Статья

Азы Node Red: Создаем HomeKit устройства в Node-Red, часть 2

Вместо предисловия

Уважаемые читатели, я конечно задержал выход второй части, но теперь у меня есть четкое понимание, о чем писать. Если Вы не читали первую часть, то есть возможность перейти по ссылке и прочесть ее заново. Статья была больше обзорной, но там есть ссылки на ресурсы, хоть и англоязычные, которые дают полноценно понять, как работать с HomeKit.

С чего начать?

Чтобы что-то добавить в HomeKit, надо понять, к какому типу устройств оно относится, а это строго регламентировано у компании Apple. И если вы захотите добавить датчик давления, то увы, Apple пока его в свою экосистему не добавила и Вам остается только ждать, когда он появится, или лепить костыли и отправлять данные, как что-то другое. Поскольку мы не можем в данный момент повлиять на Apple, то мы либо ждем, либо посылаем данные под другим именем (например, давление - как освещенность в люксах) или воспользуемся альтернативным продуктом "Sprut.hub" и приложением "Sprut.home", где все уже давно сделано, как надо.

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

Как получить данные?

Если вы уже используете Node-Red, то конечно, вам знакома нода Debag, ну а если нет, то обратитесь к статье на нашем портале Sprut.ai. Цепляем ее к источнику данных и при изменении событий смотрим, что же меняется. Для примера вот простое флоу wi-fi розетки, которая была прошита на Tasmota по статье, и общается с Node-red по mqtt протоколу.

Данная статья не направлена на изучение mqtt протокола, но, думаю, идея понятна.

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

Конечно, мы хотим, чтобы это устройство управлялось через HomeKit. Ну что, приступим!

Правила HomeKit

Apple HomeKit протокол имеет свой свод правил, которым необходимо следовать. Если взглянуть на картинку сверху, то вы можете увидеть, что необходимо поставить что-то в качестве функций, либо набора кубиков из Node-Red, для согласования правил, по которым общается Apple HomeKit и ваши устройства. В идеале, конечно, соединить все напрямую, но реально все немного сложнее, хотя в предыдущей статье описаны плагины для Node-red, где именно так можно сделать. Если ничего не подходит, то читаем входную ноду с данными и заодно ищем способ отправить правильные данные для управления вашим устройством.

На первой картинке видно, что в payload мы получаем значения "OFF" или "ON" при смене статуса устройства. На втором изображении мы видим другие значения - это "off" и "on". Если значения с первой картинки вы можете прочитать нодой debag, то значения, которые посылаются на выходную ноду управления, вы должны взять из документации, в данном случае - это описание mqtt команд по управлению этим устройством. Не подумайте, что я усложняю, в конечном итоге, чтобы включить нужное устройство физически, вы сами себе даете команду дойти именно до этого устройства и нажать именно эту кнопку. Также и в Node-Red.

HomeKit

В первой части я описывал плагин для Node-Red node-red-contrib-homekit-bridged и, думаю, вы его уже установили. Добавляем ноду HomeKit во флоу и немного ее редактируем. Выглядит это так. На первой картинке надо кликнуть на карандашик, чтобы задать имя Homkit-Bridge, pin-code и проверить статус "Allow Message Passtrough". Галочка в квадратике на этом сообщении разрешит сквозное прохождение сообщений через HomeKit ноду. Если нужна только обратная связь по входу, то надо обязательно снять галочку, а вот если хотите еще и управлять через вход китовой ноды, то она нужна, но будьте осторожны, возможно зацикливание. Я стараюсь не использовать сквозной проход сообщений.

С названием моста мы определились и, соответственно, в первом экране мы должны написать название устройства и определиться с его сервисом. Поскольку это розетка, то название сервиса будет Outlet. В первой части статьи я давал полезные ссылки на описание сервисов и характеристик HomeKit устройств и поэтому, воспользовавшись этими знаниями, мы видим, какие характеристики необходимы для работы розетки.

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

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

Почему функции проще для меня?

Вот мы и подошли к самому ответственному шагу. Есть набор данных, причем они с большой вероятностью не подходят для перенаправления в HomeKit ноду. Задача состоит в том, чтобы HomeKit получил их в том виде, в котором он их ожидает. А ожидает он их как две характеристики: On и OutletInUse в формате JSON. Для совместимости форматов необходимо написать простенькую функцию, которая преобразует один формат данных в другой. С целью упрощения задачи, характеристику OutletInUse (Розетка используется) я включаю при включении розетки, хотя по логике она должна активироваться при изменении потребления вышеопределенного порога. Все это легче реализовать в функции, особенно, если чуть-чуть знаком с любым языком программирования. Будет всего один кубик и функция пошлет только те данные, которые нужны HomeKit ноде. Конечно, как альтернативу функции можно использовать ноды switch и change и это прекрасная практика в освоении Node-red. Я так, собственно, и делал, пока не понял, что это немного громоздко. К тому же, функция может отображать сформированный статус, что бывает необходимо при отладке. Код функций для преобразования данных от розетки и в розетку на картинках снизу. Принцип прост: объявляем переменную типа object, сравниваем приходящие данные с нужным статусом и преобразовываем в необходимый формат для HomeKit ноды. Этот же принцип используется и для формирования данных с помощью нод switch и change. Чуть больше узнать о ноде можно из моей статьи и, конечно же, на сайте Node-Red.

Код функций выглядит как на картинке сверху, а тестовое флоу можно найти по ссылке.

Продолжение следует ...

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

1

Нет такой ноды - debag, поправь


Вернуться назад
Вернуться назад