Cómo recibir notificaciones de domoticz desde Google Home

En esta guía vamos a explicar cómo recibir notificaciones desde Google Home con domoticz.

Para poder utilizar domoticz con Google Home necesitamos tener acceso a nuestro domoticz desde fuera de nuestra red wifi. Para ello, necesitamos:

  • Tener el puerto de nuestra raspberry abierto.
  • Establecer una IP fija con un sistema tipo noip para acceso externo (con dominio noip gratuito). Tienes el siguiente tutorial para conseguirlo: «Cómo acceder a domoticz desde fuera de nuestra red Wifi«.
  • Opcionalmente puedes utilizar también un dominio propio

Dividimos esta guía en varios apartados

Requisitos inciales

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

También es fundamental, lógicamente, disponer de al menos un Google Home con IP estática conocida.

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.

Creamos la variable en domoticz

Para crear una variable lo primero que debemos hacer es ir a Domoticz > Setup > More Options > User variables:

A continuación rellenamos el nombre que queremos darle a la variable y seleccionamos el tipo.

Necesitaremos crear una variable llamada textoGoogle del tipo String o Cadena de texto (según idioma de domoticz).

Nos confirmará la creación de la variable y nos aparecerá en el listado:

Configuramos Node Red

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

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

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":"d7c97ae6.fbd228","type":"tab","label":"Assistant","disabled":false,"info":""},{"id":"614acdc9.be0e84","type":"change","z":"d7c97ae6.fbd228","name":"","rules":[{"t":"set","p":"language","pt":"msg","to":"es-es","tot":"str"},{"t":"set","p":"destino","pt":"msg","to":"destino","tot":"global"},{"t":"set","p":"message","pt":"msg","to":"texto","tot":"global"},{"t":"set","p":"status","pt":"msg","to":"status","tot":"global"}],"action":"","property":"","from":"","to":"","reg":false,"x":340,"y":200,"wires":[["8a66746b.d76a38"]]},{"id":"2cfae4e.441e61c","type":"comment","z":"d7c97ae6.fbd228","name":"Salon ","info":"","x":610,"y":280,"wires":[]},{"id":"8a66746b.d76a38","type":"switch","z":"d7c97ae6.fbd228","name":"","property":"destino","propertyType":"msg","rules":[{"t":"eq","v":"salon","vt":"str"},{"t":"eq","v":"dormitorio","vt":"str"},{"t":"eq","v":"cocina","vt":"str"},{"t":"eq","v":"baño","vt":"str"},{"t":"eq","v":"todos","vt":"str"}],"checkall":"true","repair":false,"outputs":5,"x":290,"y":300,"wires":[["452606a4.d37f98"],["3a76ac90.d169e4"],[],["731599c4.bfd2b8"],["452606a4.d37f98","3a76ac90.d169e4","731599c4.bfd2b8"]]},{"id":"3410bea0.e351d2","type":"http in","z":"d7c97ae6.fbd228","name":"[POST] /ws/gcast ","url":"/ws/gcast","method":"get","upload":false,"swaggerDoc":"","x":140,"y":160,"wires":[["44cffd3d.fffe24","51e95cea.e928c4"]],"outputLabels":["200"]},{"id":"44cffd3d.fffe24","type":"change","z":"d7c97ae6.fbd228","name":"","rules":[{"t":"set","p":"texto","pt":"global","to":"payload.texto","tot":"msg"},{"t":"set","p":"destino","pt":"global","to":"payload.destino","tot":"msg"},{"t":"set","p":"status","pt":"global","to":"payload.status","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":340,"y":160,"wires":[["614acdc9.be0e84"]]},{"id":"4abeae9.e47625","type":"http response","z":"d7c97ae6.fbd228","name":"","statusCode":"200","headers":{},"x":120,"y":240,"wires":[]},{"id":"5225e63.5c08e18","type":"comment","z":"d7c97ae6.fbd228","name":"URL Demo","info":"http://192.168.8.150:1880/ws/gcast?texto=Esto ya funciona, OLE OLE&destino=todos","x":120,"y":120,"wires":[]},{"id":"51e95cea.e928c4","type":"template","z":"d7c97ae6.fbd228","name":"Output","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"Reproduciendo \" {{payload.texto}} \"\n\nEn el dispositivo {{payload.destino}} \n\n","output":"str","x":110,"y":200,"wires":[["4abeae9.e47625"]]},{"id":"8a83a1bd.068ee","type":"debug","z":"d7c97ae6.fbd228","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":880,"y":260,"wires":[]},{"id":"452606a4.d37f98","type":"cast-to-client","z":"d7c97ae6.fbd228","name":"","url":"","contentType":"","message":"","language":"es","ip":"192.168.8.131","port":"","volume":"50","x":610,"y":320,"wires":[[]],"icon":"node-red-contrib-cast/google-home-mini2.svg"},{"id":"3a76ac90.d169e4","type":"cast-to-client","z":"d7c97ae6.fbd228","name":"","url":"","contentType":"","message":"","language":"es","ip":"192.168.8.141","port":"","volume":"50","x":610,"y":380,"wires":[[]],"icon":"node-red-contrib-cast/google-home-mini2.svg"},{"id":"731599c4.bfd2b8","type":"cast-to-client","z":"d7c97ae6.fbd228","name":"","url":"","contentType":"","message":"","language":"es","ip":"192.168.8.144","port":"","volume":"50","x":610,"y":440,"wires":[[]],"icon":"node-red-contrib-cast/google-home-mini2.svg"}]

