Home Assistant: un Inteligente Proyecto de Bricolaje con la Iluminación

Desde que empecé a trabajar con Home Assistant y automatizar varias cosas en casa, siempre he querido encontrar la forma de controlar las luces. Eché un vistazo a las bombillas inteligentes, como las Philips Hue, pero son demasiado caras (aproximadamente 12$ por bombilla - https://goo.gl/xiAqEe). Además, la mayoría de las soluciones usan protocolos registrados o servicios en la nube que pueden filtrar información personal, o pueden dejar de funcionar en el futuro, lo cual podía llegar a convertirlas en simples pisapapeles. Por casualidad, oí hablar de los conmutadores wifi Sonoff creados por Itead (http://sonoff.itead.cc/en/products/sonoff/sonoff-basic). Combinan un microcontrolador WiFi ESP8266 y un relé que te permite encender y apagar a distancia. Además de tener un precio bajo (~5$ - https://goo.gl/WP31Ny), el microcontrolador también cuenta con algunos GPIO y se puede actualizar con software de código abierto para adaptarlo a tus necesidades.

De modo que, el plan era hacerme con varios conmutadores Sonoff Basic, retirar la carcasa, grabar el firmware de Tasmota (https://github.com/arendst/Sonoff-Tasmota/wiki) y encontrar una forma de conectarlos a mis interruptores de luz existentes. En lugar de esto, también podría haber usado un conmutador de luz wifi (http://sonoff.itead.cc/en/products/residential/sonoff-touch), pero era más caro y deseaba mantener mis interruptores existentes. Afortunadamente encontré una guíaen youtube con una idea sobre cómo convertir un conmutador básico en un conmutador de luz: https://www.youtube.com/watch?v=ab472a40-co. Básicamente necesitas alimentar el Sonoff, conectar su salida al circuito de la bombilla/iluminación y conectar el conmutador de luz a las almohadillas GPIO14 y GND, y listo.

Grabar Tasmota

Lo primero que debes hacer es abrir la caja del conmutador Sonoff (está sujeta con unos clips de plástico) e identificar las almohadillas GPIO (consulte la figura 1). Tienes un pad cuadrado de 3.3V, UART RX y TX, la puesta a tierra y el último es el GPIO14. Para grabar un nuevo firmware necesita encender el Sonoff, conectar el UART a un dispositivo que ejecute Arduino y mantener presionado el botón (GPIO0) mientras se esté iniciado para ponerlo en modo programación. Para hacer esto, puedes soldar un cabezal de 5 pines a la placa o simplemente colocar el cabezal para que toque los pads mientras grabas (esto es lo que hice yo). Ten en cuenta que, durante esta operación, el Sonoff no se conectará a la red eléctrica y consumirá energía desde cable UART. (más detalles: https://goo.gl/5TUfz8). Si no tienes el adaptador USB-UART adecuado, puede usar los pines UART del cabezal de 40 pines de un ODROID-C1/C2 directamente con cables jumper (consulte la figura 1). Asegúrate de conectar RX y TX cruzados para que RX de Odroid esté conectado al TX de Sonoff. Además, la potencia debe venir del pin de 3.3V y no del pin de 5V.

Figure 1 - GPIO wiring diagram
Figura 1 - Diagrama de cableado GPIO

En lo que respecta al software, necesitarás descargar e instalar Arduino IDE (yo utilicé la Ver. 1.8.5) y algunas librerías de soporte, que vienen con el programa Java armhf (https://github.com/arendst/Sonoff-Tasmota/wiki/Arduino-IDE). Puedes descargar el IDE para armhf desde este enlace: https://goo.gl/ZFYj8Z.

Si está utilizando el ODROID-C2/N1, el programa arduino no se ejecutará porque no podrá encontrar las librerías de 32 bits aplicables. Necesitará instalar soporte de 32 bits en tu ubuntu y luego ejecutar los mismos pasos que en el caso del ODROID-C1:

$ sudo dpkg --add-architecture armhf
$ sudo apt-get update
$ sudo apt-get install libc6:armhf libx11-6:armhf libxext6:armhf \
libxrender1:armhf libxtst6:armhf libxi6:armhf
Si estás utilizando ODROID-XU4/N1, los pasos son los mismos que antes, pero deberá usar un shifter shield para hacer frente a la diferencia de voltaje entre el ODROID y el chip ESP. Para el C1 sigue estos pasos:
$ unxz arduino-1.8.5-linuxarm.tar.xz
$ tar xvf arduino-1.8.5-linuxarm.tar
$ cd arduino-1.8.5
$ ./arduino
Espera a que se inicie, luego abre Arduino IDE y selecciona File -> Preferencias y añade el siguiente texto para el campo Additional Boards Manager URLs: https://goo.gl/EVq7nf y selecciona OK. A continuación, abre Tools -> Boards … -> Boards Manager … y desplázate hacia abajo y haz clic en esp8266 de ESP8266 Cmmnunity. Haga clic en el botón Installl para descargar e instalar el último software de la placa ESP8266. Selecciona Close. Ahora puede cerrar Arduino. En el siguiente paso, descargarás e instalará el firmware de Tasmota. Puedes obtener la última versión desde aquí: https://github.com/arendst/Sonoff-Tasmota/releases
$ cd ..
$ wget https://goo.gl/KQwDvr
$ tar zxvf v5.13.1.tar.gz
$ cp -ar Sonoff-Tasmota-5.13.1/lib/* arduino-1.8.5/libraries/
$ cp -ar Sonoff-Tasmota-5.13.1/sonoff/ arduino-1.8.5/
$ cd arduino-1.8.5
$ ./arduino
Ahora puedes abrir el proyecto Tasmota seleccionando File -> Open, localizando y cargando sonoff.ino desde el directorio sonoff bajo arduino-1.8.5. En la lista de pestañas abiertas localiza user_config.h, donde debes cambiar la siguiente configuración. Ten en cuenta que cambiar los ajustes en este punto no es obligatorio; la mayoría se pueden configurar más tarde a través de la interfaz web o MQTT, pero una vez que resetees los valores predeterminados del hardware, estos serán los valores por defecto:

  • Configurar la dirección IP estática si quieres (WIFI_IP_ADDRESS, WIFI_GATEWAY, WIFI_SUBNETMASK, WIFI_DNS)
  • Definir SSID/Contraseña para dos puntos de acceso (STA_SSID1, STA_PASS1, etc)
  • Ajustar la herramienta de configuración para WIFI_RETRY (WIFI_CONFIG_TOOL), de modo que, si no puede conectarse al WiFi, seguirá intentándolo en lugar de convertirse en un punto de acceso. De lo contrario, algún atacante podría eliminarlo de la red WiFi con un ataque deauth (ver https://goo.gl/76kYPs) y forzarlo a convertirse en un punto de acceso y tener que volver a configurarlo.
  • Activar syslog si tienes uno (ayuda a resolver problemas de depuración, aunque los registros locales se conservarán en el dispositivo, accesibles a través de la interfaz web hasta que se reinicie)
  • Desactivar (comentar con //) MQTT TLS (// # define USE_MQTT_TLS)
  • Fijar usuario, contraseña e IP del broker MQTT (MQTT_HOST, MQTT_USER, MQTT_PASS)
  • Deshabilitar MQTT Retain (me causó algunos dolores de cabeza) (MQTT_BUTTON_RETAIN, MQTT_POWER_RETAIN, MQTT_SWITCH_RETAIN)
  • Definir un tema para los mensajes MQTT (MQTT_TOPIC). Algo como kids_light o bedroom_light por ejemplo
  • Desactivar Domoticz si no es necesario (// # define USE_DOMOTICZ)
  • Fijar un nombre de usuario y contraseña para la interfaz web para tener algo de protección (WEB_USERNAME, WEB_PASSWORD)
  • Deshabilitar mDNS discovery (// # define USE_DISCOVERY)
  • Configurar servidores NTP (NTP_SERVER1, etc.)
  • Configurar la zona horaria (APP_TIMEZONE)
  • Deshabilitar I2C si no se usa (// # define USE_I2C)

Una vez completada tu configuración, debes definir el modo de actualización haciendo los cambios que se detallan aquí: https://goo.gl/NmnZBE en Arduino IDE. Tendrás que seleccionar /dev/ttyS2 como un puerto con 115200 baudios.

Figura 2. Extracto de user_config.h y configuración de la actualización

Cuando termines, inserta el cabezal pin en el Sonoff mientras mantienes presionado el botón de encendido y suéltalo cuando tengas una conexión estable. Empieza a compilar y grabar (el segundo botón con un símbolo de flecha en Arduino IDE) y espera a que el proceso se complete. Si la actualización falla, intenta poner de nuevo el Sonoff en modo programación e inténtalo de nuevo. Una vez que el proceso haya finalizado con exito, enciende el Sonoff y se debería conectar a tu WiFi. Puedes alimentarlo a través del cable UART improvisado o desde la red eléctrica, pero asegúrate de volver a montarlo si usas la red eléctrica para que no te arriesges a recibir una descarga eléctrica. Puedes averiguar su dirección IP (ya sea estática o de DHCP) consultando la lista de clientes en tu router. A continuación, puedes conectarse a través de HTTP a su dirección de gestión para continuar configurándolo.

Figura 3. Gestión web

Configuración de Tasmota

El firmware Tasmota está en su mayor parte desarrollado teniendo en cuenta MQTT. MQTT es un protocolo de transmisión de mensajes de máquina a máquina que ya hemos tratado en un artículo anterior (https://goo.gl/9ggqHJ). Permite la integración de múltiples entidades con un broker de mensajes (estamos usando mosquitto), y además es compatible con Home Assistant. El firmware Tasmota tiene muchos parámetros que puede configurar a través de MQTT o REST API, (La lista completa la tienes aquí: https://github.com/arendst/Sonoff-Tasmota/wiki/Commands), pero lo más importante es que se puede configurar a través de la interfaz web.

Nosotros configuraremos lo siguiente:

  • GPIO14 tendrá el mismo rol que Switch1. Para ello, puede navegar por la interfaz web, dentro de Configuration -> Configure Module: Module Type: 01 Sonoff basic GPIO14 sensor: 09 Switch1
  • Si todavía no has configurado MQTT en user_config.h, puedes hacerlo ahora desde Configuration -> Configure MQTT y agregar la dirección del broker y el nombre de usuario/contraseña.

Si estás utilizando contraseñas con MQTT, deberás añadir la nueva cuenta en mosquitto:

$ sudo mosquitto_passwd /etc/mosquitto/passwd sonoffuser
Si esperas un segundo, Sonoff debería conectarse al broker MQTT y deberías poder controlarlo desde la línea de comandos. Suponiendo que estés utilizando el tema bedroom_light, puedes activar el interruptor con:
$ mosquitto_pub -p 1883 -u sonoffuser -P sonoffpassword \
cmnd/bedroom_light/POWER -m "1"
Puedes consultar la configuración o la información del dispositivo a través de MQTT, aunque las respuestas se enviarán al servidor syslog, de modo que no debes perderlo de vista al emitir comandos MQTT. Para ver el estado del conmutador ejecuta:
$ mosquitto_pub -p 1883 -u sonoffuser -P sonoffpassword cmnd/bedroom_light/POWER -m ""
El correspondiente resultado del servidor syslog sería este:
May 25 17:43:42 sonoff_bedroom ESP-MQT: stat/bedroom_light/RESULT = {"POWER":"ON"}
May 25 17:43:42 sonoff_bedroom ESP-MQT: stat/bedroom_light/POWER = ON
Ahora puedes jugar con los parámetros de configuración que no están disponibles a través de la interfaz web, como PowerOnState (https://goo.gl/hJqRTd):
$ mosquitto_pub -p 1883 -u sonoffuser -P sonoffpassword \
cmnd/bedroom_light/PowerOnState -m "3"
Una cosa más que puedes configurar es la gestión de energía ESP. Está deshabilitada por defecto, pero puede indicarle que entre en reposo 100ms para reducir el consumo eléctrico (y el calor) con este comando:
$ mosquitto_pub -p 1883 -u sonoffuser -P sonoffpassword \
cmnd/bedroom_light/Sleep -m "100"
Para integrar el Sonoff como interruptor de luz en Home Assistant puedes añadir lo siguiente a configuration.yaml y reiniciar:
light:
- platform: mqtt
name: "Bedroom Light"
state_topic: "stat/bedroom_light/RESULT"
value_template: '{{ value_json["POWER"] }}'
command_topic: "cmnd/bedroom_light/POWER"
availability_topic: "tele/bedroom_light/LWT"
qos: 1
payload_on: "ON"
payload_off: "OFF"
payload_available: "Online"
payload_not_available: "Offline"
retain: false
…
group:
lights:
name: Lights
view: yes
icon: mdi:lightbulb-on-outline
entities:
- light.bedroom_light
¡Asegúrate de que el código anterior utiliza los temas correctos que configurastes para su dispositivo! Puedes reiniciar Home Assistant y probar que todo funciona como cabría esperar (deberías poder activar y desactivar el interruptor desde Home Assistant, la interfaz web de Tasmota y el botón en Sonoff).

El Montaje del hardware

Para continuar y conectar el interruptor de luz al GPIO14 necesitamos que soldar un poco y agregar un filtro de paso bajo junto con los cables del conector al GPIO14 y GND. La razón por la que necesitamos un filtro de paso bajo es porque la radiación EM será recogida por los cables utilizados (actúan a modo de antena) y puede ocasionar que el interruptor se active fortuitamente a veces. Para mitigar esto, puede usar un filtro de paso bajo para permitir pasar solo la DC y también puede torcer los cables para que la interferencia se cancele (http://goo.gl/7zEPc9).

Puedes montar un filtro de paso bajo siguiendo esta guía (https://www.youtube.com/watch?v=aq8_os6g13s) con una resistencia de 10k y un condensador de 33pF. Los valores exactos no son tan importantes - puedes usar los que tenga.

Figura 4 - Esquema

Asegúrate de que la soldadura sea sólida y usa tubos termocontraíbles para aislar sus componentes. Cuando termines, prueba la unidad teniendo cuidado de no tocar los restos de CA que están a la vista. También deberías utilizar cinta eléctrica puesto que no utilizaremos la carcasa de plástico.

Figura 5 - Unidad ensamblada

Conectando Sonoff a las luces

Este paso puede ser el más complicado, porque el cableado de la iluminación puede variar de un lugar a otro y es posible que no tenga todo lo que necesites en un único lugar. Es posible que tengas que consultar a un electricista, recurrir al reglamento de baja tensión y a la legislación local antes de continuar. Lo que es aún más importante, asegúrate de desconectar la luz y los enchufes antes de desmontar cualquier interruptor de luz o correrás el riesgo de sufrir una descarga eléctrica. También necesitarás un multímetro (https://en.m.wikipedia.org/wiki/Test_light) para identificar los cables que están cargados de electricidad.

Analicemos brevemente qué cables son los pasan a través de tus paredes hasta las tomas de corriente y las luces. Tendrás un cable "caliente" (también conocido como "cargado") que tiene un voltaje de 110/220V dependiendo de dónde vivas, un cable "neutro" que se utiliza para completar el circuito y proporciona la ruta que toma la corriente eléctrica (éste normalmente no tiene energía) y un cable de “puesta a tierra" usado en algunos enchufes eléctricos que proporciona una ruta de emergencia para el cable neutro. Para alimentar el Sonoff necesitamos el cable con carga y el neutro del interior de la carcasa del interruptor de luz.

Desafortunadamente, no todos los estándares de cableado proporcionan el cable neutro, así que es posible que tengamos que hacer uno. En mi caso (y sospecho que será muy común en la mayor parte de Europa) el interruptor de la luz tiene una entrada cargada que va a dos interruptores mecánicos y que continua con dos cables de salida cargados independientes que van por la pared hasta la luz.

Figura 6 - Esquema de la luz

No hay neutro cerca del interruptor de la luz. El neutro va a la misma luz y cierra el circuito con la bombilla. Bueno, esto no servirá. Necesitamos modificar el circuito y detener una salida cargada y transformarla en una neutral con un poco de cableado, principalmente porque no queremos pasar otro cable por la pared (algo complicado sin cierta destreza y herramientas especiales).

Lo primero que debes hacer es cortar la energía de los interruptores y retirar el interruptor de la luz de la pared para echar un vistazo a los cables. Podría ser una buena idea probar y ver si el PCB Sonoff encaja dentro de la caja eléctrica del interruptor de la luz (no coge en la mayoría de las cajas eléctricas redondas de Europa del Este). Si no te encaja, debes ser creativo y buscar un lugar donde poder colocarlo.

Figura 7 – Testeando la caja de luz y cableado por defecto

En mi caja de luz, como puedes ver en la figura 7, solo tenía una entrada cargada para ambos interruptores (rojo) y dos salidas cargadas para las bombillas (negro). Debes tomarte tu tiempo para identificar cada cable con un multímetro (cuando el interruptor esté encendido) y etiquetar los cables (con el interruptor apagado, naturalmente).

Mi intención es convertir un cable de salida cargado en una entrada neutral desconectando el cable de salida de la bombilla y conectándolo al neutro. Al hacer esto, no podré usar una lámpara con dos luces independientes, aunque de todas formas sólo tengo lámparas sencillas, así que no tengo problema. Hay dos lugares donde puede hacer esto: en la caja eléctrica intermedia (que debe estar muy cerca, próxima al techo) o en la propia luz. Ambos diagramas de cableado los tienes en la figura 8, voy a describir los pasos necesarios para cada variante.

Figura 8a - Opciones de cableado: re-cableado en la caja de conexiones

Figura 8b - Opciones de cableado - re-cableado en la propia luz

Para la opción 8A necesitas echar un vistazo en la caja eléctrica de conexiones. Esta caja debe contener todos los circuitos eléctricos que van a una habitación: luces y enchufes. Cuando mires dentro (con el interruptor apagado) probablemente verás un revoltijo de cables, como en la figura 9. Necesitas identificar (según el color y la posición) qué cables van a tu interruptor de luz y cuáles van a la bombilla. También debes elegir qué cable de salida cargado deseas convertir a neutro e identificar el extremo superior de ese cable en la caja eléctrica. Puedes hacer esto tirando del cable y observando qué cable es el que se mueve, o midiendo la resistencia de los extremos del cable (prolongado si es necesario) con un ohmímetro (la resistencia debería ser cercana a cero). Asegúrate de etiquetar todos los cables que identifiques para futuras consultas, en caso de que necesites deshacer todo este revoltijo más adelante.

Figura 9 - Caja eléctrica - Antes de hacer nada

A continuación, debes identificar un cable neutro en la caja eléctrica. Deberías encontrar dos manojos de cables más grandes con 3 o más cables conectados entre sí. Un manojo conecta todos los cables cargados (el que viene del interruptor principal con el que va al interruptor de la luz y los que van a los enchufes) y el otro manojo contendrá todos los neutros. Puedes encontrar cuál es, identificando cuál es el cable cargado que va a tu interruptor de luz, o midiéndolos con un multímetro.

Ahora (con los interruptores apagados), necesita desconectar la salida cargada desde cable que va a la bombilla y conectarla con los otros neutros. El cable restante no estará conectado (pero sigue siendo bueno etiquetarlo y aislar su extremo).

Figura 10 - Caja eléctrica - Después de los cambios

En este punto, puedes conectar el sonoff con la entrada cargada y el neutro en su entrada, y la salida cargada en la salida (con los interruptores aún apagados) y luego probar tu configuración.

Figura 11 – Probando los cambios

Para la opción 8B no necesitas hacer cambios en la caja eléctrica. Tuve que hacer esto porque la caja eléctrica de mi habitación no es de fácil acceso. En este caso, llevamos el neutro de la lámpara al interruptor de la luz conectando el cable neutro disponible de la lámpara directamente a un viejo cable "cargado" que llamaremos neutro a partir de ahora. Ten mucho cuidado al identificar cuál es el cable correcto; de lo contrario, si conectas directamente el neutro al cable cargado real, crearás un cortocircuito y tu fusible saltará o se fundirá.

Al igual que en el ejemplo anterior, tendrás que conectar la entrada cargada y el neutro a la entrada del Sonoff y la salida cargada a la salida (con los interruptores desconectados). Conecta el interruptor de luz a GPIO14 y GND también. Una vez que las pruebas tengan éxito, tendrás que colocar suavemente el sonoff dentro de la caja eléctrica del interruptor de luz y volver a colocar el interruptor de luz en la pared y listo.

Fig 12 - Montaje final

Automatizaciones

Ahora debería tener interruptores de luz funcionales en Home Assistant, que también puede alternar con el viejo interruptor mecánico, aunque no parece tan impresionante para la cantidad de trabajo que hemos invertido. ¿Por qué quería luces "inteligentes" en primer lugar? Vamos a verlo.

Apagar la luz después de 30 minutos

En ocasiones, es posible que olvides una luz encendida cuando sales de casa para el trabajo. Con luces habilitadas por red puedes apagarlas tú mismo, pero esto no es automatización. En mi caso, a los niños les gusta quedarse dormidos con las luces encendidas (a pesar de la luz de la noche), así que siempre teníamos que apagarla una vez que estuviesen dormidos. Si se despertaban en medio de la noche, las encienden para volverse a dormir. Así que, una forma elegante de arreglar esto es crear una automatización que entre un determinado intervalo de tiempo (23: 00-17: 00) se apaguen las luces tras haber estado encendidas durante 30 minutos. Debemos editar automations.yaml y añadir las siguientes automatizaciones:

- action:
- data:
entity_id: light.kids_light
service: homeassistant.turn_off
alias: Turn off Kids Light after 30 min inactivity
condition:
- after: '23:00'
before: '17:30'
condition: time
id: '1525335992266'
trigger:
- entity_id: light.kids_light
for:
minutes: 30
platform: state
to: 'on'
- action:
- data:
entity_id: light.kids_light
service: homeassistant.turn_off
alias: Turn off Kids Light at 23:00
condition: []
id: '1525343566208'
trigger:
- at: '23:00'
platform: time
La primera automatización escucha los cambios de estado que suceden cuando la luz se enciende y si está en el intervalo de tiempo requerido espera 30 minutos antes de apagarla. La segunda automatización gestiona el caso en el que la luz se enciende digamos, a las 22:00, así que la automatización anterior no tendrá efecto (el cambio de estado debe ocurrir entre las 23: 00-17: 00) - por lo tanto, se apagará a las 23:00. Se pude mejorar esta automatización y hacer que verifique si alguien está en casa/en la habitación, o que funciona solo cuando salga el sol, etc.

Desactivar el interruptor de hardware

Si has tenido niños pequeños, te habrás dado cuenta que hay un período de su desarrollo en el que necesitan presionar todos los botones que ven. Si consigen localizar el interruptor de la luz, lo pueden encender y apagar hasta romperlo. Para evitar eso, puedes bloquear el interruptor de luz mecánico para que no se encienda la luz cuando se presiona. Simplemente fija GPIO14 en none dentro la configuración. Puedes hacer esto sobre MQTT y hará que el sonoff se reinicie (la luz parpadea durante unos 250 ms). Puedes crear los siguientes scripts en Home Assistant, dentro de scripts.yaml:

'enable_kids_light':
alias: Enable Sonoff Kids Light
sequence:
- service: mqtt.publish
data:
topic: cmnd/kids_light/Gpio14
payload: 9
qos: 1
retain: false
'disable_kids_light':
alias: Disable Sonoff Kids Light
sequence:
- service: mqtt.publish
data:
topic: cmnd/kids_light/Gpio14
payload: 0
qos: 1
Cuando llames al script (ya sea desde el menú Servicios o desde un panel de instrumentos), las luces se bloquearán o desbloquearán y podrás controlarlas únicamente a través del wifi.

Despertador

La última aplicación es algo más macabra. Si tienes personas con un sueño muy profundo en tu familia que necesitan mucho para despertarse, ¿qué te parece depertarlos con la tompreta de las fuerzas armadas de los EE. UU. (https://www.youtube.com/watch?v=xt4hSs4IWPg)? Además del sonido, también podemos hacer que la luz destelle con el mismo patrón que la música. Posiblemente resulte un poco molesto.

Puedes empezar descargando el audio y conviértelo a mp3:

$ sudo apt-get install youtube-dl ffmpeg
$ youtube-dl -f 140 "https://www.youtube.com/watch?v=xt4hSs4IWPg"
$ ffmpeg -i "US_Military_Bugle_Wake_Up_Call-xt4hSs4IWPg.m4a" \
-acodec libmp3lame -b:a 128k "Wakeup_Trumpet.mp3"
Yo uso MPD como reproductor multimedia controlado por Home Assistant, así que asegúrate de mover el archivo MP3 a algun lugar dentro del directorio de la biblioteca de medios de MPD, para que pueda reproducirse (generalmente dentro de /var/lib/mpd/music /). También necesitarás añadirlo a una lista de reproducción guardada (yo utilicé "wakeupalarm" para nombrarlo).
$ cp Wakeup_Trumpet.mp3 /var/lib/mpd/music/wake-up/
A continuación, necesitamos producir algún tipo de ritmo. Debe corresponder a las señales de encendido y apagado de la bombilla. Mi idea era "escribir" el ritmo usando el teclado mientras escuchaba el sonido, de modo que al presionar/mantener presionada una tecla se encendiera la luz, al liberar la tecla la luz se apagaría. Podemos usar evtest para seleccionar el teclado y registrar la duración y la secuencia de pulsaciones de las teclas:
$ sleep 10; ffplay Wakeup_Trumpet.mp3
$ sudo evtest 2>&1 | tee trumpet.txt
Una vez hecho esto, el archivo debería contener líneas como las siguientes, registrando los eventos de arriba/abajo para la letra "A":
Event: time 1525422859.108421, -------------- SYN_REPORT ------------
Event: time 1525422859.204406, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70004
Event: time 1525422859.204406, type 1 (EV_KEY), code 30 (KEY_A), value 1
Event: time 1525422859.204406, -------------- SYN_REPORT ------------
Event: time 1525422859.300420, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70004
Event: time 1525422859.300420, type 1 (EV_KEY), code 30 (KEY_A), value 0
El archivo trumpet.txt será tu archivo de ritmo y debe copiarse a /home/homeassistant/.homeassistant/. También puedes hacerte con mi interpretación desde aquí: https://goo.gl/cFpLbs.
$ sudo cp trumpet.txt /home/homeassistant/.homeassistant/
Ahora podemos crear una aplicación appdaemon (descrita en este artículo anterior: https://goo.gl/npGqoX) que cuando se active mediante una entrada booleana, ordene a MPD que reproduzca la trompeta y analice el archivo de texto de ritmo y emita el correspondiente comando de encendido/apagado para la luz. Puedes conseguir la aplicación y su configuración aquí (compilada para appdaemon 3.x): https://goo.gl/Kn7PLK.
$ cd /home/homeassistant/.homeassistant/apps
$ wget -O sound_and_light_alarm.py https://goo.gl/aNuUB6
Adapta la siguiente configuración para que coincida con tu entorno (cambios realizados en apps/sound_and_light_alarm.yaml):
sound_and_light_alarm:
module: sound_and_light_alarm
class: SoundAndLightAlarm
media_player: "media_player.mpd_kids"
light: "light.kids_light"
music: "wakeupalarm"
rhythm: "/home/homeassistant/.homeassistant/trumpet.txt"
trigger: "input_boolean.wake_up"
Puedes añadir el siguiente booleano a Home Assistant (configuration.yaml):
input_boolean:
wake_up:
name: Wake up
initial: off
Y la siguiente automatización se activará cuando lo necesites, por ejemplo durante los días de la semana a las 7:00 (automations.yaml):
- id: '1527938039163'
alias: Wake up alarm
trigger:
- at: 07:00
platform: time
condition:
condition: time
weekday:
- mon
- tue
- wed
- thu
- fri
action:
- data:
entity_id: input_boolean.wakeup
service: input_boolean.turn_on
Puedes verlo en acción aquí: https://www.youtube.com/watch?v=ac9xnA6Y918. Desde el exterior, parecera que tu casa está intentando comunicarse a través de código Morse con una nave extraterrestre, pero posiblemente despertara a los más dolmilones de la familia.

Solución de problemas

Si notas que las luces se apagan (o encienden) aparentemente al azar, pueden suceder varias cosas. En mi caso, mis luces a veces perdían la conectividad TCP al servidor MQTT y se restablecía una nueva conexión. Una vez que la conexión estaba activa, leía el estado del servidor MQTT y anulaba el estado local. Si está utilizando la opción "retain" de forma incoherente, te generará problemas, como que una luz activa se apague tras una reconexión. En estos casos, es mejor desactivar la retención de MQTT y valerse del estado local del interruptor. Esto significa que, si la luz está encendida y hay un corte de energía, la luz se encenderá cuando se restablezca la energía y no podrás forzarla a salir a través de MQTT mientras que la luz no esté encendida. Puedes encontrar más detalles en: https://goo.gl/ECUqRY.

Un problema más al que podrías enfrentarte es que cuando reinicias Home Assistant, tus entidades de luz estarán en modo “off” por defecto, incluso si hay una luz encendida. Para arreglar esto, puede indicarle a Home Assistant que "pregunte" a todas las luces cuál es su estado con la siguiente automatización (añadir a automations.yaml):

- action:
- data:
topic: cmnd/sonoffs/POWER
service: mqtt.publish
alias: Get Sonoff states on restart
condition: []
id: '1518951376931'
trigger:
- event: start
platform: homeassistant
Espero que este artículo te ayude a implementar un sistema de iluminación inteligente sin demasiado coste o por empidimento de un proveedor.

Be the first to comment

Leave a Reply