Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:solar_inverters:kostal_pico

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
hardware:channels:solar_inverters:kostal_pico [2019/06/04 16:08] – Link zur exec-Doku zugschlushardware:channels:solar_inverters:kostal_pico [2022/04/21 22:12] (aktuell) – [Ansatz 2: vzlogger exec-Channel] daemon & logfile jau
Zeile 1: Zeile 1:
 ====== Kostal Piko ====== ====== Kostal Piko ======
  
-Diese Wikiseite zeigt zwei Ansätze zur Einbindung von Kostal Wechselrichtern an den Volkszähler durch Auslesen des Webfrontends der Wechselrichter.+Diese Wikiseite zeigt diverse Ansätze zur Einbindung von Kostal Wechselrichtern an den Volkszähler über die Ethernetschnittstelle der Wechselrichter.
  
-Die Wechselrichter zeigen sowohl die aktuelle Leistung als auch den gesamten Stromertrag über das Webfrontend an. Diese Daten werden  ausgelesen und in die Volkszähler-Datenbank geschrieben.+Abhängig von der Firmware werden die Daten nur über ein Webfrontend (in html) ausgegeben oder zusätzlich per JSON. Gerade als JSON kann eine Vielzahl an Werten abgefragt werden, wesentlich mehr als über das Webfrontend.\\ 
 +Diese Daten werden ausgelesen und an die Volkszähler-Middleware übergeben.
  
-Zum Auslesen und Anzeigen der Messwerte genügt ein Raspberry Pi. Es ist nicht notwendig, dass Middleware und Datenbank auf demselben System liegen.+Zum Auslesen und Anzeigen der Messwerte genügt ein Raspberry Pi.  Ausgangsbasis für diese Anleitung ist das vorbereitete [[howto:raspberry_pi_image|Volkszähler-Image]]. Es ist aber nicht notwendig, dass Middleware und Datenbank auf dem selben System liegen.
  
-===== Vorarbeiten =====+===== JSON =====
  
-==== Image auf Raspberry Pi installieren ====+Über den Weg können die meisten Werte abgefragt werden, müssen aber auch konkret angefragt werden. Es gibt eine Reihe Listen in denen die dazu nötige IDs aufgelistet sind, mal mehr mal weniger Umfangreich.\\ 
 +Dem Zähler werden die IDs in einer http-Anfrage zugestellt und er antwortet mit eine strukturierten JSON in der die aktuellen Werte zu diesen IDs enthalten sind.\\
  