Y tras pegar el texto clicamos sobre IMPORT:

Veremos que se nos carga una pestaña llamada Assistant. Clicamos sobre ella en caso de estar en otra distina:

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

Efectuamos doble click en switch:

Introduciremos los Google Home que tengamos más otro extra que ponga todos. A continuación, cambiaremos las IPs que nos vienen por defecto por la de nuestros Google Home:

Uno por uno, hacemos doble click en los Cast y modificamos la IP por la nuestra. Nos aseguramos de que el orden de los conectores sea el correcto respecto al número del switch que hemos establecido en el paso anterior. El primer filamento saldrá para la IP del salón (según nuestro ejemplo).

Dentro de estos nodos podemos seleccionar también el volumen al que Google Home nos responderá.

Una vez modificado clicamos sobre DEPLOY:

Creamos el script para enlazar el sistema

Una vez hemos clicado en DEPLOY y nos aparecen los Cast como connected, nos vamos a domoticz y creamos el siguiente script en DzVents.

Nos vamos a:

Domoticz > Setup > More options > Events

Creamos un script tipo dzVents > Device:

Y copiamos y pegamos el siguiente texto adaptando lo necesario, clicamos sobre On y Guardamos:

return {
on = {
variables = {
'textoGoogle'
}
},
execute = function(domoticz, device)
--Necesario tener instalado CURL en la raspberry
--sudo apt-get install curl
local destino = "todos"
if device.value == "" then
--cuando vale "" no hacemos nada
domoticz.log('Variable textoGoogle reseteada', domoticz.LOG_ERROR)
else
local Time = require('Time')
local now = Time()
if (now.hour>8)then --de 00 a 08 no notificará, a voluntad
domoticz.log('Variable textoGoogle -> '..device.value, domoticz.LOG_ERROR)
-- en la siguiente linea sustituir 127.0.0.1 por la IP de tu node RED si no es la propia raspberry
-- quizá sea necesario instalar curl
-- sudo apt-get update;sudo apt-get install curl
local voice_command = 'curl -G --data-urlencode "texto='..device.value..'" --data-urlencode "destino='..destino..'" http://127.0.0.1:1880/ws/gcast --silent --output /dev/null'
os.execute(voice_command)
end
domoticz.variables('textoGoogle').set("")
end
end
}

Comprobamos el funcionamiento en domoticz

Una vez hemos creado el script anterior comprobamos que está funcionando correctamente. Vamos a crear otro script DzVents para comprobarlo.

Nos vamos a:

Domoticz > Setup > More options > Events

Y copiamos y pegamos el siguiente texto, clicamos sobre On y Guardamos:

return {
on = {
timer = { 'every 1 minutes'}
},
execute = function(domoticz, timer)
domoticz.variables('textoGoogle').set('Esto funciona')
end
}

Esperamos un minuto y Google Home debería emitir el mensaje: Esto funciona.

Como utilizar esta función

Para sacarle el máximo partido a las notificaciones a través de Google Home tendremos que hacer uso de los maravillosos scripts.

Os ponemos un ejemplo de script para que empecéis a jugar con este nuevo sistema. Cojamos el ejemplo del siguiente script:

return {
on = {
devices = {
'Luces - salon'
}
},
execute = function(domoticz, device)
if(device.state == 'On')then
domoticz.variables('textoGoogle').set('Luz salón encendida')
else
domoticz.variables('textoGoogle').set('Luz salón apagada')
end
end
}

Deberéis cambiar el Luces – salon por cualquiera de vuestros dummys para hacer la prueba. En nuestro caso si se encienden las luces del salón Google Home nos dice Luz salón encendida y si se apaga nos dice Luz salón apagada.

Y otro ejemplo para utilizar Google Home muy práctico. Cojamos el ejemplo del siguiente script para que telegram nos notifique si la lavadora ha terminado el programa:

return {
on = {
timer = { 'every 1 minutes'}
},
data = {
consumoPrevio = { initial = 0 }
},
execute = function(domoticz, timer)
local consumoAhora = domoticz.devices('LavadoraW').usage
local consumoPrevio = domoticz.data.consumoPrevio
--domoticz.log('Lavadora consumo actual: '..consumoAhora, domoticz.LOG_ERROR)
--domoticz.log('Lavadora consumo previo: '..consumoPrevio, domoticz.LOG_ERROR)
if(consumoAhora<2 and consumoPrevio>=2)then
domoticz.openURL({
url = "https://api.telegram.org/botTOKENDETUBOT/sendMessage?chat_id=NUMEROID&text=La lavadora ha temrinado",
method = 'GET'
})
end
domoticz.data.consumoPrevio = consumoAhora
end
}

Vamos a adaptarlo para utilizarlo con notificación a través de Google Home:

return {
on = {
timer = { 'every 1 minutes'}
},
data = {
consumoPrevio = { initial = 0 }
},
execute = function(domoticz, timer)
local consumoAhora = domoticz.devices('Lavadora.W').usage
local consumoPrevio = domoticz.data.consumoPrevio
--domoticz.log('Lavadora consumo actual: '..consumoAhora, domoticz.LOG_ERROR)
--domoticz.log('Lavadora consumo previo: '..consumoPrevio, domoticz.LOG_ERROR)
if(consumoAhora<2 and consumoPrevio>=2)then
domoticz.variables('textoGoogle').set('La lavadora ha terminado ya')
end
domoticz.data.consumoPrevio = consumoAhora
end
}

La lavadora debería notificarnos al terminar el programa a través de Google Home. 

Ejemplo sobre 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!