Solarertrag berechnen

Moin zusammen,

möchte gerne den Solarertrag für meine Solar-Thermieanlage errechnen.
Die Steuerung / Berechnung erfolgt über den Heizungsregler von Vaillant.
Da es anscheinend nicht so ohne weiteres Möglich ist über den E-Bus und die von Vailant zu beziehende Software die Daten in IPS zu bekommen versuche ich nun eine anderen Weg zu gehen.

Folgendes steht bereits zur Verfügung und wird auch im IPS angezeigt:

  1. Solarpumpe ein/aus (über Koppelrelais am Ausgang der Vaillant-Steuerung)
  2. Temperaturerfassung an VL und RL der Solarpumpenstation (gemessen über LM355)

Die Werte erfasse ich über ein Vellemann K8055 Board.
Ist zwar nicht sehr genau aber für den Anfang reicht es. Soll später auf 1-wire umgestellt werden.

Leider bekomme ich das mit dem Script schreiben unter php nicht so recht hin. :frowning:
Ich würde gerne die Wärmemenge im 15Min. Intervall berechnen, in einer txt-Datei speichern und auch gerne mit dem DUGTool als Tages, Wochen, Monats und Jahres Werten visuallisieren.

Derzeitig hab ich ein Script welches ich jede Minute einmal triggere, aber irgendwie will es nicht so recht klappen.

Über Ideen und Vorschläge zur Vorgehensweise wäre ich recht dankbar.

<?
$iid =  29934 /*[.VellemannBoard\Velleman USB]*/;
//Variablen
$channel1 = 1;   // 1 oder 2
$channel2 = 2;   // 1 oder 2
$VL = VELLEUSB_ReadAnalogChannel($iid,$channel1);
$RL = VELLEUSB_ReadAnalogChannel($iid,$channel2);

//Berechnung//

//$faktorLM335 = (((5/255)*$value1)-2.73)*100;//
$faktor1LM335 = ($VL*(5/255)-2.73)*100;
$faktor2LM335 = ($RL*(5/255)-2.73)*100;
//Wärmemenge//
//Q=m*c*deltaT/3600 (KWh)//
//m= Durchflussmenge//
$m =2.66;//"l/min" oder "l/h = 160" //
$c= 4.19; //(Wasser)//
//deltaT = VL-RL (K)//
$VL_T = $faktor1LM335;
$RL_T = $faktor2LM335;
$deltaT = $VL_T - $RL_T;
//$Q = $m*$c*$deltaT/3600;//

//Berechnung Solarpumpe//
$Pumpe = getValue(50851 /*[.VellemannBoard\Velleman USB\Digital Input 4]*/);
$Q2 = getValue (18617 /*[Solar\Solar_Ertrag_Jahr_kWh]*/);

if ($Pumpe == true)
{
$Q1 = $m*$c*$deltaT/3600;
$Q2 = $Q2 + $Q1;
SetValue(18617 /*[Solar\Solar_Ertrag_Jahr_kWh]*/,$Q2);
}
?>

Hallo,

hier hast du mal mein Skript. Dieses Trigger ich jede Minute. Ich berücksichtige hierbei noch die Durchflussmenge der Pumpen. Meine kann ich Manuell von Stufe 1 bis 3 einstellen.


////////////////////////////////////////////////////
// Ertragsberechnungen
//
// In diesem Skript werden Ertragsberechnung von den
// Solarkollektoren errechnet. Dies geschieht in Verbindung von Differenz
// Vorlauf zu Rcklauf und Durchflussmenge. (Q = c x m x (delta) T)
// Pumpengeschwindigkeiten (Stufe 1 - 3) Werden von einer Variable eingelesen.
//
// Author: Boris Bernd
//
//
////////////////////////////////////////////////////

$actual_time = date("H:i");
$day = date("w");
//echo $actual_time."
";     // debug
//echo $day."
";             // debug


// Q = c x m x (delta) T

    /*******************************************************************
     *                     Variablen einlesen                           *
     ******************************************************************/

