11 Motor MQTT
El motor MQTT se suscribe a un broker MQTT y guarda el último mensaje recibido en cada topic. Los ítems de Zabbix leen esos valores o descubren los topics disponibles. A diferencia de los otros motores, no ejecuta ninguna operación cuando Zabbix pide un valor: los datos llegan continuamente desde el broker, a través de un hilo receptor.
11.1 Configuración: sección [MQTT]#
| Parámetro | Defecto | Descripción |
|---|---|---|
Server |
obligatorio | Nombre o IP del broker. |
Port |
1883 | Puerto del broker. |
Id |
obligatorio | Identificador de cliente MQTT. Debe ser único en el broker. |
UserName |
obligatorio | Usuario. |
Password |
obligatorio | Contraseña. |
Timeout |
20000 | Tiempo máximo de conexión, en ms. |
Subscription |
# |
Jerarquía de topics a la que se suscribe. Escríbase \043 para #. |
DiscoveryDelay |
10000 | Tras el arranque, espera en ms antes de responder a los descubrimientos, para dar tiempo a recibir todos los topics. |
AbsentDelay |
10000 | Espera en ms antes de volver a intentar un ítem cuyo topic no tiene mensajes nuevos. |
[General]
Name = PLANTA1
Engine = MQTT
QueryFile = /etc/databbix/query-mqtt.xml
[Zabbix]
Server = zabbix.empresa.com
Port = 10051
[Data]
Module = MQTT
[MQTT]
Server = mqtt.empresa.com
Id = databbix-planta1
UserName = zabbix
Password = secreto
Subscription = planta1/\043 # planta1/#11.2 Ficheros de consultas#
Las consultas MQTT no llevan elementos propios: la operación es siempre la misma (leer el último valor de un topic). El fichero query-mqtt.xml de la distribución contiene las dos consultas necesarias:
<Queries engine="MQTT" databbix="2.5.0" query="2.3.0">
<query name="ItemValue" module="MQTT">
<parameter order="1" type="STRING"/>
<item name="ts.mqtt.getvalue"/>
</query>
<query name="ItemDiscover" module="MQTT" discovery="yes">
<parameter order="1" type="STRING"/>
<item name="ts.mqtt.discovery"/>
<field name="TOPIC"/>
</query>
</Queries>Atención. En este motor, los nombres de ítem son fijos: el motor solo responde a ts.mqtt.getvalue y ts.mqtt.discovery. Un <item> con otro nombre se carga sin error, pero sus valores son siempre no soportados.
Reglas de las consultas MQTT:
Los
<parameter>solo llevanorder(ovalue) ytype. El parámetro es el topic o, en los descubrimientos, el patrón de topics.Los
<item>solo llevanname; no admiten atributos que indiquen de dónde sale el valor.Un descubrimiento debe tener exactamente un
<parameter>y un<field>. El<field>solo llevaname: la macro toma como valor el nombre completo del topic.
11.3 Lectura de valores#
La clave ts.mqtt.getvalue[topic] devuelve el contenido del último mensaje publicado en ese topic. Dados estos mensajes recibidos del broker:
Últimos mensajes recibidos
| Topic | Contenido |
|---|---|
| planta1/linea1/temperatura | 21.5 |
| planta1/linea1/presion | 1.02 |
| planta1/linea2/temperatura | 22.1 |
| planta1/estado | {"modo":"auto","alarmas":0} |
Valores obtenidos
| Clave | Valor |
|---|---|
| ts.mqtt.getvalue[planta1/linea1/temperatura] | 21.5 |
| ts.mqtt.getvalue[planta1/estado] | {"modo":"auto","alarmas":0} |
| ts.mqtt.getvalue[planta1/linea3/temperatura] | no soportado: no se ha recibido |
El contenido se envía tal cual. Si es un JSON, como en planta1/estado, se pueden extraer sus campos en Zabbix con un preprocesado JSONPath en el ítem.
Un valor solo se envía a Zabbix cuando ha llegado un mensaje nuevo desde la última vez. Si no ha llegado ninguno, el ítem se vuelve a intentar al cabo de AbsentDelay milisegundos, en lugar de repetir el valor anterior.
11.4 Descubrimiento de topics#
La clave ts.mqtt.discovery[patrón] devuelve todos los topics recibidos que encajan con el patrón. El patrón usa los comodines de MQTT:
| Comodín | Significado |
|---|---|
+ |
Exactamente un nivel cualquiera. |
# |
Cualquier número de niveles. |
Con los mensajes de la sección anterior:
Patrones y topics descubiertos
| Clave | Valores de {#TOPIC} |
|---|---|
| ts.mqtt.discovery[planta1/+/temperatura] | planta1/linea1/temperatura |
| planta1/linea2/temperatura | |
| ts.mqtt.discovery[planta1/linea1/#] | planta1/linea1/temperatura |
| planta1/linea1/presion | |
| ts.mqtt.discovery[planta1/+] | planta1/estado |
| planta1/linea1/temperatura | |
| planta1/linea1/presion | |
| planta1/linea2/temperatura |
Nota. A diferencia de MQTT estándar, en Databbix un patrón también encaja con los topics que tienen más niveles que él: funciona como un prefijo. Así, planta1/+ descubre de una vez todos los topics que cuelgan de cualquier subnivel de planta1. Para limitar el resultado a un nivel concreto, escriba el patrón con todos los niveles (planta1/+/temperatura).
El valor del primer ítem es:
{"data":[ {"{#TOPIC}":"planta1/linea1/temperatura"},
{"{#TOPIC}":"planta1/linea2/temperatura"} ]}
En Zabbix se crea una regla de descubrimiento con esa clave y el prototipo de ítem ts.mqtt.getvalue[{#TOPIC}].
Solo se descubren los topics de los que ya se ha recibido algún mensaje. Por eso, durante los primeros DiscoveryDelay milisegundos tras el arranque, los descubrimientos se retrasan.
11.5 Datos de ejecución#
El motor MQTT ofrece estos datos de ejecución:
| Nombre | Valor |
|---|---|
DATABBIX.PROGRAM_NAME |
databbix, o queryexplorer en esa utilidad. |
CONN.TYPE |
MQTT. |
Como las consultas de este motor no tienen condiciones <when>, estos datos solo se consultan con getRuntimeValue en queryexplorer.