hardware:channels:solar_inverters:kostal_pico
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
hardware:channels:solar_inverters:kostal_pico [2018/04/01 15:52] – Titel jau | hardware: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 ====== |
- | #redirect | + | |
+ | Diese Wikiseite zeigt diverse Ansätze zur Einbindung von Kostal Wechselrichtern an den Volkszähler über die Ethernetschnittstelle der Wechselrichter. | ||
+ | |||
+ | 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. Ausgangsbasis für diese Anleitung ist das vorbereitete [[howto: | ||
+ | |||
+ | ===== JSON ===== | ||
+ | |||
+ | Ü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.\\ | ||
+ | |||
+ | ^Typ ^ID ^Einheit ^ | ||
+ | | // | ||
+ | |DC-Leistung |33556736 |W | | ||
+ | |AC-Leistung |67109120 |W | | ||
+ | |PV Gesamtproduktion |251658753 |kW | | ||
+ | | // | ||
+ | |Ladezustand |33556229 |% | | ||
+ | |Ladezyklen |33556228 |Int | | ||
+ | |Temperatur |33556227 |°C | | ||
+ | |Stromspannung |33556226 |V | | ||
+ | |Stromstärke |33556238 |A | | ||
+ | |Laden/ | ||
+ | [[https:// | ||
+ | |||
+ | === Software vorbereiten === | ||
+ | Um den JSON-String vom Wechselrichter auswerten zu können ist ein zusätzliche Tool nötig. Installation mit | ||
+ | < | ||
+ | |||
+ | 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, | ||
+ | |||
+ | === Kanäle anlegen === | ||
+ | Für dieses Beispiel wurden 2 [[: | ||
+ | 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> | ||
+ | # | ||
+ | set -u | ||
+ | set -e | ||
+ | |||
+ | # preliminaries | ||
+ | HOSTNAME=" | ||
+ | shift | ||
+ | READINGS=" | ||
+ | |||
+ | URL=" | ||
+ | |||
+ | # build up URL | ||
+ | for ADDURL in $READINGS; do | ||
+ | URL=" | ||
+ | echo $URL | ||
+ | done | ||
+ | URL=$(echo $URL | sed ' | ||
+ | echo $URL | ||
+ | |||
+ | # get time and json | ||
+ | NOW=" | ||
+ | CURLOUT=$(curl --connect-timeout 5 -s $URL) | ||
+ | |||
+ | # process json | ||
+ | for READING in $READINGS; do | ||
+ | OUTPUT=$(echo $CURLOUT | jq " | ||
+ | # OUTPUT=$(cat pico.json | jq " | ||
+ | if [ -n " | ||
+ | printf "%d: %s = %s\\n" " | ||
+ | else | ||
+ | printf >&2 "no reading %s\\n" " | ||
+ | exit 1 | ||
+ | fi | ||
+ | done | ||
+ | </ | ||
+ | Unter ''/ | ||
+ | |||
+ | === vzlogger === | ||
+ | In der vzlogger-Konfiguration diesen Abschnitt hinzufügen: | ||
+ | <code vzlogger.conf json> | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }] | ||
+ | } | ||
+ | </ | ||
+ | Folgende Stellen müssen bei Bedarf angepasst werden:\\ | ||
+ | |||
+ | ''" | ||
+ | |||
+ | Im Abschnitt '' | ||
+ | Für Kanal/ID " | ||
+ | |||
+ | Das sollte es gewesen sein, vzlogger starten mit | ||
+ | < | ||
+ | |||
+ | ===== Webfrontend ===== | ||
+ | |||
+ | In dem Fall werden die als http bereitgestellten, | ||
+ | |||
+ | === Kanäle im Frontend erstellen === | ||
+ | |||
+ | Für den Wechselrichter zwei [[: | ||
+ | Kanal 1: "PV aktuelle Leistung" | ||
+ | Typ: El Energie (Leistungwerte) | ||
+ | style: steps | ||
+ | öffentlich: | ||
+ | Farbe: black | ||
+ | aktiv: x | ||
+ | |||
+ | Kanal 2: "PV Zählerstand" | ||
+ | Typ: El Energie (Zählerstände) | ||
+ | style: steps | ||
+ | öffentlich: | ||
+ | Farbe: aqua | ||
+ | aktiv: x | ||
+ | |||
+ | Der zweite Kanal ist eigentlich nicht nötig. Man kann jedoch später den Zählerstand leichter auslesen. | ||
+ | |||
+ | ==== 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. | ||
+ | |||
+ | Dieser Ansatz wurde verifiziert mit dem Kostal Piko 5.5. | ||
+ | |||
+ | === Die korrekte Installation von vzclient überprüfen === | ||
+ | |||
+ | Falls < | ||
+ | |||
+ | < | ||
+ | |||
+ | Weitere Infos unter [[: | ||
+ | |||
+ | === PHP-Skript zum Auslesen der Wechselrichter-Webseite === | ||
+ | |||
+ | Die Scriptdatei htmlvz.php und die Konfigurationsdatei htmlvz.ini im Homeverzeichnis ''/ | ||
+ | Die UUID des gewünschten Kanals sowie die anderen Parameter (hoffentlich selbsterklärend) trägt man anschließend die Datei htmlvz.ini ein: | ||
+ | < | ||
+ | [allgemein] | ||
+ | ; der Pfad zum Programm vzclient kann durch which vzclient ermittelt unter Linux werden | ||
+ | vzclient_pfad = '/ | ||
+ | logdatei = '/ | ||
+ | |||
+ | [piko] | ||
+ | user = ' | ||
+ | passwort = ' | ||
+ | wechselrichter_name = ' | ||
+ | UUID_aktuelle_leistung = ' | ||
+ | UUID_gesamtenergieerzeugung ='' | ||
+ | </ | ||
+ | |||
+ | <code php htmlvz.php> | ||
+ | <?php | ||
+ | /** | ||
+ | * Skript zum Auslesen von Kostal Piko Wechselrichter und | ||
+ | * Schreiben in die Volkszähler DB | ||
+ | * getestet mit Modell Kostal Piko 5.5 ver. 3.1 | ||
+ | * Konfig Datei htmlvz.ini muss vorher bearbeitet werden | ||
+ | * erstellt am 16.7.2013 von Karlheinz | ||
+ | * Stand: 15.09.2013 | ||
+ | */ | ||
+ | |||
+ | $ini_file = parse_ini_file(" | ||
+ | // | ||
+ | $user = $ini_file[" | ||
+ | $pwd = $ini_file[" | ||
+ | $wr = $ini_file[" | ||
+ | $UUID_gesamt = $ini_file[" | ||
+ | $UUID_aktuell = $ini_file[" | ||
+ | $logdatei = $ini_file[" | ||
+ | if (empty($logdatei)) { | ||
+ | echo " | ||
+ | exit; | ||
+ | } | ||
+ | if (empty($wr)) { | ||
+ | echo " | ||
+ | exit; | ||
+ | } | ||
+ | $url = " | ||
+ | //echo "url: $url \n"; | ||
+ | |||
+ | $contents = ''; | ||
+ | $handle = fopen ($url, " | ||
+ | //echo $handle; | ||
+ | |||
+ | while (!feof($handle)) { | ||
+ | $contents .= fread($handle, | ||
+ | } | ||
+ | fclose($handle); | ||
+ | $searchtext = array(" | ||
+ | $contents = str_replace($searchtext, | ||
+ | $full = explode("</ | ||
+ | foreach ( $full as $line) { | ||
+ | $line = strip_tags(html_entity_decode($line)); | ||
+ | //echo $line; | ||
+ | |||
+ | if ( preg_match("/ | ||
+ | {$line = str_replace(" | ||
+ | unset($line2); | ||
+ | $line2 = array_filter(explode(" | ||
+ | $line2 = array_values($line2); | ||
+ | // | ||
+ | if ($line2[1] == " | ||
+ | // | ||
+ | //add array 1 mit 0 Watt | ||
+ | $line2[5] = $line2[4]; | ||
+ | $line2[4] = $line2[3]; | ||
+ | $line2[3] = $line2[2]; | ||
+ | $line2[2] = $line2[1]; | ||
+ | $line2[1] = 0; | ||
+ | } | ||
+ | // | ||
+ | $aktuell = $line2[1]; | ||
+ | $aktuellE = $line2[2]; | ||
+ | $Gesamtenergie = $line2[4]; | ||
+ | $GesamtenergieE = $line2[5]; //Einheit von Gesamtenergie | ||
+ | //echo " | ||
+ | } | ||
+ | if ( preg_match("/ | ||
+ | //echo "$line \n"; | ||
+ | unset($line2); | ||
+ | $line2 = array_filter(explode(" | ||
+ | $line2 = array_values($line2); | ||
+ | // | ||
+ | |||
+ | $tleistung = $line2[1]; | ||
+ | $tleistungE = $line2[2]; // Einheit von tleistung | ||
+ | //echo " | ||
+ | // | ||
+ | } | ||
+ | if ( preg_match("/ | ||
+ | { $status = trim(str_replace(" | ||
+ | //echo " | ||
+ | } | ||
+ | |||
+ | } // foreach Ende | ||
+ | |||
+ | // Daten mit vzclient in die DB schreiben | ||
+ | // | ||
+ | // Zusammenfassung: | ||
+ | echo date(" | ||
+ | if (isset($UUID_aktuell) && !empty($UUID_aktuell)){ | ||
+ | //echo "\n not empty UUID aktuell Zweig \n"; | ||
+ | // | ||
+ | exec($ini_file[" | ||
+ | //echo "vzrc: $vzrc \n"; | ||
+ | if ($vzrc == 0) { | ||
+ | // | ||
+ | echo " | ||
+ | } | ||
+ | else { | ||
+ | // | ||
+ | echo " | ||
+ | } | ||
+ | } | ||
+ | if (isset($UUID_gesamt) && !empty($UUID_gesamt)) { | ||
+ | //echo "not empty UUID Gesamt Zweig \n"; | ||
+ | exec($ini_file[" | ||
+ | if ($vzrc == 0) { | ||
+ | // | ||
+ | echo " | ||
+ | } | ||
+ | else { | ||
+ | // | ||
+ | echo " | ||
+ | } | ||
+ | // | ||
+ | } | ||
+ | echo date(" | ||
+ | |||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | Das Script muss noch als ausführbar gekennzeichnet werden: | ||
+ | < | ||
+ | htmlvz ausführen: | ||
+ | < | ||
+ | 20130916222335 Erzeugung aktuell: 100 W, Gesamtenergie: | ||
+ | aktuell übertragen: | ||
+ | Gesamtenergie übertragen: | ||
+ | 20130916222337 Skriptende </ | ||
+ | |||
+ | Eine Zusammenfassung und Übertragungsbestätigung findet sich anschliessend in der log-Datei. | ||
+ | |||
+ | Um die Übertragung zu automatisieren, | ||
+ | Mit dem voreingestellten Editor hatte ich meine Probleme und habe deshalb den Editor auf nano umgestellt: | ||
+ | < | ||
+ | Anschliessend wird das Script alle fünf Minuten eingeplant: | ||
+ | < | ||
+ | */5 * * * * / | ||
+ | </ | ||
+ | crontab -l zeigt die Einplanung an. | ||
+ | |||
+ | 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 ==== | ||
+ | |||
+ | Bei diesem Ansatz erfolgt die Abfrage des Wechselrichters mit einem Shellscript, | ||
+ | |||
+ | Script: (im Beispiel abgelegt unter / | ||
+ | <code bash exec-pvwr.sh> | ||
+ | # | ||
+ | # curl --silent http:// | ||
+ | # | html2text | grep --max-count=1 ' | ||
+ | # aktuell | ||
+ | |||
+ | # catch errors | ||
+ | |||
+ | set -u | ||
+ | set -e | ||
+ | |||
+ | # preliminaries | ||
+ | |||
+ | HOSTNAME=" | ||
+ | shift | ||
+ | REPEAT=" | ||
+ | shift | ||
+ | READINGS=" | ||
+ | USERNAME=" | ||
+ | PASSWORD=" | ||
+ | URL=" | ||
+ | REGEXP=" | ||
+ | |||
+ | # SC2034 | ||
+ | for repeat in $(seq 1 " | ||
+ | NOW=" | ||
+ | |||
+ | CURLOUT=" | ||
+ | |||
+ | # pull requested readings from curl output | ||
+ | |||
+ | for READING in $READINGS; do | ||
+ | case " | ||
+ | " | ||
+ | OUTPUT=" | ||
+ | # 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" " | ||
+ | ;; | ||
+ | *) | ||
+ | # we don't have what the user asked for, print error message | ||
+ | printf >&2 "no reading %s\\n" " | ||
+ | exit 1 | ||
+ | ;; | ||
+ | esac | ||
+ | done | ||
+ | if [ " | ||
+ | sleep 30 | ||
+ | fi | ||
+ | done | ||
+ | </ | ||
+ | |||
+ | === vzlogger.conf === | ||
+ | Im Aufruf des Scripts (" | ||
+ | Es sind auch die UUID der Kanäle einzutragen die in der Middleware für den Wechselrichter angelegt wurden. | ||
+ | |||
+ | <code base vzlogger.conf> | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | |||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | </ | ||
+ | ===== Weiterführende Links ===== | ||
+ | |||
+ | [[:howto: | ||
+ | |||
+ | ===== Quellen ===== | ||
+ | [[https:// | ||
+ | [[https:// |
hardware/channels/solar_inverters/kostal_pico.1522590773.txt.gz · Zuletzt geändert: 2018/04/01 15:52 von jau