JSON extraction aus HTTPMOD

Begonnen von Tsturm, 26 November 2017, 11:04:08

Vorheriges Thema - Nächstes Thema

Tsturm

Hallo zusammen,

ich werde leider nicht aus den Beispielen zu JSON und HTTPmod schlau...

Ich hätte gerne Readings aus dem untenstehenden JSON telegramm in der Art
aussentemperatur: 22.2
etc.
Bei der Syntaxerklärung im Wiki stehe ich schlichtweg auf dem Schlauch... (mit Regex wird es ziemlich aufwändig).
Wäre für eine kleine Hilfestellung mit get01JSON etc dankbar.

HTTP/1.1 200 OK Content-Type: application/json;charset=utf-8 server: wiffi Connection: close {"modultyp":"weatherman","vars":[{"name":"0","homematic_name":"w_ip","desc":"weatherman_ip","type":"string","unit":"","value":"192.168.178.27"},{"name":"1","homematic_name":"w_temperature","desc":"aussentemperatur","type":"number","unit":"gradC","value":22.2},{"name":"21","homematic_name":"w_windchill","desc":"gefuehlte_temperatur","type":"number","unit":"gradC","value":22.2},{"name":"9","homematic_name":"w_taupunkt","desc":"taupunkt","type":"number","unit":"gradC","value":7.2},{"name":"2","homematic_name":"w_humidity","desc":"rel_feuchte","type":"number","unit":"%","value":38.0},{"name":"17","homematic_name":"w_hum_abs","desc":"abs_feuchte","type":"number","unit":"g/m3","value":7.4},{"name":"4","homematic_name":"w_wind_avg","desc":"avg_windgeschwindigkeit","type":"number","unit":"m/s","value":0.0},{"name":"5","homematic_name":"w_wind_peak","desc":"peak_windgeschwindigkeit","type":"number","unit":"m/s","value":0.0},{"name":"24","homematic_name":"w_windstaerke","desc":"bft_windgeschwindigkeit","type":"number","unit":"bft","value":0},{"name":"23","homematic_name":"w_wind_direction","desc":"windrichtung","type":"string","unit":"","value":"N"},{"name":"6","homematic_name":"w_wind_dir","desc":"windwinkel","type":"number","unit":"grad","value":0},{"name":"18","homematic_name":"w_rain_activity","desc":"regenmelderwert","type":"number","unit":"","value":6},{"name":"7","homematic_name":"w_rain_status","desc":"regenstatus","type":"boolean","unit":"","value":false},{"name":"8","homematic_name":"w_rain_intensity","desc":"regenstaerke","type":"number","unit":"mm/h","value":0.0},{"name":"19","homematic_name":"w_rain_volume_1","desc":"regen_pro_h","type":"number","unit":"mm","value":0.0},{"name":"20","homematic_name":"w_rain_volume_24","desc":"regen_pro_24h","type":"number","unit":"mm","value":0.0}, {"name":"3","homematic_name":"w_barometer","desc":"nn_luftdruck","type":"number","unit":"mb","value":1300.00},{"name":"11","homematic_name":"w_barotrend","desc":"luftdrucktrend","type":"string","unit":"","value":"not valid"},{"name":"15","homematic_name":"w_sun_temp","desc":"sonnentemperatur","type":"number","unit":"gradC","value":24.9},{"name":"22","homematic_name":"w_diff_temp","desc":"sonnen_difftemperatur","type":"number","unit":"gradC","value":2.7},{"name":"16","homematic_name":"w_sonne_scheint","desc":"sonne_scheint","type":"boolean","unit":"","value":false},{"name":"10","homematic_name":"w_lux","desc":"helligkeit","type":"number","unit":"lux","value":11.8},{"name":"12","homematic_name":"w_elevation","desc":"sonne_elevation","type":"number","unit":"grad","value":18.0},{"name":"13","homematic_name":"w_azimut","desc":"sonne_azimut","type":"number","unit":"grad","value":159.1} ],"Systeminfo":{"MAC-Adresse":"23:b3:49:94:1:60","Homematic_CCU_ip":"my_ccuip","WLAN_ssid":"sturmnetz","WLAN_Signal_dBm":-95,"sec_seit_reset":2003,"zeitpunkt":" 1 10:35","firmware":"weatherman_33"}}


VG Timmo

meddie

Hallo Timmo,

hast Du die Wetterstation von Stall den Weatherman nachgebaut? Wenn ja wie bist Du zufrieden und hast Du sie in FHEM mittlerweile zum laufen gebracht?

