HomeKit и Wirenboard (node.js) - Прошу помощи в написании правил (rules)

Есть рабочая система на WB в связке с OpenHAB (v1 в работе, v2 тестируется), пультами и исполнительными устройствами на noolite и датчиками noolite и Oregon, а также инфракрасными передатчиками Rmpro (broadlink) для управления устройствами по ИК-каналу. Все общается и взаимодействует через mqtt. Еще мобильное приложение OpenHAB запущено на мобильных устройствах с iOS и Android. Вкратце все, правила и логики описывать нет смысла.
В чем вопрос?
Появляется решение как использовать Apple HomeKit без покупки сертифицированных устройств, точнее его эмулятор hap-nodejs на node.js. Кратко, он создает сервер, который эмулирует устройства для Apple Homekit, а сами устройства, их работу и взаимодействие можно описать на JavaSvript. Я не мог пройти мимо такого решения, т.к. это красивый интерфейс, Siri и логика взаимодействия с iOS через Siri с напоминаниями, событиями и т.п.
У меня получилось запустить HAP-nodeJS на линукс (debian). Точнее на NAS Synology, не знаю, возможно ли такое на WB. Соответственно мобильный клиент видит устройства и пытается с ними создать связку для работы. Это прекрасно. Проблема уже в другом, язык описания логики устройства производится на JavaSvript в шаблоне(повторяюсь уже), а я в нем от слова никак. А надо описать логику, чтобы работала связка iOS <-> HAP-NodeJS (HomeKit) <-> mqtt. Т.е. датчики, положения выключателей, все это передавалось на мобильный клиент, ну и соответственно информация с мобильного передавалась в mqtt для работы правил и исполнительных устройств.
Теперь подробнее:
Сам проект HAP-NodeJS живет тут Git HAP-NodeJS
Внутри него есть папка Accessories, в которой находятся различные шаблоны устройств, в которых на языке JS описано как им работать. Т.е. допустим по нажатию кнопки в мобильном приложении (“Дом” на iOS 10) на Accessories “Light” можно отправить команду по протоколу http на заданный IP. Ну и наверно принять изменения состояния. Мне надо чтобы шаблон описывал работу с mqtt broker.
Прошу помощи в JavaScript. В свою очередь готов рассказать подробнее, что и как работает у меня.

1 лайк

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

Ну вроде явных требований к версии нет. При настройке на MacOS (народ на другом форуме настраивал), указывали что не менее 4.5.0. Но у меня сомнения, что требуется прям последняя версия. Как бы задачи обязательно поставить на WB не стоит, но если настроим работу скриптов, то попробую перенести все на WB.

Поправил ссылку в своем посте на проект.

Подсмотрел на хабре статью по настройке этого эмулятора, приведу цитату:
“версия должна быть 0.10.44”
Статья тут ссылка на хабр
Она как бы о других устройствах, но принцип работы эмулятора понять можно.

Ну немного поваял, чуть чуть получилось
Вообщем заменил в скрипте температуры блок, который отвечает за генерацию случайных значений. сам скрипт называется так “TemperatureSensor_accessory.js” и находится тут TemperatureSensor_accessory.js
Вот что сделал:
Удалил полностью строки кода

randomizeTemperature: function() {
    // randomize temperature to a value between 0 and 100
    FAKE_SENSOR.currentTemperature = Math.round(Math.random() * 100);
  }

и вместо

