Integración del controlador eedomus con HomeKit – Parte 4

  • Guía para integrar eedomus con HomeKit de Apple para visualizar y actuar a través de Siri en dispositivos registrados en eedomus usando una Raspberry Pi.

Continuando con esta serie de tutoriales para integrar eedomus con HomeKit, hemos llegado a la cuarta y última parte. En esta ocasión os explicaremos cómo instalar otro tipo de periféricos, también cómo actualizar paquetes, ya que muchas veces mejoran la estabilidad o incluyen nuevas funcionalidades.

Otro aspecto que queremos tratar hoy es una pequeña guía de resolución de problemas. Además, os pondremos algunos scripts para automatizar alguna tarea más, y veremos cómo instalar otros plugins y qué tipo de órdenes podemos darle a Siri.

 

Distintas órdenes a Siri

 

A tener en cuenta

Para ciertos módulos que admiten porcentajes en los valores, como las luces dimmables o los módulos de persiana, vamos a tener que dar de alta todos sus valores en eedomus si queremos también controlarlos manualmente desde la aplicación “Elgato Eve“. Lo normal es que sigáis utilizando vuestra aplicación de eedomus para el control con el móvil, y la aplicación “Elgato Eve” para configuraciones de HomeKit.

Yo, para estos módulos, en eedomus, tenía la configuración por defecto, es decir, en la pestaña “Parámetros Experto” del módulo, marcada la casilla por defecto: “Límite los valores en múltiplos de 10%“.

Esto genera un problema al intentar modificar los valores desde la aplicación del móvil porque modificas los valores de 1 en 1. Sin embargo, la buena noticia es que esto no es (o no debería ser) necesario si nos limitamos a los comandos por voz a través de Siri. Pero si lo que queremos es utilizar también la aplicación de “Elgato Eve” para controlar estos módulos, debemos cambiar los parámetros en eedomus y quitar la casilla “Límite los valores en múltiplos de 10%“.

Otra cosa más a tener en cuenta, es que debemos asignar nombres de dispositivos que no estén siendo utilizados por el propio Siri para otras funciones. Como ejemplo, yo tengo OrangeTV en casa, con su descodificador y además la aplicación móvil con el mismo nombre. Pues si le indicaba a Siri: “Enciende OrangeTV“, lo que realmente hacía era arrancar la aplicación móvil, así que bastó con cambiar el nombre por “Descodificador” y ahora ya me diferencia entre ambos.

Por último, debemos ser conscientes de que cada vez que agreguemos un nuevo módulo en el fichero de configuración, posteriormente deberemos reiniciar homebridge:

# sudo /etc/init.d/homebridge stop
# sudo /etc/init.d/homebridge start

Una vez reiniciado ya podemos entrar en nuestra aplicación “Elgato Eve” y comprobar que aparece el nuevo módulo. Los nuevos módulos que vayáis añadiendo lo harán por defecto en la habitación “Casa”. Si no os aparece, debéis comprobar que estáis conectados a la misma red wifi.

Instalación de otros periféricos

Ahora vamos a ver cómo incluir otro tipo de módulos. Como comentamos en el anterior artículo, podemos utilizar cuatro tipos de módulos: Interruptor, persiana, temperatura y luz. Para este último, denominado “Light” en la configuración, hay que tener en cuenta si es o no regulable, porque hay que cambiar la configuración en el fichero config.json

Esto es un ejemplo de la configuración para una luz regulable:

       {
           "accessory": "eedomus",
           "name": "Luz escaleras primera",
           "periph_id": "260134",
           "brightnessHandling": "yes",
           "service": "Light"
       },

Y este otro ejemplo para una luz no regulable, que tenga como únicas opciones ON/OFF:

       {
           "accessory": "eedomus",
           "name": "Luz garaje",
           "periph_id": "262641",
           "brightnessHandling": "no",
           "service": "Light"
       },

Como podéis ver, la diferencia está en el parámetro “brightnessHandling” que cambiaremos de “yes” a “no”.

En la configuración del config.json, que como ya sabréis es el fichero donde vamos a crear nuestros módulos, hay que tener en cuenta la forma de añadir los dispositivos.

En esta estructura del fichero, cada módulo va entre corchetes: “{” para abrirlo, y “}” para cerrarlo. Es importante tener en cuenta que al cerrarlo debemos añadir una coma “,” si a continuación vamos a tener otro módulo, pero si es el último módulo del fichero va sin esa última “,”

