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:

captura

Y si lo vemos desde un móvil con habdroid veremos algo así:

captura2

Espero que os haya gustado y como diríamos en mi pueblo: ¡con esto y un bizcocho, hasta mañana a las ochoooo!

9 comentarios

Añadir un comentario

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.