Uso de Google Home con Domoticz mediante Node Red (actualmente NO requiere suscripción mensual)

Comentar, antes de nada, 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.

Dividimos esta guía en varios apartados

Domoticz y Google Home: Node Red vs IFTTT

Miki G. del grupo «Domoticz a lo spain» de telegram nos explica en esta guía cómo vincular Google Home con domoticz mediante Node Red.

Os recordamos que la 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«

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

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.

Generamos nuestro token Nora

Visitamos la siguiente página y nos registramos:

https://node-red-google-home.herokuapp.com/login

Nos cargará una página con el TOKEN que deberemos copiar y pegar en algún lugar a buen recaudo. Tendremos que copiarlo en una casilla de Node Red posrteriormente:

Configuramos Node Red para las Luces

Creamos el Flow

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: Nora, y lo instalamos.

Es posible que nos salte un aviso. Instalamos igualmente.

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):

[{"id":"da001352.a59c","type":"tab","label":"Luces ","disabled":false,"info":""},{"id":"b046cbba.dfc7f8","type":"mqtt in","z":"da001352.a59c","name":"","topic":"domoticz/out","qos":"2","datatype":"auto","broker":"693a8a17.e6a644","x":110,"y":240,"wires":[["654e441e.ac05ac"]]},{"id":"654e441e.ac05ac","type":"json","z":"da001352.a59c","name":"","property":"payload","action":"","pretty":false,"x":270,"y":240,"wires":[["711b8d48.b5b554"]]},{"id":"711b8d48.b5b554","type":"switch","z":"da001352.a59c","name":"","property":"payload.switchType","propertyType":"msg","rules":[{"t":"cont","v":"On/Off","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":430,"y":240,"wires":[["a68a6b66.18c598"]]},{"id":"a68a6b66.18c598","type":"function","z":"da001352.a59c","name":"Function In on/off","func":"msg.topic = msg.payload.idx\nif (msg.payload.nvalue == 1)\n{\n msg.payload = true\n}\nelse if (msg.payload.nvalue === 0)\n{\n msg.payload = false\n}\n return msg;\n","outputs":1,"noerr":0,"x":630,"y":240,"wires":[["225fb3ec.7a1c8c"]]},{"id":"225fb3ec.7a1c8c","type":"switch","z":"da001352.a59c","name":"IDX'S","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"str"},{"t":"eq","v":"2","vt":"str"},{"t":"eq","v":"3","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":810,"y":240,"wires":[["92d8f772.d1ce68"],["7bfd57f0.b084d8"],["53565575.93ac2c"]]},{"id":"524141ad.d7754","type":"function","z":"da001352.a59c","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1290,"y":180,"wires":[["5f62505f.99d1b"]]},{"id":"5f62505f.99d1b","type":"json","z":"da001352.a59c","name":"","property":"payload","action":"","pretty":false,"x":1530,"y":240,"wires":[["a30c015c.bb205"]]},{"id":"a30c015c.bb205","type":"mqtt out","z":"da001352.a59c","name":"","topic":"domoticz/in","qos":"","retain":"","broker":"693a8a17.e6a644","x":1690,"y":240,"wires":[]},{"id":"dc52e440.9d43c8","type":"function","z":"da001352.a59c","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1290,"y":300,"wires":[["5f62505f.99d1b"]]},{"id":"67e1315e.2cccd","type":"function","z":"da001352.a59c","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1290,"y":240,"wires":[["5f62505f.99d1b"]]},{"id":"7bfd57f0.b084d8","type":"nora-light","z":"da001352.a59c","devicename":"Luz2","lightcolor":false,"brightnesscontrol":true,"turnonwhenbrightnesschanges":false,"passthru":false,"statepayload":true,"brightnessoverride":"","roomhint":"Habitacion 2","name":"Luz 2","nora":"680c4136.7319c","topic":"2","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":1010,"y":240,"wires":[["67e1315e.2cccd"]]},{"id":"92d8f772.d1ce68","type":"nora-light","z":"da001352.a59c","devicename":"Luz1","lightcolor":false,"brightnesscontrol":true,"turnonwhenbrightnesschanges":false,"passthru":false,"statepayload":true,"brightnessoverride":"","roomhint":"Habitacion1","name":"Luz1","nora":"680c4136.7319c","topic":"1","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":1010,"y":180,"wires":[["524141ad.d7754"]]},{"id":"53565575.93ac2c","type":"nora-light","z":"da001352.a59c","devicename":"Luz3","lightcolor":false,"brightnesscontrol":false,"turnonwhenbrightnesschanges":false,"passthru":false,"statepayload":true,"brightnessoverride":"","roomhint":"Habitacion 3","name":"Luz 3","nora":"680c4136.7319c","topic":"3","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":1010,"y":300,"wires":[["dc52e440.9d43c8"]]},{"id":"693a8a17.e6a644","type":"mqtt-broker","z":"","name":"Mqtt","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"680c4136.7319c","type":"nora-config","z":"","name":"nora config","group":"","notify":false}]

Y tras pegar el texto clicamos sobre IMPORT:

Veremos que se nos carga una pestaña nueva denominada Luces. Clicamos sobre ella si no estamos en ella:

Y veremos que se nos carga el flow completo. Vamos a configurarlo con nuestros datos.

Configuramos el Flow con nuestros datos

Efectuamos doble click en domoticz/out:

Clicamos en el lapiz:

Introducimos los datos de nuestro domoticz y aceptamos con Add o Done:

Repetiremos el proceso para domoticz in:

Buscaremos en el desplegable si aparece la IP de nuestro domoticz (que hemos introducido anteirormente) y lo seleccionamos:

Si no aparece clicamos sobre el lápiz y lo introducimos manualmente:

Introducimos la IP de nuestro domoticz y aceptamos con Add.

Ojo si tenéis user y pass de MQTT. Deberéis introducirlos aquí:

Volvemos a tener la pantalla inicial. Ahora configuramos los IDX de nuestros dummys en IDX’s. Debemos mantener el orden con que aparecerán los dispositivos a continuación. Si el primero del switch es el 1, el primero del listado deberá ser el 1 (como en nuestro ejemplo). Hacemos doble click en el node IDX’s:

A continuación doble click sobre la primera Luz (en nuestrro ejemplo Luz 1) y:

  • Sustituimos el nombre (Light),
  • Desmarcamos la casilla Allow brightness control,
  • Cambiamos el nombre de la habitación por la que tengamos en Google Home,
  • Cambiamos el Topic por el IDX del dispositivo,
  • Añadimos el nombre con el que nos dirigiremos a GH para pedirle una orden en concreto.

Y ahora un punto muy importante…. Añadir nuestro TOKEN.

Para ello, volvemos a hacer doble click sobre la primera Luz y seleccionamos el lápiz:

Introducimos nuestro TOKEN y clicamos sobre Update. Volverá a la pantalla anterior y clicamos sobre Done:

Node Red automáticamente guardará nuestro TOKEN para todas las Luces sin necesidad de repetir la operación con el resto.

Modificamos los IDX, nombres, etc del resto de luces y añadimos las que necesitemos como en el paso anterior.

Finalmente, 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.

Resumen de la configuración en Node Red

Os dejamos una imagen como resumen del procedimiento:

Vinculamos nuestra cuenta de Google Home con Nora

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

Buscamos 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

Nos dirigimos a Google Home y le pedimos que encienda una luz: OK Google, enciende Luz 1. 

La luz debería encenderse.

Añadimos Enchufes, Persianas y Termómetros

Enchufes

Repetiremos el mismo proceso (aunque la vinculación con la cuenta de Google Home no es necesario repetirla), para añadir los Enchufes y Persianas importando los siguientes flows:

  • Enchufes:
[{"id":"a13029d1.2574f8","type":"tab","label":"Enchufes","disabled":false,"info":""},{"id":"c8af4f22.eb583","type":"mqtt in","z":"a13029d1.2574f8","name":"","topic":"domoticz/out","qos":"2","datatype":"auto","broker":"693a8a17.e6a644","x":110,"y":180,"wires":[["ca7a6947.fffc28"]]},{"id":"ca7a6947.fffc28","type":"json","z":"a13029d1.2574f8","name":"","property":"payload","action":"","pretty":false,"x":150,"y":340,"wires":[["e07e5dc5.76779"]]},{"id":"e07e5dc5.76779","type":"switch","z":"a13029d1.2574f8","name":"","property":"payload.switchType","propertyType":"msg","rules":[{"t":"cont","v":"On/Off","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":130,"y":480,"wires":[["e06e4594.f45a08"]]},{"id":"e06e4594.f45a08","type":"function","z":"a13029d1.2574f8","name":"Function In on/off","func":"msg.topic = msg.payload.idx\nif (msg.payload.nvalue == 1)\n{\n msg.payload = true\n}\nelse if (msg.payload.nvalue === 0)\n{\n msg.payload = false\n}\n return msg;\n","outputs":1,"noerr":0,"x":170,"y":660,"wires":[["31155662.d986aa"]]},{"id":"31155662.d986aa","type":"switch","z":"a13029d1.2574f8","name":"IDX'S","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"str"},{"t":"eq","v":"2","vt":"str"},{"t":"eq","v":"230","vt":"str"},{"t":"eq","v":"231","vt":"str"},{"t":"eq","v":"287","vt":"str"},{"t":"eq","v":"6","vt":"str"},{"t":"eq","v":"178","vt":"str"},{"t":"eq","v":"348","vt":"str"},{"t":"eq","v":"37","vt":"str"},{"t":"eq","v":"4","vt":"str"},{"t":"eq","v":"346","vt":"str"},{"t":"eq","v":"347","vt":"str"},{"t":"eq","v":"182","vt":"str"},{"t":"eq","v":"","vt":"str"},{"t":"eq","v":"","vt":"str"},{"t":"eq","v":"","vt":"str"},{"t":"eq","v":"","vt":"str"},{"t":"eq","v":"","vt":"str"}],"checkall":"true","repair":false,"outputs":18,"x":470,"y":540,"wires":[["feabc767.a3b278"],["daf114b.e61d5e8"],["6e140adb.832204"],["319240cd.ffad4"],["35fe2236.a7142e"],["a9e9da2d.38c1b8"],["5f8c1c6a.8b47e4"],["2809ef09.cf058"],["c5378400.14071"],["78dc48e8.312238"],["2c09d8f3.358b78"],["92e905ef.ec5c18"],["d6113738.162428"],[],[],[],[],[]]},{"id":"e7f0ea6d.2f3168","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":60,"wires":[["c7a20422.c804b8"]]},{"id":"c7a20422.c804b8","type":"json","z":"a13029d1.2574f8","name":"","property":"payload","action":"","pretty":false,"x":1290,"y":600,"wires":[["8e42695c.92eba8"]]},{"id":"8e42695c.92eba8","type":"mqtt out","z":"a13029d1.2574f8","name":"","topic":"domoticz/in","qos":"","retain":"","broker":"693a8a17.e6a644","x":1590,"y":660,"wires":[]},{"id":"9f226bad.e52198","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":180,"wires":[["c7a20422.c804b8"]]},{"id":"d04c2b82.87f798","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":240,"wires":[["c7a20422.c804b8"]]},{"id":"4cf9ca07.e26184","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":300,"wires":[["c7a20422.c804b8"]]},{"id":"88da8ed7.19e01","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":360,"wires":[["c7a20422.c804b8"]]},{"id":"a7def269.5c315","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":420,"wires":[["c7a20422.c804b8"]]},{"id":"b49fe537.827c58","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":480,"wires":[["c7a20422.c804b8"]]},{"id":"5b81d092.261ab","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":540,"wires":[["c7a20422.c804b8"]]},{"id":"27e43792.cd0718","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":120,"wires":[[]]},{"id":"29aaafe.fc4cd5","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":660,"wires":[["c7a20422.c804b8"]]},{"id":"2a33a81f.701be8","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":600,"wires":[["c7a20422.c804b8"]]},{"id":"5e6518ee.39b788","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":720,"wires":[["c7a20422.c804b8"]]},{"id":"a86b73b8.d3877","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":780,"wires":[["c7a20422.c804b8"]]},{"id":"7c7f9715.668f38","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":840,"wires":[["c7a20422.c804b8"]]},{"id":"cc69ec31.2e5b2","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":900,"wires":[["c7a20422.c804b8"]]},{"id":"8dc33c7c.1c7b8","type":"function","z":"a13029d1.2574f8","name":"Function out On/Off","func":"var idx = parseInt(msg.topic);\nif ( msg.payload === true )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"On\" };\n}\nelse if ( msg.payload === false )\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Off\" };\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1010,"y":960,"wires":[["c7a20422.c804b8"]]},{"id":"feabc767.a3b278","type":"nora-switch","z":"a13029d1.2574f8","devicename":"Basic101","roomhint":"Sotano","name":"Basic101","passthru":false,"nora":"680c4136.7319c","topic":"1","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":760,"y":60,"wires":[["e7f0ea6d.2f3168"]]},{"id":"daf114b.e61d5e8","type":"nora-switch","z":"a13029d1.2574f8","devicename":"Alimentacion Fermax","roomhint":"Rellano","name":"Alimentacion Fermax","passthru":false,"nora":"680c4136.7319c","topic":"2","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":800,"y":120,"wires":[["27e43792.cd0718"]]},{"id":"5f8c1c6a.8b47e4","type":"nora-switch","z":"a13029d1.2574f8","devicename":"Guirnalda","roomhint":"Patio","name":"Guirnalda","passthru":false,"nora":"680c4136.7319c","topic":"178","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":760,"y":420,"wires":[["a7def269.5c315"]]},{"id":"6e140adb.832204","type":"nora-switch","z":"a13029d1.2574f8","devicename":"Lluvia por voz","roomhint":"Sotano","name":"Lluvia por voz","passthru":false,"nora":"680c4136.7319c","topic":"230","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":780,"y":180,"wires":[["9f226bad.e52198"]]},{"id":"319240cd.ffad4","type":"nora-switch","z":"a13029d1.2574f8","devicename":"Garage por voz","roomhint":"Sotano","name":"Garage por voz","passthru":false,"nora":"680c4136.7319c","topic":"231","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":780,"y":240,"wires":[["d04c2b82.87f798"]]},{"id":"35fe2236.a7142e","type":"nora-switch","z":"a13029d1.2574f8","devicename":"Extractor ","roomhint":"Baño","name":"Extractor Baño","passthru":false,"nora":"680c4136.7319c","topic":"287","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":780,"y":300,"wires":[["4cf9ca07.e26184"]]},{"id":"a9e9da2d.38c1b8","type":"nora-switch","z":"a13029d1.2574f8","devicename":"Verja","roomhint":"Calle","name":"Verja","passthru":false,"nora":"680c4136.7319c","topic":"6","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":750,"y":360,"wires":[["88da8ed7.19e01"]]},{"id":"92e905ef.ec5c18","type":"nora-garage","z":"a13029d1.2574f8","devicename":"Sillón 2","roomhint":"Comedor","name":"Sillón 2","passthru":false,"nora":"680c4136.7319c","topic":"347","openvalue":"true","openvalueType":"bool","closevalue":"false","closevalueType":"bool","x":760,"y":720,"wires":[["5e6518ee.39b788"]]},{"id":"2c09d8f3.358b78","type":"nora-garage","z":"a13029d1.2574f8","devicename":"Sillón 1","roomhint":"Comedor","name":"Sillón 1","passthru":false,"nora":"680c4136.7319c","topic":"346","openvalue":"true","openvalueType":"bool","closevalue":"false","closevalueType":"bool","x":760,"y":660,"wires":[["29aaafe.fc4cd5"]]},{"id":"2809ef09.cf058","type":"nora-garage","z":"a13029d1.2574f8","devicename":"Toldo","roomhint":"Patio","name":"Toldo","passthru":false,"nora":"680c4136.7319c","topic":"348","openvalue":"true","openvalueType":"bool","closevalue":"false","closevalueType":"bool","x":750,"y":480,"wires":[["b49fe537.827c58"]]},{"id":"78dc48e8.312238","type":"nora-switch","z":"a13029d1.2574f8","devicename":"Sofa","roomhint":"Comedor","name":"Sofa","passthru":false,"nora":"680c4136.7319c","topic":"4","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":750,"y":600,"wires":[["2a33a81f.701be8"]]},{"id":"c5378400.14071","type":"nora-switch","z":"a13029d1.2574f8","devicename":"Para Toldo","roomhint":"Patio","name":"Para Toldo","passthru":false,"nora":"680c4136.7319c","topic":"37","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":770,"y":540,"wires":[["5b81d092.261ab"]]},{"id":"d6113738.162428","type":"nora-switch","z":"a13029d1.2574f8","devicename":"Enchufe 2","roomhint":"Sotano","name":"Enchufe 2","passthru":false,"nora":"680c4136.7319c","topic":"182","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":760,"y":780,"wires":[["a86b73b8.d3877"]]},{"id":"693a8a17.e6a644","type":"mqtt-broker","z":"","name":"Mqtt","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"680c4136.7319c","type":"nora-config","z":"","name":"nora config","group":"","notify":false}]

Persianas

Repetiremos el mismo proceso (aunque la vinculación con la cuenta de Google Home no es necesario repetirla), para añadir los Enchufes y Persianas importando los siguientes flows:

  • Persianas:
[{"id":"15791751.67c1c9","type":"tab","label":"Persianas2","disabled":false,"info":""},{"id":"d8ee0f3e.8d746","type":"json","z":"15791751.67c1c9","name":"","property":"payload","action":"","pretty":false,"x":170,"y":140,"wires":[["1d5625e3.78503a"]]},{"id":"21a677d9.406c18","type":"json","z":"15791751.67c1c9","name":"","property":"payload","action":"","pretty":false,"x":1130,"y":340,"wires":[["42528d43.e9d454","d494205b.e3b4"]]},{"id":"d494205b.e3b4","type":"mqtt out","z":"15791751.67c1c9","name":"","topic":"domoticz/in","qos":"2","retain":"","broker":"5eb861ad.32495","x":1310,"y":340,"wires":[]},{"id":"3750cf85.8e748","type":"nora-blinds","z":"15791751.67c1c9","devicename":"Persiana Cocina1","roomhint":"Cocina","name":"Persiana Cocina1","passthru":false,"invert":false,"nora":"680c4136.7319c","topic":"108","x":630,"y":580,"wires":[["16baf719.ab3cb9"]]},{"id":"42528d43.e9d454","type":"debug","z":"15791751.67c1c9","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1290,"y":220,"wires":[]},{"id":"ae4e0db6.ea9db","type":"mqtt in","z":"15791751.67c1c9","name":"","topic":"domoticz/out","qos":"2","datatype":"auto","broker":"693a8a17.e6a644","x":150,"y":40,"wires":[["d8ee0f3e.8d746"]]},{"id":"1d5625e3.78503a","type":"switch","z":"15791751.67c1c9","name":"","property":"payload.switchType","propertyType":"msg","rules":[{"t":"cont","v":"openPercent","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":170,"y":260,"wires":[["878c6469.a09ef8"]]},{"id":"878c6469.a09ef8","type":"function","z":"15791751.67c1c9","name":"Funcion entrada","func":"msg.topic = msg.payload.idx\nvar percent = 100 - msg.payload.svalue1\nif (msg.payload.nvalue === 1)\n{\n msg.payload = 100\n}\nelse if (msg.payload.nvalue === 0)\n{\n msg.payload = 0\n}\nelse if (msg.payload.nvalue === 2)\n{\n msg.payload.openPercent = percent\n}\n return msg;","outputs":1,"noerr":0,"x":180,"y":380,"wires":[["c695d0af.7f80b"]]},{"id":"16baf719.ab3cb9","type":"function","z":"15791751.67c1c9","name":"Funcion porcentaje","func":"var idx = parseInt(msg.topic)\nvar openPercent = 100 - msg.payload.openPercent\n\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": openPercent };\nreturn msg\n}","outputs":1,"noerr":0,"x":850,"y":580,"wires":[["21a677d9.406c18"]]},{"id":"c695d0af.7f80b","type":"switch","z":"15791751.67c1c9","name":"IDX'S","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"","vt":"str"},{"t":"eq","v":"53","vt":"str"},{"t":"eq","v":"60","vt":"str"},{"t":"eq","v":"66","vt":"str"},{"t":"eq","v":"74","vt":"str"},{"t":"eq","v":"81","vt":"str"},{"t":"eq","v":"88","vt":"str"},{"t":"eq","v":"95","vt":"str"},{"t":"eq","v":"102","vt":"str"},{"t":"eq","v":"108","vt":"str"},{"t":"eq","v":"115","vt":"str"},{"t":"eq","v":"123","vt":"str"}],"checkall":"true","repair":false,"outputs":12,"x":350,"y":380,"wires":[["6d48e17b.6214f"],["74fa15be.d9e91c"],["e0e625f2.c8d5b8"],["9c1c0c10.64d0c"],["b95d138b.94ab5"],["85b585b.2c4f378"],["2e0c3d3e.e65092"],["c44c1bc4.728ee8"],["fe993ed.04c62c"],["3750cf85.8e748"],["37ae69bc.a4c636"],["213631a6.873e0e"]]},{"id":"6d48e17b.6214f","type":"nora-blinds","z":"15791751.67c1c9","devicename":"Persiana Miguel","roomhint":"Miguel","name":"Persiana Miguel","passthru":false,"invert":false,"nora":"680c4136.7319c","topic":"45","x":620,"y":40,"wires":[["d8fa839c.eca7"]]},{"id":"74fa15be.d9e91c","type":"nora-blinds","z":"15791751.67c1c9","devicename":"Persiana 2Camas","roomhint":"2 Camas","name":"Persiana 2Camas","passthru":false,"invert":false,"nora":"680c4136.7319c","topic":"53","x":630,"y":100,"wires":[["e2260e37.f35ba"]]},{"id":"e0e625f2.c8d5b8","type":"nora-blinds","z":"15791751.67c1c9","devicename":"Persiana Ines1","roomhint":"Ines Maria","name":"Persiana Ines1","passthru":false,"invert":false,"nora":"680c4136.7319c","topic":"60","x":620,"y":160,"wires":[["1168be58.56f492"]]},{"id":"9c1c0c10.64d0c","type":"nora-blinds","z":"15791751.67c1c9","devicename":"Persiana Ines2","roomhint":"Ines Maria","name":"Persiana Ines2","passthru":false,"invert":false,"nora":"680c4136.7319c","topic":"66","x":620,"y":220,"wires":[["bdb7809e.34db3"]]},{"id":"b95d138b.94ab5","type":"nora-blinds","z":"15791751.67c1c9","devicename":"Persiana Aseo","roomhint":"Aseo Arriba","name":"Persiana Aseo","passthru":false,"invert":false,"nora":"680c4136.7319c","topic":"74","x":620,"y":280,"wires":[["52289dfe.9dc244"]]},{"id":"85b585b.2c4f378","type":"nora-blinds","z":"15791751.67c1c9","devicename":"Persiana Comedor1","roomhint":"Comedor","name":"Persiana Comedor1","passthru":false,"invert":false,"nora":"680c4136.7319c","topic":"81","x":640,"y":340,"wires":[["1d7e6be6.a48444"]]},{"id":"2e0c3d3e.e65092","type":"nora-blinds","z":"15791751.67c1c9","devicename":"Persiana Comedor2","roomhint":"Comedor","name":"Persiana Comedor2","passthru":false,"invert":false,"nora":"680c4136.7319c","topic":"88","x":640,"y":400,"wires":[["bcf4c5e7.8733d8"]]},{"id":"c44c1bc4.728ee8","type":"nora-blinds","z":"15791751.67c1c9","devicename":"Persiana Estudio","roomhint":"Estudio","name":"Persiana Estudio","passthru":false,"invert":false,"nora":"680c4136.7319c","topic":"95","x":630,"y":460,"wires":[["15ce0969.7420f7"]]},{"id":"37ae69bc.a4c636","type":"nora-blinds","z":"15791751.67c1c9","devicename":"Persiana Cocina2","roomhint":"Cocina","name":"Persiana Cocina2","passthru":false,"invert":false,"nora":"680c4136.7319c","topic":"115","x":630,"y":640,"wires":[["238b7f16.40428"]]},{"id":"213631a6.873e0e","type":"nora-blinds","z":"15791751.67c1c9","devicename":"Persiana Cocina3","roomhint":"Cocina","name":"Persiana Cocina3","passthru":false,"invert":false,"nora":"680c4136.7319c","topic":"123","x":630,"y":700,"wires":[["da68c7d8.80ec48"]]},{"id":"d8fa839c.eca7","type":"function","z":"15791751.67c1c9","name":"Funcion porcentaje","func":"var idx = parseInt(msg.topic)\nvar openPercent = 100 - msg.payload.openPercent\n\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": openPercent };\nreturn msg\n}","outputs":1,"noerr":0,"x":850,"y":40,"wires":[["21a677d9.406c18"]]},{"id":"e2260e37.f35ba","type":"function","z":"15791751.67c1c9","name":"Funcion porcentaje","func":"var idx = parseInt(msg.topic)\nvar openPercent = 100 - msg.payload.openPercent\n\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": openPercent };\nreturn msg\n}","outputs":1,"noerr":0,"x":850,"y":100,"wires":[["21a677d9.406c18"]]},{"id":"1168be58.56f492","type":"function","z":"15791751.67c1c9","name":"Funcion porcentaje","func":"var idx = parseInt(msg.topic)\nvar openPercent = 100 - msg.payload.openPercent\n\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": openPercent };\nreturn msg\n}","outputs":1,"noerr":0,"x":850,"y":160,"wires":[["21a677d9.406c18"]]},{"id":"bdb7809e.34db3","type":"function","z":"15791751.67c1c9","name":"Funcion porcentaje","func":"var idx = parseInt(msg.topic)\nvar openPercent = 100 - msg.payload.openPercent\n\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": openPercent };\nreturn msg\n}","outputs":1,"noerr":0,"x":850,"y":220,"wires":[["21a677d9.406c18"]]},{"id":"52289dfe.9dc244","type":"function","z":"15791751.67c1c9","name":"Funcion porcentaje","func":"var idx = parseInt(msg.topic)\nvar openPercent = 100 - msg.payload.openPercent\n\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": openPercent };\nreturn msg\n}","outputs":1,"noerr":0,"x":850,"y":280,"wires":[["21a677d9.406c18"]]},{"id":"1d7e6be6.a48444","type":"function","z":"15791751.67c1c9","name":"Funcion porcentaje","func":"var idx = parseInt(msg.topic)\nvar openPercent = 100 - msg.payload.openPercent\n\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": openPercent };\nreturn msg\n}","outputs":1,"noerr":0,"x":850,"y":340,"wires":[["21a677d9.406c18"]]},{"id":"bcf4c5e7.8733d8","type":"function","z":"15791751.67c1c9","name":"Funcion porcentaje","func":"var idx = parseInt(msg.topic)\nvar openPercent = 100 - msg.payload.openPercent\n\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": openPercent };\nreturn msg\n}","outputs":1,"noerr":0,"x":850,"y":400,"wires":[["21a677d9.406c18"]]},{"id":"15ce0969.7420f7","type":"function","z":"15791751.67c1c9","name":"Funcion porcentaje","func":"var idx = parseInt(msg.topic)\nvar openPercent = 100 - msg.payload.openPercent\n\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": openPercent };\nreturn msg\n}","outputs":1,"noerr":0,"x":850,"y":460,"wires":[["21a677d9.406c18"]]},{"id":"238b7f16.40428","type":"function","z":"15791751.67c1c9","name":"Funcion porcentaje","func":"var idx = parseInt(msg.topic)\nvar openPercent = 100 - msg.payload.openPercent\n\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": openPercent };\nreturn msg\n}","outputs":1,"noerr":0,"x":850,"y":640,"wires":[["21a677d9.406c18"]]},{"id":"da68c7d8.80ec48","type":"function","z":"15791751.67c1c9","name":"Funcion porcentaje","func":"var idx = parseInt(msg.topic)\nvar openPercent = 100 - msg.payload.openPercent\n\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": openPercent };\nreturn msg\n}","outputs":1,"noerr":0,"x":850,"y":700,"wires":[["21a677d9.406c18"]]},{"id":"fe993ed.04c62c","type":"nora-blinds","z":"15791751.67c1c9","devicename":"Persiana Dormitorio","roomhint":"Dormitorio","name":"Persiana Dormitorio","passthru":false,"invert":false,"nora":"680c4136.7319c","topic":"102","x":640,"y":520,"wires":[["c1510c29.df14a"]]},{"id":"c1510c29.df14a","type":"function","z":"15791751.67c1c9","name":"Funcion porcentaje","func":"var idx = parseInt(msg.topic)\nvar openPercent = 100 - msg.payload.openPercent\n\n{\nmsg.payload = { \"command\": \"switchlight\", \"idx\": idx, \"switchcmd\": \"Set Level\", \"level\": openPercent };\nreturn msg\n}","outputs":1,"noerr":0,"x":850,"y":520,"wires":[["21a677d9.406c18"]]},{"id":"5eb861ad.32495","type":"mqtt-broker","z":"","name":"Domoticz","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"680c4136.7319c","type":"nora-config","z":"","name":"nora config","group":"","notify":false},{"id":"693a8a17.e6a644","type":"mqtt-broker","z":"","name":"Mqtt","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]

Termómetros e higrómetros

Para añadir termómetros e higrómetros NO necesitamos cargar otro flow, trabajaremos sobre el flow de las luces.

Lo primero que deberemos hacer es crear un dummy virtual (un switch) en domoticz para cada termómetro y/o higrómetro. Para nuestro ejemplo hemos creado uno que se llama «leetemsalon«.

Para ello, vamos a domoticz y entramos en Setup > Hardware ó Configuración > Hardware (si lo tenemos en español).

Creamos un nuevo Sensor Virtual. Si esta es la primera vez que introducimos un dispositivo creamos un hardware tipo Dummy. Si ya lo tenemos creado y nos aparece en la lista superior NO CREAMOS OTRO, sino que pulsamos directamente sobre Create Virtual Sensors. En caso de que sea tu primera vez, crear el hardware introduciendo los siguientes datos en los campos inferiores, sino pasa al siguiente paso. Fíjate en las siguientes imágenes si tienes dudas.

En este caso no tenemos creado ningún hardware tipo Dummy en el listado superior, por ello creamos uno:

Sin embargo, en este otro casi SÍ tenemos un hardware tipo dummy creado en el listado, por ello NO CREAMOS OTRO, ya que creamos nuestro nuevo dummy desde él:

A partir de aquí continuamos tanto los que teníamos ya creado este hardware por haber añadido dispositivos anteriormente como los que por primera vez acaban de crearlo. Clicamos sobre Create Virtual Sensors:

Introducimos el nombre (en nuestro ejemplo: «letemsalon«) y el tipo de sensor. Para este caso seleccionaremos Switch ó Interruptor (según idioma seleccionado en Domoticz).

Al aceptar y clicar sobre OK veremos que nos aparece un mensaje que nos indica que ya podemos localizar el nuevo Dummy en el apartado de devices.

Para localizar el Dummy nos vamos a Setup > Devices ó Configuración > Dispositivos (según idioma):

Clicamos sobre Idx para ordenarlos por orden descendente (de mayor a menor) y así localizamos nuestro nuevo IDX. Deberemos anotar este valor para introducirlo posteriormente en la configuración de Node Red:

A continuación añadimos el nuevo dispositivo «leetemsalon» al flow de las luces de nora, en node red, como hemos hecho antes con el resto de luces. Os recomendamos que creéis una «habitación» específica para los termómetros e higrómetros y asi tenerlos todos localizados. Yo he creado una llamada «Escenas»:

Clicamos en deploy y ya deberíamos tener cargada esta nueva «luz virutal» en google home. Es el momento de coger el teléfono móvil y abrir la APP de Google Home. Añadimos una rutina para que cuando preguntes qué temperatura hace en el salón Google home active este dummy:

Finalmente nos vamos a domoticz y creamos un script en DzVents de la siguiente manera. Vamos a:

Domoticz > Setup > More options > Events

Para que Google nos diga la TEMPERATURA del termómetro que hemos incluido en el sistema, debes tener en cuenta cómo tienes asociadas las notificaciones de domoticz con Google Home.

Si has seguido el tutorial: «Cómo recibir notificaciones de domoticz desde Google Home (versión sencilla)» tendrás que copiar y pegar el siguiente script:

return {
on = {
devices = {'leetemsalon'},
},
data = {},
logging = {},
execute = function(domoticz, triggeredItem)
if domoticz.devices('leetemsalon').state == 'On'then
domoticz.variables('textoGoogle').set('La temperatura del porche es de '..domoticz.utils.numDecimals(domoticz.devices('Congelador').temperature,1,1)..'')
domoticz.devices('leetemsalon').switchOff()
end
end
}

Nos aseguramos que ponemos correctamente el nombre del dummy virtual que acabamos de crear, para nuestro ejemplo «leetemsalon».

Si por el contrario has seguido el tutorial: «Cómo recibir notificaciones de domoticz desde Google Home (definiendo el volumen y el altavoz por el que nos notifica)«, deberás copiar y pegar el siguiente script:

return {
on = {
devices = {'leetemsalon'},
},
data = {},
logging = {},
execute = function(domoticz, triggeredItem)
if domoticz.devices('leetemsalon').state == 'On'then
domoticz.variables('destino_google').set('salon')
domoticz.variables('volumen_google').set('40')
domoticz.variables('texto_google').set('La temperatura del porche es de '..domoticz.utils.numDecimals(domoticz.devices('Congelador').temperature,1,1)..'')
domoticz.devices('leetemsalon').switchOff()
end
end
}

Nos aseguramos que ponemos correctamente el nombre del dummy virtual que acabamos de crear, para nuestro ejemplo «leetemsalon».

Además, ajustaremos el volumen «40» al que nos interese.

El 1,1 evita que google nos lea la temperatura con millones de decimales.

Para que Google nos diga la HUMEDAD del termómetro/higrómetro que hemos incluido en el sistema, debes tener en cuenta cómo tienes asociadas las notificaciones de domoticz con Google Home.

Si has seguido el tutorial: «Cómo recibir notificaciones de domoticz desde Google Home (versión sencilla)» tendrás que copiar y pegar el siguiente script:

return {
on = {
devices = {'leetemsalon2'},
},
data = {},
logging = {},
execute = function(domoticz, triggeredItem)
if domoticz.devices('leetemsalon2').state == 'On'then
domoticz.variables('destino_google').set('salon')
domoticz.variables('volumen_google').set('40')
domoticz.variables('textoGoogle').set('La humedad del congelador es de '..domoticz.utils.numDecimals(domoticz.devices('Congelador').humidity,1,1)..'')
domoticz.devices('leetemsalon2').switchOff()
end
end
}

Nos aseguramos que ponemos correctamente el nombre del dummy virtual que acabamos de crear, para nuestro ejemplo «leetemsalon2».

Si por el contrario has seguido el tutorial: «Cómo recibir notificaciones de domoticz desde Google Home (definiendo el volumen y el altavoz por el que nos notifica)«, deberás copiar y pegar el siguiente script:

return {
on = {
devices = {'leetemsalon2'},
},
data = {},
logging = {},
execute = function(domoticz, triggeredItem)
if domoticz.devices('leetemsalon2').state == 'On'then
domoticz.variables('destino_google').set('salon')
domoticz.variables('volumen_google').set('40')
domoticz.variables('texto_google').set('La humedad del congelador es de '..domoticz.utils.numDecimals(domoticz.devices('Congelador').humidity,1,1)..'')
domoticz.devices('leetemsalon2').switchOff()
end
end
}

Nos aseguramos que ponemos correctamente el nombre del dummy virtual que acabamos de crear, para nuestro ejemplo «leetemsalon2».

Además, ajustaremos el volumen «40» al que nos interese.

El 1,1 evita que google nos lea la humedad con millones de decimales.

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

Agradecimientos

Agradecer a nuestros amigos @damian_rguez y obreherrero del grupo Domoticz a lo spain” de telegram su gran participación en la edición de este tutorial. Sin ellos no habría sido posible.

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!