...

вторник, 15 июля 2014 г.

Никогда не «не делай» того, о чем пожалеешь или умный дом с CCU.IO

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

Хочу представить программную платформу автоматизации для дома на базе Node.js, которую можно скачать со всеми исходниками и установить прямо сейчас практически одним кликом (Windows) или одной командой (Linux/Debian).




У некоторых возникнет, вполне уместный вопрос: зачем мне (нам) рассказывать о своей системе?


Я вижу с какими «половинчатыми» решениями живут энтузиасты автоматизации домов и хочу предложить законченное решение для комплексного программного обеспечения автоматизации дома. От драйверов — до скриптов и визуализации. Все компоненты системы имеют лицензию либо MIT либо CC NC BY. Что значит, для не коммерческого использования абсолютно бесплатно, хотя система включает в себя 3 человека-«хобби»-лет разработки. Я сам инвестировал в систему 1 год разработки по 2 часа в день (каждый день, включая выходные).


Для понимания контекста можно прочитать первые три абзаца предыдущей статьи. Данная статья является продолжением.


Вступление



Представленная система — это уже третья итерация системы автоматизации в моем жилище.

Первая была: X10 + HTTP Requests,

вторая: HomeMatic + PHP/MySQL (про них можно почитать в предыдущем моём посте)

и вот третья: HomeMatic + NodeJS / JavaScript.


Разработка этой системы началась в январе 2013, хотя активный рост начался в мае 2013 и сейчас над системой регулярно (каждый день) работают 3 разработчика и рук на всё уже не хватает.


Лирическое отступление



Можно не читать
Когда я созрел для следующего шага в написании веб интерфейса для умного дома, я уже знал, что будущая система должна уметь в любом случае:

— она должна быть легко изменяемой и дополняемой;

— желательно было не привлекать для проектирования дополнительный софт, а все проделать в браузере.

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

1. Jarvis



http://ift.tt/Wdp49x — (может упасть из-за нагрузки).


