Это случилось обычным воскресным вечером, лет 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-чат, где можно задавать любые вопросы по теме (и не по теме).
Все и ничего вознеможно!