WR Kostal Piko 5.5 Skript Update

Hallo zusammen,
ich konnte mich nicht mehr an den ursprünglichen Beitrag zum Skript von „Ziege-One“ hängen. Also habe ich einen Neuen Beitrag geschrieben.

Ich habe das Skript um eine Funktion für das Auslesen der aktuellen Tagesenergie ergänzt und das Skript IPS 2.5 kompatibel gemacht.

Nach dem Anlegen der Variablen müssen im Skript die Variablen IDs geändert werden.

Grüße
Markus


?
/*

File     : Piko Solar.php
Trigger  :
Interval :
Kostal piko 5.5


*/

   $url = "http://pvserver:pvwr@xxx.xxx.xxx.xxx";  // Hier die Webseite vom Websever eintragen pvserver = user und pvwr = Password

   $Ausgabe = file_get_contents("$url", "r");

    //AC-Leistung_Aktuel

   $pos1 = strpos($Ausgabe,"aktuell</td>");
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+65),$pos2-$pos1-65);
   $data1 = (float) $data;
   SetValueFloat(13812 /*[Photovoltaik\AC-Leistung_Aktuell]*/, $data1);
   echo "AC_Leistung_Aktuell: ";
   echo $data1;
   echo "
";

   //AC_Leistung_Status

   $pos1 = strpos($Ausgabe,"Status</td>");
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+33),$pos2-$pos1-33);
   //$data1 = (float) $data;
   SetValueString(13325 /*[Photovoltaik\AC-Leistung_Status]*/, $data);
   echo "AC_Leistung_Status: ";
   echo $data;
   echo "
";

   //Energie_Gesamtertrag

   $pos1 = strpos($Ausgabe,"Gesamtenergie</td>");
   $pos2 = strpos($Ausgabe,"</td>",$pos1+30);
   $data = substr($Ausgabe,($pos1+70),$pos2-$pos1-70);
   $data1 = (float) $data;
   SetValueFloat(37729 /*[Photovoltaik\Energie_Gesamtertrag]*/, $data1);
   echo "Energie_Gesamtertrag: ";
   echo $data1;
   echo "
";

   //Energie_Tagesertrag_Aktuell

   $pos1 = strpos($Ausgabe,"Tagesenergie</td>");
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+70),$pos2-$pos1-70);
   $data1 = (float) $data;
   SetValueFloat(56744 /*[Photovoltaik\Energie_Tagesertrag_Aktuell]*/,$data1);
   echo "Energie_Tagesertrag_Aktuell: ";
   echo $data1;
   echo "
";

   //PV_Generator_String1_Spannung

   $pos1 = strpos($Ausgabe,"Spannung</td>",$pos2);
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+66),$pos2-$pos1-66);
   $data1 = (float) $data;
   SetValueFloat(10873 /*[Photovoltaik\PV-Generator_String1_Spannung]*/, $data1);
   echo "PV_Generator_String1_Spannung: ";
   echo $data1;
   echo "
";

   //Ausgangsleistung_L1_Spannung

   $pos1 = strpos($Ausgabe,"Spannung</td>",$pos2);
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+66),$pos2-$pos1-66);
   $data1 = (float) $data;
   SetValueFloat(22705 /*[Photovoltaik\Ausgangsleistung_L1_Spannung]*/, $data1);
   echo "Ausgangsleistung_L1_Spannung: ";
   echo $data1;
   echo "
";

   //PV_Generator_String1_Strom

   $pos1 = strpos($Ausgabe,"Strom</td>",$pos2);
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+63),$pos2-$pos1-63);
   $data1 = (float) $data;
   SetValueFloat(49567 /*[Photovoltaik\PV-Generator_String1_Strom]*/, $data1);
   echo "PV_Generator_String1_Strom: ";
   echo $data1;
   echo "
";

   //Ausgangsleistung_L1_Leistung

   $pos1 = strpos($Ausgabe,"Leistung</td>",$pos2);
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+66),$pos2-$pos1-66);
   $data1 = (float) $data;
   SetValueFloat(34679 /*[Photovoltaik\Ausgangsleistung_L1_Leistung]*/, $data1);
   echo "Ausgangsleistung_L1_Leistung: ";
   echo $data1;
   echo "
