FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: wolwin am 30 November 2018, 12:48:53

Titel: [Gelöst] MQTT Reading Inhalt als Reading Bezeichner
Beitrag von: wolwin am 30 November 2018, 12:48:53
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
Titel: Antw:MQTT Reading Inhalt als Reading Bezeichner
Beitrag von: Vaddi am 01 Dezember 2018, 01:14:04
Mir würde da spontan nur userReadings einfallen.
Titel: Antw:MQTT Reading Inhalt als Reading Bezeichner
Beitrag von: wolwin am 02 Dezember 2018, 21:16:45
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