Variable per JSON einlesen und auf Plausibilität überprüfen

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

Antworten
nuiler
Beiträge: 152
Registriert: 15.04.2012, 11:07
Wohnort: Ostalbkreis / Deutschland

Variable per JSON einlesen und auf Plausibilität überprüfen

Beitrag von nuiler » 03.05.2019, 13:15

Ich möchte eine Variable per JSON befüllen.

Anbei die JSON-Ausgabe der Seite

{"modultyp":"PULSECOUNTER","vars":[{"name":"0","homematic_name":"w_counter_ip","desc":"ip des pulsecounters","type":"string","unit":"","value":"192.168.178.56"},{"name":"11","homematic_name":"w_counter_1","desc":"w_counter_1","type":"number","unit":"KWh","value":0.00},{"name":"12","homematic_name":"w_power_1","desc":"w_power_1","type":"number","unit":"KW","value":0.001},{"name":"13","homematic_name":"w_counter_2","desc":"w_counter_2","type":"number","unit":"KWh","value":0.00},{"name":"14","homematic_name":"w_power_2","desc":"w_power_2","type":"number","unit":"KW","value":0.001},{"name":"15","homematic_name":"w_counter_3","desc":"w_counter_3","type":"number","unit":"KWh","value":0.00},{"name":"16","homematic_name":"w_power_3","desc":"w_power_3","type":"number","unit":"KW","value":0.006},{"name":"17","homematic_name":"w_counter_4","desc":"w_counter_4","type":"number","unit":"m3","value":1.92},{"name":"18","homematic_name":"w_power_4","desc":"w_power_4","type":"number","unit":"m3/h","value":0.000}],"Systeminfo":{"MAC-Adresse":"5c:cf:7f:c5:f5:e8","Homematic_CCU_ip":"192.168.178.55","WLAN_ssid":"www.nuiler.de","WLAN_Signal_dBm":-46,"sec_seit_reset":180739,"zeitpunkt":"2019.05.08/12:10:28","firmware":"wiffi_counter_30"}}


Anbei mein bisheriger Script, den ich aus verschieden zusammenkopiert. Die Variablen sind bisher noch kunterbunt, da ich bisher och teste.


var temp = dom.GetObject('w_counter_4').Value();
WriteLine(temp);

var url = "http://192.168.178.56/?json:";


!hier ist die Abfrage mit system.Exec
string stdout;
string stderr;
system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr);
!WriteLine(stdout);
string wetter_xml = stdout;
WriteLine(wetter_xml);

integer pm10_position = wetter_xml.Find("w_counter_4");
WriteLine(pm10_position);
string pm10_value = wetter_xml.Substr((pm10_position+70), 4);
WriteLine(pm10_value);


Das Problem ist wenn sich der Wert nun in der Anzahl der Stellen ändert wird ja dieser abgeschnitten.
Kann ich auch filtern zwischen value + }


Kann ich später diese Variable auf Plausibilität überprüfen, d.h. sie darf sich nur einen bestimmten Wert ändern?
www.nuiler.de
Raspberrymatic 3.45.7.20190622

Nucom AG
Beiträge: 13
Registriert: 15.04.2019, 14:52
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Variable per JSON einlesen und auf Plausibilität überprüfen

Beitrag von Nucom AG » 16.08.2019, 16:04

Ich würde dir Empfehlen, einen Regex zu verwenden um es zu extrahieren. Falls das zu komplizier ist, würde ich den String splitten.

Wenn du die Zeile beim "," Splittest kriegst du ein Array:

[0]{"name":"17"
[1]"homematic_name":"w_counter_4"
[2]"desc":"w_counter_4"
[3]"type":"number"
[4]"unit":"m3"
[5]"value":1.92}

So wäre dein Arraywert immer im [5].

Dann müsste man natürlich den Wert noch durch ein ":" splitten, und die Abschliessende Klammer entfernen }

Code: Alles auswählen

!CODE nicht getestet
string json = '{"name":"17","homematic_name":"w_counter_4","desc":"w_counter_4","type":"number","unit":"m3","value":1.92}';
string valueraw = json.StrValueByIndex(",", 5) !Das 5. Element aus dem JSON string, wenn es durch , getrennt ist
string valueraw = valueraw.StrValueByIndex(":", 1") !Das Element zwsichen value, und Wert aufteilen., damit der Wert mit abschl. Klammer bleibt
string value = valueraw.Replace("}", "") !Abschliessende Klammer durch nichts ersetzen
MfG

Fabian

Benutzeravatar
Black
Beiträge: 1789
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Variable per JSON einlesen und auf Plausibilität überprüfen

Beitrag von Black » 16.08.2019, 17:01

auf einer Raspberrymatic gibt auch JQ direkt als JSON parser... da kannman sich die Umwege über das StringGedöns sparen

Black
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 3.45.7.20190507 mit Groundplane Antennenmod (Mein Grundstück ist halt etwas gross)
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker unter ProxMox auf NUC als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.3
SDV 3.08.11 Scripteditor und Objektinspektor

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“