json aus curl als readings zur Verfügung stellen

Begonnen von TimoD, 18 Februar 2021, 14:23:19

Vorheriges Thema - Nächstes Thema

TimoD

Hallo, als Workaround, würde ich gerne die Ausgabe aus curl (Json) als Readings in fhem verarbeiten.

in ssh liefert dabei der folgende Aufruf eine Ausgabe:

curl -k -b /home/pi/cookie.txt https://%powerwall_IP%/api/meters/aggregates

Wenn ich nun versuche folgendes in fhem Aufzurufen

{system("curl -k -b /home/pi/cookie.txt https://%powerwall_IP%/api/meters/aggregates")}

bekomme ich als Ausgabe nur "-1" was muss ich denn hier tun um mit der Ausgabe in fhem weiterarbeiten zu können? Bzw. würde ich gerne (analog) httpmod die Ausgabe als json verwenden.

Vorab vielen Dank!

Otto123

#1
Den richtigen Aufruf nehmen:
{qx(curl -k -b /home/pi/cookie.txt https://%powerwall_IP%/api/meters/aggregates)}

System liefert immer nur -1 zurück, qx die Ausgabe von stdout.

Edit Fehler im Code bereinigt: bei geht mit Hochkomma system(" ") bei qx() geht nur ohne!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TimoD

#2
Danke für die schnelle Antwort!

{qx("curl -k -b /home/pi/cookie.txt https://%powerwall_IP%/api/meters/aggregates")}

liefert leider gar nichts zurück. Das Fenster bleibt leer

{qx(echo test)} --> hier kommt test :-)

Muss ich noch was einstellen das die Ausgabe kommt, bzw. kann ich das irgendwie testen?

Auch ein simples {qx("curl ")} liefert keine Ausgabe,... / Anzeige

Otto123

#3
Ja offenbar schreibt curl irgend woanders hin? Die Ausgabe steht im Log  :'(

Die Ausgabe des Hilfetextes kommt offenbar über den Errorkanal?

So gehts: {qx(curl 2>&1)}

Sorry habe oben falsch geschrieben / einfach C&P gemacht {qx("curl ")} ist verkehrt! qx() verträgt keine zusätzlichen ""  Meine Notiz dazu
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Ich hab ja keine Ahnung von nix, frag einfach mal ob ob es überhaupt nötig ist den json in einer Datei zu speichern ?

Reichts nicht einfach mit HttpUtils_NonblockingGet abzurufen und dann direkt (mglw. mit json2reading) weiterzuverarbeiten?

{ HttpUtils_NonblockingGet( { url=>"https://%powerwall_IP%/api/meters/aggregates", callback=>sub($$$) { my ($hash, $err, $data) = @_;; print $data } }) }

Die Ausgabe steht im Log.

Gruß

Thomas

TimoD

Danke für die beiden Antworten, dass Problem ist, dass der Abruf zuvor über ein Login ein cookie erzeugen muss:

curl -s -k -i -c /opt/fhem/cookie.txt -X POST -H "Content-Type: application/json" -d '{"username":"customer","password":"0123456", "email":"timo"@xyz.de,"force_sm_off":false}' "https://192.168.178.92/api/login/Basic"

Und dann folgt:

curl -k -b /opt/fhem/cookie.txt https://192.168.178.92/api/meters/aggregates

Mit folgendem Aufruf bekomme ich nun die Ausgabe:
{qx(curl -k -b /opt/fhem/cookie.txt https://192.168.178.92/api/meters/aggregates 2>&1)}

Jetzt würde ich diese Ausgabe gerne direkt in ein Reading eines Dummy o.ä. speichern und über ein extractAllJSON zerlegen. (analog HTTPMOD)

Nun habe ich die Inhalte in eine Variable m Dummy mit folgendem notify geschrieben:

define n_PowerwallDummy notify PowerwallDummy:Update.* {
my $b = qx(curl -k -b /opt/fhem/cookie.txt https://192.168.178.92/api/meters/aggregates 2>&1);;\
fhem("set PowerwallDummy jasonInput $b")\
}

wie zerlege ich denn nun das Jason analog extractAllJSON analog HTTPMOD?

Schonmal MEGA Danke!

@TomLee:

gerne weitere Lösungsansätze ;-)


TimoD

Achse und der Output sieht wie folgt aus: Sieht aus als ob noch mehr als nur das json abgespeichert wird:

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed

0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 32 100 32 0 0 281 0 --:--:-- --:--:-- --:--:-- 283
{"percentage":42.53531882397862}

Wie bekomme ich denn nur das json ins Output.

Wernieman

Ich muß gestehen, das ich es extern Lösen würde. Also in einem Script beide curl-Aufrufe und dann nach FHEM "pusten". Hat noch den Vorteil, das es "non blocking" ist.

"pusten" geht mit telnet (sogar ssl), http, MQTT ...... (habe bestimmt eine Möglichkeit vergessen)
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

TomLee

#8
Wenn in dem Reading jasonInput des Dummy wirklich nur der Json stehen würde :

{"percentage":42.53531882397862}

Hätte man so mit json2reading ein Reading percentage mit dem Wert 42.53531882397862 erhalten können:

{json2reading($defs{PowerwallDummy},ReadingsVal('PowerwallDummy','jasonInput','undef'),'',undef,'','')}

Ich hab bisher aber zu wenig verstanden ob und wie man es mit deinem Output umsetzen könnte.

Otto123

Zitat(analog HTTPMOD)
Warum geht HTTPMOD nicht?
ich habe nicht verstanden welches die Daten sind und welche daten wirklich gewünscht sind?
Sind es Schlussendlich die drei Zeilen? Es geht nur um die letzte Zeile?
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 32 100 32 0 0 281 0 --:--:-- --:--:-- --:--:-- 283
{"percentage":42.53531882397862}

Dann machst Du sowas {(split("\n",$b))[2]} für den dritten Wert (Zeile) im Array.

{
my $b = qx(curl -k -b /opt/fhem/cookie.txt https://192.168.178.92/api/meters/aggregates 2>&1);;\
my @a=split("\n",$b);;\
fhem("set PowerwallDummy jasonInput $a[2]")\
}


Und für "Leistungswände" gibt's doch hier schon zig Lösungen! Deine ist nicht dabei?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

CoolTux

curl kennt die Option -s womit er nicht ganz so viel aus gibt sondern nur den eigentlichen Response
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

TimoD

Zitat von: CoolTux am 18 Februar 2021, 19:31:47
curl kennt die Option -s womit er nicht ganz so viel aus gibt sondern nur den eigentlichen Response

DANKE, habs hin bekommen,... Lösung folgt im Fehler Thread ;-)

https://forum.fhem.de/index.php/topic,118664.0.html