HomeKit в Home Assistant через Node-RED

Добавляем устройства из Home Assistant в HomeKit разными способами.

Часть 0. Почему Home Assistant?
Часть 1. Установка Home Assistant
Часть 2. Настройка Z-wave
Часть 3. Настройка Zigbee
Часть 4. Установка Node-RED
Часть 5. HomeKit в Home Assistant через Node-RED

Как обычно, многие пользователи «умного дома», которые когда-нибудь задавались вопросом унификации всех устройств под один протокол, в первую очередь конечно же думают про HomeKit.

И получается так, что одним из правил данного ряда статей, стало правило давать легкий путь, но рассказывать о сложных, ниже будет представлено также два пути переноса всех устройств Home Assistant в HomeKit.

Нативный HomeKit в Home Assistant

Много о нативном HomeKit и как его использовать писать не будем: всё очень просто.

Добавляете в свой configuration.yaml строчку

homekit:

После чего настройку можно считать законченной. Одно важное НО. Если у вас стоят какие-то z-wave устройства или еще что-то, что при перезапуске требует времени на инициализацию, то в таком случае необходимо будет немного заморочиться и поставить таймаут на запуск homekit. Подробнее об этом написано здесь.

Но остановимся на том на сколько же подобная реализация удобна:

1. Основное отличие Home Assistant  от Homebridge заключается в том, что Home Assistant поддерживает не такое множество вариантов пробросить устройства в HomeKit. Самый простой пример — это увлажнители и воздухоочистители: их HA пробрасывает просто как вентиляторы, лишая пользователя 90% настроек. И в отличие от Homebridge у нас нет варианта установить какой-нибудь плагин и сделать это. Вентилятор и всё — смеритесь.

2. HomeKit в Home Assistant в общем работает не с такой стабильностью. Самый яркий пример: устройства могут удалиться и заново добавиться, а это значит, что все заданные настройки в приложении Дом сбросятся.

3. Некоторые устройства и в общем невозможно пробросить в HomeKit

4. А некоторые устройства смогут проброситься сразу двумя-тремя-четырьмя отдельными устройствами, хотя их можно было бы скомбинировать в одно.

Все эти проблемы не просто, но решаются с помощью другого метода —подключения устройств из HA в HomeKit через Node-RED.

HomeKit через Node-RED

Предупрежу сразу, что в рамках следования шагов по этому «туториалу» вместо одной строки в конфиге HA вам понадобится некоторое время на изучение и понимание того как устроен HAP, его нюансы, параметры, а также небольшое знание в JS (для удобства написания функций). Ниже будут даны наиболее интересные примеры, которые потребуют пару кликов мыши по небольшой перенастройки их для себя, что облегчит тот путь, который мне пришлось пройти самостоятельно, но всё же будте готовы, что этот путь тернист 🙂

Теперь заходим в ранее настроенный Node-RED по этой инструкции и устанавливаем плагин (опять же смотрим как устанавливать плагины в инструкции выше) под названием node-red-contrib-homekit

После этого в списке доступных блоков у нас появится блок homekit

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

Но по итогам вами всего лишь будет добавлено устройство, которое будет просто реагировать на ваши нажатия в приложении Дом, и не более.

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

Давайте разберем два самых обсуждаемых мной примера: воздухоочиститель и увлажнитель. Это наиболее интересные примеры, и при этом наиболее сложные. Для управления, которыми пришлось потратить не один час для написания всех сценариев, которыми вы сможете пользоваться, скопировав их себе в конце статьи и импортировав в свой node-RED. Удобно 🙂

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

Увлажнитель

И так, вне зависимости от того, будет ли это увлажнитель, воздухоочиститель, датчик температуры, вам в любом случае потребуется блок Home Assistant, который мы устанавливали при настройке Node-RED — поэтому очередной раз знакомимся со статьей.

И так, для того, чтобы начать добавление увлажнителя нам необходимо добавить блок events: all, кликнуть по нему дабл кликом и в настройках выбрать сервер Home Assistant, который мы настраивали ранее (если он уже не был выбран по-умолчанию). После чего все изменения из Home Assistant вне зависимости от устройств будут приходить в Node-RED.

Для самопроверки вы можете добавить блок debug, провести к нему линию соединив два блока и посмотреть дебаг, что данные приходят (не забываем деплоить после каждого нашего изменения).

После добавления блока events:all нам необходимо отделить наш увлажнитель от всех остальных устройств, для этого мы добавляем блок switch, в котором прописываем условие с названием entity_id нашего увлажнителя (в моем случае это был fan.xiaomi_miio_device)

На выходе из данного switch мы получаем объект со старыми и новыми значениями нашего увлажнителя, с которыми можем делать практически всё что угодно. Т.к. у меня был небольшой опыт в JS, то для себя выбрал функцию, т.к. сразу в одном блоке я смогу выполнить с полученными значениями всё что мне нужно.

Если же кому-то интересно посмотреть подробнее и покритиковать мои костыли, то ниже прикладываю сам JS 🙂

Данный код собирает значения из состояний Home Assistant и превращает их в атрибуты, понимаемые протоколом HomeKit для того, чтобы отобразить их в нашем интерфейсе.

