Для решения этой задачи нам потребуется установленный Node-RED. А дальше уже все просто, ставим в Node-RED пакеты:
node-red-contrib-googlehome node-red-contrib-wirenboard
У нас появятся следующие плиточки:
Для работы пакета для Google Home, необходимо зарегистрироваться на сайте https://googlehome.hardill.me.uk/
Решение не официальное и работает через сторонний сервер, так что на ваш страх и риск.
При добавлении запросит авторизацию, вводим логин и пароль с сайта https://googlehome.hardill.me.uk/.
Вы великолепны! Осталось добавить виртуальных устройств. Для этого переходим в раздел Devices https://googlehome.hardill.me.uk/user/devices
и добавляем любые устройства, ничего сложного:
Добавляем все, что хотим видеть в Google Home, предлагаю использовать те же имена, что и в WirenBoard или других системах, короче говоря, на ваше усмотрение. Устройства есть, но чем они управляют? Правильно, пока ничем.
Акцентировать на этом много внимания не буду, плитки WB точно так же настраиваются.
Далее настраиваем все взаимосвязи. Делаю инвертированными парами, для обеспечения обратной связи. Дело муторное, но возможное.
Бонус – это все работает удаленно, надобности находиться управляющему устройству в сети 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 в функции:
delete msg._confId;
В примере я этого не использую, все названия разные. Для обратной совместимости можно использовать следующий код функции:
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 нужно перезапускать приложение, чтоб увидеть что статус поменялся.