PV-Anlage: Bezug, PV-Ernte, PV-Eigenverbrauch und PV-Einspeisung ermitteln

Hallo,

habe einen Sunnyboy 3000 von SMA und als Stromzähler einen ED3000 von EMH. Dieser Zähler hat einen S0-Ausgang für die Bezugsseite. Das nützt mir dafür nicht wiklich viel.

Daher müßte ich dann wohl mit Hutschienenzählern arbeiten, am liebsten mit RS485. Einen brauche ich direkt nach der dem Gemeindewerkezähler und einen für die PV-Anlage. Damit wären dann Bezug und PV-Ernte auslesbar.

Den PV-Eigenverbrauch sollte man aus der Differenz von Ernte und Einspeisung ermitteln können. Ist der SDM630M-DC geeignet, um ihn direkt nach dem GW-Zähler einzubauen? Der soll auch die Einspeisung zählen?

Um die PV-Ernte zu zählen hatte den DRS-210C gefunden. Der kann auhc zwei Richtungen, um einen evtl. Verbrauch durch den WR zu zählen.

Vom zweiten Zähler habe ich hier im Forum noch nichts gelesen, daher die Gesamtfrage.

Hallo,

der EMH hat wirklich einen S0 Impulsausgang?, laut technischen Daten hat der eine optische D0 Schnittstelle auf der Front für den Kunden und wohl auch eine RS485 Schnittstelle an welche Du aber wohl nicht kommst.

Gruß

Frank

Hallo,

ich habe es bei mir folgendermaßen gelöst:
Neben den Zweirichtungszähler von EON (den ich nicht abgreife) habe ich zwei eigene, digitale (und geeichte) S0-Zähler montieren lassen.
Zähler 1 misst den gesamten Hausverbrauch (–> Verbrauch).
Zähler 2 misst die gesamte Strommenge von der PV (–> PV).
Beide Zähler lese ich mit einem 1Wire-S0-Zähler von Eservice aus.

Damit kann ich mir die Einspeisung ins Netz (–> Einspeisung) ausrechnen:
Einspeisung = max(0;PV - Verbrauch)
Damit kann ich mir den Bezug vom Netz (–> Bezug) ausrechnen:
Bezug = max(0; Verbrauch - PV)
Damit kann ich mir den Eigenverbrauch (–> EV) ausrechnen:
EV = Verbrauch - Bezug

Ich erhalte also folgende 5Variablen:
Gesamtverbrauch des Hauses (Verbrauch), Gesamtleistung der PV (PV), Bezug vom Strombetreiber (Bezug), Eigenverbrauch PV (EV), Einspeisung in Netz (Einspeisung).

Dazu rechne ich mir jeweils die akkumulierte Strommenge [kWh], sowie die durchschnittliche Stromleistung der letzten 2/5/15Minuten [Watt] aus.
In Abhängigkeit dieser Stromleistung kann man sehr schön Verbraucher ansteuern (bei mir z.B. Wärmepumpe, Raumsolltemperaturen, Rollos, etc.).
Die Werte stimmen auch sehr gut mit den Daten vom Zweirichtungszähler zusammen.

Anbei die Skripte, sowie Bilder vom Aufbau, sowie Webfront:

Skript wird ausgeführt, wenn Variable Zähler(1) geändert wird.

<?

$grenzwert = 10000 /*[Objekt #10000 existiert nicht]*/;
$ID_Archiv = 20434 /*[Archive Handler]*/;
$dV = 0;
$dB = 0;
$dEV = 0;
$dE = 0;
$dPV = 0;

$ID_Zaehler1 = 14974 /*[Geräte\S0_Modul\S0 Modul (1)\Zähler 1]*/;
$ID_Zaehler1_alt = 43008 /*[Geräte\S0_Modul\S0 Modul (1)\Zaehler1_alt]*/;
$ID_Pel_Verbrauchges = 40580 /*[Geräte\S0_Modul\S0 Modul (1)\Pel_Verbrauch_gesamt]*/;

$Zaehler1_alt = GetValueInteger ( $ID_Zaehler1_alt );
$Zaehler1 = GetValueInteger ( $ID_Zaehler1 );
$Pel_Verbrauchges = GetValueFloat ( $ID_Pel_Verbrauchges );