$Brauchwasserpumpen_Stufe = GetValueInteger(46723 /*[keller\heizungsraum\solaranlage\ertragsberechnung\brauchwasser_pumpenstufe]*/);
$Pufferspeicherpumpen_Stufe = GetValueInteger(41289 /*[keller\heizungsraum\solaranlage\ertragsberechnung\pufferspeicher_pumpenstufe]*/);

$Solar_vor = GetValueFloat(28059 /*[keller\heizungsraum\solaranlage	emperaturen\solarvorlauf\Temperatur]*/);
$Solar_rueck = GetValueFloat(29274 /*[keller\heizungsraum\solaranlage	emperaturen\solarrücklauf\Temperatur]*/);

$Brauchwasserpumpe = GetValueBoolean(52409 /*[keller\heizungsraum\solaranlage\Ventile-Pumpen\Brauchwasserladepumpe]*/ );
$Pufferspeicherpumpe = GetValueBoolean(40974 /*[keller\heizungsraum\solaranlage\Ventile-Pumpen\Pufferspeicherladepumpe]*/ );

$Solar_tag = GetValueInteger(28465 /*[keller\heizungsraum\solaranlage\ertragsberechnung\solarertrag_heute]*/);

$c = 4200;


    /*******************************************************************
     *                         Pumpenstufen                            *
     ******************************************************************/


// Brauchwasser pumpen einteilung
if ($Brauchwasserpumpen_Stufe == 1)
{
$mBrauchw = 300;
}

if ($Brauchwasserpumpen_Stufe == 2)
{
$mBrauchw = 360;
}

if ($Brauchwasserpumpen_Stufe == 3)
{
$mBrauchw = 420;
}

// Pufferspeicher pumpen einteilung
if ($Pufferspeicherpumpen_Stufe == 1)
{
$mPuffer = 300;
}

if ($Pufferspeicherpumpen_Stufe == 2)
{
$mPuffer = 360;
}

if ($Pufferspeicherpumpen_Stufe == 3)
{
$mPuffer = 420;
}



    /*******************************************************************
     *                Pufferspeicherberechnung + Solar                 *
     ******************************************************************/

// Solarertragsrechnung Pufferspeicher
if ($Pufferspeicherpumpe == True)
{
$delta_T = $Solar_vor - $Solar_rueck;
$waerme = ($c * $mPuffer * $delta_T) / 3600;  // Watt / h
SetValueInteger(28782 /*[keller\heizungsraum\solaranlage\ertragsberechnung\solarertrag_aktuell]*/, $waerme);

$tag = ($Solar_tag + ($waerme / 60));
SetValueInteger(28465 /*[keller\heizungsraum\solaranlage\ertragsberechnung\solarertrag_heute]*/, $tag);

}


    /*******************************************************************
     *           Brauchwasserspeicherberechnung + Solar                *
     ******************************************************************/


// Solarertragsrechnung Brauchwasser
if ($Brauchwasserpumpe == True)
{
$delta_T = $Solar_vor - $Solar_rueck;
$waerme = ($c * $mBrauchw * $delta_T) / 3600;  // Watt / h
SetValueInteger(28782 /*[keller\heizungsraum\solaranlage\ertragsberechnung\solarertrag_aktuell]*/, $waerme);

$tag = ($Solar_tag + ($waerme / 60));
SetValueInteger(28465 /*[keller\heizungsraum\solaranlage\ertragsberechnung\solarertrag_heute]*/, $tag);
}

if (($Brauchwasserpumpe == False) and ($Pufferspeicherpumpe == False))
{
SetValueInteger(28782 /*[keller\heizungsraum\solaranlage\ertragsberechnung\solarertrag_aktuell]*/, 0);
}

@Hollowman

Die Wärmekapazität c solltest du evtl. noch reduzieren. Sie beträgt bei reinem Wasser 4,19 mit 25% Glykol habe ich Werte von ca. 3,9 gefunden.
Ich denke, das deine Anlage bestimmt auch Glykol enthält und sich somit der Wirkungsgrad etwas verschlechtert.

Grüße,
Doc

hallo,
danke für den hinweis. In meiner Anlage befindet sich natürlich auch 25% Glykol.

