Hallo,
ich finde einfach mit expandJSON keine Lösung - daher meine Frage:
Per MQTT werden folgende JSON Datensätze an FHEM geschickt:
{"ID":100010,"VALUE":19.1,"TYP":"xyz_1"}
{"ID":100012,"VALUE":40.6,"TYP":"xyz_2"}
{"ID":100013,"VALUE":14.9,"TYP":"xyz_3"}
Mit
define MQTT_W100 MQTT_DEVICE
attr MQTT_W100 IODev Mosquitto
attr MQTT_W100 subscribeReading_data /sensor/xyz
define MQTT_W100_data expandJSON MQTT_W100.*:.*:.{.*}
erhalte ich für jeden eingelesenen JSON Datensatz die Readings für ID, VALUE und TYP.
Ich würde jedoch gerne den Inhalt von TYP als Reading-Bezeichner und den gesamten JSON String als Reading-Inhalt erhalten:
xyz_1 {"ID":100010,"VALUE":19.1,"TYP":"xyz_1"}
xyz_2 {"ID":100012,"VALUE":40.6,"TYP":"xyz_2"}
xyz_3 {"ID":100013,"VALUE":14.9,"TYP":"xyz_3"}
Habt Ihr einen Tipp für mich oder einen Lösungsansatz?
Danke im Voraus
Wolfram
Mir würde da spontan nur userReadings einfallen.
Hallo,
habe folgende allgemein gültige Lösung (für mich) gefunden - für alle, die so etwas auch gebrauchen können:
define MQTT_W100 MQTT_DEVICE
attr MQTT_W100 IODev Mosquitto
attr MQTT_WM100 subscribeReading_data { main::myUtils_WM_Get_ReadingName( $hash, $name, $topic, $message, "TYP" ) } /sensor/xyz
define MQTT_W100_data expandJSON MQTT_W100.*:.*:.{.*}
Mit der Funktion 'myUtils_WM_Get_ReadingName' wird der Reading-Name für 'subscribeReading_data' ermittelt, das dann das eigentliche Reading enthält:
xyz_1 {"ID":100010,"VALUE":19.1,"TYP":"xyz_1"}
Einzelne Reading-Werte können über die Funktion 'myUtils_WM_Get_ReadingEntry' abgerufen werden - Beispiel:
attr MQTT_WM_100 stateFormat { sprintf("Text : %s", myUtils_WM_Get_ReadingEntry($name, "xyz_1", "VALUE")) }
Ausgabe:
Text : 19.1
Der Funktionscode wird z.B. in '99_myUtils.pm' abgelegt:
sub myUtils_WM_Get_ReadingName {
my ( $hash, $name, $topic, $message, $readname ) = @_;
my $json = decode_json( $message );
readingsBeginUpdate( $hash );
readingsBulkUpdate( $hash, $json->{$readname}, $message );
readingsEndUpdate( $hash, 1 );
}
sub myUtils_WM_Get_ReadingEntry {
my ( $name, $devtype, $devread ) = @_;
return((decode_json(ReadingsVal($name, $devtype, "{}")))->{$devread});
}
Gruss
Wolfram