if ($Zaehler1 - $Zaehler1_alt > 0 && $Zaehler1 - $Zaehler1_alt < $grenzwert)
	{
	$dV =($Zaehler1 - $Zaehler1_alt)/1000;
	$Pel_Verbrauchges = $Pel_Verbrauchges + $dV;
	}
else
	{
	//$Pel_Verbrauchges = 0;
	}

SetValueInteger ($ID_Zaehler1_alt, $Zaehler1 );
SetValueFloat ($ID_Pel_Verbrauchges, $Pel_Verbrauchges );

//////////////////////////// PV
$ID_Zaehler2 = 51616 /*[Geräte\S0_Modul\S0 Modul (1)\Zähler 2]*/;
$ID_Zaehler2_alt = 26576 /*[Geräte\S0_Modul\S0 Modul (1)\Zaehler2_alt]*/;
$ID_Pel_PVges = 26970 /*[Geräte\S0_Modul\S0 Modul (1)\Pel_PV_gesamt]*/;

$Zaehler2_alt = GetValueInteger ( $ID_Zaehler2_alt );
$Zaehler2 = GetValueInteger ( $ID_Zaehler2 );
$Pel_PVges = GetValueFloat ( $ID_Pel_PVges );


if ($Zaehler2 - $Zaehler2_alt > 0 && $Zaehler2 - $Zaehler2_alt < $grenzwert)
	{
   $dPV=($Zaehler2 - $Zaehler2_alt)/1000;
	$Pel_PVges = $Pel_PVges + $dPV;
	}
else
	{
	//$Pel_PVges = 0;
	}


SetValueInteger ($ID_Zaehler2_alt, $Zaehler2 );
SetValueFloat ($ID_Pel_PVges, $Pel_PVges );

//// Berechnung von PV-Eigenverbrauch und Strombezug
$ID_Pel_EV = 33804 /*[Geräte\S0_Modul\S0 Modul (1)\Pel_EV_gesamt]*/;
$ID_Pel_Bezug = 34989 /*[Geräte\S0_Modul\S0 Modul (1)\Pel_Bezug_gesamt]*/;
$ID_Pel_Einspeisung= 13146 /*[Geräte\S0_Modul\S0 Modul (1)\Pel_Einspeisung_gesamt]*/;
// Bezug = max(Verbrauch - PV,0)
// PV-Eigenverbrauch(PVEV) = V - B
// Einspeisung = max(PV - V,0)
// Eigenverbrauch(EV), PV, Bezug (B), Einspeisung (E), Gesamtverbrauch (V)
$EV = GetValueFloat ( $ID_Pel_EV  );
$B = GetValueFloat ( $ID_Pel_Bezug );
$E = GetValueFloat ( $ID_Pel_Einspeisung );

$dB = max($dV - $dPV,0);
$dEV = $dV - $dB;
$dE = max($dPV - $dV,0);

$B = $B+$dB;
$EV = $EV+$dEV;
$E = $E+$dE;

SetValueFloat ( $ID_Pel_EV ,$EV );
SetValueFloat ( $ID_Pel_Bezug,$B  );
SetValueFloat ( $ID_Pel_Einspeisung,$E );

?>

<?

//$dt = 60*2;    // Abfrage Stromzähler alle 60s
$grenzwert = 100000;
$ID_Archiv = 20434 /*[Archive Handler]*/;
//$ID_QPel_Verbrauchges = 40580 /*[Geräte\S0_Modul\S0 Modul (1)\Pel_Verbrauch_gesamt]*/;

//$ID_Pel_Verbrauchges_02min = 45285 /*[Geräte\S0_Modul\S0 Modul (1)\Pel_Verbrauch_02min]*/;


$x = array ();
$x [] = array (   "Bezeichnung"         => "Pel_VerbrauchGesamt_02min",	// nicht notwendig
						"ID_Pel_gesamt"     => 40580,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 45285,
						"dt"  		=> 60*2);
$x [] = array (   "Bezeichnung"         => "Pel_VerbrauchGesamt_05min",	// nicht notwendig
						"ID_Pel_gesamt"     => 40580,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 33946,
						"dt"  		=> 60*5);
$x [] = array (   "Bezeichnung"         => "Pel_VerbrauchGesamt_15min",	// nicht notwendig
						"ID_Pel_gesamt"     => 40580,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 49156,
						"dt"  		=> 60*15);
