Hallo,
mir ist das JSON Parsing nicht ganz klar. Wenn ich das folgende JSON habe:
warnWetter.loadWarnings({"time":1487871976000,"warnings":{"103353000":[{"start":1487858400000,"end":1487919600000,"regionName":"Kreis Harburg","level":3,"type":1,"altitudeStart":null,"event":"STURMBÖEN","headline":"Amtliche WARNUNG vor STURMBÖEN","description":"Es treten Sturmböen mit Geschwindigkeiten um 80km/h (22m/s, 44kn, Bft 9) anfangs aus südwestlicher, später aus nordwestlicher Richtung auf. In Schauernähe sowie in exponierten Lagen muss mit schweren Sturmböen bis 100 km/h (28m/s, 55kn, Bft 10) gerechnet werden.","altitudeEnd":null,"stateShort":"NS","instruction":"ACHTUNG! Hinweis auf mögliche Gefahren: Es können zum Beispiel einzelne Ã,,ste herabstürzen. Achten Sie besonders auf herabfallende Gegenstände.","state":"Niedersachsen"}],"105566000":[{"start":1487874600000,"end":1487901600000,"regionName":"Kreis Steinfurt","level":4,"type":1,"altitudeStart":null,"event":"ORKANARTIGE BÖEN","headline":"Amtliche UNWETTERWARNUNG vor ORKANARTIGEN BÖEN","description":"Es treten schwere Sturmböen mit Geschwindigkeiten zwischen 85 km/h (24m/s, 47kn, Bft 9) und 100 km/h (28m/s, 55kn, Bft 10) anfangs aus südwestlicher, später aus westlicher Richtung auf. In Schauernähe sowie in exponierten Lagen muss mit orkanartigen Böen um 110 km/h (31m/s, 60kn, Bft 11) gerechnet werden.","altitudeEnd":null,"stateShort":"NRW","instruction":"ACHTUNG! Hinweis auf mögliche Gefahren: Es können zum Beispiel Bäume entwurzelt und Dächer beschädigt werden. Achten Sie besonders auf herabstürzende Ã,,ste, Dachziegel oder Gegenstände. Schließen Sie alle Fenster und Türen! Sichern Sie Gegenstände im Freien! Halten Sie insbesondere Abstand von Gebäuden, Bäumen, Gerüsten und Hochspannungsleitungen. Vermeiden Sie möglichst den Aufenthalt im Freien!","state":"Nordrhein-Westfalen"},{"start":1487854080000,"end":1487919600000,"regionName":"Kreis Steinfurt","level":3,"type":1,"altitudeStart":null,"event":"STURMBÖEN","headline":"Amtliche WARNUNG vor STURMBÖEN","description":"Es treten Sturmböen mit Geschwindigkeiten um 80km/h (22m/s, 44kn, Bft 9) anfangs aus südwestlicher, später aus westlicher Richtung auf. In Schauernähe sowie in exponierten Lagen muss mit schweren Sturmböen bis 100 km/h (28m/s, 55kn, Bft 10) gerechnet werden.","altitudeEnd":null,"stateShort":"NRW","instruction":"ACHTUNG! Hinweis auf mögliche Gefahren: Es können zum Beispiel einzelne Ã,,ste herabstürzen. Achten Sie besonders auf herabfallende Gegenstände.","state":"Nordrhein-Westfalen"}],...
(Komplettes JSON siehe Quelle: http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json (http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json))
Wie kann ich nun den Wert der Variable "headline" bekommen, die einer bestimmten Region zugeordnet ist? (Eigentlich will ich alle headlines zu einer Region bekommen, denn es kann mehrere geben. Ist das mit Modelist möglich?)
Habe folgendes probiert, aber da kommt kein Reading headline
attr httmod get01JSON warnWetter.loadWarnings_warnings_103353000_headline
attr httmod get01Name test
attr httmod getData {"get" :["headline"]}
attr httmod getHeader1 Content-Type: application/json
attr httmod getHeader2 Accept: */*
attr httmod getURL http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json
Im fhem log mit verbose 5 wird angezeigt, dass das JSON ankommt, aber dann kommt folgende Fehlermeldung:
2017.02.23 19:10:00.566 3: httpmod: error while parsing JSON data: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "warnWetter.loadWarni...") at (eval 65075) line 1.
Jemand eine Idee?
Könnte es daran liegen, dass es JSONP ist und httpmod das nicht unterstützt? Falls ja, kann ich mit httpmod irgendwie den Präfix "warnWetter.loadWarnings(" und am Ende das " );" entfernen, dann wäre es reines JSON...
Hallo,
HTTPMOD verwendet libjson-perl und das erwartet JSON, nicht JSONP.
Im konkreten Fall wäre es aber recht einfach die Daten per Regex zu extrahieren.
Gruß
Stefan
Gibt es denn ein Attribut von httpmod für Preprocessing, sodass ich per regex aus dem JSONP ein JSON machen kann und dann normal den JSON parser nutzen kann?
Bisher nicht. Sollte aber kein größeres Problem sein so etwas einzubauen.
Gruß
Stefan
ok, aber wenns per regex auch geht reicht es auch.
Ich habe es geschafft die headlines einer Region zu finden mit
attr dev get01Regex <regionsID>.+?headline":"(.*?)"
und regOpt g
ist leider doch noch nicht gelöst, das die regex noch nicht mit mehreren Ereignissen/headlines einer region umgehen kann. Ich mache dafür einen neuen Thread auf...
Hallo Stefan,
ich hänge gerade an einem ähnlichen Problem und bin auf diesen - leider alten - Thread gestoßen.
Meine Lupus Alarmanlage gibt in der Device Liste eine nicht 100% JSON-konforme Rückmeldung mit fehlerhaften Tabs. Diese würde ich gerne über eine Regex korrigieren, bevor ich das JSON an extractAllJSON übergebe.
Zitat von: StefanStrobel am 23 Februar 2017, 21:41:55
Bisher nicht. Sollte aber kein größeres Problem sein so etwas einzubauen.
Gruß
Stefan
Gibt es inzwischen so eine Möglichkeit für ein Preprocessing bzw. wie kann man sowas implementieren? Ich bin leider eher ein copy&paste Laie - aber lernfähig.
Viele Grüße
Phillip
Hallo Philip,
probier doch mal die angehängte Version zum Testen aus.
Da gibt es ein neues Attribut preProcessRegex. Wenn Du das auf so etwas wie s/foo/bar/g setzt, kannst Du damit den gelesenen Puffer manipulieren, bevor er weiter verarbeitet wird.
Zur Fehlersuche sollte verbose auf 5 gesetzt werden, dann wird der geänderte Puffer geloggt.
Gruss
Stefan
Lieber Stefan,
absolut spitze!!! Hab bei unserer Lupusec Alarmanlage nun folgendes eingetragen (vielleicht hilft das ja auch anderen hier, ihre Anlage in FHEM einzubinden)
attr Alarmanlage_SmartHome preProcessRegex s/\t//g
attr Alarmanlage_SmartHome extractAllJSON 1
und wie durch Zauberhand tauchen nun alle Sensoren und Aktoren in der Übersicht auf. Ganz herzlichen Dank für Deine Hilfe!
Wünsche Dir ein schönes Wochenende
Phillip
Lieber Stefan,
ich wollte nun anfangen, die sehr lange Liste von Reading zu verarbeiten und aufzuräumen. Dabei bin ich auf folgendes Problem gestoßen:
Kann ich auch eine URL, die ich als get01URL in einem HTTPMPOD-Aufruf einbinde und durch preProcessRegex korrigieren lassen? An welcher Stelle müsste ich dann den numerischen Indikator setzen?
Vielen Dank
Phillip
Hallo,
die preProcessRegex gilt für das ganze HTTPMOD-Device, in dem das Attribut gesetzt ist, also auch für alle einzelnen gets.
Gruss
Stefan
Lieber Stefan,
dann mache ich da wohl was falsch. Bei mir klappt es für die Haupt-URL, bislang aber nicht, wenn ich über getXXURL weitere URLs einbinde. Dann wird mir der Buffer auch unkorrigiert im Device auf der Webseite angezeigt.
Viele Grüße
Phillip
Hallo Phillip,
dann solltest Du mal verbose für Dein Gerät auf 5 setzen und ins Log schauen.
Die preProcessRegex wird an zentraler Stelle in der Read-Funktion aufgerufen. Da kommt eigentlich nichts drum herum.
Im Log sollte dann auch ein Eintrag a la Read - body after preProcessRegex: erscheinen...
Gruss
Stefan
Lieber Stefan,
ich habe mir die neue 98_HTTPMOD.pm-Datei bei einem Update wohl aus Versehen durch die reguläre Datei ersetzt... Nachdem ich wieder Deine veränderte Datei eingebaut habe, läuft es wieder :)
Muss ich da dauerhaft aufpassen, oder wird es die preProcessRegex-Funktion viellecht auch in das reguläre Update schaffen?
Das andere Problem mit den getXXURL habe ich so gelöst, dass ich die Unter-URL in ein neues Device ausgelagert habe. Dann läuft es ohne Probleme.
Vielen Dank nochmal!
Phillip
Hallo,
das Feature ist eingecheckt und sollte inzwischen per Update verteilt werden.
Gruß
Stefan
Hallo Stefan,
seit dem letzten Update funktioniert bei mit der JSON String nicht mehr:
{"datetime":"2018-02-05T18:42:39","energy_in":2244497,"energy_out":3851922,"energy_sf":410043,"power_io":259,"power_sf":0,"powers":[16,60,183],"voltages":[234,233,233],"currents":[0.18,0.34,0.98],"analog":[0],"mode":2,"output":100,"digital":["0","0","0","0"]}
Es kommt zu dieser Fehlermeldung:
error while parsing JSON data: JSON text must be an object or array (but found number, string, true, false or null, use allow_nonref to allow this) at (eval 669) line 1
Mache ich da etwas falsch? Mit der Version 15035 gab es noch keine Probleme.
Hallo,
ich habe Deinen JSON-String gerade mal mit der aktuellen Version getestet und bei mir funktioniert es problemlos.
ModuleVersion 3.4.1 - 18.1.2018
Hast Du eine andere Version?
Oder ist der JSON-String eventuell defekt wenn der Fehler kommt?
Gruss
Stefan
Servus Stefan,
ja ich verwende die selbe Version. Wenn ich FHEM neu starte, werden die Datein einmalig eingelesen, dann nicht mehr. Im Log finde ich auch diese Infos:
PERL WARNING: Use of uninitialized value $matchlist[0] in join or string at ./FHEM/98_HTTPMOD.pm line 1801.
2018.02.06 06:28:04 1: PERL WARNING: Use of uninitialized value $val in concatenation (.) or string at ./FHEM/98_HTTPMOD.pm line 1888.
Gruß Frank
Hallo Frank,
die Warnungen kommen von Zeilen, die Debug-Informationen ins Log schreiben. Ich würde das als Schönheitsfehler verbuchen. Die Warnungen kommen auch nur wenn beim Parsen vorher schon etwas nicht klappt und Variable deshalb uninitialisiert sind.
Ich gehe eigentlich stark davon aus, dass das letzte Update nichts mit Deinem Problem zu tun hat. Um der Sache weiter auf den Grund gehen zu können, bräuchte ich zusätzliche Informationen:
- Deine genaue Konfiguration (am besten als Auszug aus der fhem.cfg)
- Ein Auszug aus dem Log bei verbose 5, in dem man den kompletten Vorgang vom Lesen bis zum Parsen nachvollziehen kann.
Gruss
Stefan
Servus Stefan,
du hattest mit deiner Einschätzung recht. Ich habe versucht das Thema weiter einzuschränken. Dabei ergab sich folgendes:
Wenn ich das Modul HMCCU mit diesen Attributen einbinde
attr d_ccu ccuflags extrpc
attr d_ccu rpcserver on
dann wird der JSON String zweimal eingelesen. Anschließend kommt es zu dem beschriebenen Fehler.
Mit der Einstellung attr d_ccu rpcserver off
funktioniert HTTMOD
Hier die Konfiguration:
define SmartFox HTTPMOD http://10.0.0.151/all 10
attr SmartFox userattr getData getHeader1 getHeader2 reading01JSON reading01Name reading02JSON reading02Name reading03JSON reading03Name reading04JSON reading04Name reading04RecombineExpr reading05JSON reading05Name reading06JSON reading06Name reading07JSON reading07Name
attr SmartFox enableControlSet 1
attr SmartFox event-min-interval .*:600
attr SmartFox event-on-change-reading .*
attr SmartFox getData {"get" :["power_sf"]}
attr SmartFox getHeader1 Content-Type: application/json
attr SmartFox getHeader2 Accept: */*
attr SmartFox group Umwelt
attr SmartFox reading01JSON power_io
attr SmartFox reading01Name LeistungAktuell
attr SmartFox reading02JSON energy_in
attr SmartFox reading02Name Energie_Gekauft
attr SmartFox reading03JSON energy_out
attr SmartFox reading03Name Energie_Verkauft
attr SmartFox reading04JSON digital
attr SmartFox reading04Name Relais_Ausgänge
attr SmartFox reading04RecombineExpr join ",", @matchlist
attr SmartFox reading05JSON digital
attr SmartFox reading05Name Relais
attr SmartFox reading06JSON analog
attr SmartFox reading06Name Buffer
attr SmartFox reading07JSON power_sf
attr SmartFox reading07Name LeistungEigenverbrauch
attr SmartFox room 1.3 Haus
attr SmartFox stateFormat {sprintf("Leitung %.1f W / Ausgänge %s / Buffer %s ", ReadingsVal($name,"Leistung",0), ReadingsVal($name,"Relais_Ausgänge","0"), ReadingsVal($name,"Buffer","0"))}
attr SmartFox verbose 5
Gruß Frank
Seltsame Sache.
Das gleiche Problem haben wohl viele Module.
https://forum.fhem.de/index.php?topic=71968.0
Irgendwie scheint aber immer HMCCU im Spiel zu sein.
Gruss
Stefan
Scheint wirklich so zu sein. Ich lagere seit Wochen ein Modul nach dem Anderen auf eine zweite Maschinen aus und verbinde sie mit FHEM2FHEM. Dies wurde notwendig da ich seit der Umstellung auf HMCCU Hänger hatte. Fhem blieb bis zu 2 Minuten stehen vor es weiter ging. Ich konnte jedoch im LOG nichts verdächtiges feststellen.
Heute habe ich nun alle HTTPMOD Devices ausgelagert.
Nun scheint das Problem behoben (oder besser) zu sein. Zumindest hängt momentan nichts. Ich muss das jedoch noch länger beobachten.
Gruß Frank
Lieber Stefan,
ich habe heute früh ein FHEM-Update gemacht und das preProcessRegex scheint nicht mehr ausgeführt zu werden. Hat sich das was geändert?
Viele Grüße
Phillip
Zitat von: Rudibarani am 19 Januar 2018, 19:25:49
absolut spitze!!! Hab bei unserer Lupusec Alarmanlage nun folgendes eingetragen (vielleicht hilft das ja auch anderen hier, ihre Anlage in FHEM einzubinden)
attr Alarmanlage_SmartHome preProcessRegex s/\t//g
attr Alarmanlage_SmartHome extractAllJSON 1
Ja, da hat sich was geändert.
Wegen einem Memory-Leak in aktuellen Perl-Versionen habe ich HTTPMOD so geändert, dass es die Regexes vorcompiliert.
Leider ist das offenbar doch etwas kniffliger wenn s// etc. verwendet wird.
Ich habe diese Funktion für die preProcesRegex jetzt erst mal wieder entfernt und eine neue Version eingecheckt.
Könntest Du mal Deine preProcessRegex posten, damit ich bei Gelegenheit versuchen kann, das mit den compilierten Regexes auch hier noch zum Laufen zu bekommen?
(am besten in https://forum.fhem.de/index.php/topic,45176.645.html)
Gruss / Thanx
Stefan
Lieber Stefan,
ich hab die Sachen wie gewünscht in dem verlinkten Thread eingestellt. Wenn Du mehr oder andere Infos brauchst, meld Dich gerne.
Viele Grüße
Phillip
Hab's gesehen, vielen Dank!
Gruß
Stefan