mfg
boris

Moin Hollowman,

vielen Dank für Dein Skript. Ist recht hilfreich gewesen.:slight_smile:
Hab nun für den gesamten, aktuellen, Tages-, Monats- und Jahres-Ertrag jeweils eine Variable und entsprechende Events angelegt.
Die Variablen kann ich dann recht einfach mit dem LogVar-Skript jeweils in einer Datei speichern.
Für die Visualisierung muss ich jetzt erst mal ein paar Daten sammeln und mit den angezeigten Daten meiner Vaillant Steuerung vergleichen.

Eine Frage hätte ich zu deinem Skript aber doch noch.
Wofür werden die Zeitvariablen im Skript benötigt?

Gruß Stefan

Hallo,

das freut mich das dir mein Skript ein wenig geholfen hat.
$actual_time ist noch Reststück aus der IPS V1. Die Zeilen werden aber jetzt nicht mehr benötigt.
Werde die bei mir mal löschen …

Gruß

Hallo,

ich möchte diese Thema gerne nochmal aufgreifen. Ich bin seit Samstag nun auch stolzer Besitzer von IPS und hab mir dank der Verknüpfung zu Siemens OZW schon eine schicke Visualisierung zusammengebaut. Jetzt stehe ich allerdings vor einem Punkt wo ich nicht weiter komme weil ich noch nie etwas mit PHP gemacht habe.

Ich hoffe jetzt mal auf eure Hilfe damit ich die Grundlagen verstehe bei einem eigenen Projekt.

In Prinzip möchte ich genau wie Hollowman die Wärmemenge errechnen. Allerdings noch etwas einfacher!

Folgende Datenpunkte stehen zur Verfügung:

OZW_WriteDataPoint(15151 /*[Heizung\Solar\Kollektor]*/, );
OZW_RequestStatus(15151 /*[Heizung\Solar\Kollektor]*/);
OZW_WriteDataPoint(57459 /*[Heizung\Solar\Kollektor Rücklauf]*/, );
OZW_RequestStatus(57459 /*[Heizung\Solar\Kollektor Rücklauf]*/);
OZW_WriteDataPoint(18396 /*[Heizung\Solar\Solarpumpe]*/, );
OZW_RequestStatus(18396 /*[Heizung\Solar\Solarpumpe]*/);

Der Massenstrom und die spezifische Wärmekapazität sollen manuell im Script hinterlegt werden. Die Pumpe ist Einstufig was die Sache hoffentlich etwas einfacher macht.

Ich würde mich sehr freuen wenn mir jemand bei dem Script helfen könnte. Ich hab schon nen ganzen Tag ohne Erfolg damit verbracht.

Ich weiß z.B. auch nicht ob ich vorher noch eine Instanz oder Variable erstellen muss, damit die Wärmemenge auch irgendwo angezeigt wird. Ich denke schon, weiß aber nicht wie das genau aussehen muss. Ich hänge dazu mal einen Screenshot vom Objektbaun an.

Ich würde mich also sehr freuen wenn mich jemand bei meinem ersten Script unterstützen könnte damit es mir beim nächsten etwas leichter fällt.

Gruß Daniel

So sieht nun mein aktuelles Script aus:

<?


 $Solar_Kollektor = GetValueFloat (15151 /*[Heizung\Solar\Kollektor]*/);
 $Solar_Ruecklauf = GetValueFloat (57459 /*[Heizung\Solar\Kollektor Rücklauf]*/);
 $Solarpumpe = GetValueString (18396 /*[Heizung\Solar\Solarpumpe]*/);
 $c = 4200;
 $mSolarpumpe = 420
 ;
 
 if ($Solarpumpe == Ein)
{
 $delta_T = $Solar_Kollektor - $Solar_Ruecklauf
 $waerme = ($c * $mSolarpumpe * $delta_T) / 3600 //Watt / h;
 SetValueInteger(33534  /*[Heizung\Solar\Wärmemenge\Wärmemenge]*/, $waerme);
}
 
?>

