Ergebnisse eines Web(JSON) Aufrufs in der bash auswerten und verarbeiten

  • Vorweg: Ich bin blutiger Anfänger und brauche mal Unterstützung, Ideen Anregungen wie ich zum Ziel komme: Ich will einen SMA Webbox auslesen und an mein domoitcz SmartHome Daten weiterleiten.

    Ich erwarte keine vollständige Lösung sondern wünsche Anregungen wie ich zum Ziel komme und ab und zu Hilfestellungen wären schön.

    Ausgangslage: Ich habe eine PV-Anlage mit 3 Wechselrichter (bluetooth) die auf einer SMA Webbox zusammenlaufen. Mit SBFSpot könnte ich jetzt jeden Wechselrichter einzenl per bluetooth verbinden und auswerten ... Aber das ist zu viel und ich wäre wieder ortsgebunden. Die Webbox von SMA kann abgefragt werden und mich interessiert zu weiteren Verarbeitung eigentlich nur der aktuelle Leistungswert. Die Doku habe ich gefunden: http://files.sma.de/dl/2585/SWebBoxRPC-BA-en-14.pdf

    Wenn ich im Chrome Browser aufrufe:

    Code
    http://192.168.64.14/rpc?RPC={"version": "1.0","proc": "GetPlantOverview","id": "1","format": "JSON"}

    erhalte ich

    Code
    {"result":{"overview":[{"meta":"GriPwr","name":"Leistung","unit":"W","value":"0"},{"meta":"GriEgyTdy","name":"Tagesertrag","unit":"kWh","value":"6.618"},{"meta":"GriEgyTot","name":"Gesamtertrag","unit":"kWh","value":"46821.407"},{"meta":"OpStt","name":"Zustand","value":"Ok, Ok"},{"meta":"Msg","name":"Meldung","value":""}]},"format":"JSON","proc":"GetPlantOverview","version":"1.0","id":"1"}

    Den Wert den ich suche finde ich da: "value":"0" aktuell dunkel also null. Tagsüber kommen da Werte zwischen den Anführungszeichen.

    Da ich nicht wirklich programmieren kann wollte ich das scripten; Naive Idee: curl .... in Datei, dann den Wert in der Datei suchen und weiter an smarthome pushen. Wenn ich den Wert mal habe klappt das mit dem pushen schon. Aber ich bekomme nicht mal das curl oder http hin, so dass ich auf der shell jemals die Werte gesehen habe.

    Also bräuchte ich mal Unterstützung:

    1) Wie könnte man in der bash an Das Ergebnis kommen

    2) Wie finde ich "geschickt" den Wert hinter dem "W","value";" ?

    Bin für jede Anregung dankbar.

  • Ergebnisse eines Web(JSON) Aufrufs in der bash auswerten und verarbeiten? Schau mal ob du hier fündig wirst!

  • Da steht wie das Format aussehen muss. D.h. Du musst einen POST mit curl zusammenbasteln und dabei Deinen Payload {"version": "1.0","proc": "GetPlantOverview","id": "1","format": "JSON"}mitgeben. Dann habe ich nach 'curl create post request' gesucht und diese Seite gefunden wo eigentlich alles steht wie es geht :cool:

    Zitat

    2) Wie finde ich "geschickt" den Wert hinter dem "W","value";" ?

    Es gibt ein sehr mächtiges Tool mit dem Namen jq mit welchem man sehr elegant JSON in bash parsen kann. Siehe dazu auch hier

    Code
    jq '.result.overview | .[] | select(.meta == "GriPwr") | .value' < result.json
  • super, vielen Dank, damit komme ich weiter, bzw. bin fertig. Zum Nachlesen: Das script sieht jetzt so bei mir aus. Jetzt kann ich das alle 5 Minuten laufen lassen und die aktuelle Leistung in das SH senden.

    Bash
    #!/bin/bash
    rm result.json
    rm act_power.txt
    curl -s -X GET  'http://192.168.64.14/rpc?RPC=%7B%22version%22%3A%20%221.0%22%2C%22proc%22%3A%20%22GetPlantOverview%22%2C%22id%22%3A%20%221%22%2C%22format%22%3A%20%22JSON%22%7D' -H 'cache-control: no-cache' -o result.json
    jq '.result.overview | .[] | select(.meta == "GriPwr") | .value' < result.json > act_power.txt
    cat act_power.txt

    natürlich ist das Löschen und das cat überflüssig, hilft mir beim "Rantasten"

    Als Hinweis für die "Mitstreiter" die Lösung hat bei mir über die App postman im chrome schnell zum Ziel geführt dem Link von framp aufmerksam lesen.

  • Du hast es nicht so gemacht wie es in dem Doc steht sondern einfach den GET, den Du im Browser eingegeben hast in curl gegossen :cool: Aber so geht es natuerlich auch :thumbup:

    Der Vollständigkeit halber noch wie der POST der Doc nach aussehen müßte:

    Bash
    curl -s -H "Content-Type: application/json" -X POST -d '{"version": "1.0","proc": "GetPlantOverview","id": "1","format": "JSON"}' http://192.168.64.14/rpc -o result.json
  • Das hat mit postman was im Beitrag beschrieben war ausgeworfen. Mit http(ie) habe ich es nicht hinbekommen und auch noch weniger seiten als zu curl gefunden.

    noisefloor kannst Du mir da noch mal bei helfen, dann würde ich mir das als Alternative auch noch anschauen. Geht ja auch um einen Lerneffekt und Anderen Ideen mitzugeben die auf ähnliche Gedanken kommen.

  • Hallo,

    framp: welches Linux kommt denn im Jahre 2017 noch ohne vorinstalliertes Python? Raspbian und Debian und Ubuntu und die ganze anderen Mainstream Distros jedenfalls nicht.

    HarryHase:

    ungetestet: http POST http://192.168.64.14/rpc version=1.0 proc=GetPlantOverview id=1 format="JSONhttp://192.168.64.14/rpc

    Die Ausgabe erfolgt dann nach stdout. Müsstest dann also noch die Ausgabe in eine Datei umleiten oder per Pipe an jq weiterleiten.

    Oder du skriptest das ganze direkt mit Python. JSON kann Python OOTB über das JSON-Modul, für die Abfrage bietet sich das requests-Modul an.

    Gruß, noisefloor

  • geht irgendwie gar nicht, habe mal ein paar Varianten ausprobiert

    Code
    http POST http://192.168.64.14/rpc '{"version": "1.0","proc": "GetPlantOverview","id": "1","format": "JSON"}'
    
    
    
    
    http POST http://192.168.64.14/rpc '{version: 1.0,proc: GetPlantOverview,id: 1,format: JSON}'

    leider n

  • okay mein Fehler, mit der Rückmeldung komme ich nicht weiter:

  • Entschuldige meine Unwissenheit;

    Selbst wenn ich an Deinen Vorschlag noch ein " anhänge oder das " dazwischen setze kommt das gleiche leere Ergebnis

    wie auch

    Code
    http POST http://192.168.64.14/rpc version=1.0 proc=GetPlantOverview id=1 format="JSON"

    Ich weiß und verstehe es schlichtweg nicht wie der Aufruf richtig lauten muss.

  • Die Syntax ist nicht ganz korrekt:

    Lt. http://files.sma.de/dl/2585/SWebBoxRPC-BA-en-14.pdf

    7.1 RPC_GET_PLANT_OVERVIEW


    Sample request: RPC={ "version": "1.0", "proc": "GetPlantOverview", "id": "1", "format": "JSON" }

    Damit lautet der Aufruf

    Code
    curl -H "Content-Type: application/json" -X POST \
    -d RPC='{"version": "1.0","proc": "GetPlantOverview","id": "1","format": "JSON"}' \
    http://192.168.1.168/rpc

    Beachte das RPC=...

    Der Request muss also nicht im Body des POST-Requests stehen sondern als Wert der POST-Variablen RPC :)

    Dabei kommt bei mir das raus:

    Code
    {"format":"JSON","result":{"overview":[{"unit":"W","meta":"GriPwr","name":"GriPwr","value":"0"},{"unit":"kWh","meta":"GriEgyTdy","name":"GriEgyTdy","value":"12.559"},{"unit":"kWh","meta":"GriEgyTot","name":"GriEgyTot","value":"112336.193"},{"unit":"","meta":"OpStt","name":"OpStt","value":""},{"unit":"","meta":"Msg","name":"Msg","value":""}]},"proc":"GetPlantOverview","version":"1.0","id":"1"}

    (Nach Sonnenuntergang kommen natürlich keine vernünftigen Daten mehr außer z.B. "heutige Erzeugung" GriEgyTdy ...)

    Wie man das für httpie kodiert, weiß ich nicht, aber Du musst das gesamte JSON schicken!

    Wenn Du mit PHP rumspielen willst, was Deine Webbox so liefert, ich hatte damals was gebaut: https://github.com/K-Ko/SMA-Webbox

    Der Aufruf mit dem RPC=... ist hier.

    Knut

    Einmal editiert, zuletzt von KKoPi (8. November 2017 um 21:57) aus folgendem Grund: Typo

  • Hallo,

    Zitat


    Leider kommt auch da keine Antwort zurück, das von KKoPi funktioniert

    Immerhin hast du eine funktionierende Version. Das geht mit HTTPie sicherlich auch, allerdings habe ich keinen Server zum Testen für die etwas ungewöhnlich strukturierte Anfrage, von daher kann ich dir die korrekte Syntax für HTTPie leider nicht sagen.

    Gruß, noisefloor

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!