Danke VG Eddie

mumpitzstuff

Versuch's doch erst mal mit dem Attribut extractAllJSON. Vielleicht reicht dir das ja schon.

Tsturm

#3
Hallo zusammen,

habe die Wetterstation von Eugen tatsächlich gebaut, läuft gut, und hat den ersten Winter mit Schnee, Eis etc gut überstanden.

Zur Extraktion nehme extractallJSON und dann RegEx... irgendwann habe ich mit JSON den Nerv verloren, und dann gings doch schnell. Irgendwann mache ich das nochmal mit JSON... bis dahin die meisten Werte manuell:

defmod weatherman HTTPMOD http://192.168.178.27/?json 1800
attr weatherman userattr getURL reading01Name reading01OExpr reading01Regex reading02Name reading02OExpr reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex reading07Map reading07Name reading07OMap reading07Regex reading08Name reading08Regex reading09Name reading09Regex reading10Name reading10Regex reading11Name reading11Regex reading12Name reading12Regex reading13Name reading13Regex
attr weatherman extractAllJSON 1
attr weatherman getURL http://192.168.178.42/?json
attr weatherman reading01Name Systeminfo_std_seit_reset
attr weatherman reading01OExpr $val /3600
attr weatherman reading01Regex "sec_seit_reset":(\d*)
attr weatherman reading02Name Systeminfo_wiffizeit
attr weatherman reading02Regex "zeitpunkt":" \d (\d*:\d\d)
attr weatherman reading03Name Systeminfo_firmware
attr weatherman reading03Regex "firmware":"(.*)"}
attr weatherman reading04Name w_barometer
attr weatherman reading04Regex "3","homematic_name":"w_barometer","desc":"nn_luftdruck","type":"number","unit":"mb","value":(\d*\.\d*)},
attr weatherman reading05Name w_rain_volume_1
attr weatherman reading05Regex "19","homematic_name":"w_rain_volume_1","desc":"regen_pro_h","type":"number","unit":"mm","value":(\d*\.\d*)}
attr weatherman reading06Name w_rain_yesterday
attr weatherman reading06Regex "27","homematic_name":"w_rain_yesterday","desc":"regen_gestern","type":"number","unit":"mm","value":(\d*\.\d*)}
attr weatherman reading07Name w_rain_status
attr weatherman reading07OMap false:0, true:1
attr weatherman reading07Regex "7","homematic_name":"w_rain_status","desc":"regenstatus","type":"boolean","unit":"","value":(true|false)
attr weatherman reading08Name w_wind_avg
attr weatherman reading08Regex "4","homematic_name":"w_wind_avg","desc":"avg_windgeschwindigkeit","type":"number","unit":"m/s","value":(\d*\.\d*)
attr weatherman reading09Name w_temperature
attr weatherman reading09Regex "1","homematic_name":"w_temperature","desc":"aussentemperatur","type":"number","unit":"gradC","value":([ +-]\d*\.\d*)
attr weatherman reading10Name w_windchill
attr weatherman reading10Regex "21","homematic_name":"w_windchill","desc":"gefuehlte_temperatur","type":"number","unit":"gradC","value":([ +-]\d*\.\d*)
attr weatherman reading11Name w_taupunkt
attr weatherman reading11Regex "9","homematic_name":"w_taupunkt","desc":"taupunkt","type":"number","unit":"gradC","value":([ +-]\d*\.\d*)
attr weatherman reading12Name w_humidity
attr weatherman reading12Regex "2","homematic_name":"w_humidity","desc":"rel_feuchte","type":"number","unit":"%","value":(\d*\.\d*)
attr weatherman reading13Name w_hum_abs
attr weatherman reading13Regex "17","homematic_name":"w_hum_abs","desc":"abs_feuchte","type":"number","unit":"g/m3","value":(\d*\.\d*)
attr weatherman timeout 20
attr weatherman userReadings windrichtung.av {movingAverage("weatherman","vars_11_value",600)}



Die Bewässerungsanlage steuere ich aber mittlerweile über den DWD-OpenData Service - der liefert Verdunstung und Niederschlag in meiner Nähe - das ist sicherlich besser mit der notwendigen Beregnungsmenge korreliert.

VG Timmo

ersthelfer

Mein Weatherman läuft jetzt auch  8)

Da ich noch blutiger Anfänger bin habe gleich das obige eingetippt.
Leider habe ich Fehlermeldungen im Logfile

