Конструктор для «Умного Дома» — от идеи до воплощения



Решение программиста сделать свое жилище «умным» способно надолго занять творческим поиском, опустошить бюджет приобретением интересных устройств и подарить немало увлекательных минут, проведенных с паяльником в клубах дыма канифоли. Ведь мы смотрим на идею умного дома сквозь призму и пользователя, и разработчика. Разработчика, с определенным опытом создания информационных систем за плечами, будь то простые сайты или системы искусственного интеллекта, промышленная электроника или разработка игр.

Проект, начавшийся в формате «для души», удивительным образом вышел за рамки хобби, и вырос серьезную разработку. В основе лежало желание создать систему, интересную как в плане технического творчества и программирования, так и удобную для повседневного использования. Хотя работа еще в разгаре, уже отчетливо видны контуры задуманного: распределенная система, высокотехнологичный «конструктор» для реализации всевозможных идей умного дома, с хорошей масштабируемостью.

В прошлом году появилась мысль усовершенствовать домашнее освещение, чтобы оно самостоятельно включалось там, где и когда нужно, подстраиваясь под обитателей дома, время суток, дни недели, и общую освещенность. Тоже можно сказать и об обогреве и прочей домашней инженерии — почему бы не придать ей интеллектуальности? К тому же об Умных Домах столько говорится и пишется.

Что может быть проще, чем реализовать задуманное в нашу благодатную на электронные радости эпоху? Действительно, устройств для создания умного дома существовало, даже на тот момент, не мало. Десятки производителей всевозможных решений:



Есть простые и дешевые устройства, а есть такие, стоимость которых заставляла пересчитывать нули на ценниках. Есть полные, законченные решения, а есть наборы «сделай сам». Оставалось выбрать, что-то наиболее подходящее, интересное с моей точки зрения: пользователя и разработчика.

Интересный момент, с которым наверняка сталкивались начинающие строители своего умного дома. Некоторые элементы планируемой системы четко определены изначально — например, нужен умный свет и интеллектуальный обогрев, или жена просит авто-полив цветов. Однако, большое количество идей существует в виде: «Попробовать в перспективе сделать управление жалюзи», или «Поэкспериментировать бы с удаленным управлением кондиционерами», а еще: «Здорово будет домашнего робота-паука интегрировать в общую сеть — будет гостей весело встречать»… Да мало ли что нам, людям творческим, с инженерным уклоном, завтра еще придет в голову? Система должна с легкостью принимать все дополнения, меняться, перестраиваться под наши идеи. Представлялся некий набор модулей, «электронных кубиков», которые можно легко собирать-соединять комбинируя каждый раз в новую Систему Мечты: надежную, с хорошей эстетикой и удобными средствами программирования. Нужна возможность постепенного дополнения новыми модулями, чтобы в конечном итоге получить единое интеллектуальное пространство, где все работает с максимальным комфортом для человека. В интерактивном или автономном режиме — на каждом этапе система должна сохранять широкие возможности для творчества.

Каждая из рассмотренных систем, оставляла двоякое чувство — вроде, все здорово… Но немного не то. Желание иметь коммуникации без проводов уменьшило список претендентов втрое. Ценовой фактор отсеял еще половину. Опять же, не рациональным кажется использование WIFI-протокола для включения лампочки. Хороши системы Zigbee, Z-wave и подобные, но и у них обнаружилось то, что заставило не спешить с решением. Удивляла «заточенность» продуктов на централизацию: с выделенным сервером или центральным контроллером. На мой взгляд, распределенные системы гибче и надежнее, обладают большей автономностью. Часто возникали вопросы к масштабируемости решений. Еще позабавил момент — «Умным Домом» зачастую называют элементарную логику и простейшую автоматизацию. Чтобы отделиться от этих представлений, давайте назовем настоящий умный дом тогда иначе, например, «Интеллектуальное Пространство» — лучше раскрывает суть.

Дальнейшее изучение вопроса привело к простому выводу: если система стоит не дорого и проста в настройке, то ограничена по возможностям и не гибка — сложно реализовать все идеи интеллектуального обустройства дома. Функционально насыщенные и универсальные системы часто требуют специальной подготовки для монтажа, имеют много лишнего и слишком дороги.
Мысль: «Можно сделать лучше и дешевле», появилась вполне закономерно.

Если у тебя есть энтузиазм,
ты можешь совершить все, что угодно.
Энтузиазм — это основа любого прогресса.
Генри Форд

Разработать свою систему автоматизации — бесспорно, сложная и многоплановая задача. Но этим и увлекает!
Объем работ предстоял не шуточный. Для ускорения разработки аппаратной части решено использовать референсные решения и проверенную временем схемотехнику, адаптировав её для своей задачи. В программной же части реализуем все свои заветные фантазии.

Первым делом сформулируем, что будем создавать?

  1. Интеллектуальное пространство дома, в моем понимании, — это своего рода нервная система. По сути специализированная распределенная система, реагирующая на все происходящее и динамически меняющая свое поведение. Множество устройств, каждое выполняет свою часть общего алгоритма, все взаимодействуют со всеми, реагируют на внешнюю среду, передают данные, сигналы и определяют свое поведение в зависимости от полученной информации. Отсутствие единого центра повышает надежность системы и позволяет наращивать возможности и интеллектуальный потенциал своего дома путем простой установки дополнительных модулей.
  2. Роль отдельного «нервного узла» возьмет на себя модуль — устройство, состоящее из двух-трех частей: системной — базовой; и одной-двух функциональных — дополнительных. Некий продуманный набор «кубиков», способных к комбинированию в широких пределах. Готовый к работе модуль получается просто: к основной части присоединяем одну или две функциональные, подходящие под конкретную задачу. Части соединяются по принципу plug-and-play, без всяких хлопот. Базовая часть содержит процессор, радио-интерфейс внутренней сети, системный и прикладной софт. Дополнительные части — они разные: блоки всевозможных датчиков или управляющих реле; WIFI или Z-wave точки доступа; а, может быть, какое-то свое устройство. Таким образом, имеем любой желанный набор «электронных кубиков», которые можно легко скомбинировать.
    Итак, общие характеристики структуры будущей системы:
    • распределенная;
    • модульная;
  3. Мне, как программисту, нужен определенный комфорт. Например, возможность не только наблюдать работу, но и перепрограммировать любое устройство в сети в любой момент. Максимально быстро и просто, без программаторов и без проводов, из любого места, где есть интернет, в он-лайновом редакторе подправить программный код и сразу увидеть изменения в работе модуля.
  4. Говоря о комфорте, обдумаем еще одно требование. При программировании этого «распределенного хозяйства», языковые средства должны поддерживать возможности удобного описания межмодульных взаимосвязей. С другой стороны, нужен и низкоуровневый доступ к аппаратуре, например, к портам ввода-вывода.
  5. При этом важна надежность, защищенность от внешнего вторжения и ошибок в программе.
  6. Стоимость отдельного модуля должна быть минимально возможной, поскольку концепция предусматривает установку большого количества устройств.
  7. Устройства должны быть:
    • компактными;
    • эстетичными;

Разберемся с этими требованиями. А к сети, радиоканалу, «облакам» и непосредственно программированию системы перейдем позже, там тоже масса увлекательного.

Постановка задачи определила основу — недорогой микроконтроллер на базе 32-битного ядра Cortex-M3/M4 с 64 или 128 Кб флеш-памяти. Цены, например, на STM32 начинаются от 1.5 долларов. За эти деньги получаем неплохую производительность. Потребление в миллиамперы позволяет питать систему от батареек. Плюсом будет достаточный объем ОЗУ, таймеры, основные аппаратные интерфейсы, продвинутые часы и календарь и другая полезная периферия. Простая двухслойная плата позволит сэкономить при производстве. Но сможет ли столь простой микроконтроллер справится со всеми задачами? Плюс вопросы безопасности и надежности работы: устройства умного дома вполне могут управлять мощными двигателями или быть частью охранной системы. Нарушение алгоритмов, преднамеренное или случайное, способно привести к печальным последствиям. Следовательно, нужна защита памяти операционной системы, нужен контроль над пользовательским кодом, также необходимо сделать бессмысленным написание вирусов. При этом хотелось бы сохранить гибкость программ и простоту операционной системы. И реализовать все на недорогом STM32, который хоть и ARM, но у которого в отличии от старших моделей серии Cortex-A, отсутствует MMU (Memory Management Unit), и всего лишь 16 — максимум 64 Килобайта ОЗУ, у моделей в заданном ценовом диапазоне.

Решение кроется в самой концепции распределенной много-модульной системы. Здесь мы рассматриваем каждый микроконтроллер не как индивидуальное вычислительное устройство, а как элемент общей вычислительной среды, выполняющий часть общей задачи. По сути, много-поточная и многоядерная система. Процессор каждого отдельного модуля выполняет свой небольшой набор задач, он физически изолирован от других и, естественно, замкнут в своем адресном пространстве. А теперь интегрируем с операционной системой виртуальную машину, которая будет исполнять программы пользователя. Преимущества виртуальных машин давно известны: полная изоляция пользовательского кода от ОС, переносимость и независимость от архитектуры, полный контроль над ошибками в коде, контроль доступа к «железу», удобство отладки.

