Cómo recibir notificaciones de domoticz desde Google Home

Definiendo el volumen y el altavoz por el que nos notifica

@damian_rguez del grupo «Domoticz a lo spain» de telegram nos explica cómo recibir notificaciones desde Google Home con domoticz estableciendo el volumen que queramos y la salida por el google home que nos interese.

Si no te interesa regular el volumen ni la salida por un GH en concreto, tienes a tu disposición un tutorial más sencillo sobre ello: «Cómo recibir notificaciones de domoticz desde Google Home«.

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 las variables 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 tres variables:

  • Una denominada texto_google del tipo String o Cadena de texto (según idioma de domoticz).
  • Otra denominada volumen_google del tipo Entero o Integer (según idioma de domoticz).
  • Y otra denominada destino_google del tipo String o Cadena de texto (según idioma de domoticz).

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":"25e21bf8.ff94b4","type":"tab","label":"Assistant","disabled":false,"info":""},{"id":"f560b862.e77f88","type":"change","z":"25e21bf8.ff94b4","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"},{"t":"set","p":"volume","pt":"msg","to":"payload.volume","tot":"global"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":180,"wires":[["64ad1691.470038"]]},{"id":"64ad1691.470038","type":"switch","z":"25e21bf8.ff94b4","name":"","property":"destino","propertyType":"msg","rules":[{"t":"eq","v":"garaje","vt":"str"},{"t":"eq","v":"cocina","vt":"str"},{"t":"eq","v":"salon","vt":"str"},{"t":"eq","v":"dormitorio","vt":"str"},{"t":"eq","v":"todos","vt":"str"}],"checkall":"true","repair":false,"outputs":5,"x":350,"y":400,"wires":[["d63ebda4.bf0468"],["8bf4207d.372698"],["a0b3f4ac.7b6b68"],["892592fb.67b45"],["8bf4207d.372698","d63ebda4.bf0468","892592fb.67b45","a0b3f4ac.7b6b68"]]},{"id":"5f2237c4.cf0148","type":"http in","z":"25e21bf8.ff94b4","name":"[POST] /ws/gcast ","url":"/ws/gcast","method":"get","upload":false,"swaggerDoc":"","x":180,"y":140,"wires":[["286a1c28.a1d724","1a938d96.7adb82"]],"outputLabels":["200"]},{"id":"286a1c28.a1d724","type":"change","z":"25e21bf8.ff94b4","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"},{"t":"set","p":"volume","pt":"global","to":"payload.volume","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":140,"wires":[["f560b862.e77f88"]]},{"id":"9e1f71d3.10a3c","type":"http response","z":"25e21bf8.ff94b4","name":"","statusCode":"200","headers":{},"x":220,"y":220,"wires":[]},{"id":"4e4623f1.17e40c","type":"comment","z":"25e21bf8.ff94b4","name":"URL Demo","info":"http://192.168.8.150:1880/ws/gcast?texto=Esto ya funciona, OLE OLE&destino=todos","x":60,"y":20,"wires":[]},{"id":"1a938d96.7adb82","type":"template","z":"25e21bf8.ff94b4","name":"Output","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"Reproduciendo \" {{payload.texto}} \"\n\nEn el dispositivo {{payload.destino}} \n\nCon el volumen al {{payload.volume}} %","output":"str","x":210,"y":180,"wires":[["9e1f71d3.10a3c"]]},{"id":"8bf4207d.372698","type":"cast-to-client","z":"25e21bf8.ff94b4","name":"","url":"","contentType":"","message":"","language":"en","ip":"192.168.1.219","port":"8009","volume":"","x":610,"y":400,"wires":[[]]},{"id":"d63ebda4.bf0468","type":"cast-to-client","z":"25e21bf8.ff94b4","name":"","url":"","contentType":"","message":"","language":"en","ip":"192.168.1.217","port":"8009","volume":"","x":610,"y":340,"wires":[[]]},{"id":"892592fb.67b45","type":"cast-to-client","z":"25e21bf8.ff94b4","name":"","url":"","contentType":"","message":"","language":"en","ip":"192.168.1.196","port":"8009","volume":"","x":610,"y":460,"wires":[[]]},{"id":"a0b3f4ac.7b6b68","type":"cast-to-client","z":"25e21bf8.ff94b4","name":"","url":"","contentType":"","message":"","language":"en","ip":"192.168.1.234","port":"8009","volume":"","x":610,"y":520,"wires":[[]]}]

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

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 = {
'texto_google'
}
},
execute = function(domoticz, device)
--Necesario tener instalado CURL en la raspberry
--sudo apt-get install curl
local destino = domoticz.variables('destino_google').value
local volume = domoticz.variables('volumen_google').value
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
local voice_command = 'curl -G --data-urlencode "texto='..device.value..'" --data-urlencode "destino='..destino..'" --data-urlencode "volume='..volume..'" http://127.0.0.1:1880/ws/gcast --silent --output /dev/null'
os.execute(voice_command)
else
domoticz.variables('volumen_google').set('20')
local voice_command = 'curl -G --data-urlencode "texto='..device.value..'" --data-urlencode "destino='..destino..'" --data-urlencode "volume='..volume..'" http://127.0.0.1:1880/ws/gcast --silent --output /dev/null'
os.execute(voice_command)
end
domoticz.variables('texto_google').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, sustituimos «cocina» por el nombre del google home que queremos que emita la notificación (tiene que ser el mismo nombre que le hemos dado en el switch de node red), clicamos sobre On y Guardamos:

