Daten als http-Aufruf mit wget oder curl holen und erst in zweitem Schritt (hier mit jq) auswerten

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

Antworten
PaulM
Beiträge: 318
Registriert: 16.02.2015, 17:05
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 129 Mal
Danksagung erhalten: 35 Mal

Daten als http-Aufruf mit wget oder curl holen und erst in zweitem Schritt (hier mit jq) auswerten

Beitrag von PaulM » 03.07.2022, 17:07

Ich muss verschiedene Daten über http abholen, und habe mir dazu mit Hilfe dieses Forums (Black, Wookbert, Baxxy, uwe111, zuletzt viewtopic.php?f=37&t=74315#p719344 ) eine Anleitung notiert, vielleicht interessiert es auch andere.

Zweck der Zwei-Teilung: ReGa Blockade vermeiden, deshalb erst Datenabruf ohne Auswertung und Verarbeitung der Antwort erst nach eingetroffener Antwort.

Teil A Daten mit Skript abrufen und Antwort in Datei /tmp/DATEINAME.txt schreiben:

Code: Alles auswählen

!- url Daten-Quelle (nach Prüfung des http-Aufrufs im Browser !!!)
string url = "http://...
WriteLine("URL: " # url);

!- CUxD-Gerät und tmp-Datei
string CUXD_Device = "CUxD.CUX2801xxx:y";
string dateinamemitpfad = "/tmp/DATEINAME.txt";  !- zu schreibende Datei

!- Datenabruf starten:
dom.GetObject(CUXD_Device#".CMD_SETS").State("wget --tries=2 --timeout=10 --quiet --output-document=- '"#url#"' > " # dateinamemitpfad);
dom.GetObject(CUXD_Device#".CMD_RUNS").State(1);
WriteLine("Ende");
Beispiel einer selektiven Abfrage mit jq und eigenen Begriffen (der Inhalt von weather.break wird in der Datei der Inhalt von Wetterpause)

Code: Alles auswählen

dom.GetObject(CUXD_Device#".CMD_SETS").State("curl --connect-timeout 10 --max-time 10 'http://XYZ/json?cmd=weather' | jq '.| {Wetterpause: .weather.break, ZuRegnerisch: .weather.condition.toorainy}' > /tmp/wetterpause.txt");
Teil B - Abgeholte Daten mit Skript über separates WebUI Programm auswerten - wenn CMD_RETS <= 0.00 oder < 0.00 bei Aktualisierung dann:

Code: Alles auswählen

!- Variablendefinitionen
string stdout; !- Deklaration für system.Exec Befehl
string stderr;
string dateinamemitpfad = "/tmp/DATEINAME.txt";  !- zu lesende Datei
string antwort;
integer zahl;	! brauche ich meist bei der Auswertung

!- Lesen der Antwort
system.Exec("cat " # dateinamemitpfad, &antwort);
WriteLine("Antwort: " # antwort);
Sofern möglich, benutze ich JSON als Antwort-Format

Auswertungen mache ich mit jq (ist Bestandteil von Raspberrymatic, ich weiss nicht ob jq auch bei CCU2/3 dabei ist)
jq ist unheimlich mächtig, ich bin entsprechend meinem Bedarf an der Oberfläche geblieben
https://stedolan.github.io/jq/manual/#Basicfilters

Antwort auswerten

Code: Alles auswählen

!- printf gibt an Konsole aus, echo was ausgegeben werden soll, Ziel: Stringvariable stdout, Auswertebegriff hier .observations.[0].stationID
system.Exec("printf $(echo '"#antwort#"' | jq '.observations.[0].stationID')", &stdout, &stderr);
dom.GetObject('MEINE_SV').State(stdout); ! Schreiben der entsprechenden SV 
WriteLine("MeineSV: " # stdout);
sinngemässe Wiederholung im Skript des 'system.Exec("printf $(echo ...' Aufrufs, soweit weitere abgeholte Daten von Interesse

weitere jq Beispiele:

Code: Alles auswählen

jq '.observations'	! Gliederungsbegriff
jq '.observations.[0]' ! gibt erstes Element von observations zurück
jq '.observations.[0].stationID' ! gibt stationID des ersten Elements von observations zurück
wenn die 1. Stelle eines Gliederungsbegriffes numerisch ist, muss dieser Gliederungsbegriff zuerst umgewandelt werden, hier 632

Code: Alles auswählen

jq '.[632|tostring].name'
Mit Mut und Entschlossenheit gegen Intoleranz

Antworten

Zurück zu „CUxD“