Добрый вечер!
Предлагаю вашему вниманию проект, над которым я работаю последние полтора года. Это программный продукт (если быть точным, .NET Windows Service), с помощью которого вы можете организовать на своем компьютере управляющий центр «умного дома». Хотя это всего лишь мое хобби (моя основная работа — веб-разработчик на .NET), многие люди, которым я показывал мой проект, высоко его оценили. Я пишу эту статью, чтобы попробовать заинтересовать вас.
Предыстория
Если набрать в гугле «умный дом», можно увидеть кучу сайтов, с предложениями «установить его под ключ». И хотя эти решения часто выглядят футуристически, почти всегда они решают проблемы, высосанные из пальца. Более того, в большинстве случаев функционал таких умных домов сводится к дистанционному управлению устройствами (например, с планшета).
На мой взгляд, «умный дом» — это то, что самостоятельно принимает решения по управлению домашними устройствами на основе поступающей извне информации (например, с датчиков) и заранее настроенных правил. Кроме того, я считаю, что умный дом должен взаимодействовать не только с устройствами, но и с интернет-сервисами (в принципе, в последнее время так, кажется, начали считать почти все).
Началось все пару лет назад со статьи на хабре об Android-приложении on{x}. Оно позволяет навешивать определенную логику на различные события в телефоне. Например, оно может отправить смску жене, когда вы выходите с работы. «Automate your life» — написано на их сайте. «Вот штука, о которой я всегда мечтал!» — подумал я тогда. «Но я хочу такую для своего дома, а не для телефона».
Далее был почти год экспериментов и программирования, в результате чего появилась первая версия приложения. Там было много недоработок и почти не было пользовательского интерфейса, но, главное — она умела то же, что on{x} — управлять домом по сценариям. Из железа поддерживались только силовые блоки nooLite и IP-камера D-Link DCS-932L.
Сейчас
На прошлой неделе я закончил работу над второй версией приложения. В новой версии были сильно переработаны внутренности системы и появилась инфраструктура для пользовательского интерфейса. Также было написано несколько модулей, которые пользователи могли бы «из коробки» использовать в повседневной жизни: «планировщик-будильник» и «прогноз погоды».
По сравнению с первой версией, разработка заняла меньше времени (примерно пол года), но объем проделанной работы оказался значительно больше. Отчасти это из-за того, что, впечатленный статьей из блога Джона Резига, я устроил трехмесячный «марафон» с ежедневным написанием кода.
Плагины
Система состоит из «ядра» и модулей (плагинов). По сути, ядро содержит только механизм подключения модулей и инфраструктуру для них (чтобы они могли описывать свой API и события, а также использовать API и подписываться на события друг друга). Также в ядре находится базовый функционал вроде логирования и средств доступа к системной БД.
Весь остальной функционал реализован в плагинах. Даже такие вещи, как сценарии и веб-интерфейс — всего лишь плагины (если их отключить, система будет и дальше нормально работать, хотя некоторые ее возможности исчезнут). Технически, плагины — это скомпилированные DLL, написанные на C# или другом .NET языке.
Управление по сценариям
Управление домом по сценариям — основное назначение системы. Сценарии — это небольшие программы, управляющие домашними устройствами и взаимодействующие с интернет-сервисами. Сценарии пишутся на языке JavaScript (вы все еще не любите JavaScript?) через веб-интерфейс и выполняются на стороне сервера. Внутри сценариев доступен API для управления домом, который может быть расширен с помощью плагинов.
В системе можно настроить автоматический запуск сценариев при возникновении определенных событий. Событие — это срабатывание датчика, сигнал с таймера, нажатие на кнопку или, например, получение сообщения в твиттере. Новые события, как и новые команды API, можно добавить с помощью плагинов.
Управление через веб-интерфейс
В первой версии интерфейса почти не было. Стоит ли говорить, что это делало систему практически недоступной для большинства людей? Именно разработка интерфейса была основной задачей второй версии системы.
Веб-интерфейс системы — модульное одностраничное приложение на основе backbone.js и marionette.js, модули загружаются через require.js. Для верстки используется Bootstrap, благодаря которому все выглядит аккуратно и корректно отображается на маленьких экранах мобильных устройств.
Плагины могут описывать свой собственный UI в виде js/css файлов, находящихся в ресурсах DLL. При установке плагина в систему его UI автоматически встраивается в веб-интерфейс управления домом (добавляется новый раздел). Например, вот так выглядит интерфейс плагина «прогноз погоды».
Документация
На мой взгляд, одна из особенностей моего проекта, отличающая его от других подобных систем — наличие подробной документации на русском языке. Посмотрите сами.
На ее написание ушло много сил и времени (почти 3 месяца). Было очень тяжело не давать себе программировать новый функционал, пока не написана документация к уже готовому. Но написание документации дало также положительный побочный эффект. Пришлось взглянуть на проект со стороны его пользователя, благодаря чему было выявлено и исправлено большое количество недоработок.
Еще один побочный эффект — во время работы над проектом я узнал новое о .NET и веб-разработке. Читая документацию, что-то новое, возможно, узнаете и вы.
Вместо заключения
Я думаю, умный дом должен автоматизировать рутинные задачи людей. Но у каждого человека свои привычки и задачи, которые он хотел бы автоматизировать (а также разное «железо»). Если реализовать хотелки всех людей, получится громоздкая неудобная система, в которой каждому конкретному человеку 90% функционала будет не нужно. Кроме того, ее невозможно реализовать без большой команды программистов за короткое время. Вместо готовой гигантской системы я хотел сделать инструмент, с помощью которого можно собрать собственную маленькую систему домашей автоматизации. Что-то типа конструктора, к которому можно подключить, например, собственные устройства на Arduino и при этом не заниматься самостоятельной реализацией инфраструктуры и общего функционала.
Попробуйте установить приложение и написать собственные плагины (это очень просто). Напишите об ошибках и присылайте пулл реквесты. Добавляйтесь в нашу группу вконтакте, чтобы быть в курсе новостей проекта. Мне будет очень приятно, если вам понравится!
Автор: dima117