Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:wechselrichter_kostal_piko

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
howto:wechselrichter_kostal_piko [2018/03/21 17:38]
jau code
howto:wechselrichter_kostal_piko [2018/04/01 16:02]
jau verschoben
Zeile 1: Zeile 1:
-====== Wechselrichter Kostal Piko ueber Web-Interface auslesen und im volkszaehler erfassen ====== +=== (verschobene Seite) === 
- +#redirect hardware:channels:solar_inverters:kostal_pico
-Das Problem kennen bestimmt einige: Der Wechselrichter hat zwar meistens einen Netzwerkanschluss,​ zum lokalen Speichern der Leistung muss man trotzdem noch ein Kabel zum Controller oder Middleware verlegen. +
- +
-Dann könnte das folgende PHP-Skript interessant sein. Damit habe ich meinen Wechselrichter ​(WRKostal Piko 5.5 über das eingebaute Web-Frontend an den Volkszähler angebunden.  +
-Da der WR ohnehin die aktuelle Leistung, als auch den gesamten Stromertrag über das WR-Web-Frontend anzeigt, wollte ich diese Daten alle fünf Minuten auslesen und in die Volkszähler Datenbank schreiben. +
-Zum Auslesen und Anzeigen der Messwerte benutze ich einen Raspberry Pi.Das Script htmlvz.php liest die Parameter aus der Konfigurationsdatei htmlvz.ini und schreibt die Daten über vzclient in die entsprechenden Kanäle.  +
- +
-===== Image auf Raspberry Pi installieren ===== +
- +
-Zuerst muss das Volkszähler Image installiert werden[[raspberry_pi_image|Volkszaehler auf einem Raspberry Pi installieren]]. +
-Die korrekte Installation von vzclient überprüfen: +
-Falls <​code>​vzclient get channel</​code>​ nicht die öffentlichen Channels auflistet fehlt vielleicht: +
-<​code>​sudo ln -s /​usr/​local/​etc/​vzclient.conf /​etc/​vzclient.conf</​code>​  +
-Weitere Infos unter [[:​software:​clients:​vzclient|vzclient]] +
- +
-===== Kanäle im Frontend erstellen ===== +
- +
-Für den Wechselrichter habe ich zwei [[:​software:​middleware:​einrichtung|Kanäle]] angelegt: +
-  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. +
- +
-===== Linux Skript zum Auslesen der Wechselrichter-Webseite ===== +
-Die Scriptdatei htmlvz.php und die Konfigurationsdatei htmlvz.ini habe ich im Homeverzeichnis des Benutzers pi abgelegt (Standardverzeichnis).Du kannst die Dateien z.B. mit dem Programm psftp auf den Raspi kopieren. +
-Die UUID des gewünschten Kanals sowie die anderen Parameter (hoffentlich selbsterklärend) trägt man anschließend die Datei htmlvz.ini ein: +
-<​code>​ +
-[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 =''​ +
-</​code>​ +
- +
-<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("​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","&​nbsp"​);​ +
-    $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";​ +
- +
-?> +
-</​code>​ +
- +
-Das Script muss noch als ausführbar gekennzeichnet werden: +
-<​code>​chmod +x htmlvz.php</​code>​  +
-htmlvz ausführen:​ +
-<​code>​pi@raspberrypi ~ $ php htmlvz.php +
-20130916222335 Erzeugung aktuell: 100 W, Gesamtenergie:​ 10000 kWh, Status: Aus +
-aktuell übertragen:​ 0 +
-Gesamtenergie übertragen:​ 25822 +
-20130916222337 Skriptende </​code>​  +
- +
-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:​ +
-<​code>​$ export EDITOR=nano</​code>​  +
-Anschliessend wird das Script alle fünf Minuten eingeplant:​ +
-<​code>​$ crontab -e +
-*/5 * * * * /​usr/​bin/​php htmlvz.php >> /​home/​pi/​piko.log 2>> /​home/​pi/​piko.log +
-</​code>​  +
-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. +
- +
-Weiterführende Links: +
-[[:​howto:​emh_pv-anlage|Script für Gesamt- u. Direktverbrauch]] +
howto/wechselrichter_kostal_piko.txt · Zuletzt geändert: 2018/04/01 16:02 von jau