Irgendwie schaffe ich es aufgrund meines Anfängerstadiums nicht einen Wert per httpmod aus einem JSON-Script auszulesen.
Ich habe einen Überschussregler für meine PV-Anlage, der mir unter anderem den aktuellen Wert der Leistung (+=Bezug, -=Lieferung) anzeigt.
Link: http://192.168.178.222/api/v1/values
Ergebnis:
{"json_values":[{"id":"U1","value":"23533"},{"id":"U2","value":"23141"},{"id":"U3","value":"23205"},{"id":"I1","value":"3069"},{"id":"I2","value":"2596"},{"id":"I3","value":"3282"},[color=blue][i][b]{"id":"P","value":"-1966"}[/b][/i][/color],{"id":"fwdEn","value":"1156"},{"id":"rvsEn","value":"2776"},{"id":"AO1","value":"100"},{"id":"AO2","value":"100"},{"id":"DO1","value":"0"},{"id":"DO2","value":"1"},{"id":"LEDS","value":"0"},{"id":"LEDP","value":"1"},{"id":"date_time","value":{"year":2016,"month":5,"day":11,"hour":10,"minute":57,"second":52}}]}
fhem.cfg (Auszug)
#Lupus5
define LupusJSON HTTPMOD http://192.168.178.222/api/v1/values
attr LupusJSON userattr get01JSON getData requestHeader stateFormat
attr LupusJSON get01JSON json_values_01_id
attr LupusJSON getData {"get" :["json_values_07_value"]}
attr LupusJSON requestHeader Content-Type: application/json
attr LupusJSON room E-Verteiler
attr LupusJSON stateFormat {sprintf("%.1f", ReadingsVal($name,"json_values_07_value",0))}
Mit diesen Einstellungen wird zumindest buf mit folgendem Ergebnis befüllt:
HTTP/1.0 200 OK Server: LwIP/1.4.1 (Lupus5) Content-type: application/json Cache-Control: no-cache, no-store, must-revalidate Pragma: no-cache Expires: 0 Access-Control-Allow-Origin: * Content-Length: 0518 {"json_values":[{"id":"U1","value":"23421"},{"id":"U2","value":"22846"},{"id":"U3","value":"23284"},{"id":"I1","value":"2974"},{"id":"I2","value":"2730"},{"id":"I3","value":"3121"},{"id":"P","value":"-1938"},{"id":"fwdEn","value":"1156"},{"id":"rvsEn","value":"2774"},{"id":"AO1","value":"100"},{"id":"AO2","value":"100"},{"id":"DO1","value":"0"},{"id":"DO2","value":"1"},{"id":"LEDS","value":"0"},{"id":"LEDP","value":"1"},{"id":"date_time","value":{"year":2016,"month":5,"day":11,"hour":10,"minute":50,"second":7}}]}
Ich schaffe es leider nicht auf den 7. Wert im buf (in diesem Fall -1983) zuzugreifen.
Mein Ziel wäre, dass ich z.B. die Klimaanlage oder mein E-Auto per schlatbarer Steckdose aktiviere, sofern genügend Überschuss vorhanden ist.
Danke für Eure Hilfe vorab.
lg
Markus
Läuft das Modul denn überhaupt erst einmal sauber durch? Steht also das Ergebnis als solches schon mal im Modul?
Ich bin daran gescheitert, dass mein JSON-Interface keinen HTNML-Header geliefert hat. Ein Browser zeigt die Daten dann eben an, das HTTPMOD tut es dann nicht.
Also einfach erst mal den Quelltext des JSON-Interfaces anschauen.
kopflose Grüße
Niels
es fehlt mindestens ein attr get01Name für den namen des readings. es müssten also fehlermeldungen in fhem.log kommen mit verbose=4 oder 5 beim device.
über regex könntest du auch statt attr get01JSON folgendes machen:
attr LupusJSON get01Regex "P","value":"([^"]+)
Danke für Eure Vorschläge! Das Modul scheint einwandfrei zu laufen, da im buf der gesamte Inhalt angezeigt wird.
Wenn ich extractAllJSON verwende und FHEM neu starte, dann funktioniert es so, dass der Leistungswert im STATE angezeigt wird.
#Lupus5
define LupusJSON HTTPMOD http://192.168.178.222/api/v1/values 30
attr LupusJSON userattr get01JSON get01Regex getData requestHeader stateFormat
attr LupusJSON extractAllJSON 1
attr LupusJSON requestHeader Content-Type: application/json
attr LupusJSON room E-Verteiler
attr LupusJSON stateFormat {sprintf("%.1f", ReadingsVal($name,"json_values_07_value",0))}
define FileLog_LupusJSON FileLog ./log/LupusJSON-%Y.log LupusJSON
attr FileLog_LupusJSON logtype text
attr FileLog_LupusJSON room E-Verteiler
define SVG_FileLog_LupusJSON_1 SVG FileLog_LupusJSON:SVG_FileLog_LupusJSON_1:CURRENT
Das mit den get01.... (RegEx, Name, etc.) habe ich irgendwie noch nicht ganz verstanden.
Spricht etwas dagegen, dass ich STATE beschreibe und dann auch entsprechend verwende?
Danke
lg
Markus
ZitatSpricht etwas dagegen, dass ich STATE beschreibe und dann auch entsprechend verwende?
nein, nutze stateformat.