Tomando como ejemplo el módulo de arriba, esta sería la estructura si es el último módulo:

       {
           "accessory": "eedomus",
           "name": "Luz garaje",
           "periph_id": "262641",
           "brightnessHandling": "no",
           "service": "Light"
       }

Si lo que queréis es controlar otro tipo de dispositivo, como por ejemplo un estado, la solución actual pasaría por definirlo como tipo Switch, pero teniendo en cuenta que los valores que HomeKit va a interpretar serán el “0” (apagado) y el “100” (encendido). De esta manera podéis controlar por ejemplo la alarma, encenderla, apagarla o consultar el estado.

 

Ejemplo de escena en ElgatoEVE

 Resolución de problemas

  • Error en configuración:

Si en el log de homebridge (/var/log/homebridge.err) nos aparece este error:

==> /var/log/homebridge.err <==
There was a problem reading your config.json file.
Please try pasting your config.json file here to validate it: http://jsonlint.com

Quiere decir que tenemos un error en la sintaxis dentro del fichero de configuración. Esto puede ser debido a haber utilizado un editor de texto que inserte caracteres no legibles para json, o por lo general, que hayamos puesto alguna “,” de más.  Podemos copiar el contenido de nuestro config.json y pegarlo en la dirección que indica el log para ver dónde está el problema.

  • Homebridge deja de funcionar:

Si por algún motivo nos deja de funcionar homebridge o nos desaparece de la aplicación “Elgato Eve“, podemos borrar en la aplicación del dispositivo iOS la aplicación asociada HOMEBRIDGE y volver a crearla.

Para ello probablemente tengamos que cambiar el usuario en el fichero de configuración config.json. Si tenemos:

"username": "CC:22:3D:E3:CE:30",

Podemos probar con el siguiente número de la última cadena:

"username": "CC:22:3D:E3:CE:31",

Además, es recomendable parar el servicio homebridge:

sudo /etc/init.d/homebridge stop

Borrar el contenido del directorio “persist” dentro del directorio “.homebridge” de nuestro usuario:

rm /home/pi/.homebridge/persist/*

Arrancar de nuevo homebridge:

sudo /etc/init.d/homebridge start

Y volver a dar de alta el accesorio homebridge dentro de la aplicación de iOS.

  • Siri no funciona fuera de casa:

En caso de que Siri no nos obedezca desde fuera de casa, lo primero que haremos será comprobar que en nuestro dispositivo iOS tenemos activada la casilla “Permitir acceso remoto” dentro de Ajustes > HomeKit > “Casa”.

Si la tenemos activa, podemos probar a desactivar iCloud en nuestro AppleTV y después volver a activarlo. Esto lo tuve que hacer varias veces con el AppleTV de 3ª generación. Desde que tengo el nuevo, he notado muchísima más estabilidad desde fuera de casa, hasta ahora no me ha fallado ni una sola vez.

  • Problemas en la sincronización del dispositivo:

Si lo que tenemos son problemas a la hora de sincronizar el estado del dispositivo, tenemos la opción de en nuestro dispositivo iOS:

  1. Desactivar “iCloud Drive” en Ajustes > iCloud > iCloud Drive
  2. Desactivar “Llaveroen Ajustes > iCloud > Llavero
  3. Volver a activar “iCloud Drive” y “Llavero

Como última opción, podemos resetear HomeKit dentro de Ajustes > Privacidad > HomeKit > Restablecer configuración

 

Como resetear datos de iCloud y llavero

Otros scripts

En esta sección vamos a ver cómo crear varios scripts para automatizar tareas. En estos ejemplos estoy utilizando el editor vi, pero podéis utilizar otro como pico o nano, más sencillos de utilizar.

  • Script para autoarranque de la red (wifi)

En caso de que tengáis vuestra Raspberry Pi conectada por wifi y de vez en cuando ésta pierda la conexión sin recuperarla, podemos crear un script que reinicie la red si no tiene conexión.

Para ello crearemos el siguiente script como usuario root:

vi /usr/local/bin/network_restart.sh

Con el siguiente contenido:

#!/bin/bash
ROUTER_IP=192.168.1.1
( ! ping -c1 $ROUTER_IP >/dev/null 2>&1 ) && /usr/sbin/service networking restart >> /tmp/network_restart.log 2>&1

En el campo ROUTER_IP debéis cambiar la IP 192.168.1.1 por la de vuestro router al que conecte la Raspberry Pi.

Ahora le debemos dar permisos de ejecución de la siguiente forma:

chmod u+x /usr/local/bin/network_restart.sh

Y por último añadiremos la siguiente línea en el crontab, como usuario root con el comando: crontab -e

*/5 * * * * /usr/local/bin/network_restart.sh