Скромные ресурсы микроконтроллера — не проблема. Кто-то из коллег наверняка помнит чарующий Spectrum 48K. Процессор 8-битный Z-80 3,5МГц и чуть больше 40 Килобайт ОЗУ. Однако, какие удивительные программы для него были написаны: Elite – 3D-игра, в которой уместилась целая вселенная с тысячами планет; весьма приличные графические редакторы «Art studio» и «Artist II»; текстовые редакторы и базы данных; компиляторы Паскаль и Си. Ресурсов хватало.

Современные микроконтроллеры обладают тем же очарованием ограниченных ресурсов, поэтому приходится продумывать системную архитектуру и аккуратно писать код. Забегая вперед, скажу, что в проекте даже к ассемблеру прибегать не пришлось, все написано на Си, при чем остался солидный запас и по производительности, и по объему памяти.

Структура модуля в общем виде:



Что из себя представляют функциональные части? Как соединяются с системной?

Плата базового блока в схематичном виде: микроконтроллер ARM cortex M3/M4, чип радио-передатчика CC1101, антенна и интерфейсные разъемы.
Соединим базовый блок с сенсорной частью:



Получится такое устройство:



Две части соединены, слева базовая часть, справа сенсорная. Отмечу, что это — визуализация дизайна устройства с одним разъемом. Будущие устройства могут отличаться, идет работа и по электронной части, и по внешнему виду корпусов.
Нажатием кнопки части разъединяются, можно сменить батарейку или присоединить другой сенсорный блок — например, с дополнительными датчиками движения и расстояния:


Сенсорные блоки могут быть самые разные, на данный момент разрабатываются такие:



Входящие в их состав датчики определяют назначение и подобраны так, что бы стоимость сенсорных блоков была небольшая.

Друзья, какие сенсоры еще нужны для дома?
В планах создание блоков для домашней безопасности:
№ 4 – контроль качества воздуха — с датчиками CO2 и вредных примесей в воздухе;
№ 5 – контроль дыма, огня, угарного (CO) и бытового газа;
№ 6 – датчик протечек.
Для любителей выращивать капризные растения:
№ 7 – блок с датчиками температуры и влажности почвы, солености и Ph (кислотности), рассчитанный на использование вне дома.

Помимо сенсоров, к базовому устройству устройству можно подключать еще два типа функциональных модулей:
  • управляющие нагрузкой;
  • интерфейсные.

Нагрузка может быть в виде насосов, светильников, светодиодных лент, приводов кранов и т. д. Модули имеют несколько каналов управления, проще говоря — разъемов для подключения устройств:



О модуле для роботостроителей. Домашние роботы — будущее, которое уже наступило. Кто-то из нас уже сделал или купил робота, кто-то размышляет о его создании. Считаю, что интересно будет интегрировать такие устройства в сеть умного дома. Нужен простой способ объединения радио-каналом со всеми сенсорами домашнего интеллектуального пространства, с удобным интерфейсом управления и унифицированной средой программирования, доступом в облака и социальные сети… Умный дом получит возможность не только чувствовать происходящее в нем и вокруг него, подстраиваться под обитателей, но и более активно взаимодействовать окружающим миром. Представьте, коллеги, какой простор для технического творчества!

Кроме того, думаю полезны будут еще:
  • доп. модуль управления сервомоторами и коллекторными электродвигателями;
  • доп. модуль управления шаговыми и бесколлекторными моторами.


Соединим модули и подключим к роботу:



