Моя реализация "умного дома" родилась не вдруг и не на пустом месте. Этому проекту предшествовали несколько лет возни с различными вариантами систем контроля доступа. Различными и по происхождению, и по задачам, и по аппаратной платформе. Собственно, концепция тонкого клиента в части электроники родилась лет 10 тому назад и постепенно "доводилась до ума". Как я уже писал, во главу угла ставилась задача не только расширяемости и достаточно высокой скорости отклика, но и вопросы экономии, как на стоимости устройств, так и на их энергопотреблении. Расширение аппаратных возможностей системы не затрагивает ее ядра, разве что в области описания новых типов обслуживаемых данных на уровне их ввода оператором.
Такая же судьба постигла и программную часть системы - она тоже трехзвенная. И это так же сказывается на ее расширяемости - клиента системы можно наваять на чем угодно - хоть на скриптах bash.
#!/bin/bash function report { wget 'http://smart-home/pin.asp?l=123&a=virt&c=p&d=01'$1 -O /dev/null \
--user=my-user --password=my-password --auth-no-challenge -o /dev/null } while [ 1 ]; do if [ -n "`ifconfig | grep ppp100`" ]; then report 0001 else report 0000 fi ping
remote-client
-c 3 -q -w 10 > /dev/null if [ $? == 0 ]; then report 0101 else report 0100 fi sleep 30 done
Да и на здоровье "тугодума" Firebird это сказывается не худшим образом - он получает лишь те запросы, которые необходимы для расчетов или для хранения данных.
Клиенты, в большинстве своем, представляют собой либо удаленные системы сбора и распределения команд, требующие сложной маршрутизации к серверу, либо устройства не способные работать на низкоскоростных коммуникациях (например, камеры видео наблюдения). Или, как в приведенном выше примере, собирающие и раздающие информацию непосредственно в компьютерах.
Вторым плюсом трехзвенки является простота собора данных с разветвленной компьютерной сети при минимизации трафика. Так, если у вас в удаленном доме используется несколько компьютерных тонких клиентов, нет необходимости гонять к главному серверу трафик от каждого из них - он может аккумулироваться на внешнем "прокси сервере", предоставляющем клиентам такой же интерфейс, как и главный сервер системы. Таким образом, нагрузка на внешние коммуникации в части "пустых" запросов сократится до всего-лишь одного соединения.
Протокол HTTP, был так же выбран не случайно - он обеспечивает высокую отказоустойчивость в части быстрого восстановления потерянных соединений и простоту реализации дополнительных внешних клиентов для интеграции их в единую систему. Дополнительным примером такого расширения служит обслуживание web сайта для отображения данных и ввода команд.
Программные модули-клиенты
В комплект основных клиентских программ входят как "скромные" приложения, имеющие ограниченную функциональность, так и программы-монстры, решающие большой круг задач. Такое разделение, с одной стороны, было сделано исходя из необходимости использования дополнительных библиотек, доступных не на всех платформах. С другой, многофункциональные программы потребляют меньше трафика на обращение к серверу - они забирают сразу все возможные типы запросов в одном обращении.
sh-robot
Программа предназначена только для обслуживания низкоскоростных коммуникаций и поддерживает низкоскоростные протоколы обмена по сетям RS-485. Дополнительно, в зависимости от платформы, может обслуживать линии 1-wire, собственные извращенные последовательные порты raspberry pi и его клонов, а так же псевдо-сенсоры обращения по ftp (для полоумных гаджетов, сигналящих о событии посредством обращения к ftp серверу). Настройки обслуживаемых линий осуществляются в главной Базе Данных (БД) и автоматически обновляются через заданный интервал (по умолчанию - раз в минуту).
Пауза между запросами к серверу указывается в качестве параметра командной строки и по умолчанию равна 250 мс - достаточно для комфортной отработки команд. Для клиентских устройств, минимально взаимодействующих с человеком (какой-нибудь автополив), в целях экономии трафика, этот интервал можно значительно увеличить.
Не используя никаких дополнительных библиотек, программа свободно работает на любых вменяемых ОСях (я сейчас про отсутствие надстройки над надстройкой) на процессорах имеющих архитектуру intel, arm, mips (различные варианты сборки).
sh-cams
Отдельный модуль для обработки изображения с IP камер видео наблюдения, имеющих возможность формировать на выходе картинку в формате JPEG.
В его задачи входит сбор изображений с камер, размещенных в локальной сети, и формирование дополнительного изображения для предварительного просмотра. Таким образом, снижая нагрузку на главный сервер системы. Обработка и передача картинок ведется по запросу от главного сервера.
Приятной особенностью данной программы является относительно малый временной лаг (при достаточной мощности процессора). Это достигается благодаря гибкой системе обновления запросов и сохранением неразрывного соединения с камерами-источниками, что значительно уменьшает время, необходимое на авторизацию.
В командной строке программы задаются:
- url сервера;
- интервал опроса сервера в режиме ожидания запросов;
- интервал опроса во время активной работы.
Как и sh-robot, программа практически всеядна по платформам, за исключением некоторых реализаций mips.
sh-speaker
Представляет собой интерфейс передачи текстов от сервера к TTS системе. По сути, может быть сделана и на bash скриптах, но ввиду наличия уже созданных библиотек, собрана как исполняемый модуль. Базовая реализация использует TTS Festival, но может работать с любой системой озвучки текста.
Так же всеядна по платформе, как и предыдущие (лишь бы там присутствовала какая-нибудь реализация TTS).
sh-goblin и sh-goblin-sphinx
Свое название (hobgoblin) получила за свойства, присущие домовым, - подслушивает, подсматривает и исполняет вежливые просьбы жильцов, хоть иногда и шалит...
Программа включает в себя весь функционал уже описанных, с небольшими изменениями и дополнениями. Она, благодаря мультимедийному фреймворку FFMPEG, способна работать не только с сетевыми камерами, но и обслуживает локальные ресурсы мультимедиа - микрофоны, usb web камеры, аналоговые видео входы. Два варианта сборки имеют отличия в способности распознавания голосовых команд. Второй вариант опирается на дополнительную библиотеку PocketSphinx, имеющую реализации отнюдь не под все платформы, хоть и достаточно распространенную.
Кроме того, по команде с сервера, она может записывать фрагменты видео потока в отдельные файлы, что может оказаться весьма полезным для организации простенькой системы видео наблюдения с внешним управлением по событиям.
В отличии от sh-cams, домовой не поддерживает связи с опрашиваемыми IP камерами. Сделано это для минимизации количества потоков внутри программы. В результате, увеличивается временной лаг, но все еще в приемлемых границах. Однако, благодаря своей мультимедийной начинке, программа способна поддерживать более тесные отношения с камерами, постоянно читая их видео поток и мгновенно формируя картинки по запросу от сервера. В этом режиме, задержка зависит от наличия звука в потоке от камеры (замедляет формирование сигнала на накоплении сэмплов в буфере для сжатия) и от типа кодека. В случае трансляции MJPEG без звука, задержка практически отсутствует.
Кроме параметров командной строки, программа имеет два настроечных файла: sh-hobgoblin.ini и sh-hobgoblin-inputs.ini. Первый банален - содержит общие настройки программы, а второй гораздо забавнее - в нем прописаны источники мультимедиа, обрабатываемые постоянно. При запуске, домовой подключается к ним и выполняет требуемые действия - слушает звуки и гоняет видео. Причем, прослушка команд может выполняться не только с локальных микрофонов, но и с удаленных IP камер, что позволяет покрыть сетью звуковых датчиков достаточно большое пространство.
Голосовое управление - не игра (как я когда-то думал), а вполне ощутимый кусок комфорта. Но и ему присущ некий недостаток - наш домовой не любит лишнего шума. Это может вызвать как ложные срабатывания (шалит паршивец!), так и замедлить реакцию на команды (программа ждет тишины, как окончания фразы). Естественно, хоровое управление также невозможно.
Платформы - любые, поддерживающие FFMPEG, и, в случае необходимости распознавания речи, CMU PocketSphinx.
sh-client
Пользовательский интерфейс системы, работающий в linux и windows. Небольшая иконка в трее открывает доступ к полноразмерному изображению с камер и спискам состояний датчиков.
Умеет разговаривать (сквозь Festival), булькать музыкой, управлять монитором (если лень возвращаться и выключать его руками).
Для работы в Unity (Ubuntu), требует установки libappindicator1
az.wilhelm.ShConsole
Ну где вы видели "умный дом", без загадочных экранчиков на стенах? Неважно, насколько это функционально, но этот атрибут из раздела "must have". Я использовал PocketBook Surfpad-2 в качестве такой игрушки. Низкое энергопотребление и ничего лишнего - сенсорный экран, динамики и wi-fi. Сожаления вызывает только платформа - ведроид.
Тем не менее, под него была написана "программа" обслуживающая отображение камер, подачу звуковых сигналов и передачу серверу информации о нажатых кнопках. Скромно, но функционально.
В режиме бездействия, аплет изображает из себя настенные часы.
Вычислительная техника
В моем случае, решение с сервером было предопределено его наличием вне зависимости от присутствия домовых - он у меня работает для прокорма семьи. Посему все мои действия по внедрению системы "умный дом" свелись к установке необходимого набора программного обеспечения. Оно достаточно компактно и нетребовательно к ресурсам.
Что до минимальных требований к технике, я бы рекомендовал для развертывания ядра системы платформу intel Atom или даже AMD Embedded G-Series SoC. Это устройства с низким энергопотреблением и высокой надежностью, в то же время, обеспечивающие достаточные вычислительные мощности.
В качестве тонких клиентов (если таковые понадобятся) подойдет практически что угодно - любая ончип система с вменяемой архитектурой (не суперхитачи какой-нибудь!). Raspberry pi, orange pi, banana pi, с raspbian или armbian на борту - вполне сгодятся не только в качестве клиентов, но могут выполнять и функции основного сервера. По самому минимуму, тонкими клиентами могут служить даже тюнера с микроконтроллерами arm или mips структуры. В частности, спутниковые тюнера GI-7000 и Formuler F4 (OpenBox) прекрасно справляются с этой задачей.
Расходы на установку системы видео наблюдения могут быть значительно снижены за счет использования аналоговых или usb камер, стоимость которых значительно ниже, нежели у IP камер (даже китайского производства).
Что до результирующего энергопотребления, надо помнить, что вычислительная техника в данном проекте используется минимально и основные задачи выполняются контроллерами линий управления и самими устройствами, потребление которых лежит в диапазоне 100..500 милливатт.