$x [] = array (   "Bezeichnung"         => "Pel_PV_02min",	// nicht notwendig
						"ID_Pel_gesamt"     => 26970,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 15702,
						"dt"  		=> 60*2);
$x [] = array (   "Bezeichnung"         => "Pel_PV_05min",	// nicht notwendig
						"ID_Pel_gesamt"     => 26970,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 42401,
						"dt"  		=> 60*5);
$x [] = array (   "Bezeichnung"         => "Pel_PV_15min",	// nicht notwendig
						"ID_Pel_gesamt"     => 26970,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 47636,
						"dt"  		=> 60*15);
$x [] = array (   "Bezeichnung"         => "Pel_Bezug_02min",	// nicht notwendig
						"ID_Pel_gesamt"     => 34989,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 54719,
						"dt"  		=> 60*2);
$x [] = array (   "Bezeichnung"         => "Pel_Bezug_05min",	// nicht notwendig
						"ID_Pel_gesamt"     => 34989,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 39437,
						"dt"  		=> 60*5);
$x [] = array (   "Bezeichnung"         => "Pel_Bezug_15min",	// nicht notwendig
						"ID_Pel_gesamt"     => 34989,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 54832,
						"dt"  		=> 60*15);
$x [] = array (   "Bezeichnung"         => "Pel_Einspeisung_02min",	// nicht notwendig
						"ID_Pel_gesamt"     => 13146,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 42137,
						"dt"  		=> 60*2);
$x [] = array (   "Bezeichnung"         => "Pel_Einspeisung_05min",	// nicht notwendig
						"ID_Pel_gesamt"     => 13146,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 37186,
						"dt"  		=> 60*5);
$x [] = array (   "Bezeichnung"         => "Pel_Einspeisung_15min",	// nicht notwendig
						"ID_Pel_gesamt"     => 13146,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 52846,
						"dt"  		=> 60*15);
$x [] = array (   "Bezeichnung"         => "Pel_Eigenverbrauch_02min",	// nicht notwendig
						"ID_Pel_gesamt"     => 33804,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 40333,
						"dt"  		=> 60*2);
$x [] = array (   "Bezeichnung"         => "Pel_Eigenverbrauch_05min",	// nicht notwendig
						"ID_Pel_gesamt"     => 33804,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 22515,
						"dt"  		=> 60*5);
$x [] = array (   "Bezeichnung"         => "Pel_Eigenverbrauch_15min",	// nicht notwendig
						"ID_Pel_gesamt"     => 33804,  	// nicht notwendig
						"ID_Pel_XXmin" 		=> 44007,
						"dt"  		=> 60*15);


for($i=0; $i < count($x); $i++)  // für jede Variable wird berechnet
	{
	$ID_Pel_gesamt = $x[$i]["ID_Pel_gesamt"];
	$ID_Pel_XXmin = $x[$i]["ID_Pel_XXmin"];
	$dt = $x[$i]["dt"];

	$wert = AC_getLoggedValues($ID_Archiv,$ID_Pel_gesamt,time()-$dt,time(),0);
	$anzahl = count($wert);
	if ($anzahl >1)
		{
		$erste = $anzahl -1;
		$letzte = 0;
		$dTime = $wert[$letzte]['TimeStamp']-$wert[$erste]['TimeStamp'];
		$erste =$wert[$erste]['Value'];
		$letzte =$wert[$letzte]['Value'];

		//$Pel_Verbrauch = ($letzte-$erste)/$dt*60*60*1000;
		$Pel_XX = ($letzte-$erste)/$dTime*3600*1000;
		//echo $anzahl."  ".$erste."  ".$letzte."  ".$Pel_XX."  ".$dTime;
		}
	else {
	$Pel_XX = 0;
	}
	SetValueFloat ($ID_Pel_XXmin, $Pel_XX );
	}


?>

Vielleicht kannst du ja damit etwas anfangen.

Grüße
Wickie

@wickie:
Klingt ja gut. Aber so in etwas habe ich das ja auch gedacht und aufgeschrieben, vermutlich nur umständlicher als du. Mittels Differenzen auf die Werte kommen, die fehlen. Und genau das ist auch mein Anstreben: das Ein- und Ausschalten von Verbrauchern abhängig von der aktuellen solaren Leistung. Welche Zähler verwendest du?

