Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Kostal Piko
Diese Wikiseite zeigt zwei Ansätze zur Einbindung von Kostal Wechselrichtern an den Volkszähler durch Auslesen des Webfrontends 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.
Zum Auslesen und Anzeigen der Messwerte genügt ein Raspberry Pi. Es ist nicht notwendig, dass Middleware und Datenbank auf demselben System liegen.
Vorarbeiten
Image auf Raspberry Pi installieren
Falls nicht bereits ein System mit installiertem Volkszähler vorliegt, muss zuerst muss das Volkszähler-Image (z.B. nach der Anleitung installiert werden.
Kanäle im Frontend erstellen
Für den Wechselrichter zwei Kanäle anlegen:
Kanal 1: "PV aktuelle Leistung" Typ: Stromsensor style: steps öffentlich: x Farbe: black aktiv: x
Kanal 2: "PV Zählerstand" Typ: Stromzaehler style: steps öffentlich: x 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
vzclient get channel
nicht die öffentlichen Channels auflistet, fehlt vielleicht:
sudo ln -s /usr/local/etc/vzclient.conf /etc/vzclient.conf
Weitere Infos unter vzclient
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 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 = '/usr/local/bin/vzclient' logdatei = '/home/pi/piko.log' [piko] user = 'pvserver' ; user = Anmeldename des Wechselrichters passwort = 'pvwr' ; Passwort dazu wechselrichter_name = 'kostal' ; Name oder IP-Adresse des WR UUID_aktuelle_leistung = 'abc-defg-hij' UUID_gesamtenergieerzeugung =''
- 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("htmlvz.ini", TRUE); //print_r($ini_file); $user = $ini_file["piko"]["user"]; // User-Name i.d.R. pvserver $pwd = $ini_file["piko"]["passwort"]; // Passwort des WR $wr = $ini_file["piko"]["wechselrichter_name"]; // Name oder IP-Adresse des Wechselrichters $UUID_gesamt = $ini_file["piko"]["UUID_gesamtenergieerzeugung"]; //Zielkanal im VZ $UUID_aktuell = $ini_file["piko"]["UUID_aktuelle_leistung"]; $logdatei = $ini_file["allgemein"]["logdatei"]; if (empty($logdatei)) { echo "ini-Parameter logdatei muss gefüllt werden!"; exit; } if (empty($wr)) { echo "ini-Parameter wechselrichter_name muss gefüllt werden!"; exit; } $url = "http://$user:$pwd@$wr/index.fhtml"; //echo "url: $url \n"; $contents = ''; $handle = fopen ($url, "r"); //echo $handle; while (!feof($handle)) { $contents .= fread($handle, 8192); } fclose($handle); $searchtext = array("\r","\n"," "); $contents = str_replace($searchtext, "",$contents); //lösche Return u. so $full = explode("</tr>",$contents); // erzeugt ein array mit </tr> als Trennung foreach ( $full as $line) { $line = strip_tags(html_entity_decode($line)); //lösche HTML Tags //echo $line; if ( preg_match("/aktuell/",$line)) {$line = str_replace(" x x x","0",trim($line)); unset($line2); $line2 = array_filter(explode(" ",$line)); // durch Leerzeichen trennen u. leere Felder löschen $line2 = array_values($line2); // array Index neu sortieren //print_r($line2); if ($line2[1] == "W") { //unterschiedliche Anzeige Status An und Aus //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; } //print_r($line2); $aktuell = $line2[1]; $aktuellE = $line2[2]; //Einheit von aktuell $Gesamtenergie = $line2[4]; $GesamtenergieE = $line2[5]; //Einheit von Gesamtenergie //echo "aktuell: $aktuell $aktuellE \nGesamtenergie: $Gesamtenergie $GesamtenergieE \n"; } if ( preg_match("/Tagesenergie/",$line)) { //echo "$line \n"; unset($line2); $line2 = array_filter(explode(" ",$line)); // durch Leerzeichen trennen u. leere Felder löschen $line2 = array_values($line2); // array Index neu sortieren //print_r($line2); $tleistung = $line2[1]; // str_replace("Tagesenergie","",$line); $tleistungE = $line2[2]; // Einheit von tleistung //echo "Tagesenergie: $tleistung $tleistungE \n"; //print_r($line2); } if ( preg_match("/Status/",$line)) { $status = trim(str_replace("Status","",$line)); //echo "Status: $status \n"; } } // foreach Ende // Daten mit vzclient in die DB schreiben //shell_exec("date >> $logdatei"); // Zusammenfassung: echo date("YmdGis"), " Erzeugung aktuell: $aktuell $aktuellE, Gesamtenergie: $Gesamtenergie $GesamtenergieE, Status: $status \n"; if (isset($UUID_aktuell) && !empty($UUID_aktuell)){ //echo "\n not empty UUID aktuell Zweig \n"; //shell_exec($ini_file["allgemein"]["vzclient_pfad"]." -u $UUID_aktuell add data value=$aktuell 2>> $logdatei"); exec($ini_file["allgemein"]["vzclient_pfad"]." -u $UUID_aktuell add data value=$aktuell ", $output, $vzrc); //echo "vzrc: $vzrc \n"; if ($vzrc == 0) { //shell_exec("echo aktuell übertragen: $aktuell >> $logdatei"); echo "aktuell übertragen: $aktuell \n"; } else { //shell_exec("echo Übertragung nicht erfolgreich! $output >> $logdatei"); echo "Übertragung nicht erfolgreich: $output \n"; } } if (isset($UUID_gesamt) && !empty($UUID_gesamt)) { //echo "not empty UUID Gesamt Zweig \n"; exec($ini_file["allgemein"]["vzclient_pfad"]." -u $UUID_gesamt add data value=$Gesamtenergie ", $output, $vzrc); if ($vzrc == 0) { //shell_exec("echo Gesamtenergie übertragen: $Gesamtenergie >> $logdatei"); echo "Gesamtenergie übertragen: $Gesamtenergie \n"; } else { //shell_exec("echo Übertragung nicht erfolgreich! $output >> $logdatei"); echo "Übertragung nicht erfolgreich: $output \n"; } //shell_exec("echo Gesamtenergie übertragen: $Gesamtenergie >> $logdatei"); } echo date("YmdGis"), " Skriptende"; ?>
Das Script muss noch als ausführbar gekennzeichnet werden:
chmod +x htmlvz.php
htmlvz ausführen:
pi@raspberrypi ~ $ php htmlvz.php 20130916222335 Erzeugung aktuell: 100 W, Gesamtenergie: 10000 kWh, Status: Aus aktuell übertragen: 0 Gesamtenergie übertragen: 25822 20130916222337 Skriptende
Eine Zusammenfassung und Übertragungsbestätigung findet sich anschliessend in der log-Datei.
Um die Übertragung zu automatisieren, wird ein Cron-Job erstellt: Mit dem voreingestellten Editor hatte ich meine Probleme und habe deshalb den Editor auf nano umgestellt:
$ export EDITOR=nano
Anschliessend wird das Script alle fünf Minuten eingeplant:
$ crontab -e */5 * * * * /usr/bin/php htmlvz.php >> /home/pi/piko.log 2>> /home/pi/piko.log
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, das vom vzlogger regelmäßig mit einem exec-Channel aufgerufen wird. Ein dedizierter Cronjob oder vzclient sind hierbei nicht notwendig.