Uso de Google Home con Domoticz mediante Node Red: SMART NORA

@Rober_nexo del grupo «Domoticz a lo spain» de telegram nos trae el nuevo sistema de vinculación de domoticz con Google Home con la nueva versión de Nora (porque ya sabéis que la versión antigua de Nora no funciona): Smart Nora.

@Mastegadragons del grupo «Domoticz a lo spain» de telegram comparte con nosotros dos flows que ha utilizado para dimmers y para persianas.

Partimos del siguiente github para implementarlo: «https://github.com/andrei-tatar/node-red-contrib-smartnora/blob/master/doc/setup/README.md«.

Dividimos esta guía en varios apartados

Domoticz y Google Home: Node Red vs IFTTT

Os recordamos que una alternativa a Node Red para utilizar Domoticz con Google Home es IFTTT, pero actualmente IFTTT requiere una suscripción con pago mensual para poder disfrutar de más de 3 applets (y cada orden que incluyamos en IFTTT para ejecutar en domoticz es un applet). Si prefieres pasar por IFTTT y no te importa el pago, deberéis seguir el siguiente tutorial: «Uso de Google Home con Domoticz mediante IFTTT (requiere suscripción mensual)«.

En caso de que prefieras evitar IFTTT y su suscripción, sigue este tutorial. El uso de Domoticz y Google Home mediante Node Red es gratuito (por el momento). Extraemos la información del siguiente enlace: «https://flows.nodered.org/node/node-red-contrib-nora«

La otra posibilidad es utilizar el sistema de integración del siguiente github: «https://github.com/DewGew/Domoticz-Google-Assistant«.

Requisitos inciales

Para poder seguir este tutorial es necesario tener instalado Node Red en nuestra Raspberry, además de Domoticz, MQTT y demás.

También es fundamental, lógicamente, disponer de un dispositivo Google Home en nuestro poder.

Os dejamos el listado de tutoriales para poder instalar lo que necesitéis antes de empezar esta guía:

  1. Material necesario para poner en marcha domoticz
  2. Instalación de domoticz desde cero
  3. Instalación de Mosquitto MQTT Broker en Raspberry Pi 
  4. Configurar MQTT con usuario y contraseña (opcional)
  5. Cargamos MQTT en nuestro domoticz
  6. Instalar Watchdog en domoticz
  7. Crear usuario y contraseña para domoticz (opcional)
  8. Cómo instalar node red en nuestra raspberry pi

Comentar también que este sistema no es compatible con tener dos raspberry con domoticz y node red ambas en la misma red wifi. En muchos casos el sistema no funciona teniendo esta doble instalación.

Descarga del software necesario

Damos por hecho que ya tenemos el software necesario a consecuencia del seguimiento de los tutoriales anteriores para instalar Node red.

OJO a los que tenéis USER y PASS en MQTT de la raspberry y en MQTT de domoticz. Debéis tenerlo en cuenta a la hora de seguir el tutorial.

Nos registramos en Smart Nora

Visitamos la siguiente página y nos registramos:

https://smart-nora.eu/

Createmos una cuenta usando nuestro email y la contraseña que deseemos.

Verificamos nuestra contraseña mediante el enlace que reccibiremos en nuestro email.

Configuramos Node Red: creamos el Flow o Adaptamos el que teníamos de la anterior versión de Nora

 

Abrimos node red (Recuerda que accedemos a ella introduciendo la IP de nuestra raspberry seguido de :1880) y empezamos instalando un plugin, el de Nora. Sigue las indicaciones de las imágenes:

Buscamos el primer plugin a cargar en node red: node-red-contrib-smartnora, y lo instalamos.

Es posible que nos salte un aviso. Instalamos igualmente.

Creamos el Flow

A continuación cargamos el flow que os adjuntamos de la siguiente manera:

Introducimos en el recuadro siguiente texto (lo copiamos con control +c) y lo pegamos en el recuadro (con control + v):

Flow para dimmers:

