node-red-contrib-googlehome
node-red-contrib-wirenboard
Решение не официальное и работает через сторонний сервер, так что на ваш страх и риск.
Бонус – это все работает удаленно, надобности находиться управляющему устройству в сети Wi-Fi нет.
Проанализировать, что приходит от плитки Google Home, можно добавить плитку Debug, соединить их и потыкать устройством. В случае с лампочкой, получим следующее окно дебага:
msg.payload : Object
object
command: "action.devices.commands.OnOff"
params: object
on: true
online: true
Это означает, что на входе будет тип команды (command) и значение переключателя (params -> on). Значение параметра online нас особо не интересует.
true - включение, false - соответственно, выключение. Для разных устройств в документации рекомендуют еще передавать значение поля command.
Забегая вперед скажу, что плитки WB принимают просто голое значение на msg.payload, для реле это "0" или "1", для диммера - значение от 0 до 255.
Напишем функцию преобразования ответа плитки Google Home для плитки WB:
if (msg.payload.params.on === true){
msg.payload = 1;
} else {
msg.payload = 0;
}
return msg;
Хорошим тоном является чистка лишнего от передающих плиток, но мешать это может только когда параметры имеют одно имя.
Делается кодом JS в функции:
В примере я этого не использую, все названия разные. Для обратной совместимости можно использовать следующий код функции:
if (msg.payload == "1"){
msg.payload = {
command: "action.devices.commands.OnOff",
params: {
on: true
}
};
} else {
msg.payload = {
command: "action.devices.commands.OnOff",
params: {
on: false
}
};
}
return msg;
От плиток WB тоже приходит голое значение в msg.payload, в функции мы его анализируем и формируем запрос для плитки Google Home.
Совет начинающим в Node-RED: обязательно пользуйтесь плитками Debug, наглядно видно, что происходит в вашей программе. В случае с анализом выводов плиток, у каждого параметра есть кнопка "copy path", при копировании пути параметра, сразу понятны все вложенности (после копирования, в начале пути вставить "msg.").
Флоу для импорта в NR и анализа:
[{"id":"a3eb06c.ce829f8","type":"tab","label":"Google home","disabled":false,"info":""},{"id":"de2b1b39.4b1278","type":"google-home","z":"a3eb06c.ce829f8","conf":"fabf43e4.9cb2e","device":"6348","acknowledge":true,"name":"Реле 1","topic":"","x":390,"y":580,"wires":[["150eaa8f.c0d4f5"]]},{"id":"195d1748.208509","type":"wirenboard-in","z":"a3eb06c.ce829f8","name":"","server":"58c389fc.46d588","channel":["/devices/wb-mr6c_164/controls/K1"],"outputAtStartup":true,"x":360,"y":640,"wires":[["f1451387.f3be6"]]},{"id":"f1451387.f3be6","type":"function","z":"a3eb06c.ce829f8","name":"","func":"if (msg.payload == \"1\"){\n msg.payload = {\n command: \"action.devices.commands.OnOff\",\n params: {\n on: true\n }\n };\n} else {\n msg.payload = {\n command: \"action.devices.commands.OnOff\",\n params: {\n on: false\n }\n};\n}\n\n\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":540,"y":640,"wires":[["efe5dac6.ac83c8"]]},{"id":"efe5dac6.ac83c8","type":"google-home-response","z":"a3eb06c.ce829f8","conf":"fabf43e4.9cb2e","device":"6348","name":"Реле 1","x":700,"y":640,"wires":[]},{"id":"91369284.c19ce","type":"wirenboard-out","z":"a3eb06c.ce829f8","name":"","server":"58c389fc.46d588","channel":["/devices/wb-mr6c_164/controls/K1"],"command":"/on","commandType":"wb_cmd","payload":"payload","payloadType":"msg","x":730,"y":580,"wires":[]},{"id":"150eaa8f.c0d4f5","type":"function","z":"a3eb06c.ce829f8","name":"","func":"if (msg.payload.params.on === true){\n msg.payload = 1;\n} else {\n msg.payload = 0;\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":540,"y":580,"wires":[["91369284.c19ce"]]},{"id":"93512863.fcf1f8","type":"google-home","z":"a3eb06c.ce829f8","conf":"fabf43e4.9cb2e","device":"6361","acknowledge":true,"name":"Бра","topic":"","x":390,"y":700,"wires":[["130a276c.f4f3c9"]]},{"id":"9406e729.56f088","type":"wirenboard-out","z":"a3eb06c.ce829f8","name":"","server":"58c389fc.46d588","channel":["/devices/wb-mrgbw-d_112/controls/White"],"command":"/on","commandType":"wb_cmd","payload":"payload","payloadType":"msg","x":750,"y":700,"wires":[]},{"id":"dfa77f52.05f66","type":"wirenboard-in","z":"a3eb06c.ce829f8","name":"","server":"58c389fc.46d588","channel":["/devices/wb-mrgbw-d_112/controls/White"],"outputAtStartup":true,"x":340,"y":760,"wires":[["6e0ee3dd.47a71c"]]},{"id":"130a276c.f4f3c9","type":"function","z":"a3eb06c.ce829f8","name":"","func":"var br = msg.payload.params.brightness\nmsg.payload = 255/100*br;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":540,"y":700,"wires":[["9406e729.56f088"]]},{"id":"ca373ffb.0aea8","type":"google-home-response","z":"a3eb06c.ce829f8","conf":"fabf43e4.9cb2e","device":"6361","name":"Бра","x":690,"y":760,"wires":[]},{"id":"6e0ee3dd.47a71c","type":"function","z":"a3eb06c.ce829f8","name":"","func":"var br = msg.payload;\n msg.payload = {\n command: \"action.devices.commands.BrightnessAbsolute\",\n params: {\n brightness: br\n }\n };\n\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":540,"y":760,"wires":[["ca373ffb.0aea8"]]},{"id":"fabf43e4.9cb2e","type":"google-home-conf","z":"","username":"klouner"},{"id":"58c389fc.46d588","type":"wirenboard-server","z":"","name":"WB","host":"192.168.1.46","mqtt_port":"1883","mqtt_username":"","mqtt_password":""}]
На iOS немного криво работает обратная связь, просьба владельцев Android устройств проверить, что все моментально отрабатывается. На iOS нужно перезапускать приложение, чтоб увидеть что статус поменялся.