";

   //PV_Generator_String2_Spannung

   $pos1 = strpos($Ausgabe,"Spannung</td>",$pos2);
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+66),$pos2-$pos1-66);
   $data1 = (float) $data;
   SetValueFloat(55218 /*[Photovoltaik\PV-Generator_String2_Spannung]*/, $data1);
   echo "PV_Generator_String2_Spannung: ";
   echo $data1;
   echo "
";

   //Ausgangsleistung_L2_Spannung

   $pos1 = strpos($Ausgabe,"Spannung</td>",$pos2);
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+66),$pos2-$pos1-66);
   $data1 = (float) $data;
   SetValueFloat(26528 /*[Photovoltaik\Ausgangsleistung_L2_Spannung]*/, $data1);
   echo "Ausgangsleistung_L2_Spannung: ";
   echo $data1;
   echo "
";

   //PV_Generator_String2_Strom

   $pos1 = strpos($Ausgabe,"Strom</td>",$pos2);
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+63),$pos2-$pos1-63);
   $data1 = (float) $data;
   SetValueFloat(54377 /*[Photovoltaik\PV-Generator_String2_Strom]*/, $data1);
   echo "PV_Generator_String2_Strom: ";
   echo $data1;
   echo "
";

   //Ausgangsleistung_L2_Leistung

   $pos1 = strpos($Ausgabe,"Leistung</td>",$pos2);
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+66),$pos2-$pos1-66);
   $data1 = (float) $data;
   SetValueFloat(19114 /*[Photovoltaik\Ausgangsleistung_L2_Leistung]*/, $data1);
   echo "Ausgangsleistung_L2_Leistung: ";
   echo $data1;
   echo "
";

   //PV_Generator_String3_Spannung

   $pos1 = strpos($Ausgabe,"Spannung</td>",$pos2);
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+66),$pos2-$pos1-66);
   $data1 = (float) $data;
   SetValueFloat(57986 /*[Photovoltaik\PV-Generator_String3_Spannung]*/, $data1);
   echo "PV_Generator_String3_Spannung: ";
   echo $data1;
   echo "
";

   //Ausgangsleistung_L3_Spannung

   $pos1 = strpos($Ausgabe,"Spannung</td>",$pos2);
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+66),$pos2-$pos1-66);
   $data1 = (float) $data;
   SetValueFloat(46833 /*[Photovoltaik\Ausgangsleistung_L3_Spannung]*/, $data1);
   echo "Ausgangsleistung_L3_Spannung: ";
   echo $data1;
   echo "
";

   //PV_Generator_String3_Strom

   $pos1 = strpos($Ausgabe,"Strom</td>",$pos2);
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+63),$pos2-$pos1-63);
   $data1 = (float) $data;
   SetValueFloat(35947 /*[Photovoltaik\PV-Generator_String3_Strom]*/, $data1);
   echo "PV_Generator_String3_Strom: ";
   echo $data1;
   echo "
";

   //Ausgangsleistung_L3_Leistung

   $pos1 = strpos($Ausgabe,"Leistung</td>",$pos2);
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20);
   $data = substr($Ausgabe,($pos1+66),$pos2-$pos1-66);
   $data1 = (float) $data;
   SetValueFloat(18457 /*[Photovoltaik\Ausgangsleistung_L3_Leistung]*/, $data1);
   echo "Ausgangsleistung_L3_Leistung: ";
   echo $data1;
   echo "
";



?>

So ganz verstehe ich den Teil, der den Tagesertrag liefern soll nicht ganz.
Und zwar den Code:



 $zeit = date("H:i", time()); 

   if ($zeit == "23:59"){ 
   SetValueFloat(39184 /*[Photovoltaik\Energie_Gesamtertrag_Tag]*/, 0); 
   } 

....

