Домашняя автоматизация - вещь неоднозначная, каждый понимает под ней что-то свое: для кого-то это подключить обогреватель через wi-fi розетку, а кому-то подавай домашний сервер, километры кабеля, KNX и часы работы интеграторов. Если в городских квартирах система "умный дом" - не всегда благо, то для загородного дома или дачи необходимость ее наличия сильно возрастает: проконтролировать отопление, выключить свет или разогреть электропечку в любимой сауне перед приездом. При этом такая система должна быть простой, дешевой и уметь работать автономно: никто не хочет приехать в промёрзший из-за упавшего интернета дом. А что нужно сделать, если готовые решения полностью не устраивают, правильно - написать самому... Для объединенеия устройств был выбран протокол zigbee по двум причинам: во-первых он беспроводной, а на даче никто не желает тратится на лишние коммуникации, а во-вторых он довольно энергоэффективный и какой-нибудь датчик или выкючатель может питаться от батареи CR2032 несколько лет без необходимости подводить внешнее питание. Изначальной идеей было прикрутить к проекту zigbee2mqtt свой мини-сервер и повесить на него всю логику по управлению умным домом(хотя скорее дачей). Минусы такого подхода: во-первых вторично, а во вторых это отдельно сервер, отдельно zigbee2mqtt и отдельно mqtt брокер для объединения, что очевидно надежности не добавляет. Поэтому первое, к написанию чего пришлось приступить - это собственная библиотека для работы с zigbee сетью на одном из самых популярных и доступных zigbee контроллеров cc2531 от Texas Instruments. С документацией по zigbee чипам ситуация неоднозначная - она есть, она довольно подробная, многие нюансы хорошо описаны, из нее совершенно не понятно как все работает и что с этим делать. Так с cc2531 было понятно как организовать обмен командами с контроллером, но его инициализация и настройка в роли координатора не описаны нормально нигде. После безуспешных поисков по иностранным форумам я понял, что проще изучить работу на живом чипе, благо в SDK к нему есть утилита Z-tool, позволяющая в ручном режиме слать команды и смотреть ответы.  Правда очень быстро выяснилось, что свежезапущенный контроллер не собирается как-то работать с ранее спаренными с ним устройствами(кнопка Xiaomi WXKG01LM и датчик температуры WSDCGQ01LM и т.д.). При этом zigbee2mqtt корректно работал с ними обоими. Самым быстрым способом начать работать через Z-tool оказалось сначала запустить zigbee2mqtt, дать ему сделать все, что он должен сделать, а потом закрыть его и, не перезагружая контроллер, подключиться через утилиту. И, как ни странно, этот способ заработал. В итоге довольно-таки быстро удалось понять логику работы при приеме сообщений, спаривании устройств и т.д., но двигаться дальше без инициализации было невозможно.  В течении нескольких дней я копался в исходниках zigbee2mqtt, однако полностью логику понять не удалось, тем более она размыта между самим проектом Koenkk и его отдельными модулями для работы zigbee (zigbee-herdsman и zigbee-herdsman-converters). Решив, что лучше зайти со стороны реверс-инжинеринга zigbee2mqtt был запущен через сниффер порта Advanced Serial Port Monitor, а дамп его работы записан в файл. Вскоре был написан парсер, выдававший что-то более читаемое из дампа и началась работа по воссозданию логики работы: Итого, чтобы запустить ZNP в роли координатора минимально необходимо: записать настройки в энергонезависимую память контроллера, по идее делается один раз при первом включении перезагрузить стартовать работу командой ZDO_STARTUP_FROM_APP зарегистрировать стандартные эндпоинты (хватит одного под номером один для профиля домашней автоматизации  0x0104) Изучение дампа обмена zigbee2mqtt не раз выручало меня и дальше при проблемах в инициализации подключаемых к сети устройств. Через какое-то время zigbee-часть мини-сервера домашней автоматизации была написана на C++ с использованием Boost.Asio, а к ней прикручена логика, объединяющая устройства в функциональные узлы (например узел отопления может объединять реле и датчик температуры). Но всем этим нужно управлять как минимум для подключения устройств, а как максимум для полноценного контроля через интернет. В итоге протоколом для второго конца системы был выбран ... mqtt(через библиотеку mqtt_cpp), и мини-сервер в каком-то роде стал еще больше похож на проект zigbee2mqtt с которого все начиналось. С исходниками и более детальным описанием проекта можно ознакомится на github.