Folgender Fehler taucht nun noch auf: Parse error: syntax error, unexpected ‚$waerme‘ (T_VARIABLE) in C:\IP-Symcon\scripts\35970.ips.php on line 14

Ich hab nun auch ein Dummy Modul angelegt. Vielleicht kann sich das mal jemand anschauen ob das so richtig ist und was am Script noch Verbessert werden muss.

Danke euch schonmal!

Ich kenne deine Zeile 14 zwar nicht aber was willst du hier mit erreichen?

//Watt / h;

Zumindest in Zeile 13 (auch in 14, dort warum auch immer auskommentiert) fehlt das Semikolon

 $delta_T = $Solar_Kollektor - $Solar_Ruecklauf;
 $waerme = ($c * $mSolarpumpe * $delta_T) / 3600;  //Watt / h;

Vielleicht muss auch noch ne Klammer rein in Z13

$delta_T = ($Solar_Kollektor - $Solar_Ruecklauf);

Gruß
Bruno

Hey Powerfreddy,

vielen Dank für deine Hilfe! Das wars :smiley:

So sieht nun mein fertiges Script aus:

<?


 $Solar_Kollektor = GetValueFloat (13520 /*[Heizung\Solar\Kollektor]*/);
 $Solar_Ruecklauf = GetValueFloat (21796 /*[Heizung\Solar\Kollektor Rücklauf]*/);
 $Solarpumpe = GetValueString (39067 /*[Heizung\Solar\Solarpumpe]*/);
 $c = 1.05555;
 $mSolarpumpe = 360
 ;
 
 if ($Solarpumpe == True)
{
 $delta_T = ($Solar_Kollektor - $Solar_Ruecklauf);
 $waerme = ($c * $mSolarpumpe * $delta_T) /1000;
 SetValueInteger(33534  /*[Heizung\Solar\Wärmemenge\Wärmemenge]*/, $waerme);
}
 
?>

Hab ausser deinen Korrekturen die Werte und Formeln noch etwas angepasst.

Jetzt hoffe ich mal das alles Funktioniert und werde mal auf die Sonne warten um zu schauen ob die Werte realistisch sind.

Hallo,

ich habe noch etwas Probleme mit meinem Script. Vielleicht kann mir da nochmal jemand helfen.

Und zwar erhalte ich mit meinem Script auch eine negative Leistung. Das soll natürlich nicht sein.
Normalerweise sollen die Werte für die Wärmemenge und die Leistung auf 0 gesetzt werden. Das passiert aber nicht. Ich hab keine Ahnung wieso.

Im Winter kommt es natürlich häufig vor das die gemessene Rücklauftemperatur bei mir im Keller 15°C beträgt. Der Kollektor aber z.B. -5°C hat.

Dann errechnet das Script eine negative Leistung und Wärmemenge.

Wie das dann im Webfront ausschaut seht Ihr ja selbst.

<?


 $Solar_Kollektor = GetValueFloat (13520 /*[Heizung\Solar\Kollektor\Kollektor Vorlauf]*/);
 $Solar_Ruecklauf = GetValueFloat (21796 /*[Heizung\Solar\Kollektor Rücklauf\Kollektor Rücklauf]*/);
 $Solarpumpe = GetValueString (39067 /*[Heizung\Solar\Solarpumpe\Solarpumpe]*/);
 $c = 1.05555;
 $mSolarpumpe = 360
 ;
 
 if ($Solarpumpe == True)
{
 $delta_T = ($Solar_Kollektor - $Solar_Ruecklauf);
 $waerme = ($c * $mSolarpumpe * $delta_T) /1000;
 SetValueInteger(33534 /*[Heizung\Solar\Wärme\Wärmemenge]*/ , $waerme);

// Leistungsberechnung (noch nicht vollständig)
 $Leistung = ($waerme / 3.6);
 SetValueFloat (14142 /*[Heizung\Solar\Wärme\Leistung]*/ , $Leistung);
}
 
 if ($Solarpumpe == False)
 {
 SetValueFloat (14142 , 0);
 
 SetValueInterger (33534 , 0);
 }
?>

Solar.JPG