// Tagesertrag 

   $aktuell = GetValueFloat(13812 /*[Photovoltaik\AC-Leistung_Aktuell]*/); 
   $Tag = GetValueFloat(39184 /*[Photovoltaik\Energie_Gesamtertrag_Tag]*/); 

   //$aktuell = $aktuell / 1000; 

   $Tagneu = ($aktuell / 60) + $Tag; 

   SetValueFloat(39184 /*[Photovoltaik\Energie_Gesamtertrag_Tag]*/, $Tagneu); 


Der Tagesertrag wird ja schon direkt vom Kostal geliefert:


 //Energie_Tagesertrag_Aktuell 

   $pos1 = strpos($Ausgabe,"Tagesenergie</td>"); 
   $pos2 = strpos($Ausgabe,"</td>",$pos1+20); 
   $data = substr($Ausgabe,($pos1+70),$pos2-$pos1-70); 
   $data1 = (float) $data; 
   SetValueFloat(56744 /*[Photovoltaik\Energie_Tagesertrag_Aktuell]*/,$data1); 
   echo "Energie_Tagesertrag_Aktuell: "; 
   echo $data1; 
   echo "
"; 

Hallo,
das war mein Fehler im ursprünglichen Script hat „Ziege-One“ den Tagesertrag berechnet. Ich habe den Teil eingefügt, mit dem der Wert von Kostal geholt wird. Hab vor dem Posten vergessen einen Teil des Skriptes zu löschen.
Wenn du den Tagesertrag berechnen willst, muß auch die auskommentierte Zeile: //$aktuell = $aktuell / 1000; wieder ins Skript rein damit richtig gerechnet wird. Ich werte jetzt aber den Wert vom Kostal Wechselrichter aus und berechne nichts im Script.

Markus

Ja, so mache ich es jetzt auch. Vielleicht magst Du Dein Skript im 1. Post ja anpassen.

Hab das Script in Post 1 überarbeitet.
Markus

In welchen Abständen fragt ihr die Daten ab?

Alle min?
Alle Std?

LG
Manfred

Hallo,

ich hole die Daten alle 5 Minuten, da das Online-Portal auch ein solches Intervall hat. Außerdem ist es total spannend die Werte in kurzen Abständen zu sehen wenn man neu ins Voltaikgeschäft eingestiegen ist. :-))

Viele Grüße aus dem Unterallgäu
Harry

Gesendet von meinem HTC Desire mit Tapatalk 2

Hallo!

Gibt es auch eine Möglichkeit die Analogeingänge des Piko auszuwerten?
AI1 Einstrahlung
AI2 Modultemperatur
AI3 Umgebungstemperatur

Mich würde die Abhängigkeit von Einstrahlung, Modultemperatur und Produktion interessieren.

Kann mir da jemand weiterhelfen? Oder hat das jemand schon bei sich gemacht??

LG
Manza

Hallo!

