Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:wechselrichter_kostal_piko

Wechselrichter Kostal Piko ueber Web-Interface auslesen und im volkszaehler erfassen

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 (WR) Kostal 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: Volkszaehler auf einem Raspberry Pi installieren. 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

Kanäle im Frontend erstellen

Für den Wechselrichter habe ich zwei 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:

[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","&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";

?>

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.

Weiterführende Links: Script für Gesamt- u. Direktverbrauch

howto/wechselrichter_kostal_piko.txt · Zuletzt geändert: 2016/12/11 07:56 von jau