[{"id":"17bb0bf2.b01de4","type":"mqtt out","z":"985f788.d875488","name":"","topic":"domoticz/in","qos":"","retain":"","broker":"64322ca9.5df834","x":2350,"y":780,"wires":[]},{"id":"a4363e11.2cfca8","type":"function","z":"985f788.d875488","name":"Function out Dimmer","func":"var idx = parseInt(msg.topic);\n\nif (msg.payload.on === false) {\n msg.payload = {\"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\"};\n}\nelse if (msg.payload.on === true) {\n msg.payload = {\"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": msg.payload.brightness};\n}\nreturn msg","outputs":1,"noerr":0,"x":1980,"y":1580,"wires":[["17bb0bf2.b01de4"]]},{"id":"ed1683ec.bb2c8","type":"noraf-light","z":"985f788.d875488","devicename":"Led Comedor","lightcolor":false,"brightnesscontrol":true,"commandonlycolor":true,"turnonwhenbrightnesschanges":true,"passthru":false,"statepayload":true,"brightnessoverride":"","roomhint":"Menjador","name":"Led Menjador","colortype":"rgb","nora":"4183ef64.18792","topic":"422","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","temperaturemin":"2700","temperaturemax":"5500","x":1360,"y":1580,"wires":[["a4363e11.2cfca8"]]},{"id":"a7ab26f5.5b71","type":"function","z":"985f788.d875488","name":"Function Dimmer In","func":"msg.topic = msg.payload.idx;\n\nif (msg.payload.nvalue === 1) {\n msg.payload = {\n on: true,\n brightness: msg.payload.Level\n }\nreturn msg; \n}\n\nelse if (msg.payload.nvalue === 0) {\n msg.payload = {\n on: false,\n brightness: msg.payload.Level\n }\nreturn msg;\n}\nelse if (msg.payload.nvalue === 2) {\n msg.payload = {\n on: true,\n brightness: msg.payload.Level\n }\nreturn msg;\n}\nelse {return null}","outputs":1,"noerr":0,"x":1090,"y":1580,"wires":[["ed1683ec.bb2c8"]]},{"id":"206371ca.6c72b6","type":"switch","z":"985f788.d875488","name":"Filter Dimmer Switch","property":"payload.idx","propertyType":"msg","rules":[{"t":"eq","v":"422","vt":"num"}],"checkall":"true","repair":false,"outputs":1,"x":740,"y":1580,"wires":[["a7ab26f5.5b71"]]},{"id":"a8f2173a.c9376","type":"mqtt in","z":"985f788.d875488","name":"","topic":"domoticz/out","qos":"2","datatype":"auto","broker":"64322ca9.5df834","x":170,"y":580,"wires":[["a26126f7.33cce","206371ca.6c72b6","88c31737.401b18"]]},{"id":"64322ca9.5df834","type":"mqtt-broker","z":"","name":"","broker":"192.168.18.14","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"4183ef64.18792","type":"noraf-config","z":"","name":"nora config","group":"Casa","twofactor":"off","twofactorpin":"","localexecution":true,"structure":"Smart Home Delfí"}]

Flow para persianas:

[{"id":"88c31737.401b18","type":"switch","z":"985f788.d875488","name":"Filter Shutter Switch","property":"payload.idx","propertyType":"msg","rules":[{"t":"eq","v":"9","vt":"num"},{"t":"eq","v":"531","vt":"str"},{"t":"eq","v":"522","vt":"str"},{"t":"eq","v":"290","vt":"str"},{"t":"eq","v":"550","vt":"str"}],"checkall":"true","repair":false,"outputs":5,"x":740,"y":1760,"wires":[["2343071b.70339"],["2343071b.70339"],["2343071b.70339"],["2343071b.70339"],["2343071b.70339"]]},{"id":"aef99e73.bc582","type":"noraf-blinds","z":"985f788.d875488","devicename":"Persiana comedor ","roomhint":"Persianes","name":"Persiana comedor","passthru":false,"invert":false,"nora":"4183ef64.18792","topic":"9","x":1370,"y":1640,"wires":[["9b2e5693.394708"]]},{"id":"2343071b.70339","type":"function","z":"985f788.d875488","name":"Function Shutter In","func":"msg.topic = msg.payload.idx;\n\nif (msg.payload.nvalue === 1) {\n msg.payload = {\n openPercent : 100\n }\nreturn msg; \n}\n\nelse if (msg.payload.nvalue === 0) {\n msg.payload = {\n openPercent : 0\n }\nreturn msg;\n}\nelse if (msg.payload.nvalue === 2) {\n msg.payload = {\n openPercent : msg.payload.svalue1\n }\nreturn msg;\n}\nelse {return null}","outputs":1,"noerr":0,"x":1090,"y":1760,"wires":[["aef99e73.bc582","72225fa2.731a78","b777d249.607db","f35af964.5e99e","4ea98a2c.594734"]]},{"id":"9b2e5693.394708","type":"function","z":"985f788.d875488","name":"Function Shutter Out","func":"var idx = parseInt(msg.topic);\n\nif (msg.payload.openPercent === 100) {\n msg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\"};\n }\nelse if (msg.payload.openPercent === 0) {\n msg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\"};\n }\n else {\n msg.payload = {\"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": msg.payload.openPercent};\n }\nreturn msg","outputs":1,"noerr":0,"x":1980,"y":1740,"wires":[["17bb0bf2.b01de4"]]},{"id":"72225fa2.731a78","type":"noraf-blinds","z":"985f788.d875488","devicename":"Persiana niños ","roomhint":"Persianes","name":"Persiana nens","passthru":false,"invert":false,"nora":"4183ef64.18792","topic":"531","x":1360,"y":1700,"wires":[["9b2e5693.394708"]]},{"id":"b777d249.607db","type":"noraf-blinds","z":"985f788.d875488","devicename":"Persiana parking ","roomhint":"Persianes","name":"Persiana parking","passthru":false,"invert":false,"nora":"4183ef64.18792","topic":"522","x":1370,"y":1760,"wires":[["9b2e5693.394708"]]},{"id":"f35af964.5e99e","type":"noraf-blinds","z":"985f788.d875488","devicename":"Persiana Sexual","roomhint":"Persianes","name":"Persiana pares","passthru":false,"invert":false,"nora":"4183ef64.18792","topic":"290","x":1360,"y":1820,"wires":[["9b2e5693.394708"]]},{"id":"4ea98a2c.594734","type":"noraf-blinds","z":"985f788.d875488","devicename":"Persiana habitacion armarios ","roomhint":"Persianes","name":"Persiana hab armarios","passthru":false,"invert":false,"nora":"4183ef64.18792","topic":"550","x":1380,"y":1880,"wires":[["9b2e5693.394708"]]},{"id":"17bb0bf2.b01de4","type":"mqtt out","z":"985f788.d875488","name":"","topic":"domoticz/in","qos":"","retain":"","broker":"64322ca9.5df834","x":2350,"y":780,"wires":[]},{"id":"a8f2173a.c9376","type":"mqtt in","z":"985f788.d875488","name":"","topic":"domoticz/out","qos":"2","datatype":"auto","broker":"64322ca9.5df834","x":170,"y":580,"wires":[["a26126f7.33cce","206371ca.6c72b6","88c31737.401b18"]]},{"id":"4183ef64.18792","type":"noraf-config","z":"","name":"nora config","group":"Casa","twofactor":"off","twofactorpin":"","localexecution":true,"structure":"Smart Home Delfí"},{"id":"64322ca9.5df834","type":"mqtt-broker","z":"","name":"","broker":"192.168.18.14","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]