Hat von euch schon wer einen neuen Piko in IPS eingebunden?
Die Positionen der Daten die abgefragt stimmt mit den des alten Piko nicht mehr überein :(:confused:

Falls das schon jemand gemacht hat, könnte er hier die Änderungen bekanntgeben??
Hab einen Anlagenteil erweitert und jetzt kommt nur mehr Müll aus dem WR :eek::eek:

LG
Manza

Wollte mal schnell DANKE! sagen für das Skript. Habe eben meinen Kostal Piko 10.1 ganz fix damit in meine IPS eingebunden. Super

tango

Hallo zusammen,

nach dem neuen Update von Kostal für die Piko-Wechselrichter (Oktober 2015) funktioniert das Ausleseskript leider nicht mehr. Der Web-Server wurde komplett überarbeitet.

Durch den neuen Webserver stehen aber auch noch mehr Werte zur Verfügung.

Ich habe die Kommunikation einmal analysiert und ein passendes neues Ausleseskript zusammengestellt.

Grüße
Matthias


<?
// Ausleseskript Wechselrichter Kostal Piko ab Firmware v05.31 (12.10.2015)

//Kommunikation
$IPAdresse = "192.168.178.224";

//Leistungswerte
$ID_DCEingangGesamt = 33556736;         // in W
$ID_Ausgangsleistung = 67109120;        // in W
$ID_Eigenverbrauch = 83888128;          // in W
//Status
$ID_Status = 16780032;                  // 0:Off
//Statistik - Tag
$ID_Ertrag_d = 251658754;               // in Wh
$ID_Hausverbrauch_d = 251659010;        // in Wh
$ID_Eigenverbrauch_d = 251659266;       // in Wh
$ID_Eigenverbrauchsquote_d = 251659278; // in %
$ID_Autarkiegrad_d = 251659279;         // in %
//Statistik - Gesamt
$ID_Ertrag_G = 251658753;               // in kWh
$ID_Hausverbrauch_G = 251659009;        // in kWh
$ID_Eigenverbrauch_G = 251659265;       // in kWh
$ID_Eigenverbrauchsquote_G = 251659280; // in %
$ID_Autarkiegrad_G = 251659281;         // in %
$ID_Betriebszeit = 251658496;           // in h
//Momentanwerte - PV Genertor
$ID_DC1Spannung = 33555202;             // in V
$ID_DC1Strom = 33555201;                // in A
$ID_DC1Leistung = 33555203;             // in W
$ID_DC2Spannung = 33555458;             // in V
$ID_DC2Strom = 33555457;                // in A
$ID_DC2Leistung = 33555459;             // in W
//Momentanwerte Haus
$ID_HausverbrauchSolar = 83886336;      // in W
$ID_HausverbrauchBatterie = 83886592;   // in W
$ID_HausverbrauchNetz = 83886848;       // in W
$ID_HausverbrauchPhase1 = 83887106;     // in W
$ID_HausverbrauchPhase2 = 83887362;     // in W
$ID_HausverbrauchPhase3 = 83887618;     // in W
//Netz Netzparameter
$ID_NetzAusgangLeistung = 67109120;     // in W
$ID_NetzFrequenz = 67110400;            // in Hz
$ID_NetzCosPhi = 67110656;
//Netz Phase 1
$ID_P1Spannung = 67109378;              // in V
$ID_P1Strom = 67109377;                 // in A
$ID_P1Leistung = 67109379;              // in W
//Netz Phase 2
$ID_P2Spannung = 67109634;              // in V
$ID_P2Strom = 67109633;                 // in A
$ID_P2Leistung = 67109635;              // in W
//Netz Phase 3
$ID_P3Spannung = 67109890;              // in V
$ID_P3Strom = 67109889;                 // in A
$ID_P3Leistung = 67109891;              // in W

$url = "http://".$IPAdresse."/api/dxs.json".
"?dxsEntries=".$ID_Ertrag_d.
"&dxsEntries=".$ID_Hausverbrauch_d.
"&dxsEntries=".$ID_Eigenverbrauch_d.
"&dxsEntries=".$ID_Eigenverbrauchsquote_d.
"&dxsEntries=".$ID_Autarkiegrad_d.
"&sessionId=3378188426";
$response = file_get_contents("$url", "r");
$dataObject = json_decode($response);
echo "Ertrag Tag=                  ".$dataObject->dxsEntries[0]->value."Wh".chr(13);
echo "Eigenverbrauchsquote Tag=    ".$dataObject->dxsEntries[3]->value."%".chr(13);

$url = "http://".$IPAdresse."/api/dxs.json".
"?dxsEntries=".$ID_Ertrag_G.
"&dxsEntries=".$ID_Hausverbrauch_G.
"&dxsEntries=".$ID_Eigenverbrauch_G.
"&dxsEntries=".$ID_Eigenverbrauchsquote_G.
"&dxsEntries=".$ID_Autarkiegrad_G.
"&dxsEntries=".$ID_Betriebszeit.
"&sessionId=3378188426";
$response = file_get_contents("$url", "r");
$dataObject = json_decode($response);
echo "Ertrag Gesamt=               ".$dataObject->dxsEntries[0]->value."kWh".chr(13);
echo "Eigenverbrauchsquote Gesamt= ".$dataObject->dxsEntries[3]->value."%".chr(13);

?>

Guten Abend zusammen,

ich hoffe ich trete hier keinem mit meiner ungewöhnlichen Frage auf dem Schlipps. Ich habe nichts mit IPsymcon zu ton und auch nicht vor dieses zu nutzen ich bin durch Zufall auf diesen Thread gestoßen.
Warum bin ich hier gelandet.
Ich habe einen Kostal piko den ich auf die aktuellste SW Version geupdatet habe nun habe ich dieses php skript um die Daten in meinem Volkszähler zu verarbeiten

<?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 
";

    $contents = '';
    $handle = fopen ($url, "r");
    //echo $handle;

    while (!feof($handle)) {
        $contents .= fread($handle, 8192);
    }
    fclose($handle);
    $searchtext = array("\r","
","&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 
Gesamtenergie: $Gesamtenergie $GesamtenergieE 
";
        }
	if ( preg_match("/Tagesenergie/",$line)) {
            //echo "$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);

            $tleistung = $line2[1];  // str_replace("Tagesenergie","",$line);
	    $tleistungE = $line2[2]; // Einheit von tleistung
            //echo "Tagesenergie: $tleistung $tleistungE 
";
	    //print_r($line2);
        }
        if ( preg_match("/Status/",$line))
            { $status = trim(str_replace("Status","",$line));
            //echo "Status: $status 
";
        }

    } // 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 
