JSON -> Readings

Begonnen von dev0, 09 Februar 2017, 11:31:43

Vorheriges Thema - Nächstes Thema

dev0

Im [HowTo] Sonoff POW an Fhem anbinden Thread kam die Frage auf, wie man Werte eines JSON Strings in individuelle Readings schreibt.
Eine mögliche Variante ist hier zu finden.

EDIT: Das Modul expandJSON ist ab morgen früh (16.03.2017) über das FHEM Update verfügbar.

Reinhart

#1
Hallo dev0!

Das geht ja bei dir superschnell und es funktioniert! Danke für deine Mühe, das Modul ist ja sehr universell einsetzbar.
Ich habe jetzt folgendes bei einem Sonoff Modul mit Originalsoftware Tasmota getestet.

Das Attribut in Fhem:
attr TestSwitch subscribeReading_Sensor tele/TestSwitch/SENSOR


{"Time":"2017-02-09T12:05:01", "DHT":{"Temperature":"20.7", "Humidity":"28.7"}}
und das ist der übergebene String vom Modul mit der Topic "tele/TestSwitch/SENSOR"


define n_j2r notify TestSwitch:Sensor:.* { j2r($NAME,$EVENT) }

dann habe ich diesen Notify angelegt und erhalte wie im Bild unten dargestellt die darin enthaltenen Messdaten als Reading.

- DHT_Humidity
- DHT_Temperature
- Time



Vielen Dank für dieses sehr nützliche universelle Tool!

LG
Reinhart
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

dev0

Ich habe im ersten Beistrag noch ein Beispiel für einen Dummy hinzugefügt, um die Arbeitsweise vielleicht noch etwas klarer zu machen.

SamNitro

Vielen Dank läuft super :)
(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)

octek0815

Da die v3.2.13 von arendst EOL ist habe nun auch auf Tasmota umgestellt.
Im FHEM Log tauchen beim Laden von dem j2r Modul folgende Meldungen auf, ist das Ok?

2017.02.09 18:40:37 1: PERL WARNING: each on reference is experimental at ./FHEM/99_j2r.pm line 74.
2017.02.09 18:40:37 1: PERL WARNING: each on reference is experimental at ./FHEM/99_j2r.pm line 79.
2017.02.09 18:40:37 1: PERL WARNING: main::j2r_update() called too early to check prototype at ./FHEM/99_j2r.pm line 73.
2017.02.09 18:40:37 1: PERL WARNING: Scalar value @_[0] better written as $_[0] at ./FHEM/99_j2r.pm line 91.



P.A.Trick

Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

dev0

@octek0815: Teste mal bitte ob die aktualisierte Version die Warnungen immer noch bringt. Nach dem Update FHEM bitte neu starten.

octek0815

Zitat von: dev0 am 10 Februar 2017, 08:32:43
@octek0815: Teste mal bitte ob die aktualisierte Version die Warnungen immer noch bringt. Nach dem Update FHEM bitte neu starten.

Perfekt, die Meldungen sind nun weg. Vielen Dank dafür!

LG
Olli

octek0815

#8
Ich habe nun noch was entdeckt. Die Readings die durch das j2r Modul erzeugt werden lassen sich nicht loggen.
Ich habe zumindest nicht raus gefunden warum. Die werden im SONOFF Device schön erzeugt und aktualisiert wandern aber leider nicht ins FileLog.
Kann das Jemand bestätigen?

Nachtrag: Wenn ich mit setreading etwas bzw. einen Event im Device erzeuge taucht es im FileLog auf.

?!*#*???

Mickbaer

Hallo,
zuerst einen großen Dank an dev0 :) :) :) für die Perl Funktion.
Die Readings kommen alle sauber in FHEM an.
(siehe Anhang)

Das die hinzugefügten Readings, keinen EVENT auslösen, habe ich gerade auch festgestellt,
darum werden die neuen Readings nicht in die LOG-Datei geschrieben.

Ich habe das auch noch nicht gefunden,
wie FHEM dazu zu bewegen ist beim Schreiben der Readings einen Event auszulösen.

Für einen Tip wäre Ich hier auch dankbar.
Grüße aus Berlin sagt der Mickbaer ;)

dev0

Die fehlenden Events werden wegen der FHEM Event loop detection nicht generiert. Ich werde einen Workaround einbauen, sobald ich dazu komme.

Mickbaer

Hallo Dev0,
kann man die fehlenden Events nicht nach dem hier beschriebene Muster,
https://wiki.fhem.de/wiki/Plot-Abriss_vermeiden
like addlock lösen?
siehen hier:
#### Log-abriss vermeiden
# called by
# define addLog notify addLog {addLog("ez_Aussensensor","state");;\
#            addLog("ez_FHT","actuator");;\
#            addLog("MunichWeather","humidity");;\
#            addLog("MunichWeather","pressure");;\
#            addLog("MunichWeather","temperature");;\
#            addLog("MunichWeather","wind_chill");;}
# define a_midnight1 at *23:59 trigger addLog
# define a_midnight2 at *00:01 trigger addLog
sub
addLog($$) {
  my ($logdevice, $reading) = @_; # device and reading to be used
  my $logentry = ReadingsVal($logdevice,$reading,"addLog: invalid reading");
  if ($reading =~ m,state,i) {
    fhem "trigger $logdevice $logentry   << addLog";
  } else {
    fhem "trigger $logdevice $reading: $logentry   << addLog";
  }
}

