Kostal Piko (neue Generation) in vzlogger

  • DXS_PICK=("'${CURLOUT}' | jq '.dxsEntries[${READING}] | .value'")

    DXS_RESULT=$(echo "$DXS_PICK")

    Code
    DXS_PICK="echo $CURLOUT | jq '.dxsEntries[$READING] | .value'"
    DXS_RESULT=$($DXS_PICK)

    ...glaub ich.



    mfg JAU

    No Shift - No Service

  • Mein Vorschlag für das Script (hab die Wiederholschleife mal eben weggelassen):


    Bei mir sieht das dann (JSON aus Datei gelesen) so aus:

    Code
    pi@volkszaehler:~ $ ./pico.sh localhost 83886848 83888128 1234
    http://localhost/api/dxs.json?dxsEntries=83886848&
    http://localhost/api/dxs.json?dxsEntries=83886848&dxsEntries=83888128&
    http://localhost/api/dxs.json?dxsEntries=83886848&dxsEntries=83888128&dxsEntries=1234&
    http://localhost/api/dxs.json?dxsEntries=83886848&dxsEntries=83888128&dxsEntries=1234
    1609886437: 83886848 = 0
    1609886437: 83888128 = 2
    no reading 1234

    Die zwei echo $URL rausgeworfen und die Schleife mit sleep noch dazu. Fertig ist der Lack.

    Der Rest passiert in vzlogger.conf.


    Das schöne ist auch: Die Reihenfolge der IDs ist egal.

    Verdreht man bei dem aktuellen, guten Script (kostal.new) die Schlüssel würden die Value nicht mehr dazu passen.



    mfg JAU

    No Shift - No Service

  • KANN man so machen!


    Nachdem Dein Lösungsvorschlag für meine Stringbastelei auch nicht funktionierte, teste ich jetzt mal Dein Script in der live-Umgebung.

    Habe dafür die Datei in /usr/local/bin/mit pi angelegt und wieder kostal.sh genannt, weil Piko nur eine Produktreihe des Herstellers ist.


    Manuell in der shell:

    pi@raspberrypi:~ $ /usr/local/bin/kostal.sh 192.168.178.59 251658753 67109120

    http://192.168.178.59/api/dxs.json?dxsEntries=251658753&

    http://192.168.178.59/api/dxs.…8753&dxsEntries=67109120&

    http://192.168.178.59/api/dxs.…58753&dxsEntries=67109120

    1609920632: 251658753 = 9981.792969

    1609920632: 67109120 = 0


    Jetzt per Systemservice:

    - 2 Kanäle mit den IDs als Bezeichner im Front-End angelegt

    - command sowie identifier und UUIDS in der /etc/vzlogger.conf geändert:

    - Im script noch die 2 URL-Kontroll-echos entfernt

    - sudo systemctl start vzlogger


    Läuft. Beeindruckend. Kein Fehler (außer "permission denied" bei Aufruf). Das muss an meiner guten Vorrecherche liegen ;)

    Front-End malt auch.


    Ja, die dxsIDs zu verwenden macht es schön schlank. Vor allem weil ich noch mehr Werte zum Auslesen in einem Forum gefunden habe. Ich kopiere sie mal hier hinein, dann sind sie an einer Stelle mit dem script:

  • Nachdem Dein Lösungsvorschlag für meine Stringbastelei auch nicht funktionierte,

    Beim Schreiben von pico.sh bin ich auch drauf gekommen was da falsch ist.

    Mein Fehler: in $READING steht keine Ganzzahl sondern der für den Schleifendurchlauf aktuelle String aus dem Array $READINGS.

    Vermutlich dein Fehler: in .dxsEntries[0] steht nicht die Id sondern zwei weitere Variablen {"dxsId":83886848,"value":0.000000} (ein sogenanntes Datenfeld).


    In dem Zuge hab ich auch erst gesehen das die Tiles von jq ein genau so starkes Werkzeug sind wie in der Shell.

    jq ".dxsEntries[] | select(.dxsId == $READING) | .value"

    1. in Array dxsEntries[] eintauchen
    2. das Array wählen in dem die richtige Id steht
    3. und daraus bitte den Inhalt der Variable value


    Das muss an meiner guten Vorrecherche liegen ;)

    Es sind manchmal die kleinen Dinge. JQ kannte ich letzte Woche noch gar nicht.

    Und du hast ganz nebenbei den JSON-String gepostet den curl liefert, das war sehr wichtig um voran zu kommen. Während an der URL für curl die du gebaut hattest kein echter Zweifel bestand, die hat einfach nur funktioniert.



    Generell macht es mehr Spaß jemandem zu helfen der selbst Hand anlegt als denen die einfach nur Lösungen erwarten.



    mfg JAU

    No Shift - No Service

  • JQ kannte ich letzte Woche noch gar nicht.

    Ich auch nicht... Aber wenn es Dich dazu geführt hat, sich mit diesem Beispiel näher zu beschäftigen: Bitte gern. Ohne Deine Unterstützung oder Anstupsen hätte ich die Lust verloren. Auf Grund meines eher geringen Grundwissens bin ich eben auch echt langsam.


    Der Wiki-Beitrag ist leider nicht mehr aktuell und irreführend. Nun haben wir ein für die neuere Kostal-Generation funktionierendes script.

  • Insgesamt alles verständlich und komplett dargestellt, finde ich gut!


    Nur eingangs muss der unbedarfte Kostal-WR-Eigentümer erkennen, was er für eine Version vorfindet. Weil auch die neue Firmware ein "Webfrontend" hat (aber zusätzlich JSON), würde ich den Satz "Abhängig von der Firmware werden die Daten als JSON oder über ein Webfrontend ausgegeben." etwas verfeinern.

    Vorschlag: "Abhängig von der Firmware werden die Daten nur über ein Webfrontend (in fhtml) ausgegeben oder zusätzlich per JSON."

  • Heute Nacht ist übrigens der Webserver des Wechselrichters abgestürzt. Ist mir noch nie passiert. Keine Ahnung, ob ihn die ganze JSON-Abfragerei so arg anstrengt.


    im log sieht das dann so aus:

    [Jan 10 04:07:58][chn0] CURL: Timeout was reached

    [Jan 10 04:08:04][chn0] CURL Error from middleware: 'UniqueConstraintViolationException': 'An exception occurred while executing 'INSERT INTO data (channel_id, timestamp, value) VALUES (5,?,?), (5,?,?), (5,?,?), (5,?,?), (5,?,?)' with p$

    [Jan 10 04:09:41][chn1] CURL: Timeout was reached

    [Jan 10 04:09:43][chn0] CURL: Timeout was reached

    [Jan 10 04:10:11][chn3] CURL: Timeout was reached

    [Jan 10 04:10:16][chn0] CURL: Timeout was reached


    So habe ich den Wechselrichter neu gestartet, aber der VZlogger-Service war ja auch aus. Ich musste den Service neu starten. Fällt Dir eine schlaue Zeile ein, die das abfängt und dann z.B. 0 ausgibt?

  • Wenn die curl-Abfrage des Scripts an den Wechselrichter fehl schlägt wird kostal.sh abgebrochen und kein Wert an vzlogger weitergegeben. Dafür sorgt das set -e.

    Fällt Dir eine schlaue Zeile ein, die das abfängt und dann z.B. 0 ausgibt?

    Man sollte davon absehen Werte an den Logger zu übergeben die es nicht gibt.

    Schreibe eine 0 in den Kanal vom Zähler und du hast massive Peaks im Graphen wenn wieder ein echter Zählerstand ankommt.


    [Jan 10 04:09:41][chn1] CURL: Timeout was reached

    [Jan 10 04:09:43][chn0] CURL: Timeout was reached

    [Jan 10 04:10:11][chn3] CURL: Timeout was reached

    Das sind Fehler weil die Daten die vzlogger abschickt nicht ankommen (dafür wird ebenfalls curl genutzt).

    Man sieht das auch daran [chnX] das es mehr als nur die 2 Channel vom Kostal betrifft.



    mfg JAU

    No Shift - No Service