JSON in Reading umwandeln

Begonnen von fr00sch, 27 Februar 2020, 17:09:07

Vorheriges Thema - Nächstes Thema

fr00sch

Hallo,

ich war erfolglos mit dem Herum probieren von expandjson und auch meine Suche hier hat keine entsprechende Hilfe hervorgebracht.

Ich erhalte via MQTT: folgendes JSON in einem Reading des MQTT-DEVICES:
[{"A":"01:23:45:67:89:10","R":"-76","N":""},{"A":"10:98:76:54:32:10","R":"-64","N":""}]
Hier werden alle Bluetoothgeräte aufgelistet samt Name und RSSI-Wert
Die Länge der Liste kann natürlich abhängig von der Anzahl der Geräte varieren.
Kann fhem mit irgendeinem Modul mit so einem JSON Array umgehen?
Oder muss ich in dem Reading jedesmal nach der entsprechenden MAC-Adresse über ein DOIF oder notify suchen?

Gruß fr00sch
RPi3B+ als FHEM mit VCCU,ZWave,Signalduino,MQTT
RPi4B als CCU3
QNAP TS451p(mit Docker) als Messwerte-Datenbank

rudolfkoenig

Mir sind mehrere Moeglichkeiten bekannt:
- MQTT2_DEVICE statt MQTT_DEVICE zu verwenden (IODev muss auch umgestellt werden), da wird JSON automatisch umgewandelt
- es gibt ein expandJSON Modul
- man kann per userReadings die FHEM/perl Funktion json2reading aufrufen.

fr00sch

Danke für die schnelle Antwort.

Ich verwende ein MQTT2_DEVICE und die JSON-Daten werden nicht autmatisch umgewandelt. Da das aber anscheinend ein JSON Array ist, denn es hat "[]" statt "{}", könnte das ein Problem sein, weswegen die automatische Umwandlung nicht geschieht. Macht das Sinn?

Das expandJSON Modul habe ich nicht ans laufen bekommen, weil ich nicht aus der Beschreibung und aus den Beispielen hier im Forum schlau geworden bin:

Internals:
   DEF        MQTT2_ESP32_ble1:json:.\{.*}
   FUUID      yyyyyyyyyyyyyyyyyyyy
   NAME       ble1
   NOTIFYDEV  MQTT2_ESP32_ble1
   NR         153838
   NTFY_ORDER 50-ble1
   STATE      active
   TYPE       expandJSON
   s_regexp   MQTT2_ESP32_ble1:json:.\{.*}
   t_regexp   .*
   version    1.13
   Helper:
     DBLOG:
       state:
         logdb_remote:
           TIME       1582713470.71557
           VALUE      active
   READINGS:
     2020-02-27 21:01:11   state           active
   helper:
     addReadingsPrefix 1
Attributes:
   DbLogExclude .*
   addReadingsPrefix 1
   room       MQTT2_DEVICE



mein MQTT2-DEVICE sieht wie folgt aus

Internals:
   CID        ESP32_ble1
   DEF        ESP32_ble1
   DEVICETOPIC MQTT2_ESP32_ble1
   FUUID      xxxxxxxxxxxxxxxxxxx
   IODev      MQTT2_FHEM_Server
   LASTInputDev MQTT2_FHEM_Server
   MQTT2_FHEM_Server_MSGCNT 1431
   MQTT2_FHEM_Server_TIME 2020-02-27 21:01:38
   MSGCNT     1431
   NAME       MQTT2_ESP32_ble1
   NR         117660
   STATE      ???
   TYPE       MQTT2_DEVICE
   JSONMAP:
     MQTT2_ESP32_ble1 json
   OLDREADINGS:
   READINGS:
     2020-02-27 21:01:17   ip              192.168.999.999
     2020-02-27 21:01:38   json           [{"A":"01:23:45:67:89:10","R":"-76","N":""},{"A":"10:98:76:54:32:10","R":"-64","N":""}]
     2020-02-27 21:01:33   number          2
     2020-02-27 21:01:17   status          1
Attributes:
   DbLogExclude .*
   IODev      MQTT2_FHEM_Server
   event-on-change-reading .*
   jsonMap    MQTT2_ESP32_ble1:json
   readingList ESP32_ble1:ble1/status:.* status
ESP32_ble1:ble1/ip:.* ip
ESP32_ble1:ble1/json:.* json
ESP32_ble1:ble1/number:.* number
   room       MQTT2_DEVICE


Die Möglichkeit mit json2reading habe ich noch nicht getestet, aber was ich gesehen habe scheint mir auch nicht für JSON-Arrays mit [] geeignet zu sein:
https://forum.fhem.de/index.php/topic,55005.msg931672.html#msg931672
RPi3B+ als FHEM mit VCCU,ZWave,Signalduino,MQTT
RPi4B als CCU3
QNAP TS451p(mit Docker) als Messwerte-Datenbank

herrmannj

Was genau ist das Ziel, bzw wie soll das Ergebnis aussehen?

rudolfkoenig

