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).
#!/bin/bash
# catch errors
set -u
set -e
# preliminaries
HOSTNAME="$1"
shift
REPEAT="$1"
shift
READINGS="$*"
USERNAME="pvserver"
PASSWORD="pvwr"
URL="http://${HOSTNAME}/api/dxs.json?dxsEntries=67109120&dxsEntries=251658753"
REGEXP="aktuell.*Gesamtertrag"
#repeat
for repeat in $(seq 1 "${REPEAT}"); do
NOW="$(date +%s)"
CURLOUT=$(curl --connect-timeout 5 -s $URL)
for READING in $READINGS; do
case "$READING" in
"Gesamtertrag"|"aktuell")
if [ $READING == 'aktuell' ]
then
OUTPUT="$(printf "%s\\n" "$(echo $CURLOUT | jq '.dxsEntries[0] | .value')" | sed -e 's/\..*$//')"
else
OUTPUT="$(printf "%s\\n" "$(echo $CURLOUT | jq '.dxsEntries[1] | .value')" | sed -e 's/\..*$//')"
fi
# PVWR prints "x x x" in the dark, that is parsed
# into the empty string by the sed, make it zero
re='^[0-9]+$'
if ! [[ $OUTPUT =~ $re ]] ; then
OUTPUT="0"
fi
printf "%d: %s = %d\\n" "${NOW}" "${READING}" "${OUTPUT}"
;;
*)
# we don't have what the user asked for, print error message
printf >&2 "no reading %s\\n" "${READING}"
exit 1
;;
esac
done
if [ "${repeat}" != "${REPEAT}" ]; then
sleep 10
fi
done
Alles anzeigen
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:
{
"retry" : 3,
"daemon": true,
"verbosity" : 15,
"log" : "/var/log/vzlogger.log",
"local" : {
"enabled" : false,
"port" : 8080,
"index" : true,
"timeout" : 30,
"buffer" : 600
},
"meters" : [
{
"enabled" : true,
"device" : "/dev/ttyUSB0",
"protocol" : "sml",
"parity" : "8N1",
"baudrate" : 9600,
"aggtime" : -1,
"aggfixedinterval" : true,
"channels": [{
"uuid" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"middleware" : "http://localhost/middleware.php",
"identifier" : "1-0:1.8.0*255", /* Bezug */
"aggmode" : "MAX"
}, {
"uuid" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"middleware" : "http://localhost/middleware.php",
"identifier" : "1-0:2.8.0*255", /* PV Ertrag */
}, {
"uuid" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"middleware" : "http://localhost/middleware.php",
"identifier" : "1-0:16.7.0*255", /* Verbrauch aktuell */
}]
},
{
"enabled": true,
"allowskip": true,
"protocol": "exec",
"command": "/usr/local/bin/kostal.sh 192.168.178.59 3 Gesamtertrag aktuell",
"format": "$t: $i = $v",
"interval": 30,
"channels": [
{
"uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"identifier": "aktuell",
"middleware": "http://localhost/middleware.php"
},
{
"uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"identifier": "Gesamtertrag",
"middleware": "http://localhost/middleware.php"
}]
}
]
}
Alles anzeigen
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