2. HCS — Home Control Suite (http://ift.tt/U5gAiE)


3. Dash UI


Jarvis выглядит очень презентабельно. Человек, написавший этот интерфейс профессионально работает веб дизайнером. Но при более детальном изучении выяснилось, что это PHP+Apache+SQL, а главное, что положение+конфигурация всех объектов задана статически в HTML файле. А это мы уже проходили: при добавлении нового датчика нужно править HTML файл и потом муторно подгонять позиции и свойства объекта, через CSS или свойство style, т.к. визуальных средств проектирования для этой системы нет.


Home Control Suite написал тот же человек, что и основы моего прошлого интерфейса (http://ift.tt/P0BI1r). Он, видимо, тоже пришел к таким же заключениям, как и я, и уже год как работал над новой системой. Протестировав систему я понял, что это то что нужно, хотя настройки виджетов вызывали нарекания. Ничего, решил я: JS + PHP + SQL мы уже проходили и можно будет переписать или улучшить интерфейс до необходимого мне уровня.


Dash UI я протестировал тоже, но она была непрезентабельной и была на неизвестной мне платформе Node.js. На тот момент она разрабатывалась только 2 месяца, что тоже не внушало уверенности.


Попутно я выяснил, что разработчик HCS живет в моем городе. Какая удача, решил я: вот тут то мы сработаемся, тем более можно без труда встретиться и обсудить все offline. Хотя разработчик DashUI жил в соседнем городе, всё равно это было расстояние в 80 км и после работы уже просто так не встретишься.

Написав человеку с HCS о желании встретиться и о том, что не мог бы он выложить исходники куда нибудь на SVN, я получил ответ, что звонить не стОит, т.к. можно все обсудить по почте, а уж встречаться тем более смысла нет. Также он дал мне знать, что исходники я могу выложить сам, но он не обещает, что будет этим пользоваться. Хм…

Я написал человеку с DashUI и тут же получил письмо с ответом, что лучше всё обговорить по телефону, т.к. тема эта не простая. Мы прообсуждали час, потом у меня сел аккумулятор.


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


Хорошо, решил я, думая про HCS: не хочешь, не надо.


И взялся за Dash UI.


Прошёл год.



CCU.IO + Dash UI активно разрабатывает команда из 3х человек с уже 200-300 пользователями. HCS разрабатывает по прежнему один и имеет от силы 10 пользователей (Должен признаться я сам потом переманил 3-х на Dash UI).

При поездке на конференцию по автоматизации, разработчик Dash UI вызвался подбросить меня и разработчика HCS до места проведения конференции. Благо мы все на неё собирались. По дороге туда и на конференции (мы, кстати, делали там доклад) и по дороге обратно человек, отказавший мне в кооперации, был вынужден слушать наши обсуждения, планы, проблемы, задачки пользователей — постоянно. После того как мы приехали с конференции обратно, он сказал: «Ах как бы я хотел участвовать в проекте, как ваш. Жалко, что я тогда не позвонил...»




Описание системы




Цитата из документации:


CCU.IO это программа, написанная на Node.js и служащая для автоматизации различного домашнего (и не очень) оборудования.

При помощи встроенного веб-сервера CCU.IO выступает платформой для визуализации и позволяет отображать события с использованием Socket.IO библиотеки. Нет постоянных запросов к серверу (no-polling), а сервер сам говорит, когда нужно обновить графический элемент. Ресурсоёмкий процесс постоянных запросов отпадает и таким образом уменьшается время реакции на события. Дополнительно CCU.IO выступает, как прокси между визуализацией и приборами. Не важно, сколько запущено копий визуализации, нагрузка на приборы всегда одинаково низкая.


Можно подключать новое оборудование через, так называемые, драйверы. На данный момент существуют драйвера для Philips Hue, Sonos, IRTrans, подключение к базе данных MySQL, а также различных веб-сервисов (Погода, валюта, почта, pushover). Некоторые новые драйвера находятся в разработке или запланированы на ближайшее будущее.


Интегрированный в CCU.IO механизм скриптов позволяет автоматизировать системы при помощи языка JavaScript. Все возможности среды Node.JS можно использовать и в скриптах (например доступ к дисковой системе, сетевые функции и т.д.) Также можно использовать огромное количество готовых библиотек через npm.


CCU.IO это открытое программное обеспечение.



Взаимодействие компонентов можно представить таким образом:


Компоненты системы:


CCU.IO



1.CCU.IO — это ядро системы. Название CCU (Central Control Unit) пришло из HomeMatic, где CCU это центральный контроллер и gateway для связи по ethernet.

В данный момент ядро переписывается, что бы уйти от архитектуры HomeMatic и т. к. уже в сегодняшнем виде система поддерживает и другие системы автоматизации, то новая будет называться ioBroker.

Ядро написано на NodeJS/JavaScript и может быть запущено на почти любой платформе, для которой есть NodeJS бинарники. В настоящий момент высокая степень интеграции создана для Raspberry PI. Известно точно, что пользователи запустили систему на Windows, OSX, QNAP (ARM/Intell) Synology, Cubietrack, BananaPI, Odroid, Ubuntu (x86) und Debian.

CCU.IO является только связующим звеном между компонентами. Из него же происходит запуск драйверов (adapters) с указанными параметрами.

GitHub: http://ift.tt/U5gyav


Драйвера



2. Драйвер или адаптер — это JavaScript файл, запускающийся в отдельном NodeJS процессе и обслуживающий одно устройство или службу. На данный момент созданы следующие драйвера:






















































































































































































emailдля отправки сообщений по электронной почте
pushoverдля отправки сообщений на мобильные клиенты (http://pushover.net)
mysqlзапись событий в базу данных
graphiteпересылка событий в graphite (http://ift.tt/YbRO0u). Группировка данных в мыслимых и немыслимых формах и их отображение в виде графиков.
icalGoogle и Apple iCloud календари
geofencyподдержка Apple системы геолокации geofency
growlсообщения на Apple Growl App
currencyкурсы валют с европейского центрального банка. (Есть EUR-RUB и USD-RUB)
telnetуправление приборами по telnet протоколу
pingпингует IP устройства в сети
lircдля управления приборами и принятия команд по инфракрасному порту (требуется дополнительное железо)
irtransподдержка IRTrans инфракрасной системы (http://ift.tt/1ki8yLC)
hueуправление PhilipsHUE лампами
lgtvуправление LG телевизорами по сети
denonуправление DENON ресиверами
onkyoуправление ONKYO ресиверами
yamahaуправление YAMAHA ресиверами
sonosуправление SONOS системой звука
dreamуправление DreamBOX спутниковыми ресиверами (http://ift.tt/Wdp49F)
owfsOne Wire File System (http://owfs.org/) — сбор данных с датчиков Dallas/Maxim по 1-Wire
B-control Energy Managerмониториг расхода электроэнергии http://ift.tt/U5gAiQ (нет описания на английском)
all3418v2 — ALLNET ALL3418v2 / IP Thermometer LAN / WLANбеспроводной термометр — http://ift.tt/Wdp4pT… r-lanwlan/
homepilotуправление системой автоматизации Rademacher.
homematicуправление системой автоматизации HomeMatic (встроено в CCU.IO).
regoмониторинг котлов Junkers TM75, IVT Rego 634
megaDподдержка MegaD-328.
rpiмониторинг основных параметров (CPU, Mem, Temperature) RaspberryPI. Поддержка 1-Wire интерфейса и PiFace.
cubieмониторинг основных параметров (CPU, Mem, Temperature, Battery) Cubietruck.
sayitголосовые сообщения (text2speech или wav) на системе(Linux, Windows, OsX) или android планшете (через Home24 Mediaplayer — http://ift.tt/1mteFil… ayer&hl=ru).
textCommandsинтерфейс для команд, заданных обычным текстом (Пример: Какая температура дома?)
owmOpenWeatherMap (http://ift.tt/ScoM9f) — погода по всему миру
yrпогода с норвежского сервера www.yr.no/
dwdофициальные предупреждения о штормах в Германии
fritzBoxотображение списка звонивших для fritzBox
speedportотображение списка звонивших для speedport
sun_and_timeвремя захода и восхода солнца, а также праздничные дни для Германии
muell_stuttgartвремя вывоза мусора в Штутгарте

Создать собственный драйвер со знаниями системы, для которой создается адаптер, не составляет труда. Конечно, знания JavaScript на много облегчат задачу.

Есть демо драйвер с большим количеством объяснений из которого можно понять: как писать собственный драйвер.


Script Engine



3. Сценарии реакций на события (Собственно — автоматизация)

Script Engine тоже запускается в своем процессе, как драйвер и служит для выполнения пользовательских скриптов на JavaScript. Все скрипты лежащие в папке ccu.io/scripts будут запущены. Управление происходит следующим образом:

// Простые события
var swicthID = 79111; // Адрес кнопки
var actorID = 80187; // Адрес силового реле

// подписываемся на нажатие кнопки
on(swicthID, function (obj) {
// передаем состояние на реле
setState(actorID, obj.newState.value);
});

// Можно так. Значение из адреса 79111 при изменении запишется в устройство или переменную по адресу 80187
on(79111, 80187);



Вот пример посложнее:



var postboxTimer = null;
var postboxSensorID = 61555; // ID датчика на почтовом ящике
subscribe(postboxSensorID, function (obj) {

// Если таймер ещё не запущен
if (!postboxTimer) {

// Стартуем таймер на 30 секунд, что бы отбросить быстрые открытия/закрытия
postboxTimer = setTimeout(function () {
postboxTimer = null;
}, 30000);

// Увеличиваем счетчик
setState(postboxStateID, 1 + getState(postboxStateID ));
}
});

// При старте создаем собственную переменную в CCU.IO
setObject(postboxStateID , {
Name: "Postbox.State",
TypeName: "VARDP"
}, function () {
setState(postboxStateID , 0);
});


Описание функций можно взять на git.


Для SctiprEngine написана визуальная система создания скриптов ScriptGUI, где всё программирование происходит визуально.


http://ift.tt/U5gAzb — Внимание, видео на немецком



В данный момент перевод идет полным ходом. Это снимок с незавершенным переводом, но кое что уже переведено.


Dash UI



4. Дополнение Dash UI (Читается Дэш-ЮАЙ) это система визуализации для умного дома.

Вот примеры интерфейсов созданных с помощью DashUI:







По адресу DashUI.ccu.io их можно потыкать и посмотреть на скорость. Хочу заметить, что отображение графиков и таблиц не работает в оффлайн режиме, так что не удивляйтесь, если некоторые страницы окажутся пустыми.


Есть даже такие реализации(в стиле Star Trek):



Есть видео создания простенького интерфейса с чистого листа:


Вот ещё несколько видео:

http://ift.tt/Wdp3CA — Примеры

http://ift.tt/Wdp4Gp — Голосовые сообщения на немецком


Открыть дверь по NFC тэгу


Недостатки дополнения в том, что интерфейс не масштабируется автоматически под экран. Но с другой стороны можно нарисовать 2 интерфейса: для таблета / десктопа и для телефона. Как многие и делают.


GitHub: http://ift.tt/Wdp4Gr


MobileUI



5. Дополнение MobileUI в данный момент называется Yet another home user interface — yahui. Но мне название режет ухо и мы скоро переименуем его в MobileUI.

Этот интерфейс выглядит в виде списка устройств. Можно назначить каждому устройству или комнате собственные картинки или переименовать. На этом конфигурация системы закончена.




Это дополнение (Add-on) использует jQuery Mobile и автоматически изменяется, в зависимости от устройства, где вызвана страница.


SlimUI



6. Интерфейс SlimUI — система веб визуализации на «Vanilla» Javasript для очень старых браузеров и слабых устройств. Никакие библиотеки (jQuery или подобные) не используются. Данные опрашиваются по таймеру (polling), а команды отдаются через RestAPI (SimpleAPI).

GitHub: http://ift.tt/U5gAPJ


SimpleAPI



7. SimpleAPI — Интерфейс основанный на HTTP-GET запросах вида:

http://ccu-io-host:ccu.io-port/api/get/950

где 950 — это индекс переменной из CCU.IO.


Ответ отдается в JSON формате или просто значение, как текст.

Управление выглядит вот так:



http://ccu-io-host:ccu.io-port/api/set/950/?value=1
http://ccu-io-host:ccu.io-port/api/set/Свет-кухня/LEVEL/?value=0.7


Используется для коммуникации CCU.IO с внешними программами, такими как Trigger или Tasker. Я, например, использую интерфейс для открытия замка двери по NFC тэгу, через Trigger.

Описание интерфейса можно взять на git.


CCU.IO-Highcharts



8. Дополнение CCU.IO-Highcharts.

Рисование графиков используя исторические данные, сохраненные CCU.IO.



GitHub: http://ift.tt/Wdp4Gx


Дополнение CCU.IO-Eventlist



9. Дополнение CCU.IO-Eventlist.

Используется для отображения событий записанных CCU.IO


Graphite



10. Адаптер Graphite.

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


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


Эта система довольно объёмна и на мой взгляд требует отдельной статьи на хабре. Странно, что Graphite ещё ни кто не описал здесь.


http://ift.tt/YbRO0u

http://ift.tt/Wdp4GB


Реальное применение




Конечно, CCU.IO установлена у меня дома.

Даже дважды: рабочая система на Odroid/Linux (она редко изменяется и обновляется) и тестовая система на RaspberryPi (перезагружается и изменяется по несколько раз за вечер)

Системы работают параллельно не мешая друг другу и обеспечивают высокую доступность (redundancy) сервиса.


Лично мной используются следующие дополнения и драйвера:

Dash UI для визуализации на планшете и удаленного управления с телефона;

Highchart для представления графиков температур и влажности в визуализации;

Eventlist для отображения истории событий по одному датчику, например открытие/закрытие входной двери;

Script-Engine для генерирования текстовых сообщений для pushover, и вообще для связывания событий с действиями на эти события;

HomeListener App для управления голосом с таблета или телефона


ping для определения присутствия жены членов семьи дома. По IP адресу мобильного телефона можно определить — дома человек или нет;

pushover для текстовых сообщений на телефон: «Звонок в дверь», «Стирка закончена» или «Входная дверь открыта уже 10 минут. Надо проверить.»;

ccu для управления светом, рольставнями и отоплением. Информация о температуре и влажности, в каждой комнате и на улице, тоже поступает через этот драйвер;

ical для отображения запланированных событий и дней рождений на экране планшета;

sonos в основном, для индикации состояния проигрывателя, т.к. с родного приложения управлять удобнее;

fritzbox для получения списка звонков на домашний номер;

yahooWeather для информации о погоде;

lgtv для выключения телевизора при уходе из квартиры;

sayit для голосовых сообщений на планшете;

rpi для контролирования свободного места на RaspberryPi.

textCommands как точка подключения HomeListener App


Но это далеко не полный список сервисов, которые можно было-бы задействовать. Из-за огромного количества времени, уходящего на поддержку и разработку CCU.IO, нет возможности поиграться и реализовать систему на полную.

Как говориться: сапожник без сапог :)


Вообще я управляю системой редко. Она просто тихо мониторит все события и отдает по-тихому команды на исполнение: отопление, свет по датчику движения, информирует сообщениями о происходящем дома.


Итог




При помощи CCU.IO можно соединить воедино все компоненты умного дома и управлять ими. Можно создать различные визуальные графические интерфейсы или управлять системой через HTTP вызовы.

Есть даже интеграция голосового интерфейса, правда google тогда будет знать о чем говорят дома. (Ведётся проверка возможности использования оффлайн распознавания)


Ссылки

P.S.

Всегда завидовал аллизарам и компании, строчащим по 2 поста в день.

Написание 80-ти процентов этой статьи заняло 3 дня. Плюс 3 недели на доработку, дополнение и перевод документации.


При написании статьи были обнаружены следующие похожие проекты (некоторые были известны и до этого):

Node-RED — установленный локально IFTT (if than than that) Node.js проект. Недостатки: нет визуализации, хотя очень продуманный проект от инженеров IBM.

SmartVISU — красивая визуализация. Недостатки: заточен только под KNX устройства и компоновка/конфигурация виджетов только через конфигурационный текстовый файл.

MajorDoMo — визуализация и автоматизация. Недостатки: PHP и polling событий. Нет возможности писать сложные драйвера, т.к. нет таймера. Cron не в счет.

OpenHUB — сервер автоматизации на Java. Недостатки: рудиментарная визуализация

OpenRemote — ещё один сервер автоматизации на Java.

и десятки других проектов.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий