Verarbeiten von JSON Daten

Eine Reihe von Devices liefert Antworten bzw. Stati in Form von JSON formatierten Daten zurück. Diese Daten können in Items verwendet werden, wenn sie in Items vom Typ dict oder vom Typ list eingelesen werden können.

 

Einlesen von JSON Messages in dicts mit dem MQTT Plugin

Besonders einfach ist das Einlesen von Daten in Items der Typs dict, wenn man MQTT Messages mit dem aktuellen MQTT Plugin empfängt. Das MQTT Protokoll bis zur Version 3.1x unterstützt keine Datentypen. Die Payload, also die übertragenen Daten, werden immer als Array of Byte übertragen.

Das aktuelle MQTT Plugin unterstützt das Casting in den Datentyp des Items. Wenn also z.B. das Item vom Typ str ist, wird beim Empfang das Array of Byte in einen String gewandelt.

Wenn man in der Payload der MQTT Message JSON formatierte Daten in ein Item vom Typ dict empfängt, werden die Daten in Form eines Python dict gespeichert und können in Logiken und eval-Ausdrücken entsprechend weiter verarbeitet werden.

Bei komplexen JSON Strukturen ist die Weiterverarbeitung mit einer Logik zu empfehlen. Bei einfacheren Strukturen kann die Weiterverarbeitung jedoch auch sehr gut in Items mit Hilfe von eval oder on_change erfolgen.

 

Ein einfaches JSON Beispiel

Wenn eine MQTT Message z.B. folgende Daten liefert:

{  
   "key1":"value1",
   "key2":"value2",
   "key3":"value3"
}

und Du nur den Wert von key2 benötigst, kannst Du das über ein Hilfs-Item lösen, in dem Du die MQTT Payload einliest und den entsprechenden Wert in das Ziel-Item schreibst. Dazu musst Du die Items folgendermaßen definieren:


test:
    hilfs_item:
        type: dict
        mqtt_topic_in: test/test
        on_change: ..ziel_item = value['key2']

    ziel_item:
        type: str

Das MQTT Topic musst Du durch einen sinnvollen Wert ersetzen. Natürlich kann im on_change Attribut anstelle der relativen Item Adressierung auch die absolute Adressierung (test.ziel_item) verwendet werden.

 

Alternativ kannst Du das auch mit eval / eval_trigger lösen:

test:
    hilfs_item:
        type: dict
        mqtt_topic_in: test/test

    ziel_item:
        type: str
        eval: sh.test.hilfs_item()['key2']
        eval_trigger: test.hilfs_item

Diese Variante kannst Du natürlich auch mit relativer Item-Adressierung realisieren.

 

Einlesen von JSON Messages in lists mit dem MQTT Plugin

Wenn man in der Payload der MQTT Message JSON formatierte Daten in ein Item vom Typ list empfängt, werden die Daten in Form eines Python list gespeichert und können in Logiken und eval-Ausdrücken entsprechend weiter verarbeitet werden.

 

Ein einfaches JSON Beispiel

Wenn eine MQTT Message z.B. folgende Daten liefert:

[  
   "value1",
   "value2",
   "value3"
]

und Du nur den zweiten Wert von benötigst, kannst Du das über ein Hilfs-Item lösen, in dem Du die MQTT Payload einliest und den entsprechenden Wert in das Ziel-Item schreibst.

Listen sind so definiert, dass das ersten Element den Index 0 hat. Um den zweiten Wert zu adressieren, musst Du den Index 1 verwenden. Dazu musst Du die Items folgendermaßen definieren:


test:
    hilfs_item:
        type: list
        mqtt_topic_in: test/test
        on_change: ..ziel_item = value[1]

    ziel_item:
        type: str

 

Auswertung komplexerer Datenstrukturen

Ein dict oder eine list kann statt einfacher Daten auch dicts oder lists enthalten. Auch diese Daten lassen sich auswerten und es können Einzelwerte dieser Datenstruktur in Items gespeichert werden.

Wenn eine MQTT Message z.B. folgende Daten liefert:

{  
   "key1":"value1",
   "key2":[  
      "value21",
      "value22",
      "value23"
   ],
   "key3":{  
      "key31":"value31",
      "key32":"value32",
      "key33":"value33"
   }
}

 

kannst Du folgendermaßen auf den value22 oder den value33 zugreifen:


test:
    hilfs_item:
        type: dict
        mqtt_topic_in: test/test
        on_change: 
          - ..ziel_item1 = value['key2'][0]
          - ..ziel_item2 = value['key3']['key33']

    ziel_item1:
        type: str

    ziel_item2:
        type: str

 

Kategorien: Tipps & Tricks

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.