@Frank:
Die Menschen von den Werken bei uns hatten mir erzählt, dass der Kasten einen S0 für Bezug hat. Weiterhin - das ist richtig - einee D0, die aber nur für die Programmierung das sein soll. Kann ich mangels Lesekopf nicht testen, und nur für einen Test ist mir die Sache auch zu teuer. Evtl. noch mal den Udo1 fragen. PC steht zu weit weg vom Zähler. RS485 ist nicht mit drin, weil durch die Werke nicht bestellt. Kann ja mal aus Spass den Zähler auf den Bus legen. Einen Wandler auf USB habe ich hier, weiß jedoch nicht, ob dieser auch sauber funktioniert.

Weiß jemand, welche Baudrate im Standard eingestellt sein könnte bzw. ich die am Zähler (EMH ED30009 einstellen kann?

Eltako DSZ12D-3x65A

Grüße
Wickie

Hallo zusammen,

ich wusste jetzt nicht ob ich ein neues Thema aufmachen sollte oder mich einfach mal an diese Thematik dran hängen sollte. Ich habe ähnliches mit meine PV-Anlage vor.
Ich habe eine PV-Anlage mit einem SMA-Umrichter und dem Sunnyhomemanager. Ich habe lange mit dem Sunnyportal und dem Homemanager rumgebastelt nur leider habe ich das nicht sauber zum laufen bekommen . Bis ich die Nase voll hatte. Dann habe ich mir einen zweiten KNX-Energiezähler eingebaut (Hager TL360) der die Leistung von der PV-Anlage misst.
Jetzt habe ich zwei KNX-Energiezähler verbaut. Der eine misst den Gesamtverbrauch des Hause und der Ander die Erzeugung der PV-Anlage.
Wo ich jetzt auf dem Schlauch stehe ist, wie kann ich den Selbstverbrauchten und den Eingespeisten Strom errechnen? Geliefert bekomme ich den Aktuellen Stromverbrauch und die Aktuelle Stromerzeugung in Watt und von beiden Zählern einen Gesamtzählerstand.
Die Aktualisierung des aktuellem Verbrauch wird bei einer Änderung von 30Watt aktualisiert.

Hat jemand ein Tipp oder einen Lösungsansatz für mich wie ich das am Besten umsetzten kann ?

Gruß
Stephan

Wo ist das Problem ?
Du hast ja alle Daten, brauchst nur ausrechnen.
Wenn du es ganz korrekt haben willst solltest du die Zähler möglichst zeitnah zum gleichen Zeitpunkt auslesen.

Oder löse es grafisch, hier als Anregung meine Inselanlage:

gruß
bb

Hi bb,
danke erstmals für die Antwort und dem Screenshot. Das sieht gut aus.

Tendenziell würde ich mir erstmals die beiden Verbräuche und den aktuellen Timestamp in eine in eine Variable festschreiben. Sobald sich dann ein Wert ändert (Erzeugung PV / Gesamtverbrauch Haus) würde ich mir dann die beiden werte inkl. dem Timespamp wieder zurücklesen und mir die Zeit errechnen die zwischen dem aktuellen Wert und der letzten Werten liegen.

Aber wie lautet jetzt die Formel wenn ich z.B. 2Minuten und 13 Sekunden 350Watt lang verbrauche um auf KW/h Stunde zu kommen.

Hast du oder anders vielleicht einen Script ausschnitt für mich?

Gruß
Stephan

Moin,

du loggst doch die Daten mit und hast doch den Zeitstempel. Mußt dann nur umrechnen. Ich habe nun kein Beispiel für Watt/Zeit da mein Zähler nur den Zählerstand ausgibt. Ist aber so ähnlich, da ich wissen wollte wie viel kWh verbrauche ich von 8 Uhr morgens bis 20:00 ( Nachtstrom).

anbei mein kleines zusammengeklautes Skript:

<?
$archiveID = 37914 /*[Archive]*/  ;   // Archive-Handler-ID
$objectID = 41291 /*[Energiekostenzähler\Strom\Zählerstand Strom]*/  ; // Variablen-ID
$ende = time(); // JETZT
$verbrauch_akt=getvalue(41291 /*[Energiekostenzähler\Strom\Zählerstand Strom]*/ );
$start_30T = time()-(60*60*24*30); // Datenbank auslesen letzte 30 Tage
$start_gestern = strtotime(date("d.m.Y",strtotime("-1 day"))." 00:00:05"); //Startzeit gestern
$ende_gestern = strtotime(date("d.m.Y",strtotime("-1 day"))." 23:59:59"); //Endzeit gestern
$start_nacht = strtotime(date("d.m.Y",strtotime("-1 day"))." 20:00:00"); //Startzeit gestern
$ende_nacht = strtotime(date("d.m.Y",strtotime("today 00:00"))." 08:00:00"); //Endzeit

// Abfrage gestern
$temp = AC_GetLoggedValues($archiveID, $objectID, $start_gestern, $ende_gestern, 0);

$anzahl = count($temp);
$wert = $temp[$anzahl-1];
$letzterWert=$wert['Value'];
$timeletzterWert = strftime("%H:%M:%S",intval($wert['TimeStamp']));
$wert=$temp[0];
$ersterWert=$wert['Value'];
$timeersterWert = strftime("%H:%M:%S",intval($wert['TimeStamp']));

$verbrauch=($ersterWert-$letzterWert);
setvalue(29332 /*[Energiekostenzähler\Strom\Verbrauch gestern]*/ , $verbrauch);

// Abfrage 30 Tage
$buffer = AC_GetLoggedValues($archiveID, $objectID, $start_30T, $ende, 0);
$anzahl = count($buffer);
$wert = $buffer[$anzahl-1];
$ts = $wert["TimeStamp"];
$value = $wert["Value"];
$verbrauch_30T=($verbrauch_akt - $value);
setvalue(30676 /*[Energiekostenzähler\Strom\letzen 30 Tage]*/ , $verbrauch_30T);

// Abfrage heute
$temp = AC_GetLoggedValues($archiveID, $objectID, strtotime("today 00:00"), time(), 0);

$anzahl = count($temp);
$wert = $temp[$anzahl-1];
$letzterWert=$wert['Value'];
$timeletzterWert = strftime("%H:%M:%S",intval($wert['TimeStamp']));
$wert=$temp[0];
$ersterWert=$wert['Value'];
$timeersterWert = strftime("%H:%M:%S",intval($wert['TimeStamp']));

$verbrauch=($ersterWert-$letzterWert);
setvalue(13837 /*[Energiekostenzähler\Strom\ges. Tagesverbrauch]*/ , $verbrauch);

// Abfrage Nacht
$temp = AC_GetLoggedValues($archiveID, $objectID, $start_nacht, $ende_nacht, 0);

$anzahl = count($temp);
$wert = $temp[$anzahl-1];
$letzterWert=$wert['Value'];
$timeletzterWert = strftime("%H:%M:%S",intval($wert['TimeStamp']));
$wert=$temp[0];
$ersterWert=$wert['Value'];
$timeersterWert = strftime("%H:%M:%S",intval($wert['TimeStamp']));

$verbrauch=($ersterWert-$letzterWert);
setvalue(26138 /*[Energiekostenzähler\Strom\Nachtverbrauch]*/  , $verbrauch);

// Abfrage Jahresverbrauch start 31.03.2015
$temp = AC_GetLoggedValues($archiveID, $objectID, strtotime("31.03.15 00:00"), time(), 0);

$anzahl = count($temp);
$wert = $temp[$anzahl-1];
$letzterWert=$wert['Value'];
$timeletzterWert = strftime("%H:%M:%S",intval($wert['TimeStamp']));
$wert=$temp[0];
$ersterWert=$wert['Value'];
$timeersterWert = strftime("%H:%M:%S",intval($wert['TimeStamp']));

$verbrauch=($ersterWert-$letzterWert);
setvalue(21795 /*[Energiekostenzähler\Strom\akt. Jahresverbrauch]*/  , $verbrauch);
?>

LG Izack

Dein Denkfehler liegt hier: „KW/h“ du brauchst aber „kWh“ :wink:

Berechnen kannst du es wenn du erst mit Sekunden rechnest.
Also 2min 13sec = 133sec -> 133*350 Wattsec -> nun verwandeln nach Wh ergibt 12,9Wh -> 0.0129kWh

gruß
bb