Интерфейсная часть (Interface #3) облегчает подключение различной периферии, а также литий-полимерного аккумулятора. Модуль-драйвер позволит управлять коллекторными и серво-моторами.

Кстати, об интерфейсных дополнительных блоках:



Если нужен постоянный доступ к домашней системе через интернет — имеет смысл WIFI модуль подключить. Если нужно от случая к случаю собирать данные и планируется, в основном, автономная работа системы, подойдет bluetooth. Для собственных аппаратных разработок, экспериментов и решения каких-то особых задач пригодится блок с набором популярных интерфейсов.

Запланированы дополнительные блоки Z-wave и других сетей для умных домов, чтобы получить возможность объединяться с существующими устройствами, которых уже наделаны тысячи под разные запросы. Увидел, например, красивые дизайнерские выключатели с интерфейсом ZigBee, так почему бы не добавить их в свою систему?

Решив ряд задач с помощью виртуальной машины и вынеся механизмы межмодульного взаимодействия в сетевую подсистему, ядро операционной системы можем упростить до предела. Простое и «легкое» ядро системы — большой плюс в нашем случае. Рассмотрим подробнее структуру программного обеспечения модуля. Цветами обозначено, что реализовано, а что еще в работе. Условно можно разделить на четыре части: системная, сетевая, контролирующая и виртуальная машина:



Об операционной системе
Одним и первых шагов был выбор: взять готовую ОС или написать свою. Операционных систем для микроконтроллеров не мало: ChibiOS, eCos, TinyOS, FreeRTOS, FemtoOS и другие. Все они по-своему интересны и достойны, чтобы их применять, однако, хотелось получить скроенную под конкретную задачу, специализированную ОС, максимально простую и быструю. Изначально надеялся обойтись простым диспетчером сообщений, но функционал пришлось постепенно расширить. Каждое дополнение тщательно взвешивалось, все лишнее отсекалось. Создавая систему с нуля, получаешь замечательную возможность оптимизации на всех этапах. В результате, на данный момент, системная часть умещается в 5 Кб флеш-памяти, в процессе написания дополнительных драйверов датчиков, объем будет расти. Сразу надо пояснить, что «драйверы» в данном случае — это не совсем то, с чем мы сталкиваемся в Windows или Linux, это — просто набор функций инициализации, задания параметров работы или чтения результатов измерений.

Итак, ядро представляет собой простую событийную операционную систему реального времени, с дискретность реакции 5 миллисекунд. Многозадачность поддерживается: для пользовательских скриптов — кооперативная, для системных процессов — вытесняющая, с учетом приоритетов, основана на аппаратных возможностях микроконтроллера. Процессы связываются с событием, и при его возникновении — запускаются. События могут инициироваться самими процессами, таймерами, оборудованием, сетью и скриптами пользователя. Процессы взаимодействуют через сообщения. В общем, предельный минимум, однако, позволяет реализовать все, что угодно.

О виртуальной машине
Виртуальная машина тоже достаточно простая и компактная — помещается в 12 Килобайт флеш-памяти. Работает пока с целыми числами и строками. Поддержка арифметики с плавающей точкой — в процессе. Синтаксис языка, близок к стандарту Си-99, но с некоторыми особенностями. Размер получаемого байт-кода радует — в 1-2 Килобайта умещается вполне существенный алгоритм. Трансляция в байт-код идет очень быстро (в том числе по причине слабой оптимизации).

Идею создания своего специализированного языка программирования для «Домашнего Интеллектуального Пространства», не дрогнувшей рукой, отложил в дальний ящик, поскольку знаю во что это выльется по срокам, есть опыт. А вот добавить трансляторы более современного С++, Javascript и, возможно, других языков планирую. Второе по важности — сделать JIT-компилятор. Для решения этих задач знакомлюсь с LLVM — отличный инструментарий, надо сказать! Если все задуманное получится, быстродействие байт-кода приблизится к нативному, а писать программки можно будет на нескольких языках.

На данный же момент производительность Виртуальной Машины примерно соответствует другим аналогичным без JIT-компиляции. Подергаем, для теста, выводом микроконтроллера в цикле и измерим частоту:

// Инициализируем порт ввода-вывода   
_pinConfig (GPIOB, GPIO_PIN_1, GPIO_MODE_OUTPUT_PP, GPIO_Speed_10MHz);
_pinOff (GPIOB, GPIO_PIN_1);

int i = 100000;
while (i){
 	    _pinInv (GPIOB, GPIO_PIN_1);
 	    --i;
}

Цикл выполнился примерно за секунду. Соответственно, получилось около 100 КГц. STM32L151CB, 32МГц — очень экономичный, но не быстрый микроконтроллер. С чем сравнить результат? Аналогичный Си-код на том же микроконтроллере со стандартной (-O2) оптимизацией, выполняется примерно в 16 раз быстрее.

К слову, можно задействовать аппаратные возможности контроллера, и получить, например, 10МГц на выводе:

// Сконфигурируем 1-й и 2-й каналы, задав частоту 10 МГц и режим работы.
_pwmConfig( PWM_CHANNEL_1 | PWM_CHANNEL_2, 10000000 , TIM_CounterMode_Up , TIM_OCPolarity_High)

// Запускаем генерацию импульсов с 50% заполнением, т.е.
// длительность высокого уровня будет равна длительности низкого.
_pwmOn ( PWM_CHANNEL_1 | PWM_CHANNEL_2, 50 )


Функции "_pinInv (...)" и "_pwmOn (...)" и аналогичные — это прямой доступ к драйверам периферии микроконтроллера, элементы низкоуровневого API, так сказать.

Контролирующая часть
Потребность в этом блоке появилась не сразу, возникающие исключения обрабатывались по месту возникновения. Однако, необходимость уведомлять и координировать работу других подсистем, в зависимости от возникшей проблемы или изменившегося режима работы сильно усложняла жизнь. За счет вынесения контролирующей логики в отдельный блок легче отслеживать проблемы в остальных трех подсистемах и реагировать на них. Можно попытаться восстановить работу или уведомить пользователя. Или сохранить на «облачном» сервере данные пользовательского скрипта, затем перезагрузить модуль и продолжить работу. Отслеживаются: проблемы с питанием, ошибки в скриптах, зависания и сбои, проблемы сетевого обмена.

Сетевая подсистема
Как и весь проект, сеть создавалась с мыслью о максимальной автоматизации работы и удобстве для пользователя. При этом оказалось много тонкостей и на физическом уровне, и на уровне протокола. Поскольку раньше сетями и радио-устройствами не занимался, получил массу удовольствия и ценного опыта. Подробностям, пожалуй, стоит посвятить в отдельную статью.
В общих чертах: получилась самоорганизующаяся сеть, типа Mesh (ячеистая) с динамически назначаемыми «маршрутизаторами». Настройка, конфигурирование при добавлении и отключении модулей, а так же перестройка маршрутов при возникновении препятствий на пути радиосигнала происходит без участия пользователя. Оригинальные алгоритмы самоорганизации сети являются отдельным предметом гордости: при объеме занимаемой памяти около 10 Килобайт, обеспечивают стабильность передачи данных и надежность работы. Например, любой модуль, обнаружив, что оказался связан с удаленным модулем, который не видят некоторые устройства сети, берет на себя функцию маршрутизатора, чтобы транслировать предназначенные удаленному устройству пакеты. Другие модули так же определяют сами, нужно ли им заниматься маршрутизацией или не засорять эфир лишней передачей данных.

Сетевой протокол предусматривает несколько способов взаимодействия между модулями и внешним миром, расскажу о самом, на мой взгляд, удобном для программиста. Он навеян замечательным решением в QT – signal/slot. Сигнал может отправить любой модуль домашней сети. А может и удаленный сервер в облаке. Или приложение пользователя, запущенное в смартфоне. Этот сигнал будет обработан одним или несколькими устройствами, которым программист задал слушать этот сигнал. Например, сигнал могут отправить: датчик влажности на клумбе или кнопка интерфейса приложения, запущенного в браузере. Принять сигнал может как Веб-приложение, так и модуль управления насосом полива. Таким образом упрощена реализация пользовательских интерфейсов, все взаимодействия построены по единому принципу, а значит достаточно просто заставить всю распределенную систему взаимодействовать, не вдаваясь в особые сложности. Структура передаваемых данных может быть различной: например, показания отдельного датчика или набора сенсоров, или текстовое сообщение. Для решения каких-либо специфичных задач, можно использовать другие типы сетевого обмена. Помимо сигналов, в которых явная адресация отсутствует, можно формировать пакеты на более низком уровне с конкретной адресацией, например широковещательные или предназначенные определенному сегменту сети, или определенному устройству, или, например, передать данные синхронизации даты/времени. Внутри сети адресация 16-битная, соответственно возможно объединение тысяч устройств. Уникальный идентификатор каждой сети — 32-битный. Защита данных — шифрование AES128.

Подводя предварительный итог, можно сказать, что объединение идей модульности и распределенной одно-ранговой умной сети, дают положительный результат. Основные плюсы:
  1. Домашняя система может постоянно находиться on-line, сохранять данные в «облаке» и т. д.
  2. И наоборот, будучи единожды запрограммированной, может прекрасно работать автономно. Автономности способствует экономичность модулей, следовательно, их малая зависимость от сетевого напряжения.
  3. Высокая способность к модификации интеллектуальной среды. Можно быстро вносить коррективы в программный код и сразу видеть результат. Любой модуль можно соединить/разъединить с любыми функциональными частями без остановки работы системы, Например, модуль управлял умным обогревом зимой, на лето же заменим функциональную часть, и отправим его на управление декоративным фонтаном или умным поливом растений.
  4. Высокий параллелизм процессов.
  5. Надежность работы: отсутствие единого центра, работа пользовательского кода в виртуальной машине, плюс шифрование сетевых пакетов и контролирующий блок кода.
  6. Любое домашнее устройство с дисплеем и интернет-браузером — телевизор, планшет или смартфон — способно быть интерфейсом умного дома. Интерфейс – WEB приложение, соответственно его кастомизация не ограничена.
  7. Упрощение реализации творческих задумок. Даже в таком, незавершенном виде, система позволяет комфортно экспериментировать с различными устройствами.

Расположившись с ноутбуком или планшетом по-удобнее, в он-лайновом редакторе правим код, меняем значения констант, и почти сразу видим результаты. Никаких, сборок, прошивок… Компиляция проходит прозрачно для программиста, байт-код разливается по сети — сразу наблюдаем работу. Кстати, скрипт загружается и работает в ОЗУ, исправлять его можно сколько угодно, и если все хорошо — даем команду на запись во флеш-память микроконтроллера, чтобы скрипт запускался при старте модуля. Таким образом, износ ячеек флеш-памяти сводится к минимуму.

На фотографии не показать особенности работы с системой, как и процесс программирования модулей. Готовится отдельный материал с видео-роликами, с демонстрацией решений некоторых задач домашней автоматизации, где можно увидеть преимущества распределенной системы.

Пока же проведем пару тестов в подтверждение работоспособности системы.
Тестируем веб-приложение и модуль управления светодиодной лентой. Набираем небольшую программку в он-лайновом редакторе, запускаем — смотрим — светится как положено, яркость красного задана 100%.



Код достаточно прост:



Еще один тест. Свяжем датчик освещенности и управление нагрузкой 220Вольт. Элементарный алгоритм, пороговое значение ставим 500Lux.



Лампа зажглась — тень зафиксирована.

Свет от окна около 1000 Lux, лампа гаснет:



Код для модуля, управляющего лампой:

@lamp(idx) // При получении сигнала "SENSOR" из сети, попадаем в эту функцию-обработчик
{ 
    // Значение освещенности, пришедшее из сети
		int light = Argument(idx, 0);
    
		// Проверка порогового значения
		if (light < 500){
    	  _pinOff (GPIOA, GPIO_PIN_3);
    	  tick  = GetTick();
    }
    else{
        _pinOn (GPIOA, GPIO_PIN_3);
        tick  = GetTick();
    }
}

main()
{
    // Конфигурируем вывод, управляющий нагрузкой
		_pinConfig (GPIOA, GPIO_PIN_3, GPIO_MODE_OUTPUT_PP, GPIO_Speed_10MHz);
    // Управление инвертировано: pinOff - включено, pinOn - выключено
		_pinOn (GPIOA, GPIO_PIN_3);
	
    // Слушаем сигнал из сети и обрабатываем его при получении
    Listen ("SENSOR", "@lamp");
}


Код для модуля с датчиком:

@sendSens() // Обработчик, с которым связали сигнал об окончании преобразования АЦП
{
	// Значение освещенности в милливольтах, которое насчитал АЦП
	// Новое и предыдущее значение
	// считаем в милливольтах ввиду временного отсутствия поддержки типа float
    int ambLightNew = _getSensor (SENSOR_AMBILIGHT, NEW_VAL)+1;
    int ambLightOld = _getSensor (SENSOR_AMBILIGHT, OLD_VAL)+1;
    
    //Преобразуем в Люксы, библиотечная ф-ция
    int ambLight = _getAPDS9007(ambLightNew)/1000;
    
    //Сравним старое и новое значение, в h - процентная разница
    int h;
    if (ambLightNew > ambLightOld)
        h = ambLightNew*100 / ambLightOld;
    else
        h = ambLightOld*100 /ambLightNew;
    h -= 100;
    
    int d[2];
    if ( h>10 ){ // Реагируем на более, чем 10% изменение освещенности
		
      // Формируем пакетик с результатом измерения
    d[0] = 1; // Одно значение
    d[1] = ambLight;

      // Отправляем в сеть сигнал
	    Signal("SENSOR",d[0]);
    }
	// Взводим таймер на 1/4 секунды для чтения результатов сенсора, чтобы снова попасть в эту функцию
	Timer (MSG_READ_ADC_SENSORS, 0, 250);
}

main() {
	// После старта, ждем одну секунду и запускаем чтение сенсоров
	Timer (MSG_READ_ADC_SENSORS, 0, 1000);
	
	// Вычисления значения аналогово-цифровым преобразователем закончится отправкой "MSG_ADC_FINISHED"
	// свяжем его с функцией @sendSens
	Bind  (MSG_ADC_FINISHED, "@sendSens" );
}




В тесте участвовал прототип модуля с платой сенсора освещенности и питанием от батареек.

Разработке «железа» посвящена следующая часть: проектируем, делаем рабочий макет, паяем мелочь размера 0402 (1мм x 0,5мм) и QFN-корпуса, изготавливаем прототипы.
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 86

    +8
    Очень круто, размах проекта впечатляет. Но в данном контексте, когда столько всего нужно сделать — тратить время на самописную виртуальную машину и свой язык, даже и похожий на С++ — это не самый лучший выход в наше время. Большому проект нужно большое комьюнити, и лучше привлекать адептов из смежных областей. Почему бы не использовать библиотеки и опыт mbed, а через него и ардуинщиков привлечь? Я бы с радостью писал программы в этой среде вместо изучения вашего фреймворка, ведь она и так упрощена до безобразия. Да, возможно это не так просто и придется помучиться над интегрированием в ваше ядро, с учетом многозадачности. Но игра стоит свечь, как мне кажется.
      0
      Большое спасибо за высокую оценку проекта. Идея на счет Ардуино-среды разработки просто отличная. Изначально в этом направлении не думал, но сейчас, когда объем работы осознается лучше, действительно, адаптировать существующую продуманную систему с готовыми библиотеками выглядит мудрым решением.
        0
        **вспомнил исходники the glitch, в которых нет отсылок на то, что все неприложенные хидеры надо искать в такой-то версии такой-то ардуино иде**
        0
        arduino ide настолько упрощена, что ей просто неудобно пользоваться.
        +4
        Друзья, какие сенсоры еще нужны для дома?

        Датчик шума.

        Мое ИМХО конечно, но как насчет проводов — Ethernet'а в идеале с POE?

        И я немного не понял из статьи, Вы это продаете готовое или делитесь с сообществом наработками?
        Если продаете, то глянуть хоть одним глазком уже можно где-нибудь?
          +2
          Мое ИМХО конечно, но как насчет проводов — Ethernet'а в идеале с POE?

          Автор очень точно написал в начале про философию этого внедрения «разумного» дома — ты заранее предсказать не можешь, чего где захочется прикрутить и как поменяется логика. Соответственно заранее везде провода не заложить, рано или поздно придется уходит в радиоэфир. И что бы не городить гетерогенную картину (тут танцую, тут пляшу) — автор сразу все делает на радио и это верно на мой взгляд.
            0
            Я понимаю все сладости и горести проводов. К счастью (или к сожалению), я уже протянул провода во все (вроде-бы) уголки квартиры пока меняли проводку.
            И я ни сколько не спорю с тем, что радио не нужно. Напротив, порой действительно без него не обойтись.
              0
              Посмотрите тогда вот это imall.iteadstudio.com/development-platform/arduino/arduino-compatible-mainboard/im120410001.html — уже встроенное poe питание и не дорого. Минус — не стандартный для arduino pinout \
                0
                Уже имею экземпляр для тестов. Правда еще не дотянулись руки пощупать… :-( ремонт съедает все время после работы…
                А piout не проблема кмк…
            0
            Привязка к «кабелю» многих в использовании умного дома и останавливает. Был недавно ремонт, а корода спрятанные в плинтусе уже надежно оккупированы кабельным ТВ и интернетом, не вопхнешься.
              +1
              Согласен, но ведь кто-то уже использует провода в доме?
              мало того Ethernet может быть как модулем для интеграции в свою систему чужих систем, которые увы, только Ethernet.

              PS: ни в коем случае не хочу быть похожим на картинку «JPEG! JPEG! JPEG!!». Просто для себя я выбрал провод. И да, понимаю, что когда-то, возможно, придется добавить радио, опять же, например, для совместимости с каким-то готовым оборудованием…
              +1
              Датчик шума — полностью согласен, хорошее дополнение к модулю безопасности.

              как насчет проводов — Ethernet'а в идеале с POE?

              Проводов решил по возможности избегать, поскольку умным домом озадачился как раз после ремонта. В перспективе можно сделать интерфейсный доп. модуль с Ethernet.

              Если продаете, то глянуть хоть одним глазком уже можно где-нибудь?

              На данный момент все существует в виде прототипов, многое еще надо обкатать, но о производстве думаем. Хотим сразу устройства в хороших корпусах делать, а не в виде плат.
                0
                Спасибо. Понял.

                Простите, а схемы плат планируете публиковать, или это будет полностью закрытый продукт? =)
                  +2
                  Схемы, со временем, думаю, имеет смысл опубликовать. И интерфейсы детально описать.
                  Проект этот для творческих людей, возможно, кто-то захочет сделать свои собственные сенсорные или другие платы.
                  Да и повторить устройство самостоятельно будет не сложно и интересно — схема достаточно проста, плата двухслойная.
              +3
              Роман, работа проделана колоссальная. Даже не верится, что в одиночку столько можно осилить, хотя наверно можно — но забив на работу и вложившись полностью.
              Из готовых аналогов могу подсказать посмотреть на SPARK Core.
              — так же очень маленький «головной модуль» 2*3,5 см, под него можно сделать дочерний модуль
              — Они «никак» в плане децентрализации и MESH.
              — Используют wifi модуль от Ti с STM32 контроллером.
              — Веб среда разработки, wiring язык пользовательского скрипта, поддержка библиотек от комьюнити
              — загрузка прошивки с облака и по usb
              — возможность работать с локальным облаком (без web редактора кода пока, но upload скомпиленной прошивки через локальное облако возможен)
              — сформировавшаяся тусовка на их форуме.
              — все opensource лежит на github
                +2
                Благодарю за теплые слова, действительно, труда вложено много, хотя и удовольствие от разработки весьма велико. Проект оказался настолько увлекательным, что не задумываясь трачу и выходные, и свободное время, да и деньги, конечно. Проще немного тем, что фрилансер, могу сам время распределять. А так да, семья моя уже с грустью смотрит: «Когда на море поедем-то?»

                Из готовых аналогов могу подсказать посмотреть на SPARK Core.

                SPARK Core — очень хорош, и имеет схожие концептуальные моменты. Но есть пара минусов, на мой взгляд:
                — даже «гиковское» устройство должно иметь красивый корпус с продуманным дизайном, чтобы могло украсить любой интерьер.
                — WIFI — загруженность частотного диапазона 2,4ГГц, на сегодняшний день, большая и будет расти, поэтому сразу ориентировался на 868МГц, за-то можно смело ставить в доме несколько сотен модулей.
                +1
                Общая картина системы впечатляет. Всегда напрягала завязка «умного» дома на сервер, под который приходится отводить целую машину, по уму. А децентрализация, участие отдельных модулей системы в маршрутизации и взаимодействии с другими частями системы просто «на отлично». Руководствовались «Не клади все яйца в одну корзину»? Так же радует спартанский минимализм и простота, что, конечно, на порядки снижает энергопотребление модулями. Многих от использования систем «умного дома» сейчас останавливает необходимость развертывания достаточно большой инфраструктуры в плане проводки, точек доступа и прочих «приблуд».

                Планируете выходить на «промышленные» масштабы? Думаете оставить разработку для среды гиков и программистов, или в планах есть user-friendly конфигуратор системы для домохозяек и гуманитариев людей не могущих в программирование?
                  0
                  Да, тоже всегда думал, почему Умные Дома тяготеют к централизации? Ведь распределенная система просто «сама просится».

                  Планируете выходить на «промышленные» масштабы?

                  О производстве думаем, масштабы, конечно, определит спрос.

                  Думаете оставить разработку для среды гиков и программистов или в планах есть user-friendly конфигуратор

                  Есть кое-что интересное в разработке для «программирования без программирования», в статье не писал, поскольку пока еще на очень ранней стадии.

                  Сначала будет вариант для гиков. По мере появления свободных рук и ресурсов, будем реализовывать он-лайновый визуальный редактор или скорее конструктор, для программирования системы в графическом виде. Максимально, как Вы правильно сказали, user-friendly. Не так, как в Скрэтч-редакторе, на более высоком уровне абстракций. Концепция взаимодействия между модулями на основе «сигналов» позволяет легко проектировать итоговую систему подобно тому, как это выглядит в он-лайновом конструкторе ВЕБ-страниц. Удобно манипулировать модулями, «электронными кубиками» и «отношениями» между ними. Более-менее типичные решения можно получать простыми манипуляциями мышки, а сгенерированный готовый код дополнять, при желании, вручную, или не касаться программы вообще. В можно реально облегчить рутинные операции и дать возможность не-программисту работать с системой.

                  Если заглядывать много дальше, в мечтах — довести систему до такого уровня простоты и удобства (и цены), чтобы на самом деле, домохозяйкам в супермаркетах продавать.
                    0
                    Роман, вы уже не первый раз пишете «мы», вы не один работаете над проектом?
                      0
                      Есть друзья, к которым иногда обращаюсь по электронике и веб-технологиям, обсуждаем концепции. Получается — «Мы», но друзья, в силу различных причин, к сожалению, всерьез к проекту подключиться не могут, так что постоянный участник и «двигатель» проекта пока в одном лице. Надеюсь, ситуация изменится в лучшую сторону.
                  +5
                  Мода на ардуинки и малинки сделала больше, чем хотелось бы; горшочек, не вари!

                  имхо, очень хорошо, что система получается распределенной. Но, очень плохо то, что эта «распределенность» вместо абстракции имеет под собой конкретную основу — связная сеть ARM'овых контроллеров? Не хочу. Хочу пачку реле, привязанную на тупой 8битный девайс, который при наличии управляющего процесса на линуксовой x86 машине будет делать именно то, что говорит x86 машина. Как насчет копирования состояния виртуальной машины из x86-контроллера в реальный — пошагово?
                    +2
                    Отличный проект.
                    А теперь — по конкретике:
                    Для Вас похоже это — бизнес. Так? Тогда вопрос: цена. Хоть предполагаемая, хоть какая… Когда можно ждать? Интересуют большие поставки, сколько можно ожидать устройств? Где и как будете делать?
                      +1
                      Есть желание продавать много, соответственно, цены постараемся сделать привлекательные.
                      Стремлюсь, что бы розничная цена базового модуля была не более 20-25 долл., доп. блоки — разные, в среднем 10-15 долл. Но будут и дорогие, поскольку некоторые датчики, например CO2, десятки долларов стоят.

                      Итого, условный модуль, состоящий из базовой и сенсорной части, в корпусе из хорошего поликарбоната, с залитой прошивкой, протестированный, упакованный и готовый к отправке: 30-40 USD в розницу. Эта стоимость, конечно, предположительная.

                      Платы китайцы сделают, быстро, дешево и качественно. Корпуса — у них же. Монтаж скорее всего своими силами сделаем.

                      Количество планирую исходя из свободного бюджета.
                      Думаю, первую партию 2-3 тысячи базовых модулей и по тысяче различных дополнительных. Если будут пред-заказы или взять кредит, реально сделать и 20 тысяч, и более.

                      Сроки: доводка некоторых моментов и подготовка к производству: три-четыре месяца займет, плюс производство около месяца-двух. Опять же многое упирается в деньги. Можно все сделать быстрее.
                        +1
                        Огромная работа проделана.
                        Автору — респект!

                        Наверняка Вы об этом и сами думали, и, подозреваю, у Вас есть достаточный опыт,
                        но с Вашего позволения — совет:

                        Не знаю, насколько для Вас вложения в партию в пару тысяч модулей
                        ( по моей прикидке — это пару десятков тыщ баксов)
                        являются «небольшой» суммой, которую нестрашно и потерять,
                        но я бы рекомендовал Вам начать с по кр мере сотни — другой изделий.

                        Во первых, иногда случается, что наши ожидания не соответствуют реальности,
                        и реальный спрос может быть очень малым.
                        Ваш продукт может нравиться многим ( и даже ОЧЕНЬ многим),
                        и при этом, по какой то «необъяснимой» причине,
                        число покупателей может быть оч малым.

                        Вам необходима тщательно продуманная схема продаж и определиться с заказчиками.

                        Иначе у Вас на руках останется куча изделий, которые Вы замучаетесь бегать и искать
                        кому бы еще «всучить», даже и подешевке.

                        Далее, партия в пару тысяч изделий — изделия ведь придется тестировать,
                        заливать софт, в конце концов упаковывать и клеить этикетки…
                        Когда нет хорошо отлаженного процесса — это УЙМА работы.

                        Также, ктото должен будет заниматься заказами, их отправкой, обработкой платежей…

                        В общем, даже партия в одну-две тысячи изделий — это ОЧЕНЬ много,
                        если у вас нет подготовленной логистики ( которую кстати тожде надо учесть в расходах)
                        и тем более, если Вам некому будет помогать с этим
                        (причем помогать по долгу обязанностей, а не по дружбе).

                        Начав с сотни-другой изделий
                        ( ок, пусть они и обойдутся процентов на 20-30% дороже )
                        Вы сможете оценить реальный спрос, отладить техпроцесс логистики ПРОДУКТА,
                        «малой кровью» исправить ошибки и прочее.

                        А уж если, даст Б-г ( айтишный) все пойдет на ура и заказов будет уйма,
                        Вы легко сможете быстро увеличить объемы при уже наработанной схеме.

                        И стоимость «ошибки» будет на порядок ниже, чем при большой партии.

                        Тоесть даже если в самом худщем случае чтото не заладится
                        — Вам это обойдется в тыщу-две баксов.

                        При этом, даже " в худшем случае", Вы их не потеряете
                        — это будет стоимость Вашего бесценного опыта
                        по выпуску на рынок продукта.

                        Желаю Вам успехов!
                          0
                          Благодарю Вас за добрые советы.
                          Есть над чем подумать, все может оказаться не столь гладко, как хотелось бы. Потеря указанной суммы, конечно, будет весьма болезненной. Да и больше сумма выйдет, изготовление пресс-форм для корпусов изрядно стоит…
                      +8
                      Автор молодец. Пост не назовешь из песочницы. Прям из карьера по добыче песка и гравия за одно.
                        0
                        Все таки об интерфейсе. Большая часть исполнительных устройств будет завязана на сетевое напряжение. Технология Home PNA точно не может быть подспорьем? Были лет 3-4 назад недорогие модули на эту тему. А насчет ардуино технологии в разработке софта — обоими руками поддерживаю — они уже все сделали, остается только скопировать ))
                          0
                          Почитал о Home PNA. По-своему хороша, но все-таки провода. Плюс дополнительный чип — тоже деньги. Поддерживать две сетевых технологии сложнее, от беспроводных-то сетей не откажешься — они дают большую свободу.
                          0
                          При разработке схожей системы столкнулся со следующими сложностями:
                          — при наличии большого количества модулей, хранить все переменные/сигналы в голове уже сложно. Необходимо место где это можно посмотреть, желательно с организацией в виде дерева.
                          — из-за лимитированных ресурсов ограниченны возможности отладки, разработку алгоритмов упрощает использование FBD подобного языка.
                          — для отладки желательна возможность послать произвольные сигналы и смотреть текущее состояние переменных.

                          Проект класный, буду следить за развитием.
                            0
                            Спасибо большое! Советы, полученные из практики особенно ценны.
                            Возможностям отладки, действительно, надо уделить больше внимания.

                            Задумался над организацией работы с большим количеством модулей. И такая мысль пришла.
                            К безадресному сигналу:
                            Signal("SENSOR", data);
                            

                            Добавить еще один тип сигналов, где можно использовать метку (alias) модуля.
                            В одном модуле объявляем что-то вроде:
                            SetAlias("Kitchen");
                            

                            А в другом отправляем ему и другим кухонным модулям:
                            Signal("SENSOR", "Kitchen", data);
                            


                            И все модули, которые помечены SetAlias в скрипте как «Kitchen», обработают сигнал «SENSOR», если они его слушают.
                            А модули с меткой, например, «Bedroom», проигнорируют данный сигнал.

                            Кажется, это должно немного облегчить жизнь, назначил модулям метки: эти на кухне, эти в спальне, а эти еще где-то и все, пусть система сама разруливает, кому какие сигналы пришли.
                              0
                              Проще задавать произвольный путь. Возможные уровни:
                              здание/этаж/помещение/узел/(сенсор или актор)/параметр
                              у наc используется /dev/узел/(сенсор или актор) — и этого уже нехватает.
                            +1
                            По себе знаю, за 1 час в день такое не провернуть. (Если, конечно, устройства на картинках действительно существуют :) Работа большая, но ещё больше нужно сделать.

                            Какие датчики ещё необходимы:
                            — влажности,
                            — датчик дождя,
                            — протечки,
                            — геркон следует сделать отдельно и маленьким, что бы можно было навесить на окно или дверь
                            — отдельно (очень) маленький 2xDI для встраивания за существующий выключатель

                            Вопросы:
                            — Как заряжается аккумулятор на Interface #3?
                            — Будет ли графический интерфейс?
                            — Будет ли код Open Source?

                              0
                              По себе знаю, за 1 час в день такое не провернуть.

                              Примерно 1,5 года пошло с момента, когда первые наброски были сделаны.

                              По датчикам — взял на заметку, мысли правильные, благодарю.

                              Как заряжается аккумулятор на Interface #3?

                              Внешнее питание — USB-разъем, сам аккумулятор можно подключить к стандартному игольчатому разъему 2,54 мм или к винтовому клемнику.
                              Схема контроля заряда — на самом Interface #3, дополнительные зарядники не нужны, нужен только блок питания 5 Вольт, от мобильника, например.

                              Будет ли графический интерфейс?

                              Поясните, пожалуйста, что имеется ввиду? Графический интерфейс для визуального программирования системы или модуль с экранчиком?

                              Будет ли код Open Source?

                              Исходники Веб-приложений интерфейсов, включая редактор кода, API модулей и «облачной» части должны быть доступны.
                              Часть внутреннего ПО модулей, думаю, тоже можно будет со временем открыть, закрытой точно останется система шифрования и сетевого обмена с целью безопасности.
                                +6
                                закрытой точно останется система шифрования и сетевого обмена с целью безопасности

                                Будьте осторожны с security through obscurity.
                                  0
                                  Интересно Ваше мнение, скажите, пожалуйста, какие таятся в этом опасности?
                                    0
                                    Да собственно, сейчас ситуация не та, что была 2 года назад, сейчас уже есть системы на рынке за реальную цену, которые можно использовать, вместо того, чтобы делать свое с нуля. Вот только вопрос безопасности и защищенности был, остается, и скорее всего, будет оставаться открытым.

                                    Возьмем к примеру вашу систему. Вы пишите, что «защита данных — AES128». Но как именно он защищает данные? AES128 — симметричный шифр, и единственный способ защитить данные пользователя — дать ему возможность ввести один и тот же ключ на всех устройствах сети. Передача ключа «по воздуху» в открытом виде или не дай боже использование статического ключа для всех нод — это не безопасность, это курам на смех. Так вот, надо вводить ключ. Либо физически на устройстве, либо подключая каждую ноду к компу («безопасный физический канал»). Эта тема освещена у вас? Нет. Доверие есть к вашей системе? Нет ;-).
                                      0
                                      Планировал: зашивать индивидуальный набор сеансовых ключей вместе с сетевыми идентификаторами в защищенную область флэша. Каждому модулю — свой набор, алгоритм использования ключей из набора — также часть защиты.

                                      А что бы Вы посоветовали сделать, чтобы завоевать Ваше доверие к системе?

                                        +1
                                        Так как зашивать-то? Вот пользователь купил новый модуль и хочет подключить к своей существующей системе, его алгоритм действий?

                                        > А что бы Вы посоветовали сделать

                                        Ну, для начала, хотя бы намек на то, что автор знаком с тем, как работает паринг/аутентификация в существующих протоколах — BT, BTLE, WiFi (WPS). Я понимаю, что статья обзорная, но фраза «на каждом устройстве присутствует кнопка, используемая в частности для начального паринга, и светодиод, для подтверждения пользователю миганием» — внушила бы доверие.
                                          0
                                          Понял, в чем вопрос. Этот момент я никак не описал в статье, исправляюсь.

                                          Пользователь получает модули уже с ключами. Расчет на то, производитель базовых модулей будет один — мы.

                                          Приобретая устройства впервые, пользователь заводит аккаунт. Получая при этом определенный сетевой сервис, в том числе конструктор сети. Там набрасывает первую конфигурацию будущей системы. Далее ключи генерируются. И пользователь получает модули уже прошитые, со своими персональными наборами ключей и идентификаторами.

                                          Пользователю также доступен сервисный режим на сайте, в котором он может сменить идентификаторы любого устройства на идентификаторы сети другого пользователя и передать (продать) ему свой модуль, или всю сеть.

                                          Из минусов:
                                          — некоторое усложнение процедуры подготовки модулей к отправке заказчику,
                                          — привязка сети модулей пользователя к аккаунту и сетевому сервису.
                                            0
                                            Есть еще схемы обена ключами RSA например. После такого обмена у 2х сторон есть все ключи противоположной стороны.
                                            Такой обмен можно использовать скажем при инициализации устройства. И уже потом использовать AES в любом исполнении, что не оч накладно для маленькой STMки или продолжать использовать RSA — по вкусу…
                                              0
                                              Спасибо большое.
                                              Хорошее решение, стоит подумать о реализации.
                                            0
                                            Проблема безопасности достаточно серьезна, чтобы пытаться решить все самому. Что хорошо для прототипов, не всегда годится для серийных устройств.

                                            На определенном этапе лучше привлечь хорошего специалиста, я это понимаю.
                                            +2
                                            Согласен, что защита — Security through obscurity — тупиковый метод. Кнопки, наверно, был бы выход. Нажал на обном устройстве, нажал на Gateway или другом устройстве. Ключ передался по открытому каналу один раз и всё. Ну уж если взломщик в этот момент слушает траффик, то это конечно не спасёт. Но всё же лучше статического ключа.
                                          +2
                                          Обычно это создает ложную иллюзию защищенности, отсекая лишь взломщиков без достаточного опыта или мотивации, при должной квалификации и настойчивости reverse engineering снимает эту дымовую завесу, оставляя ваше творение один на один со взломщиком, со всеми теми недоработками, на которые вам могли бы указать, будь алгоритмы защиты опубликованы. Более того, это понижает доверие к системе, так как в открытом случае можно самому проверить и убедиться или учесть мнение нескольких специалистов, а тут — только надежда на то, что создатель системы что-нибудь не упустил. А, как известно, в этих вопросах сложно что-нибудь не упустить :)
                                          По этим причинам, насколько я знаю, сокрытие алгоритма защиты считается плохим тоном, псевдозащитой.
                                      –2
                                      CO, O2, радон

                                      Хотя основная идея мне кажется нерациональной. Интернет вещей кажется более правильной идеей.

                                      Сейчас даже сенсорны корпоративной безопасности делают облачными.
                                        +1
                                        Будьте добры, поясните, пожалуйста, на Ваш взгляд, в чем недостатки основной идеи?
                                          –2
                                          наличие центрального сервера, да еще выполненного столь громозко. Узлы должны быть автономными, пошел в магазин — купил за 20-30 баксов, добавил на вебсайте в конфигурацию, и все работает.

                                          Уже сделаны десятки протоколов, тонны несовместимых друг с другом устройств, которые через 2-3 можно выбрасывать в помойку.
                                            +2
                                            наличие центрального сервера, да еще выполненного столь громоздко.

                                            Нет в системе никакого центрального сервера.

                                            Основные характеристики системы:
                                            — распределенная;
                                            — модульная;
                                            — способная работать автономно;

                                            Именно уйти от централизации было решено изначально. Какие-то внешние устройства — ноутбук, комп или планшет — нужны лишь для программирования системы.
                                      0
                                      Интересно, а как были собраны макросы вроде @функция?
                                      Или используется препроцессор какой-то?
                                        0
                                        Препроцессор в этом случае не задействован.
                                        @ — при трансляции обрабатывается как токен, обозначающий функцию скрипта доступную из Си-кода, т. е. «публичную». Эти имена потом передаются в таблице вместе с байт-кодом. Соответственно по её имени можно получить её условный адрес в основной Си-программе и передать виртуальной машине обработку байт-кода с этого «адреса». Так, собственно, обработчики всех событий в скрипте пользователя и работают.
                                        0
                                        В электронных устройствах главное — питание. Тут есть 2 варианта — блок питания и провод или батарейки. Их плюсы и минусы писать не буду, они и так известны. Но, как говорится, из двух зол нужно выбирать меньшее. Поэтому я согласен с автором по поводу выбора батареек.
                                        Но а если вдруг где-нибудь батарейка разрядится?
                                        Будет неприятно, когда утром шторы не откроются, потому что разрядился элемент, их контроллирующий.
                                        Контроллируется ли сейчас как-то заряд батарейки? Было бы хорошо получать уведомление о том, что где-то осталось 10% заряда. И в список покупок автоматически добавляются батарейки — ведь дом максимально автоматизирован!
                                        Или даже батарейки сами заказываются на Amazon, а в гостинной открывается окно, через которое квадрокоптер доставит товар
                                        О как меня понесло! :)
                                          0
                                          Замечательная идея, автоматически заказывать батарейки на Amazon с доставкой через открывающееся окно. В наш век, пожалуй, так и должно быть.
                                          Контроллируется ли сейчас как-то заряд батарейки?

                                          Да, контроль заряда, стабильности питания — первым делом.
                                          Почти каждый сетевой пакет в заголовке содержит информацию о состоянии устройства, которое этот пакет передало, в том числе и оставшийся заряд батареи. Поэтому, пользователь будет проинформирован вовремя.

                                          Для привода штор и других моторов лучше аккумулятор или ионистор использовать, сил у батарейки может не хватить.
                                          Батарейки хорошо использовать для мало-потребляющих сенсоров, чтобы поставить и год-два не заглядывать.
                                            0
                                            И что, ваши модули работают год-два от батарей? Увы, год-два от батареи, mesh и real-time реакция — это фантастика. Именно поэтому индустриальные стандарты вроде BluetoothLE делают «по-тупому», никаких mesh'ей, централизованная звездочка, и все. Зато работает от CR2032, и если отказаться от realtime'овости, то даже обещают год-два (правда пока никто такого не видел, возможно брешут). Кстати, батарейку раз и поменял, а с Li-poly аккумуляторами как быть?
                                              0
                                              Вы правы, если все модули будут питаться от батареек, никакой mesh-сети не выстроится, они просыпаются раз в несколько секунд, чтобы отдать в эфир свое состояние и пакеты с данными, если есть. Их можно перевести в постоянный режим, но так они батарею за несколько дней съедят.

                                              с Li-poly аккумуляторами как быть?

                                              Li-poly аккумуляторы — заряжать, хотя понимаю, не всем эти лишние действия понравятся. Чем меня аккумуляторы привлекают, так это компактностью — модули «похудеют» с ними почти в два раза.
                                              С другой стороны, упростить все можно:
                                              — использовать CR2032 для компактных модулей, которые большую часть времени во сне проводят;
                                              — для тех, что постоянно работают, аккумуляторы могут быть опцией, на случай отключения энергии, аккумулятор там и дозаряжаться будет, без участия пользователя.
                                                0
                                                > если все модули будут питаться от батареек, никакой mesh-сети не выстроится

                                                Ну вот, начиналось все так красиво — гомогенная mesh-сеть с flood-раутингов event'ов (ведь именно это вы реализовали, если любой модуль самостоятельно может реагировать на любые event'ы, так?). А вернулось к нашим WSN'овским баранам о том, что гомогенная сеть нежизнеспособна, и узлы должны быть специализированы по алгоритмам поведения (а значит, по сетевым алгоритмам). И кроме просыпающихся раз в несколько секунд сенсоров, должны быть просыпающиеся по внешнему событию очень редко, но отрабатывающие очень быстро. Потому что вас будет безумно раздражать, если от момента нажатия на кнопку до зажигания света пройдет 1-2 секунды, а жена так вообще не будет пользоваться, про отзывы покупателей вообще молчу. И все это у вас реализовано в 10K кода? Реквест: не пишите про пайку QFN, баян. Пишите про это.

                                                > Чем меня аккумуляторы привлекают, так это компактностью — модули «похудеют» с ними почти в два раза.

                                                Да-да, ход мыслей именно такой. Но мы же хотим N узлов на квадратный метр, как мы можем подписывать пользователя на конвейер по зарядке сотен устройств? Поэтому ход мыслей логично ведет к energy harvesting. Не стесняйтесь, показывайте ваши прототипы из разломанных солнцезарядных фонариков ;-).

                                                > С другой стороны, упростить все можно:

                                                «Упростить»? Увы, это все весьма усложняет задачу построения реально пригодной для использования smarthome системы…
                                                  0
                                                  Спасибо, вопросы очень дельные. Есть над чем подумать и что обсудить. Вкратце:

                                                  — мысли об удобстве системы питания важны. Пока еще все в виде прототипов, можно менять концепцию как угодно. Найдем лучший вариант?..

                                                  — «не спящих» модулей, по идее, будет достаточно много, чтобы они поддерживали инфраструктуру сети. Почему?
                                                  А) Многие интересные сенсоры нуждаются в сетевом питании — иначе батарейку за день съедят. Это датчики некоторых газов, сенсоры перемещения людей и другие интересные устройства.
                                                  Б) Все управляющие нагрузкой модули: для светодиодов, моторов, насосов и светильников, все они постоянно в сети.
                                                  В) WIFI-интерфейс многие предпочтут, а ему тоже постоянное питание нужно.

                                                  — радиопередатчики CC1101 весьма дальнобойные, соответственно «роутерный» режим модуля на практике, в условиях квартиры/дома будет не часто включаться.

                                                  — из режима глубокого сна микроконтроллеры выходят по аппаратному прерыванию, привязанному к 1-2 выводам, соответственно, очень быстро. Вешаем кнопку и геркон на эти пины — и все.

                                                  — программирование спящих модулей будет идти медленнее, на это время их лучше перевести в обычный режим.
                                                    0
                                                    > мысли об удобстве системы питания важны.

                                                    Я бы даже сказал, что вопрос питания — критически важный, который задает и функциональность и форм-фактор. Я вот пришел к выводу, что в один форм-фактор все не впихнешь…

                                                    > «не спящих» модулей, по идее, будет достаточно много, чтобы они поддерживали инфраструктуру сети.

                                                    Верю. Я бы даже сказал, типичный случай — что такой powered будет. Один. Тогда стоит ли заморачиваться с mesh? ;-)

                                                    > радиопередатчики CC1101 весьма дальнобойные, соответственно «роутерный» режим модуля на практике, в условиях квартиры/дома будет не часто включаться.

                                                    В смысле, будет плохо реализован и отлажен? ;-) Я не подначиваю и не критикую, а делюсь своими сомнениями, появившимися в процессе следования по сходному пути.

                                                    > из режима глубокого сна микроконтроллеры выходят по аппаратному прерыванию, привязанному к 1-2 выводам, соответственно, очень быстро.

                                                    Так дело-то не в прерываниях, а в том, как передать это событие в realtime, чтобы его не забивали десятки датчиков освещенности, спамящие эфир 4 раза в секунду. Надо делать QOS, причем я бы сказал не простой, а многоуровневый, а то как бы event затопления не «потерялся». Ой, не вместить все это в 10K…
                                                      0
                                                      В смысле, будет плохо реализован и отлажен?

                                                      Шутку оценил :)

                                                      такой powered будет. Один.

                                                      Надеюсь, даже рассчитываю, что много больше, потому как сама концепция распределенной системы, реализуется не только для надежности, а для того, чтобы Умный Дом-таки стал на самом деле умным ;)

                                                      Образно говоря, модули, которые «не спят», постоянно «думают», как же им еще угодить человеку, анализируют происходящее вокруг них и их соседей. Вроде того: «Так… кто-то движется по коридору со скоростью превышающей среднюю по дому. Так… Определяем направление… Ага, а не включить ли освещение в той маленькой комнате, куда, скорее всего, человек спешит?» :)

                                                      Идея в том, что чем больше модулей (powered, конечно), том больше «интеллектуальный потенциал» умного дома.

                                                      Надо делать QOS

                                                      Может, лучше спамить критическими сообщениями сильнее, чем все прочие? ;)
                                                      А если серьезно, надо подумать. Спасибо за идею с QOS. И, конечно, в 10 Килобайт можно не уложиться.
                                                      0
                                                      Что насчёт беспроводной передачи электроэнергии? Что-то наподобие зарядки Qi, только раздаёт она энергию на большое расстояние, например на комнату. Существуют ли такие системы, хотя бы прототипы? Это решило бы проблему и проводов, и вечно разряженных батареек.
                                                        0
                                                        Существуют. В двух вариантах:
                                                        1) Мощные, могут питать телевизор. Но человек в комнате для них нечто вроде помехи. Да и есть сомнения в полезности этого мероприятия.
                                                        2) enOcean. Как раз умный дом с питанием за счет сбора энергии. Там много вариантов, что и как собирать, включая энергию от нажатия кнопок выключателей.
                                                          0
                                                          Идеи в правильном направлении. Избавиться от необходимости менять батарейки или быть привязанным к розетке — мечта. В перспективе хотелось бы её воплотить, но пока сложно.
                                                  +1
                                                  Замечательная идея, автоматически заказывать батарейки на Amazon с доставкой через открывающееся окно. В наш век, пожалуй, так и должно быть.

                                                  А когда батарейки доставлены, домашний робот-слуга распечатывает их и вставляет в нужный датчик. Или в самого себя :)
                                                  0
                                                  Я если не ошибаюсь, поправьте если не прав, но частота радио канала какая-то странная, обычно производители используют 433МГц, а у вас на изображении 8++ МГц вроде как…
                                                    0
                                                    У 868 МГц есть не мало плюсов. По сетевой части делаю небольшую статью, там распишу, почему выбор пал на этот диапазон.
                                                      0
                                                      А еще у него есть недостатки, как например неоткрытость диапазона в некоторых частях света. Вот почему индустриальные стандарты вроде BluetoothLE делаются на на глобальной частоте 2.4ГГц — плевать на проникновение сигнала, зато продавать можно где угодно ;-).
                                                        0
                                                        Да, Вы все верно сказали, нелицензируемые частоты: 868 МГц — это для России и Европы, в США — 915 МГц. Это учтено, в разработке — антенна и согласующая схема рассчитаны на оба диапазона, а переключение работы радио-чипа производится программно.

                                                        Более того, можно и на 433 МГц переключиться, и на многие другие полосы частот, правда, несколько потеряв в чувствительности приема. В тестах, был удивлен, пробивает через 2 перекрытия на 433 МГц с антенной на 868 МГц.

                                                        Постараюсь на следующей неделе статью о сетевой части доделать, там обстоятельно расскажу, чем руководствовался при выборе рабочего диапазона.
                                                          0
                                                          Вы лучше расскажите, что вы делаете, когда не пробивает. Есть ли у вас к примеру vector network analyzer, чтобы протестировать антенну и убедиться, что она настроена и работает оптимально и отделить проблемы антенны от проблем окружающей среды? А еще бесит, что с визуализацией в этом мире плохо. Хотелось бы надеть очки и видеть распространение электромагнитного поля. Так не только досе не сделали такое, не понятно, можно ли сделать такое вообще реалистично. Да что там говорить, если даже тепловизор — девайс на грани фантастики на пару килобаксов. Грустная физика в этом мире ;-).
                                                      0
                                                      В России и 433-434, и 868-869 являются безлицензионными диапазонами (при соблюдении максимальной мощности, что делают далеко не все). Но если первый довольно плотно занят, то во втором относительно свободно, но это зависит от местности, ибо там попадаются радио-микрофоны с довольно мощными передатчиками.
                                                      0
                                                      А несмотрели вот этот проект, pinocc.io/ на мой взгляд очень схоже
                                                        0
                                                        Ух, и правда, похож с виду.
                                                        Спасибо большое. Посмотрю подробнее.
                                                        0
                                                        Роман проект супер. НО то ли я статью не до конца понял то ли не увидел. Взаимосвязь модулей между собой полностью автономная. Эта реализация конечно супер. И если я правильно понял то можно каждый модуль настроить так чтобы при получении информации от другого модуля он выполнял определенный скрипт. Но как идет взаимосвязь «сеть модулей» < — > " компьютер ". Применяется какой то отдельный адаптер или что?
                                                        Просто концепция так называемого умного дома мне интересна самому. Очень интересно этим заниматься. Но мне больше интересно было бы использовать существующие модули и подключать их к своей системе нежели, делать свои. Я начал с простейшего подружил модули ноолайт с роутером на базе openwrt. Получилось и автономно и работа через интернет, да и мелкие плюшки. habrahabr.ru/sandbox/83923/
                                                        А можно ли как то начать с вами сотрудничать, может я смогу оказать какую то помощь, содействие? И использовать ваши наработки в своей сети? Проект полностью опенсурс, не умею я такие вещи монетизировать, да и с сообществом он получит большее развитие на начальном этапе. Мне очень хочется получить систему которая была бы автономной, и в тоже время обладала бы возможностью простого управления и очень легкого конфигурирования, дабы пользователь без навыка программирования мог настроить все так как нравится ему.
                                                        Понимаю что все это сложно и тяжело, из за этого сейчас я со своими коллегами очень сильно уперся в вопрос веб интерфейса, простого и примитивного но в тоже время функционального. Может быть общими усилиями мы сможем добиться чего то. Потому как даже банальная проработка модуля для управления кондиционером заняла у меня очень много времени. (Была задача построить автономный домашний лимат контроль, дабы выходя с работы, я мог включить удаленно кондиционер, и по приходу домой меня бы ожидала комфортная температура)
                                                        Подключить к AR9331 вч модуль на 868 большой проблемы не представляет, вопрос только в реализации протокола. А если он еще и влезет в память ATMEGA, к сожалению работаю только с ними, то все будет просто замечательно.
                                                          0
                                                          Применяется какой то отдельный адаптер или что?

                                                          Да, концепция такова, что каждый модуль состоит из двух/трех элементов: соединяем базовую часть и интерфейсную с WIFI или Bluetooth. Все, система может постоянно находиться on-line, перепрограммироваться, управляться и. т.

                                                          Интерактивность важна, но умный дом тогда Умный, когда он старается сам догадаться, что человеку сейчас нужно.

                                                          Все это, конечно, не так просто создать. Нужны исследования, разработка алгоритмов и одновременная проверка их в реальности. Концепция системы как раз такова, что располагает к техническому творчеству и обкатке распределенных алгоритмов. При этом будет не в виде «Ардуино и клубок проводов», а максимально эстетичном и удобном для повседневного использования виде.

                                                          А можно ли как то начать с вами сотрудничать

                                                          Если есть желание, всегда можно оказаться взаимно полезными.

                                                          ATMEGA

                                                          От них давно ушел на ARM, рекомендую.
                                                          0
                                                          Вопрос по смежной теме: я бы хотел заменить защитные и автоматические выключатели в щитке на нечто управляемое с сохранением основной функции (в идеале — ещё и умеющее рапортовать о проходящем токе), но не нашёл ничего подобного. Есть ли какие-то подвижки на эту сторону?
                                                            0
                                                            Реализуемо. Причем довольно быстро.

                                                            — Стандартные корпуса серийно выпускаются под DIN-рейку.
                                                            — Микросхемы для учета протекающего переменного тока какие-то попадались, припоминаю.
                                                            — Мощные реле — выбор богатый.
                                                            — Особо компактные блоки питания уже разработаны — в корпус уместятся.
                                                            — Собрать все в единое устройство — без проблем.
                                                            — Радиоканалом, естественно, свяжется с основной сетью, и можно онлайн наблюдать все параметры сети.

                                                            Встречный вопрос. Скажите, пожалуйста, какая цена такого устройства была бы для Вас приемлемой? И какое количество интересует?
                                                              0
                                                              В идеале, это должно быть устройство размерами примерно с набор автоматов на соответствующее число линий (4, 8, 12… у меня почти каждая розетка подведена к щитку отдельной линией), полностью сертифицированное и позволяющее мне реализовать не только подсчёт элетроэнергии, но и сценарий «в линии пропал потребитель — отключаем её полностью» (т.е. «ребёнок вытащил вилку электроприбора и суёт в освободившуюся розетку спицы») и диммирование; ну, с последним, наверное «на каждую линию» будет неоправданно дорого, проще запитать отдельный «многолинейный диммер» от одного автомата, но данный абзац про идеал.

                                                              По цене опять же, ориентируясь на автоматы, не более чем в три-четыре раза дороже набора ABBшных. Опять же, я понимаю, такой девайс на четыре позиции будет дороже, чем половина «восьмилинейного», но примерный диапазон такой.
                                                                0
                                                                у меня почти каждая розетка подведена к щитку отдельной линией

                                                                Я сейчас делаю разводку, исходя из требования «1 комната — 1-2 группы розеток», и у меня уже получается до хочень много кабеля. А в вашем случае, если тянули каждую розетку в щит, это ж сколько провода вы заложили в стены? Или у вас в каждой комнате по промежуточному щитку?

                                                                сценарий «в линии пропал потребитель — отключаем её полностью»

                                                                Тоже интересно, но не представляю, как это реализовать без сигнального контакта в розетке и дополнительного провода. Если в случае с каким-либо блоком питания все ясно (всегда есть ток, пусть очень маленький, но есть), то, например, с утюгом все печально — после нагрева в нем физически разрывается цепь, что равнозначно его «выдергиванию» из розетки.
                                                                  0
                                                                  Или у вас в каждой комнате по промежуточному щитку?


                                                                  Именно так. Один щиток входной + кухня + отдельные линии к кондиционерам и стиралке, второй на кабинет + балкон, третий на спальню + санузел.
                                                                    0
                                                                    Не успел отредактировать свой комментарий:

                                                                    … хотя электрики мне показывали разводку в одной из «их» квартир, где на один «входной» щиток приходило около шестидесяти кабелей. До упаковки в стену выглядело хтонично.
                                                                +1
                                                                Частично есть, а частично нельзя делать. Защитная автоматика должна быть простой до тупости, чтобы там нечему было выходить из строя. И она должна работать вез питания.

                                                                Но кое-что есть. Покупаете автоматы от ABB. У них сбоку и сверху есть разъемы для дополнительных контактов. Т.е. покупаете этот дополнительный контакт, выламываете заглушку, приделываете контакт. Эти самые контакты подключаются к СКУДе и сообщают ей, когда произошла авария.

                                                                Есть еще вот такие штуки:
                                                                meandr.ru/uzm51m
                                                                meandr.ru/om63

                                                                УЗМ 51М всем очень рекомендую. У меня оно периодически обесточивает квартиру, когда на вход более 250 приходит.

                                                                А если хочется чего-то более хитрого, то берете контакторы, подключаете управляющую линию к PLC, подключаете к нему датчики и творите что хотите. Но, во первых, это никоим образом не заменяет базовую защиту в виде автоматов и УЗО, а во-вторых, не очень бюджетно.
                                                                  0
                                                                  Если городить «управляемый размыкатель» отдельным корпусом на рейку, в щитке потребуется вдвое больше места. Это неудобно.

                                                                  Насчёт дополнительных контактов у ABB погуглил, но какого-то бо-ме популярного текста на тему «с чем едят» не нашёл.

                                                                    +1
                                                                    Если городить «управляемый размыкатель» отдельным корпусом на рейку, в щитке потребуется вдвое больше места. Это неудобно.

                                                                    Никакой управляемый размыкатель не будет заменой автомату. И я не верю, что можно значительно ужать автомат не потеряв в качестве.
                                                                    Насчёт дополнительных контактов у ABB погуглил, но какого-то бо-ме популярного текста на тему «с чем едят» не нашёл.

                                                                    Про контакты есть тут: cs-cs.net/avtomaty-greb-sk в разделе «Извращенские приблуды: Сигнальные контакты для серии S200»
                                                                +1
                                                                Задумка классная, но вот я, к примеру, тупой и паять не умею. Программировать — это ладно, это можно, а паять как-то не срослось. Соответственно вопрос: а есть что-то из систем умного дома, которые предполагают модульный монтаж и сравнительно несложное программирование? Может кто кинет линки на какие-нибудь обзоры?
                                                                  +2
                                                                  Смотря что подразумевается под умным домом, если включение выключение света и электроприборов то Noolite, все примитивно и просто. Плюс выше кидал свое описание как все это подружить с роутером на OPENWRT, и тогда можно и простую логику прикрутить. ТАм только программирование, ничего паять не надо.
                                                                  Если что то более серьезное и сложное то Z-WAVE и прочие более дорогие решения.
                                                                  Вопрос в финансах и вашем видении умного дома.
                                                                    0
                                                                    Играюсь сейчас с весьма бюджетным контроллером Умного Дома для «домохозяек». Простора для программиста конечно не так много как здесь, но паять не надо и для решения простых задач типа антипротечки или охранной сигнализации вполне достаточно — сценарии, таймеры, календарь, условия, управление через интернет и со смартофна… 1-m.biz

                                                                    а вообще вот товарищ постарался и выложил списочек систем по Умному Дому на разный вкус:
                                                                    http://buildingsmarthome.ru/smarthome/technology/smarthome-technologies-review
                                                                    –1
                                                                    Извиняюсь, если кто-то уже озвучил, комментарии читал по диагонали.
                                                                    Давайте только представим, что монтировать систему должен электрик ЖЭКа (пусть и продвинутый), а эксплуатировать человек, умеющий лишь постить сэлфи и тарелки с едой в Инстаграмм. Как говорит мой любимый шеф — система разработана программистом для программистов. В данном виде у неё нет ни малейшего коммерческого будущего, хотя задумка весьма интересная и красивая. Т.е. для себя и избранных хабровчан.
                                                                    Автор начал с разработки финишных модулей и сильно увлёкся этой темой. В итоге — определённая перегруженность, а следовательно, увеличенное время разработки, более, чем необходимо. Задачи, решённые в процессе разработки интересные, но скорее с академической точки зрения, чем с практической.
                                                                    Я бы предложил начать с управляющего центра, который будет общаться с конечным пользователем и работать с финишными модулями. Кстати, на него же можно возложить и программирование управляющих блоков. И не обязательно заморачиваться с разработкой интерпретатора байт-кодов и их загрузкой, можно просто грузить готовые программы. Плюс некоторые доработки по конструктиву.
                                                                    Если всё расписывать более развёрнуто, получится отдельная статья. Возможно имеет смысл изложить все свои претензии и предложения, ибо в основе своей система понравилась, а главное — подсказала ряд идей.
                                                                    P.S. Автору огромное спасибо за проделанный труд, и главное, за публикацию идеи. На мой взгляд, при определённой доработке напильником, проект весьма работоспособен, а главное — конкурентоспособен. Ибо прост и не дорог. Прост, в том числе и в плане установки-настройки (при условии доведения до ума вопроса простоты общения и, возможно, конструктива).
                                                                      0
                                                                      Спасибо, друг, за интересный комментарий.
                                                                      Мысли весьма разумные и правильные. Есть о чем поразмыслить и что обсудить. Буду рад общению.

                                                                    Only users with full accounts can post comments. Log in, please.