Hauptmenü

HTTPMOD Parsing JSON

Begonnen von Newti64, 01 Mai 2021, 15:05:50

Vorheriges Thema - Nächstes Thema

Newti64

Hallo,

ich habe in meinen Mähroboter einen ESP32 mit der SW Mähspitzel eingebaut.
Hier kann ich per http://IP/renew eine JSON Datei abrufen, deren Inhalte ich gerne in FHEM sehen möchte.
Deshalb habe ich mir in FHEM ein Device mit HTTPMOD angelegt:

define RobomowRS630 HTTPMOD http://192.168.178.30/renew 60
attr RobomowRS630 extractAllJSON 1


Mit "extractAllJSON 1" werden alle readings automatisch angelegt. Soweit alles i.O.
Das Json-File sieht so aus:
{"0":"62 %", "5":"", "6":"Innerhalb inaktiver Zeit", "7":"Hauptzone", "8":"Hauptzone", "11":"29", "cDSnear":"1","cBLEsw":"lightgreen","msgIfr":"0","sernr":"RSxxxxx","rssi":"-64","fheap":"98764"}

Es werde alle Einträge als readings angelegt. Da aber ein Reading mit Name 0, 5, 6, 7, 8, 11,... nicht sonderlich Aussagekräftig ist, habe ich die 2. Möglichkeit von "extractAllJSON 2" genutzt.

attr RobomowRS630 extractAllJSON 2

Dabei werden Attribute wie reading1xxJSON, reading1xxName .... und die Readings angelegt. Jetzt kann man den Wert der Attribute reading1xxName umbenennen und hat aussagekräftige Readings.

So, jetzt mein Problem :-(
Wegen der Automatik habe ich als erstes das Attribut "attr extractAllJSON 2" gesetzt und es werden reading1xxJSON, reading1xxName mit den Readings angelegt.
Nur das Reading für den ersten Eintrag im Json "0":"62 %" fehlt, die Attribute dafür werden als reading111JSON und reading111Name angelegt.
Deshalb habe ich jetzt "attr extractAllJSON 1" gesetzt und das Reading "0" mit Wert "62 %" erscheint, leider bringt das Umbenennen beim reading111Name  von "0" auf "Akku" nicht den erwarteten Erfolg.

Liegt das an dem Wert "0", den "62 %" mit Leerzeichen oder dem % ?
Oder was habe ich übersehen?

Hier die Readings
0                 64 %                            2021-05-01 14:30:34
Ausfahrtbehindert  Innerhalb inaktiver Zeit  2021-05-01 14:30:34
EinsatzNaechster                                       2021-05-01 14:30:34
Feuchtigkeit          29                                2021-05-01 14:30:34
ZoneAktuell          Hauptzone                     2021-05-01 14:30:34
ZoneNaechste       Hauptzone                    2021-05-01 14:30:34
cBLEsw                lightgreen                     2021-05-01 14:30:34
cDSnear              1                                  2021-05-01 14:30:34
fheap                  99116                          2021-05-01 14:30:34
msgIfr                 0                                2021-05-01 14:30:34
rssi                     -62                             2021-05-01 14:30:34
sernr                  RSxxxxxxxxxx             2021-05-01 14:30:34


und die Attribute:
extractAllJSON  1                      deleteattr
reading100JSON         cDSnear            deleteattr
reading100Name        cDSnear            deleteattr
reading101JSON         fheap                deleteattr
reading101Name        fheap                deleteattr
reading102JSON         8                      deleteattr
reading102Name        ZoneNaechste    deleteattr
reading103JSON        cBLEsw              deleteattr
reading103Name       cBLEsw              deleteattr
reading104JSON        rssi                   deleteattr
reading104Name       rssi                   deleteattr
reading105JSON       sernr                 deleteattr
reading105Name      sernr                 deleteattr
reading106JSON      msgIfr                deleteattr
reading106Name     msgIfr                deleteattr
reading107JSON      5                       deleteattr
reading107Name     EinsatzNaechster deleteattr
reading108JSON      6                        deleteattr
reading108Name     Ausfahrtbehindert deleteattr
reading109JSON     11                       deleteattr
reading109Name     Feuchtigkeit         deleteattr
reading110JSON     7                         deleteattr
reading110Name    ZoneAktuell          deleteattr
reading111JSON     0                        deleteattr
reading111Name    Akkuladung          deleteattr


Ich bin mal auf die Lösung gespannt.

Grüße
Claus

yersinia

#1
Es gibt sicher eine Lösung für HTTPMOD, die ich dir aber nicht liefern kann. Da es sich aber um JSON handelt, könntest du auch mit JsonMod arbeiten. Wenn du dies versuchen möchtest, lies weiter. ;) Anbei ein raw define, ungetestet. Ausgelesen wird alle 60 Sekunden um :30 (Attribut interval in cron Notation):
defmod RobomowRS630_JM JsonMod http://192.168.178.30/renew
attr RobomowRS630_JM interval 0 */1 * * *
attr RobomowRS630_JM webCmd reread
attr RobomowRS630_JM readingList single(jsonPath('$.0'), 'Akkuladung', 'none');;\
single(jsonPath('$.5'), 'EinsatzNaechster', 'none');;\
single(jsonPath('$.6'), 'Ausfahrtbehindert', 'none');;\
single(jsonPath('$.7'), 'ZoneAktuell', 'none');;\
single(jsonPath('$.8'), 'ZoneNaechste', 'none');;\
single(jsonPath('$.11'), 'Feuchtigkeit', 'none');;\
single(jsonPath('$.cDSnear'), 'cDSnear', 'none');;\
single(jsonPath('$.cBLEsw'), 'cBLEsw', 'none');;\
single(jsonPath('$.msgIfr'), 'msgIfr', 'none');;\
single(jsonPath('$.sernr'), 'sernr', 'none');;\
single(jsonPath('$.rssi'), 'rssi', 'none');;\
single(jsonPath('$.fheap'), 'fheap', 'none');;
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