// randomize our temperature reading every 3 seconds
setInterval(function() {
  
  FAKE_SENSOR.randomizeTemperature();[/code]
вписал
[code]var client = mqtt.connect({ port: 1883, host: '192.168.1.3', keepalive: 10000});
    client.subscribe('/devices/oregon_rx_1d20_d7_1/controls/temperature')
     client.on('message', function (topic, message) {
    console.log(topic, message.toString());          
     FAKE_SENSOR.currentTemperature = message.toString();
//    FAKE_SENSOR.currentTemperature = 55;

В итоге в консоль выводит правильно значение температуры с mqtt топика, НО в мобильный клиент не отдает информацию, пишет нет ответа :frowning:
если я закоментирую строку

FAKE_SENSOR.currentTemperature = message.toString();

и расскоментирую

FAKE_SENSOR.currentTemperature = 55;

то в мобильный клиент прилетит значение 55.

Что я сделал не так? Почему message.toString() в лог пишется верно, а мобильному не отдает. Какой формат надо сделать?

P.S. Не хватает знаний, помогите.
А вот так это выглядит в мобильном клиенте на скорую руку. (Не могу спрятать под спойлер)
<spoiler=“Скриншот”>

может

parseInt(message.toString());

?

Заработало.
Получается, что клиент не понимает не целое число.

Спасибо! Красота.
Теперь пойду кнопки ваять :smile:

Нашел проект homekit2mqtt, там не надо знаний JS. Поставил, все отлично работает, температура показывает, свет переключается, скрипты работают.
Теперь возник вопрос, как правильно установить node.js на WB? Плюсом надо *npm *и, есть дополнение от разработчика:

If you’re running on Linux, you’ll need to make sure you have the libavahi-compat-libdnssd-dev package installed.

Нашел на форуме дискуссию:
Node.JS
Я могу ей руководствоваться? Она верная?

P.S. Консультируюсь, потому что не хочу поломать то, что работает. Как ставить стандартным путем, из пакетов, я знаю.

to_Rainstation: спасибо за классную идею.
Поделитесь, пожалуйста, примером управления светом и управления ИК-передатчиком через HomeKit. Не хватает знаний чтобы понять что изменить например в “Light_accessory”.

Присоединяюсь к просьбе, расскажите, что и как надо установить, чтобы начать всем этим делом пользоваться? тоже охотно бы протестировал такие возможности, глядишь и сформировали бы что-нибудь прогрессивное!

Я отказался от HAP-NodeJS пока, т.к. не силен в JS. Переключился на homekit2mqtt, в нем все отлично работает. Описания устройств делаются в одном файле настроек, по сути там все интуитивно понятно, прочитайте примеры, что непонятно, спрашивайте - расскажу.
Попробую кратко рассказать идею уже на основе homekit2mqtt, но по сути разницы нет, принцип будет один. Итак основная концепция (везде мое мнение, оно может не совпадать с реальностью, т.к. я все это сам изучал и, возможно, где-то ошибаюсь):
В основе homekit от Apple лежат уже преднастроенные шаблоны устройств, т.е. уже обладающие своими иконками, свойствами и атрибутами. Поэтому изначально надо выбрать шаблон, который лучше всего подходит под нужды и определить его свойства в файле настроек.
Таким образом появится управляющий элемент, который по нажатию (или движению ползунка) меняет свои свойства и пишет их в ветку mqtt.
Пока для меня было все просто, дальше я пока самостоятельно решить не могу.
На WB работает скрипт, который отслеживает изменения в mqtt для данной ветки и отправляет http пакеты на ИК-передатчик, который уже управляет любым ИК устройством в комнате. Вот в этом и затык, как на JS написать скрипт, который основываясь на изменениях в ветке mqtt будет отправлять строго определенные пакеты данных из файла (-ов).

P.S. Пока писал увидел еще просьбу, не пойму, что именно точнее описать? Работу IR-передатчика или работу с homekit устройствами?
P.S.S. И кто-нибудь помогите с JS? Или это настолько сложный язык что им никто не пользуется? Есть же тут программисты, и я не в коммерческих целях прошу (т.е. я из этого выгоду не планирую извлекать), хотя определенное вознаграждение могу заплатить, пока хочу обменяться знаниями.

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

1 лайк

Перенес тему в Rules Engine, т.к. сейчас требуется помощь в написании правил именно на WB. Продублирую суть.
Правило должно отслеживать в любой (указанной) ветки (ветках) mqtt определенное значение и, в зависимости от данного значения отправлять пакет данных по http на 80 порт. Пакет данных содержится в файле, т.е. его надо прочитать, там примерно от 250 байт до 1 килобайта данных, в зависимости от команды (это записанные ИК-команды).
Если представить схематично:
Если в /devices/устройство значение 1, то на адрес http://x.y.z:80 отправляем пакет данных из файла file.dat
Если в /devices/устройство значение 0, то на адрес http://x.y.z:80 отправляем пакет данных из файла file_1.dat
и т.д., все остальное я допишу сам, мне не хватает понимания именно данной конструкции.

А подскажите, как вы ноду вообще поставили? Я пока дошел до того, что ее компилировать нужно.

А вы на что ее ставите? Ну т.е. на компьютер (какая ОС?) или на WB?

я думаю всем будет интересно как всё это устанавливается и настраивается на контроллере wirenboard. спасибо!

Вот на контроллер ноду пока не ставил. Мне к сожалению так и не ответили в ветке о просьбе подсказать как правильно это сделать. В данный момент нода крутится на NAS. Как только кто нибудь запостит как ее правильно ставить, перенесу на WB.

А, вот как. Я на WB ее пытался поставить, пока сдался )

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

хочу вернуться к вопросу об установке node.js. кто-нибудь поставил её на контроллер? как всё-таки это сделать???

В 2013-ом году из nodejs (точнее libv8) выкинули поддержку архитектуры, которая используется в Wiren Board 2-5. Поэтому поставить можно только заведомо устаревшие версии.