Y tras pegar el texto clicamos sobre IMPORT:

Configuraremos el Flow con nuestros datos.

Editamos nuestro antiguo Flow de la versión anterior de Nora

Exportamos el flow de Nora (el que teníamos de antes) y lo guardamos en nuestro ordenador.

Abrimos con un editor de texto (notepad++, bloc de notas, o el que sea) y remplazamos nora-light por noraf-light. Guardamos.

Para el resto de tipos de nodo: persianas y demás, hacer la misma operación sustituyendo nora-blinds por noraf-blinds, y así con los que tengamos.

Importamos el nuevo flow editado.

A continuación debemos editar la config del primer nodo light tal y como indicamos.

Editamos el nodo de luz. Editamos el primer nodo light el nora-config (las configuraciones se pueden reutilizar entre varios dispositivos nora) en el que debemos ingresar nuestras credenciales (correo electrónico / contraseña) que utilizamos cuando creamos la cuenta Smart NORA.

El Grupo se usa para múltiples conexiones a la misma cuenta Smart NORA (si utilizamos múltiples instancias de Node-RED. La dejamos en blanco si no planeamos usar múltiples instancias).

Para los siguientes nodos, lo único que hay que hacer es entrar tal y como muestra las imágenes de arriba y ya aparecerán los datos rellenados, solo hay que darle a UPDATE.

Recordatorio del antiguo tutorial de Nora para la configuración de escenas y dimmers

Si hemos añadido algún IDX de una escena, deberemos modificar el texto del Function de la Luz correspondiente. Por defecto el texto es el siguiente:

var idx = parseInt(msg.topic);
if ( msg.payload === true )
{
msg.payload = { "command": "switchlight", "idx": idx, "switchcmd": "On" };
}
else if ( msg.payload === false )
{
msg.payload = { "command": "switchlight", "idx": idx, "switchcmd": "Off" };
}
return msg

Si os fijáis, aparece la palabra light. Si tenéis una luz o luces con escena en domoticz, deberéis cambiar ese texto por:

var idx = parseInt(msg.topic);
if ( msg.payload === true )
{
msg.payload = { "command": "switchscene", "idx": idx, "switchcmd": "On" };
}
else if ( msg.payload === false )
{
msg.payload = { "command": "switchscene", "idx": idx, "switchcmd": "Off" };
}
return msg

Si además de tener una escena, en ella sólo se ejecuta una orden (por ejemplo encender) y tenéis la orden contraria en otra escena, no hace falta que añadáis un idx extra en el flow, simplemente añadid en el texto de la escena que enciende la luz el IDX de la escena que apaga esa misma luz (o luces):