Newti64

#2
Hallo yersinia,

habe jetzt deinen Vorschlag mit JsonMod getestet, bekomme jedoch folgende Fehlermeldung:

API__LAST_MSG http://192.168.178.30/renew: empty answer received

Statt http://192.168.178.30/renew im DEF mit file://tmp/x.json funktioniert es.

Ein attr verbose 5 zeigt auch nix zusätzliches.
2021.05.01 16:58:31 5: HttpUtils url=http://192.168.178.30/renew
2021.05.01 16:58:31 4: IP: 192.168.178.30 -> 192.168.178.30
2021.05.01 16:58:31 5: HttpUtils request header:
GET /renew HTTP/1.0
Host: 192.168.178.30
User-Agent: fhem
Accept-Encoding: gzip,deflate

Accept: application/json
Accept-Charset: utf-8, iso-8859-1

2021.05.01 16:58:31 2: [RobomowRS630_JM] http request error: http://192.168.178.30/renew: empty answer received


Nochmal zurück zum Ursprung:
Der Vorteil beim HTTPMOD kann man auch HTTP Post machen, um auch Befehle zu schicken, so wie ich das verstanden habe.

Habe noch beim HTTPMOD verbose auf 5 gestellt, die interessanten Zeilen aus dem Logfile dürfte die hier sein.
2021.05.01 17:53:03 5: RobomowRS630: ExtractReading for context reading, num 111 - no individual parse definition
2021.05.01 17:53:03 4: RobomowRS630: Read response matched 11, unmatch 1 Reading(s)
2021.05.01 17:53:03 5: RobomowRS630: Read response to update matched cDSnear fheap ZoneNaechste cBLEsw rssi sernr msgIfr EinsatzNaechster Ausfahrtbehindert Feuchtigkeit ZoneAktuell
2021.05.01 17:53:03 5: RobomowRS630: Read response to update did not match Akkuladung
2021.05.01 17:53:03 5: RobomowRS630: HandleSendQueue called from ReadCallback, qlen = 0
2021.05.01 17:53:03 5: RobomowRS630: HandleSendQueue found no usable entry in queue


Grüße
Claus

Newti64

Hallo yersinia,

danke für deine Version mit JsonMod, habe es jetzt zum laufen gebracht.
Was noch gefehlt hat, war das Attribut httpHeader und vorsichtshalber hab ich noch den Timeout hoch gesetzt.
attr  httpHeader    X-Clacks-Overhead: FHEM
attr  httpTimeout  5


Bei der Version mit HTTPMOD bin ich noch nicht weiter gekommen.

Grüße
Claus

yersinia

Zitat von: Newti64 am 02 Mai 2021, 14:22:44Was noch gefehlt hat, war das Attribut httpHeader und vorsichtshalber hab ich noch den Timeout hoch gesetzt.
attr  httpHeader    X-Clacks-Overhead: FHEM
attr  httpTimeout  5
Interessant, man lernt nie aus.

Mich wunderte eher dies:
2021.05.01 16:58:31 2: [RobomowRS630_JM] http request error: http://192.168.178.30/renew: empty answer received
Mir war nicht klar, dass du einen bestimmten header bzw irgendwas über POST absenden musst bevor du ein JSON erhältst.

Aber wenns läuft... :)
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