var characteristic = {};
if (msg.payload.event.new_state.state != msg.payload.event.old_state.state) {
if (msg.payload.event.new_state.state === "on") {
characteristic.Active = 1;
characteristic.CurrentHumidifierDehumidifierState = 2;
characteristic.TargetHumidifierDehumidifierState = 1;
}
else {
characteristic.Active = 0;
characteristic.CurrentHumidifierDehumidifierState = 0;
characteristic.TargetHumidifierDehumidifierState = 0;
characteristic.CurrentRelativeHumidity = 0;
}
}
if (msg.payload.event.new_state.attributes.speed === "Silent") {
characteristic.RotationSpeed = 25;
}
else if (msg.payload.event.new_state.attributes.speed === "Medium"){
characteristic.RotationSpeed = 50;
}
else if (msg.payload.event.new_state.attributes.speed === "High"){
characteristic.RotationSpeed = 75;
}
else if (msg.payload.event.new_state.attributes.speed === "Strong"){
characteristic.RotationSpeed = 100;
}
if (msg.payload.event.new_state.attributes.child_lock === true) {
characteristic.LockPhysicalControls = 1;
}
else {
characteristic.LockPhysicalControls = 0;
}
characteristic.CurrentRelativeHumidity = msg.payload.event.new_state.attributes.humidity;
characteristic.RelativeHumidityHumidifierThreshold = msg.payload.event.new_state.attributes.target_humidity;
msg.payload = characteristic;
return msg;

В данном случае мной были использованы практически все атрибуты HomeKit для увлажнителя, кроме, наверное того, который может пригодится для увлажнителя второй версии Xiaomi — WaterLevel, но я думаю, воспользовавшись примером и данной сверхполезной страницей (за что её автору огромное спасибо) вы сможете добавить эти данные сами.

Если же вы пользуетесь первой версии увлажнителя от Xiaomi, то смело можете использовать данный код.

Соответственно, после данной функции вы уже вставляете блок HomeKit, настроив его на тип: Увлажнитель (а точнее HumidifierDehumidifier).

На этом половина работы завершена и теперь вы сможете изменив какие-то настройки в HomeAssistant лицезреть их в своем приложении Дом в «прокинутом» туда увлажнителе.

Вторая часть данного гайда будет заключаться в том, что теперь вам необходимо считывать изменения, которые вы выполнили в приложении, и прокидывать их в Home Assistant.

К сожалению, из-за того, что HomeKit (в отличие от Home Assistant) прокидывает каждый измененный атрибут отдельно, пришлось вместо создания единой функции (хотя возможно сейчас бы я и пересмотрел этот подход заморочившись с глобальными переменными) и составлять на каждый «чих» HomeKit устройства отдельный поток с выполнением отдельной команды.

Для этого я воспользовался в какой-то мере уже известным нам блоком switch, несколькими блоками функций, а также блоками call service (от Home Assistant) для исполнения команд в Home Assistant.

Для того, чтобы не описывать однотипные шаги и обратные куски функций, которые из HomeKit атрибутов превращают в параметры для функций Home Assistant, я просто приложу ниже итоговый Flow.

Воздухоочиститель

На данном устройстве я бы не останавливался так подробно, а просто упомянул основные особенности прокидывания воздухоочистителя. Весь код для Node-RED вы сможете взять снизу, скачав себе, импортировав и тогда уже в нем покопаться.

Наиболее интересным для меня моментом здесь стало то, что в отличие от возможностей воздухоочистителя Xiaomi, в котором есть возможность выбирать из трех режимов работы (автоматический, ручной, ночной), в атрибутах HomeKit AirPurifier есть только два режима (автоматический и ручной).

И в этом случае, конечно же, на руку сыграл один очень важный плюс Node-RED, что вы любой параметр, полученных из Home Assistant, можете интерпретировать так, как вам будет интересно.

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

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

Итоги

По итогам, мой текущий HomeKit выглядит примерно так. Некоторыми устройствами я пока что доволен не очень и еще буду их дорабатывать (пока что мне не очень нравится как работает яркость и выбор цвета у лампочек), но в общем сейчас это выглядит так.

Но при этом, потратив на это несколько часов своего времени, я полностью уверен в том как это работает и уверен в полной стабильности его работы.

По итогам перенастройки всех устройств в HomeKit через Node-RED не забудьте снести (или закомментировать) ту самую строку выше в configuration.yaml в HA (она нам больше не понадобится).

# homekit:

Как и обещал ниже выкладываю экспорт Flow с увлажнителем/воздухоочистителем — clipboard-indahomekit.

Часть 0. Почему Home Assistant?
Часть 1. Установка Home Assistant
Часть 2. Настройка Z-wave
Часть 3. Настройка Zigbee
Часть 4. Установка Node-RED
Часть 5. HomeKit в Home Assistant через Node-RED

Подписывайтесь на канал InDaHomeKit в Telegram и Яндекс.Дзен, чтобы у вас всегда было что почитать: новости мира умного дома, обзоры новых устройств, инструкции по подключению.

Приходите в наш чат в Telegram

Так же у нас отличные паблики VK, Facebook, Instagram и Twitter.