Ich habe json2nameValue umgebaut, damit auch sowas (array auf toplevel) akzeptiert wird:
fhem> { my $r=json2nameValue('[{"A":"01:23:45:67:89:10","R":"-76","N":""},{"A":"10:98:76:54:32:10","R":"-64","N":""}]');; join("\n", map { "$_=>$r->{$_}" } sort keys %{$r}) }
1_A=>01:23:45:67:89:10
1_N=>
1_R=>-76
2_A=>10:98:76:54:32:10
2_N=>
2_R=>-64
Ich hoffe, dass es keine Nebeneffekte hat, wenn doch, bitte melden.

HeikoGr

#5
Seiteneffekte? Damit kann ich dienen :-D

seit dem Update ging mein MQTT2 / EBUS / Vaillant Setup nicht mehr.

Leider verstehe ich die Zusammenhänge nicht genau. Folgendes kommt zum verarbeiten rein:
ebusd/bai/ModulationTempDesired:.* { json2nameValue($EVENT, 'ModulationTempDesired_', $JSONMAP) }

Aber das neue regex (autocreate complex) legt bei mir zum Beispiel folgende neuen Readings an:
MQTT2_ebusd_bai.TempDesired_0_ModulationTempDesired_value
tatsächlich sind alle readings im Eimer.

ich erwarte eigentlich (und die bestehenden readings werden nicht weiter befüllt...):
MQTT2_ebusd_bai.ModulationTempDesired_0_value

BridgeRegex im MQTT2_Device ist (wie im Wiki empfohlen):
(ebus.)[^/]*/(bai|broadcast)/.*:.* "$1_bai"
  (ebus.)[^/]*/([\d]+)/.*:.* "$1_$2"
  (ebus.)[^/]*[/][^b][a-zA-Z]+[/].*:.* "$1"


Nachdem ich die Änderung manuell zurückgesetzt habe geht wieder alles.
Brauchst du noch weitere Informationen um das nachzuvollziehen?

rudolfkoenig

Ja, das JSON, was die "kaputten" Readings erzeugt.
Bitte mit dem aktuellen fhem.pl pruefen, gestern habe ich noch was gefixt: https://forum.fhem.de/index.php/topic,108828.msg1028044.html#msg1028044

HeikoGr

Das heutige update hat den fehler nicht korrigiert.
Mqtt2 wurde heute auch nicht geupdatet - wenn ich mich richtig erinnere.

Wie komme ich denn am einfachsten an die json Daten ran?

Ich kann dir folgenden mitschnitt einer app abbieten:


rudolfkoenig

ZitatMqtt2 wurde heute auch nicht geupdatet - wenn ich mich richtig erinnere.
Die Aenderung war in fhem.pl => Neustart ist erforderlich.
Kannst du bitte die Ausgabe von version anhaengen?

ZitatWie komme ich denn am einfachsten an die json Daten ran?
attr <mqtt_iodev> verbose 5

Mit den Informationen, den ich habe, generiert die aktuelle Version mAn richtige Namen:fhem> { my $r=json2nameValue('{ "0":{"name":"","value":36.5}}','ModulationTempDesired_');; join("\n", map { "$_=>$r->{$_}" } sort keys %{$r}) }
ModulationTempDesired_0_name=>
ModulationTempDesired_0_value=>36.5

Kannst du bitte eine raw Definition der MQTT2_DEVICE Instanz zeigen?

HeikoGr

Ok. Das war dann der entscheidende Hinweis...

Nicht meine Änderung hat alles wieder gangbar gemacht, sondern der Neustart.
Update hatte ich heute vormittag bereits durchgeführt. Aber keinen Neustart.
Dann habe ich versucht die Ursache für mein kaputtes setup zu finden.

Nachdem ich 10_MQTT2_DEVICE geändert habe, habe ich fhem neu gestartet und damit deinen Patch aktiviert.

Danke für die Hilfe! Jetzt geht wieder alles!

rudolfkoenig

ZitatUpdate hatte ich heute vormittag bereits durchgeführt. Aber keinen Neustart.
Nur aus Interesse, um zu verstehen wie Benutzer "ticken", und worauf ich achten soll: hast du nach dem update ein reload gemacht?

HeikoGr

Nein, ich hab ja nur schnell mit dem handy geschaut ob mqtt2 korrigiert wurde.
Kann ja keiner ahnen, dass die Korrektur in der fhem.pl liegt. ;D

Aber auch sonst war ich mir bis gerade nicht bewusst, dass ein reload bzw. shutdown restart immer notwendig ist :-[


rudolfkoenig

Vermutlich uebersieht man zu einfach die vorletzte Zeile beim update:
Zitatupdate finished, "shutdown restart" is needed to activate the changes.

frank

beim update über pgm2 öffnet sich ja automatisch der eventmonitor.
wie wäre es, diese zeile dort rot zu färben?
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

TomLee

Ein blinkendes ? (neben save config), als Zeichen für Handlungsbedarf, hätte ich als Vorschlag.