De esta manera, cada 5 minutos va a comprobar el estado de la red y la reiniciará en caso de que no funcione.

  • Automatización del arranque de homebridge al iniciar Raspberry Pi

Ahora vamos a ver cómo automatizar el arranque/parada de homebridge cuando arranca/para la Raspberry a través de init.d:

Creamos el script:

sudo vi /etc/init.d/homebridge

Con el siguiente contenido (asumiendo que tenemos la instalación por defecto o que hemos ido siguiendo por estas guías):

#!/bin/sh
### BEGIN INIT INFO
# Provides: homebridge
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

dir="/home/pi"
cmd="DEBUG=* /usr/local/bin/homebridge"
user="pi"

Creamos los permisos para el script y lo añadimos a los scripts de arranque con estos comandos:

sudo chmod 755 /etc/init.d/homebridge
sudo update-rc.d homebridge defaults
  • Script para autoarranque de homebridge

El siguiente script comprueba que homebridge se está ejecutando, y si no lo está haciendo lo arranca.

Como usuario root también, creamos el fichero con:

vi /usr/local/bin/homebridge_restart.sh

Con el contenido:

#!/bin/bash
date=`date`
proc=`ps -ef | grep "/usr/local/bin/homebridge" | grep -v grep | grep DEBUG | wc -l `
if [ $proc -ne "1" ]
  then echo "$date" >> /var/log/homebridge_restart.log
  echo "Homebridge not running, restarting..." >> /var/log/homebridge_restart.log
  /etc/init.d/homebridge start >> /var/log/homebridge_restart.log
fi

Le asignamos permisos de ejecución:

chmod u+x /usr/local/bin/homebridge_restart.sh

Y como en el anterior caso, como root editaremos el crontab con: crontab -e para añadir:

* * * * * /usr/local/bin/homebridge_restart.sh

Comandos Siri

En esta sección vamos a recopilar ejemplos de algunas de las órdenes y preguntas que podemos hacerle a Siri. En algunos casos son órdenes sencillas y naturales, otras sin embargo, son algo más forzadas.

  • Preguntas:

“¿Qué temperatura hay en el sensor de temperatura del despacho?”

“¿Qué temperatura tiene despacho?”

“¿A qué temperatura están los sensores de casa?”  -> te dirá la temperatura más alta y más baja de los sensores dados de alta.

“¿Hay alguna luz encendida?”

“¿Cómo está la persiana del salón?”

“¿Está encendida la televisión?”

“¿Cómo están las puertas del garaje?”

  • Órdenes

“Cierra las puertas del garaje”

“Sube/baja la luz de la escalera primera al 50%”

“Sube/baja la persiana del salón al 30%”

“Sube/baja las persianas” ->Pone las persianas configuradas al 100%/0%

“Enciende/apaga la televisión”

  • Actualización de los paquetes

Esta parte no es necesario ejecutarla si todo nos funciona bien, podemos recurrir a ella en caso de inestabilidades.

Para comprobar si la versión del paquete que tenemos está actualizada, entraremos en el directorio donde están nuestros módulos y lanzaremos el comando “npm outdated” :

pi@raspi ~ $ cd /usr/local/lib/node_modules
pi@raspi /usr/local/lib//node_modules $ npm outdated homebridge
Package     Current  Wanted  Latest  Location
homebridge   0.2.11  0.2.14  0.2.14  homebridge

Podemos ver la versión actual que tenemos (Current), la versión requerida (Wanted) y la última versión (Latest) del paquete y sus dependencias.

Para actualizar la versión de alguno de los paquetes (homebridge en el siguiente ejemplo), ejecutamos:

pi@raspi ~ $ cd /usr/local/lib/node_modules
pi@raspi /usr/local/lib/node_modules $ sudo npm update homebridge
...
...
homebridge@0.2.14 homebridge
└── semver@5.0.3
└── commander@2.8.1 (graceful-readlink@1.0.1)
└── chalk@1.1.1 (escape-string-regexp@1.0.4, ansi-styles@2.1.0, supports-color@2.0.0, strip-ansi@3.0.0, has-ansi@2.0.0)
└── hap-nodejs@0.0.7 (debug@2.2.0, node-persist@0.0.6, curve25519@1.1.0, srp@0.2.0, ed25519@0.0.3, mdns@2.2.11)

