Daten aus einem Text-String in einzelne Readings umwandeln

Begonnen von stewen, 02 Juni 2021, 11:21:35

Vorheriges Thema - Nächstes Thema

stewen

Hallo beisammen,

ich bekomme es einfach nicht hin - bitte hiermit um Hilfe!

Ich bekomme auf einer internen Webseite einen String mit allen Daten aus einem Logger zur Verfügung gestellt. Es sind jeweils mehrere Messwerte von etwa 20 Messstellen enthalten. Hier mal ein Beispiel (Auszug, davor und dahinter stehen noch paar Sachen):

{"sensorId":"002","valueSum":"6316821","timestamp":"1622607075"},{"sensorId":"003","valueSum":"18818997","timestamp":"1622607394"},{"sensorId":"004","value":"11.4","valueSum":"26724286","timestamp":"1622624690"}

Ich hab mit dem HTTPMOD Modul rumprobiert und kann den String komplett einlesen - mit "showBody" sehe ich den String bei Internals. Danach sind meine Fähigkeiten aber nicht mehr ausreichend. Vor allem die Tatsache, dass ein Sensor, der gerade nix meldet, keinen "value" mehr anzeigt, macht mich fertig.
Kann mir bitte jemand auf die Sprünge helfen, wie ich die Daten jeweils für einen Sensor auslesen und als Reading darstellen kann? Am liebsten wäre mir ein Reading-Satz pro Sensor, das den "value" auf "0" setzt, wenn der Wert fehlt ....

So würde ich es mir vorstellen:
reading01Name 002
reading01Value: 0
reading01ValueSum 6316821
reading01Timestamp 1622607075


Vielen Dank im Voraus!
Stephan
FHEM auf Proxmox Cluster - viele Sender/Adapter an Raspberry Pi 3 mit LAN angebunden (ser2net) - schon ewig dabei.

herrmannj

lässt sich mit JsonMod komfortabel realisieren. Gibt viele Beispiel zur Vorgehensweise im forum.

stewen

Hallo Herrmann,

vielen Dank für den Hinweis. Ich werd mir das mal anschauen. Falls ich weiterhin Hilfe brauch, melde ich mich nochmal.

Viele Grüße
Stephan
FHEM auf Proxmox Cluster - viele Sender/Adapter an Raspberry Pi 3 mit LAN angebunden (ser2net) - schon ewig dabei.

stewen

Jetzt brauch ich doch nochmal Hilfe bitte:

In "Internals" steht bei "API__LAST_MSG" die korrekte URL, danach folgt aber ein "empty answer received". Stimmt die URL nicht oder fehlen einfach noch die Readings, weshalb er nix abfragt?

Beim Erstellen des attr "readingList" stelle ich mich auch blöd an. Ich könnte wirklich nochmal einen Schubser in die richtige Richtung brauchen ...  :-[
Kann mir bitte  jemand anhand der Daten aus dem Eingangspost eine Hilfestellung geben?

Vielen Dank im Voraus!
Stephan
FHEM auf Proxmox Cluster - viele Sender/Adapter an Raspberry Pi 3 mit LAN angebunden (ser2net) - schon ewig dabei.

yersinia

Versuche doch für den Anfang einfach mal
complete();
als readingList
Zitatcomplete();
Automatically creates readings for the entire JSON source. The readings ​​are named after their JSON path.
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

TomLee

#5
Eine weitere Möglichkeit wäre json2reading zu verwenden um die gewünschten Readings zu erhalten, vorausgesetzt in der Datei der "internen Webseite" steht nur der korrekt (oben ist ja nur ein Ausschnitt zu sehen) aufgebaute JSON.

"interne Webseite" lässt mich vermuten du kannst direkt auf die Datei zugreifen (entsprechend passende Rechte vorausgesetzt), dann wäre bspw. eine zyklische Abfrage der Daten mit einer AT-Definition auch relativ kurz, im Vergleich zu HTTPMOD oder JsonMod <- hab ich mich aber ehrlicherweise noch nicht mit beschäftigt, mein ich zumindest:

defmod Test at +*00:00:30 {json2reading($defs{Test},`cat <Pfad zur HTML-Datei>`,undef,undef,undef,'sensorId|valueSum|timestamp')}
attr Test room Test


Wenn ich mich täusche und kein direkter Zugriff auf die Datei möglich ist, dann wirds etwas länger und du müsstest den Inhalt der Datei mit HttpUtils_NonblockingGet() zuvor ermitteln und diesen dann im 2. Parameter von j2r statt dem `cat <Pfad zur HTML-Datei>` angeben.

Das AT soll nur ein Beispiel sein, wenn ich das bei mir umsetzen müsste, denke ich, würde ich nicht zyklisch abfragen sondern eine inotify-Definition "dazwischenschalten" und mit einem notify immer bei Änderung an der Datei reagieren.

Gruß

Thomas


herrmannj

Wenn der te schreibt url dann wird es wohl eine sein. Die angegebene Fehlermeldung sagt ziemlich offensichtlich dass die Quelle keine Daten geliefert hat.

Bitte vollständige Angaben liefern. Welcher Dienst/welche url?, komplettes list, logauszug, relevante Kontextinformationen. Kein Roman, Fakten

stewen

Hallo beisammen,

es handelt sich um eine URL im lokalen Netz, auf die Datei hab ich keinen Zugriff.

Hier die Anzeige im Browser, der Quelltext sieht genau so aus:

{"perSensorStats":[{"sensorId":"001","value":"8.94","valueSum":"24810092849","timeStamp":"1622799079"},{"sensorId":"002","valueSum":"6538603390","timeStamp":"1622779728"},{"sensorId":"003","valueSum":"19432479689","timeStamp":"1622780462"},{"sensorId":"004","value":"8.64","valueSum":"28204653653","timeStamp":"1622799015"},{"sensorId":"005","valueSum":"14773740591","timeStamp":"1622780238"},{"sensorId":"006","value":"4.39","valueSum":"22651828668","timeStamp":"1622799100"},{"sensorId":"007","valueSum":"15758090154","timeStamp":"1622779461"},{"sensorId":"008","value":"6.39","valueSum":"23383150073","timeStamp":"1622799045"}]}

Hier der Logfile-Eintrag bei "reread":
2021.06.04 13:38:17 2 : [jsonmod1] http request error: https://192.168.139.14:8008: empty answer received

Das Modul HTTPMOD holt die Daten korrekt ab.
Danke für Eure Hilfe.

Viele Grüße
Stephan

FHEM auf Proxmox Cluster - viele Sender/Adapter an Raspberry Pi 3 mit LAN angebunden (ser2net) - schon ewig dabei.

stewen

Liebe Leute,

vielen Dank für Eure Hilfe, Gedanken und Zeit. Ich habs mit HTTPMOD nun doch hinbekommen - ich musste mich durch die Regex-Befehle kämpfen, aber "regex101.com" ist da sehr hilfreich. Ich habe nun die Werte, die mich interessieren, als Reading in FHEM. Funktioniert super  8)

Viele Grüße und schönes Wochenende!
Stephan
FHEM auf Proxmox Cluster - viele Sender/Adapter an Raspberry Pi 3 mit LAN angebunden (ser2net) - schon ewig dabei.