Когда все провода проложены, выключатели установлены, электрический щиток сделан (все это описано в первой части), то можно приступать к самому интересному — программированию контроллера. Так как я использовал не специализированный контроллер для умного дома, а контроллер из промышленной автоматизации, то программировать приходилось с чистого листа — есть входы, есть выходы, все остальное нужно программировать — что делать по нажатию на кнопку (выключатель без фиксации), как запрограммировать диммер, сценарии и т.д.
Но обо всем по порядку. Изначально архитектура моего умного дома включала следующие компоненты:
модуль аналогового вывода МУ110-6У (используется для управления диммерами)
модуль ввода аналоговых сигналов МВ110-8А (добавился позже для снятия показаний с датчиков).
Все это вместе связано по RS-485 и проколу Modbus RTU. Основной контроллер подключен к Ethernet для связи с внешним миром.
Для управления с телефона изначально я использовал Iridium Mobile, которые мне любезно предоставили производители (да-да, использование служебного положения в личных целях!). В последствии я его заменил на веб-сервис на базе Node JS. Также позже добавилось беспроводная часть на базе z-wave. Про все это я планирую написать отдельно, а пока возвращаемся к нашим овцам.
Программирование контроллера осуществляется в среде CoDeSys, которая поддерживает 5 специализированных языков, из которых я освоил два — FBD (Язык функциональных блоков) и ST (Pascal-подобный язык). Собственно, изначально я думал довольствоваться только FBD, так как программирование на этом языке выглядит как составления диаграмм в редакторе.
Так вот выглядит в FBD подпрограмма (или правильнее функциональный блок) обработки выключателя в коридоре. Кроме включения и выключения света в коридоре этот выключатель используется для выключения света во всей квартире. Одиночное нажатие переключает свет в коридоре, а длительное нажатие (1 сек) активирует команду погасить весь свет.
По мере добавления новых и новых функций и возможностей, я пришел к выводу, что язык функциональных диаграмм вовсе не такой уж удобный — получается громоздкий код, программирование идет медленно, а отлаживать очень неудобно. Поэтому постепенно я переключился на язык ST и к языку FBD больше не обращаюсь.
Для сравнения вот так вот выгляди кусок функционального блока диммера на языке ST (согласитесь, совсем другое дело!):
Раз уж речь зашла про диммер, то про него нужно рассказать особо. Как оказалось, совсем не просто найти подходящий диммер (железо) для умного дома. Всевозможные беспородные варианты я не рассматривал, так как весь базовый функционал должен быть реализован на проводных технологиях — об этом я уже писал ранее. Ценник на диммеры, которые мне попадались меня не радовал. Плюс нужно было обеспечить совместимость с моим умным домом. Вначале я остановился на INSYTE LDD-400D, с управлением по ModBus, что позволяло подключись его напрямую к контроллеру без дополнительных модулей, но знакомые, которые его использовали в своих проектах, как-то не очень хорошо о нем отзывались, и в результате я решил вопрос с диммером так — поставил твердотельное реле.
Реле управляется (через модуль аналогового вывода) сигналом 0-10В и выдает на выходе 10-220В соответсвенно. Обратите внимание на то, что минимальное напряжение на выходе у твердотельного реле не 0, а 10В — при таком напряжении спираль у лампа накаливания заметно светится. Эта проблема решается так: в цепи кроме твердотельного реле стоит и обычное промежуточное (механическое) реле, а на программном уровне, когда нужно полностью погасить свет контроллер выключает промежуточное реле и разрывает цепь.
Вторая сложность с организацией диммирования света — это как сделать удобный интерфейс с учетом того, что в качестве управления у меня используется обычный выключатель без фиксации.
Первый вариант интерфейса выглядел примерно так (сейчас уже не помню точно):
короткое нажатие — включение или выключение света (включался свет на последнем уровне яркости)
долгое нажатие при включенном свете — плавное уменьшение яркости, а потом проходя через ноль увеличение
долгое нажатие при выключенном свете — плавное увеличение от нуля
двойное нажатие включение света на полную яркость.
С этим вариантом я жил несколько месяцев, но потом пришел к выводу, что он все-таки не очень-то удобен и чаще всего используются только 3 режима — свет включен, свет выключен или свет включен на минимальную ярость. Поэтому я реализовал более простой дискретный вариант (который остается до сих пор):
короткое нажатие — включение/выключение света (включается на полную яркость)
длинное нажатие — включает свет на 25% яркости и переводит в режим диммера;
каждое следующее нажатие переводит на следующую ступень +25%. Выход из режима диммера — по таймауту.
Как я уже говорил в предыдущем посте, управление одиночными кнопками без фиксации — все-таки не лучшее решение. Кроме примера с диммером, который я только что привел, я еще реализовал сложный сценарий включения света в гостиной. Мы предпочитаем не использовать верхний свет в гостиной и сразу включаем настольную лампу и подсветку в шкафу. Я автоматизировал этот процесс и сейчас управление светом в гостиной выглядит так:
одно нажатие (если лампа выключена) — включает лампа и подсветку
одно нажатие (если лампа включена) — включает или выключает верхний свет
одно нажатие сразу за вторым (когда выключился верхний свет) — гасит настольную лампу
длинное нажатие — выключает весь свет в комнате
Первые два пункта этого сценария — очень подходят с точки зрения модели поведения. Последний пункт сделан по аналогии с коридором. Третий пункт весьма спорен и не используется. Проблема заключается в том, что семья с ворчанием, но придела этот сценарий, но вот ни один гость со светом не справится. Поэтому для сценариев нужны либо сенсорные панели, либо многофункциональные кнопки.
В системе CoDeSys есть возможность сделать визуализацию и панель управления. ПЛК110 не поддерживает веб-интерфейс, поэтому визуализация работает только в самом комплексе CoDeSys.
Вот так вот выглядит техническая панель управления моим умным домом. Техническая, потому что в повседневной жизни ей никто не пользуется. За одним маленьким исключением — эта панель служит удаленным интерфейсом для управления умным домом. Если мне надо что-то сделать удаленно, то я захожу через TeamViewer на домашний сервер и использую эту панель. Такая необходимость возникает очень редко, поэтому настраивать удаленный доступ для веб-сервиса я даже не стал.
В заключение плюсы и минусы.
Плюсы:
Надежность — решение зарекомендовало себя очень хорошо (все-таки оно построено на компонентной базе, которая используется для промышленной автоматизации). За все время не было ни одного (!!!) сбоя. Даже после скачков напряжения, система запускалась без каких-либо проблем.
Более низкая цена по сравнению с системами домашней автоматизации (уверен, можно найти вариант решения еще более дешевый, но меня вполне устраивал текущий бюджет и дальнейшее снижение цены для меня было не принципиальным).
Два самых больших недостатка на мой взгляд:
программировать нужно все самостоятельно и решение оказывается неотрывно от создателя
сопряжение с внешним миром по протоколу Modbus TCP — в результате архитектура решения стала достаточно избыточной и по факту сейчас у меня в системе умный дом задействовано три контроллера (но об этом в следующий раз)
Как я уже говорил в первой статьей, сейчас бы я более внимательно посмотрел в сторону альтернатив, но, если вдруг кому-то захочется изучить это решение, то исходный код, сделанный в среде CoDeSys, я выложил на github. (только будьте, пожалуйста, снисходительны к качеству кода.
В следующих частях — управление с телефона и беспроводные решения.