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