2018.06.07 19:48:01 3: weatherman: error while parsing JSON data: garbage after JSON object, at character offset 3252 (before "\x{4}") at (eval 616198) line 1.

2018.06.07 19:48:01 3: weatherman: no parsed JSON structure available
2018.06.07 19:48:01 1: Error evaluating weatherman userReading windrichtung.av: Undefined subroutine &main::movingAverage called at (eval 616200) line 1.


Könnt Ihr mir da mal auf die Sprünge helfen?

Vielen Dank

Tsturm

#5
Grüss Dich,

um zu helfen müsstest Du Deine Umgebung und ein "List" des Moduls und die Experten-Modus-Seite des Weatherman posten, sonst wird es Raterei. Bekommst Du ein JSON-Protokoll vom Weatherman ("URL/json:")?

Als ersten Diagnoseansatz würde ich alle readings bis auf eines rauswerfen, die Regex-Sachen sind recht fragil (ein falsches Komma langt). Erstmal schauen einen ersten Schritt hinzubekommen, dann die Sache erweitern.

Der Fehler zum moving average ganz unten weist auf ein Perl-Thema hin - hast du alle Perl-Libraries installiert? Siehe auch
https://wiki.fhem.de/wiki/Raspberry_Pi (debian repository installation)

vg timmo

ersthelfer

#6
Also, ich habe in FHEM jetzt folgende Zeilen:

define Wetterstation HTTPMOD http://192.168.2.221/json 60
attr Wetterstation userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex
attr Wetterstation reading01Name SysInfo_Sec_seit_Reset
attr Wetterstation reading01Regex "sec_seit_reset":(\d*)
attr Wetterstation reading02Name SysInfo_WLAN_Signal
attr Wetterstation reading02Regex "WLAN_Signal_dBm":([+-]\d*)
attr Wetterstation reading03Name Aussentemperatur
attr Wetterstation reading03Regex "aussentemperatur","type":"number","unit":"gradC","value":([+-]\d*\.\d*)
attr Wetterstation room Draussen


