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
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');;
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
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
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... :)