-Falls nicht bereits ein System mit installiertem Volkszähler vorliegt, muss zuerst muss das Volkszähler-Image (z.B. nach der [[howto:raspberry_pi_image|Anleitung]] installiert werden.+^Typ ^ID ^Einheit ^ 
 +| //Leistungswerte// ||| 
 +|DC-Leistung |33556736 |W | 
 +|AC-Leistung |67109120 |W | 
 +|PV Gesamtproduktion |251658753 |kW | 
 +| //Batterie// ||| 
 +|Ladezustand |33556229 |% | 
 +|Ladezyklen |33556228 |Int | 
 +|Temperatur |33556227 |°C | 
 +|Stromspannung |33556226 |V | 
 +|Stromstärke |33556238 |A | 
 +|Laden/Entladen |33556230 |bool | 
 +[[https://www.photovoltaikforum.com/thread/150800-kostal-piko-neue-generation-in-vzlogger/?postID=2164774#post2164774|Eine umfangreichere Liste]]
  
-==== Kanäle im Frontend erstellen ====+=== Software vorbereiten === 
 +Um den JSON-String vom Wechselrichter auswerten zu können ist ein zusätzliche Tool nötig. Installation mit 
 +<code>sudo apt install jq</code> 
 + 
 +Zur Übermittlung der Daten an die Middleware nutzen wir vzlogger mit meter-exec. Um den nutzen zu können sollte vzlogger nicht unter User root laufen. Im Image ist das vorbereitet, falls nicht nachholen: [[software/controller/vzlogger/installation_cpp-version#vzlogger_als_anderer_benutzer_ausfuehren]] 
 + 
 +=== Kanäle anlegen === 
 +Für dieses Beispiel wurden 2 [[:software:middleware:einrichtung|Kanäle]] angelegt: 
 +  Kanal 1: "PV Zählerstand" 
 +  Typ: El Energie (Zählerstände) 
 +  style: steps 
 +  öffentlich:
 +  Farbe: aqua 
 +  aktiv: x 
 + 
 +  Kanal 1: "PV aktuelle Leistung" 
 +  Typ: El Energie (Leistungwerte) 
 +  style: steps 
 +  öffentlich:
 +  Farbe: black 
 +  aktiv: x 
 +   
 +Die UUID notieren, die wird noch benötigt. 
 + 
 +=== Bash-Script === 
 +Als Bindeglied zwischen vzlogger und Wechselrichter dient ein kurzes Script. 
 +<code bash kostal.sh> 
 +#!/bin/bash 
 +set -u 
 +set -e 
 + 
 +# preliminaries 
 +HOSTNAME="$1" 
 +shift 
 +READINGS="$*" 
 + 
 +URL="http://${HOSTNAME}/api/dxs.json?" 
 + 
 +# build up URL 
 +for ADDURL in $READINGS; do 
 +    URL="${URL}dxsEntries=${ADDURL}&" 
 +    echo $URL 
 +done 
 +URL=$(echo $URL | sed 's/.$//') # remove last character (&) from URL 
 +echo $URL 
 + 
 +# get time and json 
 +NOW="$(date +%s)" 
 +CURLOUT=$(curl --connect-timeout 5 -s $URL) 
 + 
 +# process json 
 +for READING in $READINGS; do 
 +    OUTPUT=$(echo $CURLOUT | jq ".dxsEntries[] | select(.dxsId == $READING) | .value"
 +#    OUTPUT=$(cat pico.json | jq ".dxsEntries[] | select(.dxsId == $READING) | .value"
 +    if [ -n "$OUTPUT" ]; then # only if value present 
 +        printf "%d: %s = %s\\n" "${NOW}" "${READING}" "${OUTPUT}" 
 +    else 
 +        printf >&2 "no reading %s\\n" "${READING}" 
 +        exit 1 
 +    fi 
 +done 
 +</code> 
 +Unter ''/usr/local/bin/kostal.sh'' ablegen und mit ''chmod +x'' ausführbar machen. 
 + 
 +=== vzlogger === 
 +In der vzlogger-Konfiguration diesen Abschnitt hinzufügen: 
 +<code vzlogger.conf json> 
 +        { 
 +            "enabled": true, 
 +            "allowskip": true, 
 +            "protocol": "exec", 
 +            "command": "/usr/local/bin/kostal.sh 192.168.1.99 251658753 67109120", 
 +            "format": "$t: $i = $v", 
 +            "interval": 10, 
 +            "channels": 
 +                { 
 +                    "uuid": "c673b290-fdac-11e0-a470-1d9351203a00", 
 +                    "identifier": "251658753", 
 +                    "middleware": "http://localhost/middleware.php" 
 +                }, 
 +                { 
 +                    "uuid": "e640a820-7a2a-11e8-b04b-0fe628c3aa8d", 
 +                    "identifier": "67109120", 
 +                    "middleware": "http://localhost/middleware.php" 
 +                }] 
 +        } 
 +</code> 
 +Folgende Stellen müssen bei Bedarf angepasst werden:\\ 
 + 
 +''"command": "/usr/local/bin/kostal.sh 192.168.1.99 251658753 67109120"'' sagt vzlogger wo er das Script findet (/usr/local/bin/kostal.sh), welche IP-Adresse der Wechselrichter hat (192.168.1.99) und welche IDs (in dem Fall 2: 251658753 & 67109120) abgefragt werden sollen. Möchte man mehr Daten holen die gewünschten IDs einfach, durch ein Leerzeichen getrennt, anhängen.\\ 
 + 
 +Im Abschnitt ''channels'' weisen wir dann die IDs den bereits erstellten Kanälen zu. ''"identifier": "251658753"'' Die ID steht für Gesamtertrag und entspricht einem Zählerstand. Dementsprechend steht im selben Abschnitt unter ''"uuid": "c673b290-fdac-11e0-a470-1d9351203a00"'' die tatsächliche UUID des Kanals (die UUID hier ist nur ein Platzhalter).\\ 
 +Für Kanal/ID "aktuelle Leistung" (oder auch zusätzliche) gilt das Selbe.\\ 
 + 
 +Das sollte es gewesen sein, vzlogger starten mit 
 +<code>sudo systemctl start vzlogger</code> 
 + 
 +===== Webfrontend ===== 
 + 
 +In dem Fall werden die als http bereitgestellten, aktuellen Werte angefordert und maschinell extrahiert. Es gibt 2 Lösungsansätze dazu. 
 + 
 +=== Kanäle im Frontend erstellen ===
  
 Für den Wechselrichter zwei [[:software:middleware:einrichtung|Kanäle]] anlegen: Für den Wechselrichter zwei [[:software:middleware:einrichtung|Kanäle]] anlegen:
   Kanal 1: "PV aktuelle Leistung"   Kanal 1: "PV aktuelle Leistung"
-  Typ: Stromsensor+  Typ: El Energie (Leistungwerte)
   style: steps   style: steps
   öffentlich: x   öffentlich: x
Zeile 24: Zeile 139:
  
   Kanal 2: "PV Zählerstand"   Kanal 2: "PV Zählerstand"
-  Typ: Stromzaehler+  Typ: El Energie (Zählerstände)
   style: steps   style: steps
   öffentlich: x   öffentlich: x
Zeile 32: Zeile 147:
 Der zweite Kanal ist eigentlich nicht nötig. Man kann jedoch später den Zählerstand leichter auslesen. Der zweite Kanal ist eigentlich nicht nötig. Man kann jedoch später den Zählerstand leichter auslesen.
  
-===== Ansatz 1: PHP-Script und vzclient =====+==== Ansatz 1: PHP-Script und vzclient ====
  
 Das Script htmlvz.php liest die Parameter aus der Konfigurationsdatei htmlvz.ini und schreibt die Daten über vzclient in die entsprechenden Kanäle.  Das Script htmlvz.php liest die Parameter aus der Konfigurationsdatei htmlvz.ini und schreibt die Daten über vzclient in die entsprechenden Kanäle. 
Zeile 38: Zeile 153:
 Dieser Ansatz wurde verifiziert mit dem Kostal Piko 5.5. Dieser Ansatz wurde verifiziert mit dem Kostal Piko 5.5.
  
-==== Die korrekte Installation von vzclient überprüfen ====+=== Die korrekte Installation von vzclient überprüfen ===
  
 Falls <code>vzclient get channel</code> nicht die öffentlichen Channels auflistet, fehlt vielleicht: Falls <code>vzclient get channel</code> nicht die öffentlichen Channels auflistet, fehlt vielleicht:
Zeile 46: Zeile 161:
 Weitere Infos unter [[:software:clients:vzclient|vzclient]] Weitere Infos unter [[:software:clients:vzclient|vzclient]]
  
-==== PHP-Skript zum Auslesen der Wechselrichter-Webseite ====+=== PHP-Skript zum Auslesen der Wechselrichter-Webseite ===
  
 Die Scriptdatei htmlvz.php und die Konfigurationsdatei htmlvz.ini im Homeverzeichnis ''/home/pi'' des Benutzers pi ablegen. Die Scriptdatei htmlvz.php und die Konfigurationsdatei htmlvz.ini im Homeverzeichnis ''/home/pi'' des Benutzers pi ablegen.
Zeile 208: Zeile 323:
 Wenn das Script bereits einige Male manuell ausgeführt wurde, kann man im VZ-Frontend die öffentlichen Kanäle anzeigen. Wenn das Script bereits einige Male manuell ausgeführt wurde, kann man im VZ-Frontend die öffentlichen Kanäle anzeigen.
  
-===== Ansatz 2: vzlogger exec-Channel =====+==== Ansatz 2: vzlogger exec-Channel ====
  
-Bei diesem Ansatz erfolgt die Abfrage des Wechselrichters mit einem Shellscript, das vom vzlogger regelmäßig mit einem vzlogger [[software:controller:vzlogger:vzlogger_conf_parameter#exec|exec-Kanal]] aufgerufen wird. Ein dedizierter Cronjob oder vzclient sind hierbei nicht notwendig. Dieser Ansatz wurde verifiziert im Juni 2019 mit einem Kostal Piko 4.2 und Debian buster.+Bei diesem Ansatz erfolgt die Abfrage des Wechselrichters mit einem Shellscript, das vom vzlogger regelmäßig mit einem vzlogger [[software:controller:vzlogger:vzlogger_conf_parameter#exec|exec-Kanal]] aufgerufen wird. Ein dedizierter Cronjob oder vzclient sind hierbei nicht notwendig. Dieser Ansatz wurde verifiziert im Juni 2019 mit einem Kostal Piko 4.2 und Debian Buster.
  
 +Script: (im Beispiel abgelegt unter /home/pi/)
 +<code bash exec-pvwr.sh>
 +#!/bin/bash
 +# curl --silent http://pvserver:password@pvwr01.example/index.fhtml
 +#  | html2text | grep --max-count=1 'aktuell.*Gesamtenergie'
 +#  aktuell    50   WGesamtenergie 23257   kWh                            
 +
 +# catch errors
 +
 +set -u
 +set -e
 +
 +# preliminaries
 +
 +HOSTNAME="$1"
 +shift
 +REPEAT="$1"
 +shift
 +READINGS="$*"
 +USERNAME="pvserver"
 +PASSWORD="password"
 +URL="http://${USERNAME}:${PASSWORD}@${HOSTNAME}/index.fhtml"
 +REGEXP="aktuell.*Gesamtenergie"
 +
 +# SC2034
 +for repeat in $(seq 1 "${REPEAT}"); do
 +        NOW="$(date +%s)"
 +
 +        CURLOUT="$(curl --silent "${URL}" | html2text | grep --max-count=1 "${REGEXP}")"
 +
 +        # pull requested readings from curl output
 +
 +        for READING in $READINGS; do
 +                case "$READING" in
 +                  "Gesamtenergie"|"aktuell")
 +                        OUTPUT="$(printf "%s\\n" "${CURLOUT}" | sed -n "/.*${READING}[[:space:]]\\+\\([[:digit:]]\\+\\).*/{s//\\1/;p;q;}")"
 +                        # PVWR prints "x x x" in the dark, that is parsed
 +                        # into the empty string by the sed regexp, make
 +                        # that zero here
 +                        printf "%d: %s = %d\\n" "${NOW}" "${READING}" "${OUTPUT:-0}"
 +                        ;;
 +                  *)
 +                        # 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 30
 +        fi
 +done
 +</code>
 +
 +=== vzlogger.conf ===
 +Im Aufruf des Scripts ("command") ist die IP-Adresse (oder URL) des Wechselrichters und bei Bedarf Pfad und Durchläufe des Scripts (3) anzupassen.
 +Es sind auch die UUID der Kanäle einzutragen die in der Middleware für den Wechselrichter angelegt wurden.
 +
 +<code base vzlogger.conf>
 +{
 +"retry" : 0,
 +"verbosity" : 0,
 +"log" : "/var/log/vzlogger/vzlogger.log",
 + 
 +"local" : {
 +        "enabled" : false,
 +        "port" : 8081,
 +        "index" : true,
 +        "timeout" : 0,
 +        "buffer" : 0
 +},
 + 
 +"meters" : [
 +        {
 +            "enabled": true,
 +            "allowskip": true,
 +            "protocol": "exec",
 +            "command": "/home/pi/exec-pvwr.sh 192.168.1.11 3 Gesamtenergie 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": "Gesamtenergie",
 +                    "middleware": "http://localhost/middleware.php"
 +                }
 +            ]
 +        }
 +    ]
 +}
 +</code>
 ===== Weiterführende Links ===== ===== Weiterführende Links =====
  
 [[:howto:emh_pv-anlage|Script für Gesamt- u. Direktverbrauch]] [[:howto:emh_pv-anlage|Script für Gesamt- u. Direktverbrauch]]
  
 +===== Quellen =====
 +[[https://www.loxwiki.eu/pages/viewpage.action?pageId=28803569]]\\
 +[[https://www.photovoltaikforum.com/thread/150800-kostal-piko-neue-generation-in-vzlogger/]]
hardware/channels/solar_inverters/kostal_pico.1559657282.txt.gz · Zuletzt geändert: 2019/06/04 16:08 von zugschlus