Die SysInfo_Sec_seit_Reset und SysInfo_WLAN_Signal werden auch korrekt angezeigt  :)
aber ich bekomme keine Ausgabe für die Aussentemperatur  :(
Das JSON der Wetterstattion liefert:
{"modultyp":"weatherman","vars":[{"name":"0","homematic_name":"w_ip","desc":"weatherman_ip","type":"string","unit":"","value":"192.168.2.221"},
{"name":"1","homematic_name":"w_temperature","desc":"aussentemperatur","type":"number","unit":"gradC","value":26.0},
{"name":"21","homematic_name":"w_windchill","desc":"gefuehlte_temperatur","type":"number","unit":"gradC","value":26.0},
{"name":"9","homematic_name":"w_taupunkt","desc":"taupunkt","type":"number","unit":"gradC","value":18.1},
{"name":"2","homematic_name":"w_humidity","desc":"rel_feuchte","type":"number","unit":"%","value":61.8},
{"name":"17","homematic_name":"w_hum_abs","desc":"abs_feuchte","type":"number","unit":"g/m3","value":15.0},
{"name":"4","homematic_name":"w_wind_avg","desc":"avg_windgeschwindigkeit","type":"number","unit":"m/s","value":0.4},
{"name":"5","homematic_name":"w_wind_peak","desc":"peak_windgeschwindigkeit","type":"number","unit":"m/s","value":0.8},
{"name":"24","homematic_name":"w_windstaerke","desc":"bft_windgeschwindigkeit","type":"number","unit":"bft","value":1},
{"name":"23","homematic_name":"w_wind_direction","desc":"windrichtung","type":"string","unit":"","value":"W"},
{"name":"6","homematic_name":"w_wind_dir","desc":"windwinkel","type":"number","unit":"grad","value":270},
{"name":"18","homematic_name":"w_rain_activity","desc":"regenmelderwert","type":"number","unit":"","value":5},
{"name":"7","homematic_name":"w_rain_status","desc":"regenstatus","type":"boolean","unit":"","value":false},
{"name":"8","homematic_name":"w_rain_intensity","desc":"regenstaerke","type":"number","unit":"mm/h","value":0.0},
{"name":"19","homematic_name":"w_rain_volume_1","desc":"regen_pro_h","type":"number","unit":"mm","value":0.0},
{"name":"20","homematic_name":"w_rain_volume_24","desc":"regen_pro_24h","type":"number","unit":"mm","value":0.0},
{"name":"27","homematic_name":"w_rain_yesterday","desc":"regen_gestern","type":"number","unit":"mm","value":0.0},
{"name":"25","homematic_name":"w_bodenfeuchte","desc":"bodenfeuchtewert","type":"number","unit":"","value":0},
{"name":"3","homematic_name":"w_barometer","desc":"nn_luftdruck","type":"number","unit":"mb","value":1012.80},
{"name":"11","homematic_name":"w_barotrend","desc":"luftdrucktrend","type":"string","unit":"","value":"not_valid"},
{"name":"14","homematic_name":"w_sky_temp","desc":"himmel_temperatur","type":"number","unit":"gradC","value":0.0},
{"name":"15","homematic_name":"w_sun_temp","desc":"sonnentemperatur","type":"number","unit":"gradC","value":41.7},
{"name":"22","homematic_name":"w_diff_temp","desc":"sonnen_difftemperatur","type":"number","unit":"gradC","value":15.7},
{"name":"16","homematic_name":"w_sonne_scheint","desc":"sonne_scheint","type":"boolean","unit":"","value":true},
{"name":"10","homematic_name":"w_lux","desc":"helligkeit","type":"number","unit":"lux","value":5420.3},
{"name":"12","homematic_name":"w_elevation","desc":"sonne_elevation","type":"number","unit":"grad","value":46.3},
{"name":"13","homematic_name":"w_azimut","desc":"sonne_azimut","type":"number","unit":"grad","value":245.3}],"Systeminfo":{"MAC-Adresse":"b2:83:a:e8:3a:2c","Homematic_CCU_ip":"192.168.2.220","WLAN_ssid":"Stealth","WLAN_Signal_dBm":-70,"sec_seit_reset":670,"zeitpunkt":" 1 16:15","firmware":"weatherman_56"}}


Kann mir jemand sagen, wo mein Fehler liegt?

Vielen Dank für Eure Mühe...

ersthelfer

Hab es gefunden  :D

reading03Regex
"aussentemperatur","type":"number","unit":"gradC","value":([+-]?\d*\.\d*)


Hinter [+-] fehlte noch das ?

Tsturm

Klasse, freut mich - bei RegEx sinds die Kleinigkeiten... ein Komma fehlt, und es gibt einen Fehler an einer ganz anderen Stelle. Ich mache es immer schrittweise, sonst bekommt man das kaum mehr sortiert.
VG Timmo

ersthelfer

Hallo,

ich habe meine Wetterstation jetzt auf die FW 117 updatet. Dadurch hat sich scheinbar das JSON Format geändert.
So wurde scheinbar aus
{"name":"1","homematic_name":"w_temperature","desc":"aussentemperatur","type":"number","unit":"gradC","value":26.0},
jetzt
{"name":"1","homematic_name":"w_temperatur","desc":"aussentemperatur","type":"number","unit":"gradC","value":"31.2"},
d.h. der Wert steht jetzt scheinbar auch in " "

Ich muss gestehen, das ich die readings noch nicht ganz verstanden habe.
Kann mir jemand sagen wie ich die Zeile
attr Wetterstation reading03Name 03_Aussentemperatur
attr Wetterstation reading03Regex "aussentemperatur","type":"number","unit":"gradC","value":([+-]?\d*\.\d*)

verändern muss, damit das wieder funktioniert?

Wenn ich einfach nur ein " anhänge
attr Wetterstation reading03Name 03_Aussentemperatur
attr Wetterstation reading03Regex "aussentemperatur","type":"number","unit":"gradC","value":"([+-]?\d*\.\d*)

färbt sich in der Raw definition die nächste Zeile das attr von blau auf grün und das macht mich etwas stutzig.


Vielen Dank

Tsturm

#10
Hi Ersthelfer.

nich ganz klar, was du mit den Fraben meinst. Probiere es mit

"aussentemperatur","type":"number","unit":"gradC","value":"([+-]?\d?\d?.\d?)"

der * ist beliebig viele Zeichen, während das ? nur keine oder eine instanz für eine Ziffer zulässt. Am Ende noch das Anführungszeichen (ausserhalb der capture group) dazu.

Am besten mit http://regex101.com und dem gesamten JSOM Telegramm testen.

VG Timmo

PS - mittlerweile gehts auf per push - und dann auch einfach mit ExpandJSON. Siehe https://forum.fhem.de/index.php/topic,86097.msg960650.html#msg960650