Kostal Piko (neue Generation) in vzlogger

  • ich möchte die Daten meines Wechselrichters Kostal Piko 8.5 in vzlogger anzeigen.

    vzlogger läuft mittels Image installiert und aktualisiert auf einem Raspi W Zero und liest erfolgreich bereits Daten vom Stromzähler mittels IR-Optokopf.

    ich bin kein Profi in bash, raspi und Programmierung. trotzdem nahm ich diese Herausforderung an.

    da es bereits ein Beispiel im vz-wiki gibt, dachte ich es ginge schnell.

    jetzt bin ich schlauer und noch demütiger. damit andere schneller zum Erfolg kommen, stelle ich mal hier hinein, was ich gemacht habe.

    der Hauptgrund dieses Beitrags ist allerdings: Ich stecke fest. Kurz vor Schluss.

    ich bitte also um Hilfe. und um Nachsicht, wenn ich manche Dinge eher mit Hausmitteln gelöst habe. und um Verbesserungsvorschläge gern auch.


    zunächst mal als Basis - das Beispiel im vz-Wiki für Kostal Piko

    ich wählte Ansatz 2. es brauchte seine Zeit, bis ich feststellen durfte, dass das Beispiel veraltet ist und manche Dinge nicht erwähnt werden. Am entscheidensten ist, dass mein Wechselrichter nach Firmware-Update die Daten gar nicht mehr in html ausspuckt wie im Beispiel, sondern mittels JSON.


    Also schrieb ich die Beispiel-Datei exec-pvwr.sh um (bei der Gelegenheit änderte ich u.a. auch den Dateinamen, den Pfad und das Wort "Gesamtertrag" im Kommando).


    um die JSON-Daten zu parsen, musste auf dem Raspi-Image zstzl. jq installieren (apt install jq). im vzlogger-Frontend legte ich die beiden Kanäle für Gesamtertrag und aktuell an - nahm dafür allerdings "sensor" statt wie im Beispiel "Stromzähler".


    die vzlogger.conf muss auch angepasst werden. ich hatte ein bisschen rumprobiert, wie die neuen Einträge mit den vorhandenen zu integrieren seien - das ist das Ergebnis:

    der obere Teil liest den USB-Optokopf, der untere ist für den Wechselrichter. Wobei zu ersetzen sind:

    - die Wechselrichter-URL

    - die UUIDs


    der manuelle Aufruf der exec-Datei in der Kommandozeile ist schon einmal erfolgreich:

    bash kostal.sh 192.168.178.59 3 Gesamtertrag aktuell

    gibt aus

    1609586955: Gesamtertrag = 9975

    1609586955: aktuell = 110

  • ...allerdings funktioniert der automatische Aufruf über die exec nicht. ich erfahre, dass die exec nur funktioniert, wenn vzlogger unter dem User pi läuft.

    also füge ich den User pi in der vzlogger.service ein.

    und mache sicherheitshalber sudo setcap 'cap_sys_nice=eip'

    für

    /etc/systemd/system/vzlogger.service

    /etc/vzlogger.conf

    /usr/local/bin/kostal.sh


    auch mache ich chown pi für alle drei Dateien (man merkt, wie ich mich bei Berechtigungen auf Glatteis bewege).

    Systemprozesse stoppe und starte ich, direkt danach schaue im /var/log/vzlogger.log nach:


    ...und da komme ich jetzt nicht weiter.

    entweder steht da

    [Jan 02 09:38:45][exec] MeterExec::open: Testing command line '/usr/local/bin/kostal.sh 192.168.178.59 3 Gesamtertrag aktuell': Permission denied

    oder auch

    [Jan 02 09:38:45][exec] MeterExec::open: Testing command line '/usr/local/bin/kostal.sh 192.168.178.59 3 Gesamtertrag aktuell': No such file or directory


    im weiteren log-Verlauf wird für Gesamtertrag oder aktuell bei jedem Aufruf 0 zurückgegeben (obwohl es über die shell funktioniert). weil das command gar nicht richtig ausgeführt wird.


    systemctl status vzlogger gibt direkt nach Wiederstart aus:

    pi@raspberrypi:/usr/local/bin $ sudo systemctl start vzlogger

    pi@raspberrypi:/usr/local/bin $ systemctl status vzlogger

    vzlogger.service - vzlogger

    Loaded: loaded (/etc/systemd/system/vzlogger.service; enabled; vendor preset: enabled)

    Active: active (running) since Sat 2021-01-02 12:48:37 CET; 6s ago

    Main PID: 22530 (vzlogger)

    Tasks: 11 (limit: 881)

    CGroup: /system.slice/vzlogger.service

    ├─22530 /usr/local/bin/vzlogger -c /etc/vzlogger.conf

    ├─22549 sh -c /usr/local/bin/kostal.sh 192.168.178.59 3 Gesamtertrag aktuell

    ├─22550 /bin/sh /usr/local/bin/kostal.sh 192.168.178.59 3 Gesamtertrag aktuell

    └─22566 sleep 10

    Jan 02 12:48:37 raspberrypi systemd[1]: Started vzlogger.


    aber dann, nach einer Minute...

    pi@raspberrypi:/usr/local/bin $ systemctl status vzlogger

    vzlogger.service - vzlogger

    Loaded: loaded (/etc/systemd/system/vzlogger.service; enabled; vendor preset: enabled)

    Active: active (running) since Sat 2021-01-02 12:48:37 CET; 1min 43s ago

    Main PID: 22530 (vzlogger)

    Tasks: 8 (limit: 881)

    CGroup: /system.slice/vzlogger.service

    └─22530 /usr/local/bin/vzlogger -c /etc/vzlogger.conf

    Jan 02 12:48:37 raspberrypi systemd[1]: Started vzlogger.



    dasselbe auch nach reboot - ein Berechtigungsproblem, oder? wie löse ich den Knoten?

    wie kann ich eigentlich erkennen, ob vzlogger tatsächlich unter dem user pi gestartet wird?

  • Ein Problem könnte sein das dein Script nicht ausführbar ist. Wenn du das mit bash vorne dran aufrufst ist das glaub egal, ohne dagegen entscheidend.

    Du kannst das prüfen wenn du das Script ohne bash vorne dran an der Shell startest. ./kostal.sh, das es ein Shellscript ist steht ja im Script selbst drin.


    Anderer Punkt könnte vielleicht sein das du im Script den curl-Aufruf absolut adressieren musst. Bin mir nicht sicher inwieweit beim Daemon die Umgebungsvariablen (darin stehen Pfade für ausführbare Kommandos mit drin) aktiv sind.



    mfg JAU

    No Shift - No Service

  • danke für die umgehende Unterstützung.


    hatte vergessen zu erwähnen, dass ich die script-datei nach dem Speichern auch ausführbar gemacht hatte, mit chmod +x /usr/local/bin/kostal.sh


    ./kostal.sh funktioniert also auch, führt zur Ausgabe


    in kostal.sh habe ich jetzt

    CURLOUT=$(curl --connect-timeout 5 -s $URL)

    ersetzt mit

    CURLOUT=$(curl --connect-timeout 5 -s http://192.168.178.59/api/dxs.json?dxsEntries=67109120&dxsEntries=251658753)


    gestoppt & gestartet, im log leider immernoch

    [Jan 02 14:05:31][exec] MeterExec::open: Testing command line '/usr/local/bin/kostal.sh 192.168.178.59 3 Gesamtertrag aktuell': Permission denied

  • Du solltest nicht die URL (das ist ja eine Variable, die wird korrekt zusammengebaut) ändern sondern den Aufruf von curl.

    CURLOUT=$(/usr/bin/curl --connect-timeout 5 -s $URL)

    Das ist nämlich auch nur ein aufrufbare Datei.



    mfg JAU

    No Shift - No Service

  • Du solltest nicht die URL ändern sondern den Aufruf von curl.

    ach so, bitte um Verzeihung.

    habe ich jetzt geändert.

    gestoppt & gestartet, im log leider immernoch

    Permission denied


    beim manuellen script-Aufruf mit bash -x gibt die curl-Sektion übrigens aus:

    ...

    + NOW=1609603040++ /usr/bin/curl --connect-timeout 5 -s 'http://192.168.178.59/api/dxs.json?dxsEntries=67109120&dxsEntries=251658753'

    + CURLOUT='{"dxsEntries":[{"dxsId":67109120,"value":0.000000},{"dxsId":251658753,"value":9975.701172}],"session":{"sessionId":0,"roleId":0},"status":{"code":0}}'+ for READING in $READINGS

    ...

    sieht alles gut aus

    aber dann bin ich ja schon in der script-datei drin. liegt der Fehler nicht schon vorher, beim Aufruf der Datei?



  • Vielleicht als Alternativ-Ansatz:

    Lass doch das kostal.sh Skript über ein cron-Job minütlich laufen und schreibe die Werte mittels vzclient in dein System.

    Ich mach das für meine SMA-Wr im 5-minütlichen Intervall und bin zufrieden mit...


    Stefan

  • aber dann bin ich ja schon in der script-datei drin. liegt der Fehler nicht schon vorher, beim Aufruf der Datei?

    Ist für mich nicht so eindeutig, schließlich antwortet das Script ja:

    [Jan 02 09:38:45][exec] MeterExec::read: Reading line: '1609576725: Gesamtertrag = 0'


    Auffällig finde ich allerdings auch das da:

    ├─22549 sh -c /usr/local/bin/kostal.sh 192.168.178.59 3 Gesamtertrag aktuell

    ├─22550 /bin/sh /usr/local/bin/kostal.sh 192.168.178.59 3 Gesamtertrag aktuell

    Wieso zweimal? :/ Mit -n würde ich ja verstehen, aber -c?


    Mein nächster Ansatz wäre das Script mal ins Homeverzeichnis zu verschieben, irgendwie müssen wir das doch eingrenzen können. Wobei das sicher nur gegen den ersten Fehlereintrag hilft.


    Der zweite Punkt das $v=0 raus kommt ist kniffliger. Zeilen 37-40 scheinen da zu greifen. Einfach mal auskommentieren.

    Generell finde ich es seltsam das du mit sed den String manipulierst wenn du doch eigentlich jq schon hast und dir auf dem Weg relativ bequem direkt nutzbare Variablen basteln könntest. :S



    Beim nächsten Beitrag bitte wieder mit Großschreibung, Danke.


    Ich mach das für meine SMA-Wr im 5-minütlichen Intervall und bin zufrieden mit...

    Dann hast du den Puffer vom vzlogger nicht.

    Da hier ein Zero läuft ist nicht davon auszugehen das MW und DB auf der selben Hardware laufen.



    mfg JAU

    No Shift - No Service

  • Um dir mal zu zeigen was jq kann, bzw wozu es gut ist:


    Ich hab mir eine Datei erstellt in welcher der json String steckt den curl empfängt.

    Java: pico.json
    {"dxsEntries":[{"dxsId":"67109120","value":0.000000},{"dxsId":251658753,"value":9975.701172}],"session":{"sessionId":0,"roleId":0},"status":{"code":0}}

    Und mit diesen Aufrufen bekomme ich an der Shell direkt die gewünschten Werte:

    Code
    pi@volkszaehler:~ $ jq -r '.dxsEntries[0].value' pico.json
    0
    pi@volkszaehler:~ $ jq -r '.dxsEntries[1].value' pico.json
    9975.701172

    Adressiert man das JSON-Array nicht direkt werden beide Werte ausgeworfen. Diese kann man ihrerseits bequem in ein Shell-Array packen:

    Code
    value=($(jq '.dxsEntries[].value' pico.json))

    Und entsprechend wieder abrufen, z.B.:

    Code
    echo ${value[1]}

    Da die Quelle aber keine Datei ist sonder ein curl-Aufruf könnte das in etwa so aussehen (nicht getestet):

    Code
    value=($(curl --connect-timeout 5 -s $URL | jq '.dxsEntries[].value')



    mfg JAU

    No Shift - No Service