";
    if (isset($UUID_aktuell) && !empty($UUID_aktuell)){
	//echo "
 not empty UUID aktuell Zweig 
";
        //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 
";
	if ($vzrc == 0) {
	    //shell_exec("echo aktuell übertragen: $aktuell >> $logdatei");
	    echo "aktuell übertragen: $aktuell 
";
	}
	else {
	    //shell_exec("echo Übertragung nicht erfolgreich! $output >> $logdatei");
	    echo "Übertragung nicht erfolgreich: $output 
";
	}
    }
    if (isset($UUID_gesamt) && !empty($UUID_gesamt)) {
	//echo "not empty UUID Gesamt Zweig 
";
        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 
";
	}
	else {
	    //shell_exec("echo Übertragung nicht erfolgreich! $output >> $logdatei");
	    echo "Übertragung nicht erfolgreich: $output 
";
	}
        //shell_exec("echo Gesamtenergie übertragen: $Gesamtenergie >> $logdatei");
    }
    echo date("YmdGis"), " Skriptende";

?>

Leider scheint es nicht mehr mit dieser Version zu funktionieren bekomme immer diese Fehlermeldung.

php htmlvz.php
20161214130604PHP Notice:  Undefined variable: aktuell in /home/pi/htmlvz.php on line 89
PHP Notice:  Undefined variable: aktuellE in /home/pi/htmlvz.php on line 89
PHP Notice:  Undefined variable: Gesamtenergie in /home/pi/htmlvz.php on line 89
PHP Notice:  Undefined variable: GesamtenergieE in /home/pi/htmlvz.php on line 89
PHP Notice:  Undefined variable: status in /home/pi/htmlvz.php on line 89
 Erzeugung aktuell:  , Gesamtenergie:  , Status:
PHP Notice:  Undefined variable: aktuell in /home/pi/htmlvz.php on line 93
PHP Notice:  Array to string conversion in /home/pi/htmlvz.php on line 101
Übertragung nicht erfolgreich: Array
PHP Notice:  Undefined variable: Gesamtenergie in /home/pi/htmlvz.php on line 106
PHP Notice:  Array to string conversion in /home/pi/htmlvz.php on line 113
Übertragung nicht erfolgreich: Array

Ich habe zu meinen bedauern keine Ahnung von PHP.
Beschäftige mich Ausschließlich (Arbeitsbedingt) mit Step7

Ich weiß es ist etwas unkonventionell, aber ich hoffe ihr könnt mir weiterhelfen.

Gruß Nils