RaspberryMatic jq JSON Parser auf Skript-String anwenden?

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

Moderator: Co-Administratoren

Antworten
Wookbert
Beiträge: 224
Registriert: 10.05.2013, 18:40
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

RaspberryMatic jq JSON Parser auf Skript-String anwenden?

Beitrag von Wookbert » 18.02.2020, 06:56

Ich versuche gerade mein DarkSky-Wetterdaten-Abhol-und-Parsing-Skript in der RaspberryMatic dahingehend zu optieren, daß ich nicht für jeden per jq zu parsenden Wert eine API-Abfrage per curl mache, sondern den JSON-Datensatz nur einmal hole, in einem string im Skript ablege und dann — so der Plan — auf diesen String jq anwende.

(Nebenbei: Doof ist dass man hier im Forum nicht explizit nach dem Wort "jq" suchen kann, weil die Suchfunktion min. 3 Zeichen verlangt :cry:. Die Suche nach "JSON" liefert halt nicht die passenden Ergebnisse).

Das sieht dann so aus:

Code: Alles auswählen

var DarkSkyURL = "'" # dom.GetObject('Wetter DarkSky URL').ValueList() # "'";
string stdout;
string stderr;

! Wetterdaten (komplett) holen -> DarkSky_JSONdata
system.Exec("curl -sSf "#DarkSkyURL#" ", &stdout, &stderr);
string DarkSky_JSONdata = stdout.ToLatin(); ! .ToLatin() sorgt für die korrekte Darstellung von Umlauten
DarkSky_JSONdata enthält den kompletten JSON-Datensatz, wie ich per WriteLine sehen kann, und der im JSONLint Validator fehlerfrei ist. Alles fein.

Ich kriege bei der anschließenden jq-Auswertung aber einfach keine Schreibweise hin, in der der 2. stdout (also der vom system.Exec("printf...) das gewünschte Ergebnis liefert bzw. der dazugehörige stderr nicht irgendeinen Fehler ausspuckt ... auch wenn ich den Rundungsparameter "%.0f" weglasse (weil die " vielleicht für zusätzliche Probleme sorgen:

Code: Alles auswählen

! Aktuelle Temperatur übergeben
system.Exec("printf \"%.0f\" $("#DarkSky_JSONdata#" \| jq .currently.temperature)", &stdout, &stderr);

Wenn ich curl verwende (statt die JSON-Daten in einen string zu übergeben), so wie nachstehend, klappt alles ... nur will ich eben nicht X-mal die Daten von DarkSky ziehen:

Code: Alles auswählen

string s_cmd = 'printf "%.0f" $(curl -sSf ' # DarkSkyURL # '| jq .currently.temperature)';
system.Exec(s_cmd, &stdout, &stderr);
Ist jq mit einem string überhaupt möglich? Oder muss ich — wenn ich nicht jq auf den curl direkt anwenden will, die per curl geholten Daten erst in eine Datei schreiben? (Eine der stderr-Ausgaben beim Rumprobieren war "File name too long" ... erwarten printf oder jq also eine Datei?) Oder kann das vielleicht einfach nicht klappen, weil in dem JSON-String etliche Zeichen sind, die der system.Exex-Kommandozeile in die Suppe spucken?
Zuletzt geändert von Wookbert am 19.02.2020, 07:53, insgesamt 1-mal geändert.

Wookbert
Beiträge: 224
Registriert: 10.05.2013, 18:40
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: RaspberryMatic jq JSON Parser auf Skript-String anwenden?

Beitrag von Wookbert » 19.02.2020, 07:46

Problem gelöst!

Code: Alles auswählen

system.Exec("printf \"%.0f\" $(echo '"#DarkSky_JSONdata#"' | jq .currently.temperature)", &stdout, &stderr);

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

Re: RaspberryMatic jq JSON Parser auf Skript-String anwenden?

Beitrag von PaulM » 04.12.2021, 18:58

Die Schlüsselbegriffe innerhalb meiner Sammelabfrage sind numerisch.
Ich hatte entweder Syntaxfehler von der CCU oder von jq (Schlüsselbegriffe 632 und name).
Nach einigen Versuchen hat es so mit der Funktion tostring geklappt:

Code: Alles auswählen

system.Exec("printf $(echo '"#antwort#"' | jq '.[632|tostring].name')", &stdout, &stderr);   
Mit Mut und Entschlossenheit gegen Intoleranz

Antworten

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