Comprobamos que se ha actualizado (no nos deberá devolver nada la salida):

pi@raspi /usr/local/lib/node_modules $ sudo npm outdated homebridge
pi@raspi /usr/local/lib/node_modules $

Dependencias de los módulos de algún paquete:

pi@raspi ~ $ cd /usr/local/lib/node_modules/homebridge
pi@raspi /usr/local/lib/node_modules/homebridge $ sudo npm outdated
Package     Current  Wanted  Latest  Location
commander     2.8.1   2.8.1   2.9.0  commander
hap-nodejs    0.0.3   0.0.3   0.0.7  hap-nodejs*
semver        5.0.3   5.0.3   5.1.0  semver

*El paquete hap-nodejs es la base de homebridge, por lo que conviene tenerlo actualizado.

Actualizar node a la versión 5.3.0:

Si tenemos la versión de node en 4.2.2 y alguna inestabilidad, podemos probar a actualizarlo a 5.3.0.

pi@raspberrypi:~ $ node -v
v4.2.2

Para actualizarlo podemos seguir los pasos de https://github.com/nodesource/distributions

Como usuario root:

curl -sL https://deb.nodesource.com/setup_5.x | bash -
apt-get install -y nodejs

Si después al intentar arrancar os muestra este fallo:

==> /var/log/homebridge.err <==
/usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/node_modules/mdns/lib/dns_sd.js:35
throw ex;
^

Error: Module version mismatch. Expected 47, got 46.
at Error (native)
at Object.Module._extensions..node (module.js:423:18)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Module.require (module.js:354:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/node_modules/mdns/lib/dns_sd.js:24:20)
at Module._compile (module.js:398:26)
at Object.Module._extensions..js (module.js:405:10)
at Module.load (module.js:344:32)

Lo podéis solucionar creando un enlace simbólico:

sudo ln -s /usr/bin/node /usr/local/bin/node

Si continúa el error:

cd /usr/local/lib/node_modules/
npm uninstall homebridge
npm install homebridge

Y ya debería funcionar.

Actualizar npm a su última versión:

root@raspi:~# curl https://www.npmjs.com/install.sh | sh
root@raspi:~# npm -v
2.14.7

Con esto damos por cerrado este tutorial para integrar vuestro eedomus en HomeKit. Esperamos que no haya resultado muy complicado y las explicaciones hayan sido lo suficientemente claras. Si tenéis cualquier duda, nos las podéis comentar aquí o en el hilo del foro dedicado a esta integración.

Carlos Fernández

Informático en el mundo de las telecomunicaciones y gran apasionado de las tecnologías, el mundo Apple y la domótica.


5 Respuestas

  1. Javier dice:

    Gracias Carlos!

  2. Philippe dice:

    Impresionante esta serie de tutoriales, Carlos. Mil gracias.

  3. Eduardo dice:

    Muchas gracias por todo, Carlos.
    He intentado añadir “type”: “rgbw”, a una de las luces de zipato que tengo y nada. Las enciendo y apago y controlo el brillo, pero el color se me resiste. Seguiré buscando. ¿Hay que hacer algún tipo de llamada http?

    Por cierto, desde que instalé un monitor de recursos en la RPi (y nodejs) parece ser que no tengo que reiniciar para volver a tener activo HomeKit.
    Saludos.

  4. Javier dice:

    Lo del color por ahora no se puede controlar directamente, sólo existen los 4 tipos de periférico que existen como ejemplo en el archivo “json”, no se pueden crear más. Podrías hacer, por ejemplo, un periférico de estado intermedio (tipo swicht) apuntando a una macro para cada color/acción pero no sé si merece la pena.

  5. Fernando dice:

    Ante todo muchas gracias Carlos, me he animado a montarlo y funciona :-).

    Me gustaría saber si existe algún repositorio donde poder descargar una versión más actualizada de dicho plugin homebridge-eedomus para soportar por ejemplo los sensores de apertura, o si existe algún otro plugin que puedas recomendarnos. Seria genial si diera soporte a los mismos tipos de periféricos que tiene el servidor hombridge interno de la eedomus+.

    En mi caso particular la implementación de homebridge dentro de mi eedomus+ dejo de funcionar y no hay forma de recuperarlo. He utilizado un contenedor Docker dentro de un NAS en vez de la raspberry del artículo, y los 4 tipos de dispositivos de este plugin en su version 0.0.2 funcionan correctamente, pero busco la forma de integrar también los sensores de apertura. Saludos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *