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] (aktuell)
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:+
-  Farbe: black +
-  aktiv: x +
- +
-  Kanal 2: "PV Zählerstand" +
-  Typ: Stromzaehler +
-  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. +
- +
-===== 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:+
-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