return {
on = {
timer = { 'every 1 minutes'}
},
execute = function(domoticz, timer)
domoticz.variables('destino_google').set('cocina')
domoticz.variables('volumen_google').set('40')
domoticz.variables('texto_google').set('Esto funciona')
end
}

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

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 = {
timer = {
'at 22:05'
}
},
execute = function(domoticz, timer)
domoticz.variables('destino_google').set('todos')
domoticz.variables('volumen_google').set('80')
domoticz.variables('texto_google').set('¿Cargamos el coche?')
end
}

Con el script anterior Google Home nos recuerda todas las noches a las 22:o5 si queremos cargar el coche, para que no se nos olvide si no lo hemos programado.

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:

Actualización del script (opcional)

Añadiendo esta linea antes del local voice comand, nos notifica por telegram todo lo que mandemos a los altavoces google:

domoticz.openURL({url = "https://api.telegram.org/botTOKENDETUBOT/sendMessage?chat_id=NUMEROID&text=El altavoz "..destino.." con volumen "..volume..", ha dicho lo siguiente:" ..device.value.."",method = 'GET'})

Con ello conseguiríamos como ejemplo:

  • El altavoz salón con volumen 50, ha dicho lo siguiente: La lavadora ha terminado.
return {
on = {
variables = {
'texto_google'
}
},
execute = function(domoticz, device)
--Necesario tener instalado CURL en la raspberry
--sudo apt-get install curl
local destino = domoticz.variables('destino_google').value
local volume = domoticz.variables('volumen_google').value
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
local voice_command = 'curl -G --data-urlencode "texto='..device.value..'" --data-urlencode "destino='..destino..'" --data-urlencode "volume='..volume..'" http://127.0.0.1:1880/ws/gcast --silent --output /dev/null'
os.execute(voice_command)
else
domoticz.variables('volumen_google').set('20')
domoticz.openURL({url = "https://api.telegram.org/botTOKENDETUBOT/sendMessage?chat_id=NUMEROID&text=El altavoz "..destino.." con volumen "..volume..", ha dicho lo siguiente:" ..device.value.."",method = 'GET'})
local voice_command = 'curl -G --data-urlencode "texto='..device.value..'" --data-urlencode "destino='..destino..'" --data-urlencode "volume='..volume..'" http://127.0.0.1:1880/ws/gcast --silent --output /dev/null'
os.execute(voice_command)
end
domoticz.variables('texto_google').set('')
end
end
}

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!