Nach längerem Try and Error gibt es in meiner Library ein neues IO Modul zum Publishen von Variablenänderungen an einen MQTT-Broker.
Es nutzt die mit IPS 4.1 eingeführte Möglichkeit der Registrierung auf IPS Events von einzelnen Objekten
Man registriert (subscribed) die VariableIDs, für die man Update Messages an den Broker schicken möchte. Das Modul verarbeitet dann die IPS VM_UPDATE Events, bildet aus dem Variablen-Namen, ID und Path einen MQTT Topic (kann man in der Konfiguration einstellen),z.B.
IPS/status/42440/Watt/APCUPSD_Devices/Back-UPS_RS_900G/Watt
Als Payload wird ein Json-String mit den aktuellen Wert und Eigenschaften der Variable an den Broker übertragen.
{'Path': 'APCUPSD Devices/Back-UPS RS 900G/Watt',
'TS': 1477132802,
'UTF8Value': '124',
'VariableChanged': 1477132502,
'VariableID': 42440,
'VariableIdent': 'Watt',
'VariableType': 2,
'VariableUpdated': 1477132802}
Zur Installation einfach eine neue IP Instance des Moduls erstellen. Die kann dann für alle Variablen in IPS genutzt werden. Das Modul stellt die Verbindung zum Broker mittels einer angepassten phpMQTT Klasse direkt her, es wird also keine zusätzlichen IO Instance wie Client Sockets benötigt.
Folgende Funktionen stehen zur Verfügung
MQTTPUP_Publish($id,$varid); //trigger immediately publishing variable $varid to the broker
MQTTPUB_Subscribe($id,$varid); //Subscribes VM_UPDATE messages for variable $varid on IPS Messageloop
MQTTPUB_UnSubscribe($id,$varid); //UnSubscribes VM_UPDATE messages for variable $varid from IPS Messageloop
MQTTPUB_Subscribe_All($id,$objectid); // Subscribes all variable IDs below $objectid to IPS Messageloop
MQTTPUB_UnSubscribe_All($id,$objectid); //UnSubscribes all variable IDs below $objectid from IPS Messageloop
Als Beispiel Consumer habe ich ein Python Script beigelegt, womit man die an den Broker übergebenen Daten in eine Mysql-DB schieben kann.
Details zum Modul wie immer auf Github
Viel Spass!
Tommi