var idx = parseInt(msg.topic);
if ( msg.payload === true )
{
msg.payload = { "command": "switchscene", "idx": idx, "switchcmd": "On" };
}
else if ( msg.payload === false )
{
msg.payload = { "command": "switchscene", "idx": 14, "switchcmd": "On" };
}
return msg

En el ejemplo anterior, el texto pertenece a la escena 13 que enciende las luces del jardín al ejecutarla (Ver siguientes dos imágenes). Sin embargo, esas mismas luces se apagan con la activación de la escena con IDX 14. Por ello, ponemos el IDX 14 tras el else if junto a la acción On. Cuidado no confundir la acción que se genera en el dispositivo (apagado de luces) con la acción que requiere la escena para ejecutar su cometido (en este caso ON). Es decir, cuando se activa (ON) la escena 14, se apagan (OFF) las luces.

Para añadir Dimmers o Tiras Led RGBW deberemos seguir los siguientes pasos:

Añadiremos una Function Dimmer independiente a las Luces que hemos creado en el paso anterior y un Function out Dimmer al final con doble salida como los siguientes:

En Function Dimmer introducimos el siguiente texto:

msg.topic = msg.payload.idx
var brightness = msg.payload.svalue1
if (msg.payload.nvalue === 1)
{
msg.payload = 100
}
else if (msg.payload.nvalue === 0)
{
msg.payload = 0
}
else if (msg.payload.nvalue === 2)
{
msg.payload = brightness
}
return msg;

Y en Function out Dimmer introduciremos el siguiente texto:

var idx = parseInt(msg.topic)
var brightness = msg.payload
if ( msg.payload === 0 )
{
msg.payload = { "command": "switchlight", "idx": idx, "switchcmd": "Off" };
return [msg, null]
}
else
{
msg.payload = { "command": "switchlight", "idx": idx, "switchcmd": "Set Level", "level": brightness };
return [null, msg]
}

Además, en este mismo node modificaremos el número de salidas en la parte inferior para poner 2:

A continuación editamos el node de las luces en cuestión introduciendo la misma información que con las luces normales y, además, dos aspectos diferenciadores que os marcamos en rojo en el siguiente ejemplo:

Establecemos las uniones entre Switch – Function Dimmer – Switch – Luz – Function out Dimmer (doble conexión) – json.

Finalizamos el trabajo en Node Red

Una vez tenemos nuestros datos cubiertos y todos los dispositivos añadidos, guardamos mediante DEPLOY.

Es posible que nos aparezcan los dispositivos como not connected o connected:

No te alarmes, aún no hemos terminado el tutorial. Continúa sin saltarte ninguna parte.

Vinculamos nuestra cuenta de Google Home con Smart Nora

Entramos en nuestro asistente google home y vinculamos nuestra cuenta con Nora:

Buscamos Smart NORA y lo vinculamos:

Un pequeño cambio en domoticz

Abrimos domoticz y vamos a:

Setup > Hardware > Local MQTT

Seleccionamos la línea Local MQTT:

Por defecto la casilla Prevent Loop viene como True. La cambiamos a False y Guardamos desde Update, NO DESDE ADD:

Comprobamos su funcionamiento

Sincronizaremos dispositivos, desde el asistente de voz “Ok google” “sincroniza dispositivos”.

Nos dirigimos a Google Home y le pedimos que encienda alguno de nuestros dispositivos incluídos en el flow de Nora: OK Google, enciende Luz 1. 

La luz debería encenderse.

Y si todo funciona, eliminar de Google Home el anterior NORA para que no aparezcan duplicados los dispositivos.

Cómo localizar errores en node red

Os damos un truquito para vuestra información. Tenemos un node en el listado de la izquierda que se llama DEBUG. Cuando lo llevamos a la pantalla principal, lo conectamos a un node y lo activamos, nos dá mucha información (como un LOG) en la columna de la derecha del todo. Os explicamos con unas cuantas imágenes cómo conseguirlo:

Mantén el cursor pulsando la bola del final del recuadro del mqtt/in y arrástrala hasta la bola del inicio del recuadro del debug:

Clicamos sobre deploy:

Activamos la cucaracha y a la derecha nos aparecerá el debug con info de errores /( y así podremos analizar qué estamos haciendo mal) o info correcta:

Inicio automático de Node RED con Raspberry Pi

Recordar que por defecto Node RED está apagado. Podemos iniciarlo de dos formas diferentes: manual o automático.

Para inicio manual introducimos en puTTY:

node-red-start

Para que Node Red inicie de forma automática (tras caídas de red, o tras apagar y encender la raspberry) lanzamos el siguiente comando en puTTY:

sudo systemctl enable nodered.service

Para cualquier duda o consulta tienes disponible el grupo de telegram «Domoticz a lo Spain» para entrar, ponerte cómodo y participar cuanto quieras.

Clica aquí para entrar en él

Cualquier duda, sugerencia o comentario será bien recibida en la web!