die benötigten Variablen für $logdevice & $logentry sind ja in der J2r.pm vorhanden.
damit müsste sich doch ein Trigger pro reading in FHEM auslösen lassen.?
Mir fehlen dazu leider die nötigen Perl & FHEM Kenntnisse :'(

Gruß Mickbaer

Mickbaer

Hallo,
Ich habe jetzt noch einmal genauer nachgesehen.
Das J2r Modul erzeugt schön die Readings im Device.(J2R_B.JPG)
Auch im EVENT-Monitor sind die Events zu sehen.(J2R_C.JPG), gelb und blau markiert.
nur bei dem Auswahl menu für die Regexp parts ,(J2R_D.JPG)
sind die selbst erzeugten readings nicht gelistet. in J2R_C.JPG gelb markiert nicht gelistet.
es werden nur die in J2R_C.JPG blau markiert gelistet.

Das scheint mir der Grund zu sein warum die selbst erstellten Readings nicht in die Logdatei geschrieben werden.

Kann hier jemand weiter helfen, ist warscheinlich nur eine Kleinigkeit.

Gruß Mickbaer

dev0

#13
@Mickbaer,octek0815: Testet mal bitte die angehängte Version. Wenn das Problem damit beseitigt ist, dann werde ich das noch ordentlich einbauen. Zum Testen sollte es reichen, wenn meine Vermutung richtig ist.

Ins Modul Verzeichnis kopieren und 'reload 99_j2r' tippern oder FHEM neu starten.

Edit: Anhang entfernt

Mickbaer

Hallo Dev0,
das sieht gut aus. mit der neuen J2R.pm.
jetzt kommen die readings in der log Datei an. :D :D :D

hier meine Logdatei Ausschnitt.
Die ersten beiden Zeilen sind die vom Original,
Die untern beiden Zeilen sind die vom J2R.pm erzeugten.
2017-02-11_17:17:01 sonoffpow1842 transmission-state: incoming publish received
2017-02-11_17:17:01 sonoffpow1842 SENSOR: {"Time":"2017-02-11T17:17:00", "DS18B20":{"Temperature":"16.0"}}
2017-02-11_17:17:01 sonoffpow1842 DS18B20_Temperature: 16.0
2017-02-11_17:17:01 sonoffpow1842 Time: 2017-02-11T17:17:00

Ich hatte auch schon gelesen:
-------------------------------------------------
setreading <devspec> <reading> <value>

Set the reading <reading> for the device <name> to <value> without sending out commands to the device, but triggering events and eventMap/stateFormat transformations as usual. See the set command documentation for replacement description.

Examples: setreading lamp state on Note: setreading won't generate an event for device X, if it is called from a notify for device X. Use "sleep 0.1; setreading X Y Z" in this case.
-------------------------------------------------
Du warst nur schneller mit  Use "sleep 0.1; setreading X Y Z"

Danke für die tolle Unterstützung. 8) 8)

Jetzt kann ich alle meine Sonoff / Sonoffpow auf das Json Format umstellen.

Eine frage bleibt noch:
Ich bekomme in den FEHM Log immer diese Meldung:
2017.02.11 17:15:03 2: MQTT_DEVICE sonoffpow1842: WARNING: deformed JSON data, check your config.
2017.02.11 17:15:03 2: MQTT_DEVICE sonoffpow1842: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "incoming publish rec...") at ./FHEM/99_j2r.pm line 51.

2017.02.11 17:15:03 3: no_sonoffpow1842 return value: deformed or no JSON
2017.02.11 17:15:03 5: calling readingsSingleUpdate(sonoffpow1842,SENSOR,{"Time":"2017-02-11T17:15:00", "DS18B20":{"Temperature":"16.0"}},1
--------------------------------------------
./FHEM/99_j2r.pm line 51. sieht so aus:

  eval { $h = decode_json($j); 1; };
  if ( $@ ) {
    Log3 $name, 2, "$type $name: WARNING: deformed JSON data, check your config.";
    Log3 $name, 2, "$type $name: $@";
    return "deformed or no JSON";
  }
-----------------------------------------


Ich hatte Theo schon gefragt, der sagt an seinem MQtt String liegt es nicht.
Ich nutze die Version 3.9.11 Theo ist schon bei 3.9.14 ganz frisch von heute Nachmittag,
Ich wollte aber erst das mit den Logfiles lösen ehe ich die Version hoch setze.

Hast Du eine Idee was das sein kann?

Danke und Gruß Mickbaer aus Berlin :D