Intregrando Owntracks en openHAB
En esta (modificada por esta otra) entrada aprendimos a configurar un servidor MQTT y en esta otra a configurar la aplicación OwnTracks, por tanto nos quedaba pendiente la integración de todo en openHAB. Vamos a ello.
Lo primero, siempre, en openHAB es asegurarse de que tenemos los módulos correspondientes activados y configurados correctamente. Para ello necesitaremos los bindings mqtt y mqttitude. Después tendremos que crear los items y modificar el sitemap para que nos aparezcan los datos en la aplicación habdroid del móvil. Vamos allá…
Binding mqtt, instalación y configuración
La instalación consiste en copiar (o crear un enlace simbólico) del fichero .jar correspondiente en la carpeta addons. En mi caso, y dado que tengo instalada la última versión (de pruebas) 1.5.0 el fichero se llama org.openhab.binding.mqtt-1.5.0-SNAPSHOT.jar. En este punto me gustaría hacer una puntualización personal: como openHAB cuando se inicia carga todos los bindings que se encuentren en el directorio addons, creo que es bastante interesante que nos creemos una carpeta addons.all con todos los bindings, y en lugar de copiarlos a addons, es suficiente con crear un enlace simbólico, de esta forma tendremos todos los ficheros en una ubicación (addons.all), pero solo activados los necesarios (enlaces en addons).
La configuración la hacemos modificando el fichero configurations/openhab.cfg. Vamos a la sección MQTT Transport y la modificamos de la siguiente forma (a partir de aquí todos los datos de latitud y longitud de tipo numérico se han enmascarado…):
################################# MQTT Transport ###################################### # # Define your MQTT broker connections here for use in the MQTT Binding or MQTT # Persistence bundles. Replace <broker> with a id you choose. # # URL to the MQTT broker, e.g. tcp://localhost:1883 or ssl://localhost:8883 #mqtt:<broker>.url=tcp://<host>:1883 mqtt:mosquitto.url=ssl://127.0.0.1:8883 # Optional. Client id (max 23 chars) to use when connecting to the broker. # If not provided a default one is generated. #mqtt:<broker>.clientId=<clientId> mqtt:mosquitto.clientId=openHABclient # Optional. User id to authenticate with the broker. # mqtt:<broker>.user=<user> mqtt:mosquitto.user=openHABuser # Optional. Password to authenticate with the broker. #mqtt:<broker>.pwd=<password> mqtt:mosquitto.pwd=openHABpassword # Optional. Set the quality of service level for sending messages to this broker. # Possible values are 0 (Deliver at most once),1 (Deliver at least once) or 2 # (Deliver exactly once). Defaults to 0. #mqtt:<broker>.qos=<qos> mqtt:mosquitto.qos=1 # Optional. True or false. Defines if the broker should retain the messages sent to # it. Defaults to false. #mqtt:<broker>.retain=<retain> mqtt:mosquitto.retain=false # Optional. True or false. Defines if messages are published asynchronously or # synchronously. Defaults to true. #mqtt:<broker>.async=<async> mqtt:mosquitto.async=true mqtt-eventbus:broker=mosquitto mqtt-eventbus:commandPublishTopic=home/openHAB/out/${item}/command mqtt-eventbus:statePublishTopic=home/openHAB/state/${item}/state
Básicamente lo que definimos es el nombre mosquitto del broker MQTT que usaremos, los datos de conexión (host, puerto y cifrado) y la autenticación (usuario y contraseña). Además al final le indicamos a openHAB dónde y como publicar la información que se vaya generando de los items que le configuremos (por si tenemos algún otro programa que los lea y haga algo, o para depurar su funcionamiento simplemente…)
Binding mqttitude, instalación y configuración
La instalación es similar a la anterior pero el fichero se llama org.openhab.binding.mqttitude-1.5.0-SNAPSHOT.jar. Creamos el enlace simbólico en la carpeta addons y listo. Para configurarlo vamos a su sección en el fichero openhab.cfg:
################################# Mqttitude Binding ################################### # # The latitude/longitude coordinates of 'home' #mqttitude:home.lat= #mqttitude:home.lon= mqttitude:home.lat=XX.Y99153 mqttitude:home.lon=-YY.X55697 # Optional. Distance in metres a user must be from 'home' to be considered inside # the geofence #mqttitude:geofence= mqttitude:geofence=50
Es bastante simple: indicamos la latitud y longitud de nuestra home, y la distancia máxima en metros. El círculo resultante será considerado como nuestra casa. El radio dependerá mucho de la precisión de nuestro dispositivo con GPS, de la cobertura de los satélites, y de mil condiciones más, así que vale la pena ser algo generoso.
Items
Como nos dice la documentación de openHAB, un item es un objeto que puede ser escrito o leído para interactuar con él. Nosotros vamos a necesitar tres objetos:
- Un Switch que nos dirá si estamos o no en nuestra home,
- Un Number para mostrar la latitud y
- Otro Number para mostrar la longitud de la posición en la que nos encontremos.
Los items se definen en ficheros, dentro de la carpeta configurations/items. Para tenerlo todo bien ordenado, los relacionados con Owntracks los guardaremos en el fichero configurations/items/owntracks.items:
Switch PresenceJose_MQTT "Jose Maria" (PresenceJose) { mqttitude="mosquitto:/owntracks/jose" } Number PresenceJose_Lat "Jose Latitud [%.6f]" (PresenceJose) { mqtt="<[mosquitto:/owntracks/jose:state:REGEX(.*\"lat\"\\S\\s\"(-?\\d+\\.\\d+)\".*)]" } Number PresenceJose_Long "Jose Longitud [%.6f]" (PresenceJose) { mqtt="<[mosquitto:/owntracks/jose:state:REGEX(.*\"lon\"\\S\\s\"(-?\\d+\\.\\d+)\".*)]" }
El primer item, leerá la información que le llegue del binding mqttitude que será si estamos o no dentro de la home, y los otros dos leerán las coordenadas que publicará la aplicación Owntracks en el servidor MQTT. Las expresiones regulares que veis sirven para extraer los números que nos interesan de la cadena de texto que envía Owntracks. Es muy importante que especifiquemos bien de dónde vamos a sacar la información, en este caso /owntracks/jose que es exactamente el topic que le dijimos a la aplicación Owntracks que debía usar para publicar su información.
Sitemap
Como ejemplo vamos a crear un sitemap que nos mostrará los tres items anteriores. El sitemap se llamará owntracks y el fichero donde lo definiremos será configurations/sitemaps/owntracks.sitemap:
sitemap owntracks label="Menu Principal" { Frame label="Presencia" { Switch item=PresenceJose_MQTT Text item=PresenceJose_Lat Text item=PresenceJose_Long } }
Una vez finalizada la configuración, ya podemos reiniciar el servidor openHAB para que cargue todos los bindings, en modo debug (con start_debug.sh), y veremos en la pantalla mensajes como:
23:57:46.348 INFO o.o.i.t.m.i.MqttBrokerConnection[:106] - Starting MQTT broker connection 'mosquitto' 23:57:46.429 DEBUG o.o.i.t.m.i.MqttBrokerConnection[:277] - Creating new client for 'ssl://127.0.0.1:8883' using id 'openHABclient' and file store '/tmp/mosquitto' ... 23:58:55.869 DEBUG o.o.b.m.i.MqttitudeActivator[:33] - Mqttitude binding has been started. 23:58:56.049 DEBUG o.o.m.i.i.GenericItemProvider[:334] - Start processing binding configuration of Item 'PresenceJose_MQTT (Type=SwitchItem, State=Uninitialized)' with 'MqttitudeGenericBindingProvider' reader. 23:58:56.145 DEBUG o.o.b.m.i.MqttitudeBinding[:177] - Registering Mqttitude consumer for /owntracks/jose (on mosquitto) 23:58:56.156 DEBUG o.o.i.t.m.i.MqttBrokerConnection[:440] - Starting message consumer for broker 'mosquitto' on topic '/owntracks/jose' 23:58:56.183 DEBUG o.o.b.m.i.MqttitudeBinding[:84] - Activating Mqttitude binding 23:58:56.234 DEBUG o.o.b.m.i.MqttitudeBinding[:118] - Mqttitude binding configuration updated, 'home' location specified (Lat: XX.Y99153, Long: -YY.X55697) with a geofence of 50.0m. ... 00:12:18.850 DEBUG o.o.c.t.i.s.RegExTransformationService[:42] - about to transform '{"_type": "location", "lat": "XX.3Y92476", "lon": "-YY.XX253867", "tst": "1397772708", "acc": "20.0", "batt": "59"}' by the function '.*"lat"\S\s"(-?\d+\.\d+)".*' 00:12:18.903 INFO runtime.busevents[:26] - PresenceJose_Lat state updated to XX.3Y92476 00:12:18.914 DEBUG o.o.c.t.i.s.RegExTransformationService[:42] - about to transform '{"_type": "location", "lat": "XX.3Y92476", "lon": "-YY.XX253867", "tst": "1397772708", "acc": "20.0", "batt": "59"}' by the function '.*"lon"\S\s"(-?\d+\.\d+)".*' 00:12:18.967 DEBUG o.o.i.t.m.i.MqttBrokerConnection[:404] - Publishing message 30 to topic 'home/openHAB/state/PresenceJose_Lat/state' 00:12:19.013 INFO runtime.busevents[:26] - PresenceJose_Long state updated to -YY.XX253867 00:12:19.100 DEBUG o.o.i.t.m.i.MqttBrokerConnection[:404] - Publishing message 31 to topic 'home/openHAB/state/PresenceJose_Long/state' 00:12:19.500 DEBUG o.o.b.m.i.MqttitudeConsumer[:147] - PresenceJose_MQTT is inside the 'home' geofence (12.831291781064577m) 00:12:19.521 INFO runtime.busevents[:26] - PresenceJose_MQTT state updated to ON 00:12:19.604 DEBUG o.o.i.t.m.i.MqttBrokerConnection[:404] - Publishing message 32 to topic 'home/openHAB/state/PresenceJose_MQTT/state'
Podemos ver los mensajes de inicialización de los items, de lectura de la configuración del binding mqttitude, de la actualización de los items cuando se procesan los datos de Owntracks…
Si accedemos mediante un navegador a nuestro servidor openHAB veremos algo parecido a esto:
Y si lo vemos desde un móvil con habdroid veremos algo así:
Espero que os haya gustado y como diríamos en mi pueblo: ¡con esto y un bizcocho, hasta mañana a las ochoooo!
Hola,
Pues nada, lo he repasado 100 veces… todo igual. Bueno he cambiado alguna cosa para que estuviese igual que el ejemplo pero nada… La única diferencia es que el ‘broker’ no está en el mismo equipo, mqtt:mosquitto.url=ssl://192.168.1.100:8883, es más
Received SUBSCRIBE from serverHAB
1397837568: /owntracks/nex4 (QoS 1)
1397837568: serverHAB 1 /owntracks/nex4
1397837568: Sending SUBACK to serverHAB
1397837568: Sending PUBLISH to serverHAB (d0, q0, r1, m0, ‘owntracks/nex4’, … (113 bytes))
🙁
Saludos
Y desde la máquina con openHAB ¿puedes subscribirte al topic de /owntracks/nex4 del servidor mosquitto que tienes en la otra maquina?
Parece que han sacado un parche para MQTT en openHAB que soluciona los problemas que da al intentar conectar con el broker MQTT que tengamos configurado, hay mas información en la lista de distribución del proyecto (https://groups.google.com/forum/#!topic/openhab/USemUN7cM0A)
Sin problema… es muy extraño.
a ver me conecto así… por lo que también cambié mqtt:mosquitto.url=tcp://192.168.1.100:1883
mosquitto_sub -h 192.168.1.100 -p 1883 -u user -P pass -t owntracks/nex4
desde la linea de comando todo va perfecto, pero openHAB no se entera…. y eso que si parece enterarse:
20:34:46.168 DEBUG o.o.i.t.mqtt.MqttService[:118]- Starting MQTT Service…
20:34:46.194 INFO o.o.i.t.mqtt.MqttService[:102]- MQTT Service initialization completed.
20:34:46.202 INFO o.o.i.t.m.i.MqttBrokerConnection[:106]- Starting MQTT broker connection ‘mosquitto’
20:35:03.707 DEBUG o.o.b.m.internal.MqttActivator[:34]- MQTT binding has been started.
20:35:03.740 DEBUG o.o.b.m.i.MqttItemConfig[:71]- Loaded MQTT config for item ‘PresenceTest_Lat’ : 1 subscribers, 0 publishers
20:35:03.755 DEBUG o.o.b.m.i.MqttItemConfig[:71]- Loaded MQTT config for item ‘PresenceTest_Long’ : 1 subscribers, 0 publishers
20:35:03.792 DEBUG o.o.b.m.i.MqttEventBusBinding[:61]- MQTT: Activating event bus binding.
:/
pues estaba todo bien… sólo que si has configurado openhab así mqttitude=»mosquitto:/owntracks/jose» y owntracks como owntracks/jose tendrás problemas… sabía que era una tontería… 😉
Lo que me despistó fue que al cliente mosquito_sub le da igual que pongas la barra o no…
Sí, es verdad, yo estuve haciendo pruebas con las barras y los comodines (# y +), y al final me quedé con lo que dice la entrada: «es muy importante que especifiquemos bien de donde vamos a sacar la información…» Busqué un pequeño manual por la red sobre la sintaxis de los topics en mosquitto y estuve echándole un vistazo para ver si me aclaraba algo el tema y al final parece que todo funciono. También es cierto que a veces no me conectaba a la primera openHAB con mosquitto, aun no se muy bien el por qué, y tengo que esperar a que haga varias conexiones contra el servidor mosquitto para que empiece a recibir la información bien (parece que es un fallo que ya está reportado). Por esto uso siempre la ultima versión disponible de openHAB, aunque sea una versión de pruebas, y también alguna anterior para comparar el funcionamiento…
Me he fijado y en la entrada sobre la configuración del software en Android, no pone /owntracks/jose, solo /owntracks.
Sobre esto último es cierto, use tu nombre pero me refería a mi configuración en realidad. 😉
En cuanto a los (a veces) comportamientos raros. Yo he tenido que dejar de usar el «binding» ‘openenergymonitor’, pues a pesar de funcionar bien, de pronto deja de hacerlo sin motivo, y lo que es peor sin rastro en el log… y de enviar correos ni hablar tampoco.
Voy a poner en práctica eso de las dos versiones, estable y última beta… Si no estoy equivocado sólo necesito copiar la carpeta configuration/* y las imágenes que hayas añadido… ¿no?
A mi la parte de enviar correos si que me funciona bien, con Gmail, y el acceso a Google Calendar parece que también… Lo bueno de openHAB es que cuando algo te falla o no sabes muy bien qué es lo que esta haciendo te puedes ir al código fuente y echarle un vistazo. El del binding mqttitude es muy sencillo de leer. El problema viene cuando lo que falla no es el binding en si, sino todo lo que lleva por debajo, ahí sí que me pierdo, jajajajaja 🙂
Yo si que mantengo la misma configuracion en la carpeta configurations, aunque el fichero openhab_default.cfg dejo el nuevo (por si cambia algo, o añaden algo nuevo).