Pull to refresh

HOMEd: A почему «d»? Чтобы никто не догадался

Reading time5 min
Views11K

Это случилось обычным воскресным вечером, лет 15 назад. Завтра - понедельник, на работу, значит пора ложиться спать. По всей квартире горит свет, надо идти выключать, но лень! Хочу чтобы одной кнопкой все выключалось! Знакомая ситуация, не правда ли?

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

Это был долгий путь, все начиналось с изучения базовой схемотехники, основ языка C и микроконтроллера STM32F100, к которому, при помощи развешанной по всей квартире витой пары, были подключены 1-Wire устройства, способные кое-как управлять друг другом, по жестко запрограммированной схеме. Позже F100 был заменен на F4 c ethernet и первым неуклюжим web-интерфейсом, позволявшим жутко неудобно настраивать логику поведения устройств. В конечном итоге я пришел к выводу, что центральное устройство умного дома на микроконтроллере - это слишком сложно. Так на свет появился HOMEd.

первая версия конроллера
первая версия конроллера
и вторая, в процессе отладки
и вторая, в процессе отладки

Что же такое HOMEd?

Это, в первую очередь, программный комплекс для умного дома. Он состоит из отдельных небольших приложений, каждое из которых выполняет свою конкретную функцию. Все приложения написаны на C++ с использованием фреймворка Qt5 для работы под Linux/OpenWRT, распространяются в виде apt и opkg пакетов для большинства популярных архитектур, а также в виде docker-образов. Исходный код приложений я публикую на github. Приложения общаются друг с другом посредством MQTT-брокера, что ощутимо упрощает интеграцию с другими сервисами.

Почему Qt?

Hidden text

Ведь это же фреймворк для GUI-приложений, скажете вы. А я отвечу - это не мешает ему быть шикарным кроссплатформенным фреймворком и для "консольных" приложений. Тем более, я довольно хорошо изучил его на текущем месте работы и активно использую в своем коде многие фичи, такие как мета-объекты и сигналы/слоты.

А теперь давайте по порядку. Сильно вдаваться в детали не буду, вместо этого постараюсь донести самую нужную информацию. Поехали!

HOMEd ZigBee

Думаю, из названия понятно что это - программный шлюз для работы с ZigBee-сетью. Зачем, ведь есть же Zigbee2MQTT? Да, есть. Но я не очень люблю интерпретируемые языки программирования и огромных монстров, написанных на этих языках. Тем более, на момент, когда я узнал о существовании ZigBee, у меня уже была сформирована некая идеология и Zigbee2MQTT в нее никак не вписывался.

HOMEd ZigBee на данный момент умеет работать с адаптерами (координаторами) на базе чипов Texas Instruments CC2530/2531/2538/1352/2652 с прошивками Z-Stack, Silicon Labs EFR32MG1/MG2 с прошивками EZSP v8+ и NXP JN5168/5169 с прошивками ZiGate. Как через локальный порт, так и по сети, через RAW-сокет.

Примерно полгода назад по многочисленным просьбам немногочисленных пользователей была реализована функция Home Assistant MQTT Discovery, благодаря которой устройства автоматически "залетают" в HA.

Библиотека поддерживаемых устройств сейчас, навскидку, содержит около 300 моделей, в основном это популярные устройства от Aqara/Xiaomi и TUYA, доступные в массмаркетах РФ и на Aliexpress. Сама по себе библиотека - это псевдо-декларативное описание устройств в формате JSON, позволяющее, в большинстве случаев, добавлять новые устройства без перекомпиляции кода приложения. Вот пример описания среднестатистического датчика температуры:

{
  "description": "Sonoff Temperature and Humidity Sensor SNZB-02",
  "modelNames":  ["TH01"],
  "properties":  ["batteryPercentage", "temperature", "humidity"],
  "bindings":    ["battery", "temperature", "humidity"],
  "reportings":  ["batteryPercentage", "temperature", "humidity"],
  "exposes":     ["battery", "temperature", "humidity"]
}

Кроме библиотеки устройств в HOMEd ZigBee реализован механизм автоматического "распознавания" для неизвестных устройств. Этот механизм создает функциональные элементы на основании списка ZigBee-кластеров устройства, как если бы оно было описано в библиотеке. Да, эта фича работает не безупречно и не в состоянии "распознать" какой-нибудь навороченный термостат, но простая лампочка или датчик температуры почти наверняка "заведутся" без проблем.

HOMEd Modbus

Это небольшое приложение для работы с Modbus RTU устройствами через локальные (в перспективе - и через удаленные) последовательные порты. Приложение пока находится в стадии тестирования и официально не опубликовано, но это ненадолго. В текущий момент реализована поддержка совсем небольшого количества устройств, а именно - счетчиков электроэнергии Wiren Board WB-MAP и устройств собственной разработки. Как и в HOMEd ZigBee, настройки и данные устройств "прокидываются" в Home Assistant посредством функции MQTT Discovery.

Что касается устройств собственной разработки - это шлюзы и контроллеры для установки на din-рейку (в основном), но о них я лучше напишу отдельную статью.

HOMEd Automation

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

Триггеры:

  • изменение состояние устройства (например, кнопка была нажата или показания датчика вошли в заданный диапазон)

  • telegram-сообщение (пока работает только конкретный текст, например, "включить свет в гараже")

  • mqtt-сообещние (так же как в предыдущем пункте, конкретное сообщение в конкретный топик)

  • рассвет/закат (с вознеможностью корректировки, например, за полчаса до рассвета)

  • время суток (включаем кофеварку в 7 утра)

Условия:

  • текущее состояние устройства (включаем кофеварку, только если в берлоге прохладно)

  • конкретная дата или диапазон дат

  • конкретное время суток или диапазон времени суток

  • определенные дни недели

Действия:

  • изменить состояние устройства (включить реле, открыть шторы и т.д.)

  • отправить telegram-сообщение

  • отправить mqtt-сообщение

  • выполнить shell-команду

HOMEd Web

Одно кольцо, чтобы править всеми. Это приложение является самостоятельным http-сервером и позволяет настраивать автоматизации, добавлять/удалять устройства и управлять ими прямо в браузере.

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

Заключение

Наверняка вы хотите спросить, а зачем мне все это? Ведь есть популярные решения: Zigbee2MQTT, Home Assistant, OpenHAB и прочие! Я отвечу коротко - да просто так, потому что могу. Мои приложения самобытные, шустрые и могут работать на "слабом" оборудовании.

Если же я смог заинтересовать вас, то самое время попробовать все это в деле. У меня есть вики с документацией, которую я очень стараюсь держать в актуальном состоянии, хотя не всегда получается, а так же telegram-чат, где можно задавать любые вопросы по теме (и не по теме).

Все и ничего вознеможно!

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 30: ↑29 and ↓1+33
Comments40

Articles