Hallo,
ich habe einen alten digitalen Stromzähler/Zweirichtungszähler (aus 2010) für den es laut Netzbetreiber keinen Pin-Code gibt.
Somit kann ich mittels IR-Kopf nur Standardwerte auslesen. Bei mir ist das A+ (Stromverbrauch) und A- (Stromeinspeisung). Diese Werte bekomme ich per MQTT zyklisch ausgelesen. Mehr Brauchbares bekomme ich nicht aus dem Zähler raus.
Damit kann/könnte ich mir errechnen, ...
wann ich Einspeise?
wieviel ich Einspeise?
wann ich Strom beziehe?
wieviel Strom ich beziehe?
Das erfordert einige Berechnungen und Formeln.
Ich gebe zu, dass ich ein fauler Mensch bin und mir nicht gerne unnötige Arbeit mache. Zudem sind meine Kenntnisse, was solchen komplexeren Berechnungen in Fhem anbetrifft, nicht besonders ausgeprägt.
Daher meine Frage/Bitte: Vielleicht hat das schon mal jemand gemacht und hat Lust seinen Codeschnipsel mit mir (und der FHEM-Gemeinde) zu teilen. Das wäre toll.
Vielen Dank und Grüße,
Jogi
Hallo Jogi,
Zweirichtungszähler saldieren schon auf den drei Phasen. Somit ist der Bezug der wirkliche Bezug und die Einspeisung die wirkliche Einspeisung in das Verteilnetz des Netzbetreibers. Wenn Du Deine Erzeugung sehen willst benötigst Du einen eigenen Zähler für die Erzeugung. Erst mit dieser Information kannst Du errechnen welchen Eigenverbrauch Du zum Zeitpunkt t hattest. Durch die Saldierung im Zähler solltest Du eigentlich folgendes nachvollziehen können, sofern Du zyklisch Daten, alle Minute, alle 5 Minuten oder so, bekommst. Zum Zeitpunkt t sollte bei Bezug die Einspeisung 0 sein oder bei Einspeisung der Bezug 0 sein. Erst wenn Du die Erzeugung kennst, kannst Du errechnen wie hoch Dein Eigenverbrauch zum Zeitpunkt t gewesen ist.
Grüße Jörg
ja, das passt schon so, aber interessant ist hier zum Beispiel das Statisttik Modul (https://wiki.fhem.de/wiki/Statistics), damit bekommst du schonmal Stunden-, Tages-, Jahres- und Jahreswerte.
Man kann auch noch ein bisschen Magic machen und durchschnittliche Leistung zwischen zwei Zählerständen berechnen, dazu benötigst du aber neben den Zählerstanden auch die Zeitstempel.
Ich mach das zum Beispiel mit userReadings:
UR_Count_Diff:STROM_Total_in:.* {
#
my $current = ReadingsNum($name,"STROM_Total_in",0);;
my $previous = OldReadingsNum($name,"STROM_Total_in",0);;
my $diff = $current - $previous;;
if (abs($diff)<3) {
return round($current - $previous,3);;
}
else {
return 0;;
}
},
UR_Current_Timestamp:STROM_Total_in:.* {
#use Date::Parse;;
return get_CounterNxTimestamp();;
},
UR_Current_Power:STROM_Total_in:.* {
my $power;
$power = ReadingsNum($name,"UR_Count_Diff",0) * 1000;
my $current = ReadingsNum($name,"UR_Current_Timestamp",0);;
my $previous = OldReadingsNum($name,"UR_Current_Timestamp",0);;
my $diff_in_seconds = $current - $previous;;
if ($diff_in_seconds < 1000){
return round($power*3600/$diff_in_seconds,3);;
}
else {
return 0;;
}
},
UR_Power_last_hour:STROM_Total_in:.* {
my $power_avg_1h;;
$power_avg_1h=round(movingAverage("COUNTER", "UR_Current_Power",3600),3);;
return $power_avg_1h;;
}
Dazu musst du noch das Attribut oldreadings für die Zählerstände und den Zeitstempel setzen.
Die Funktion movingAverage kommt hierher: https://wiki.fhem.de/wiki/Gleitende_Mittelwerte_berechnen_und_loggen
Die Funktion get_CounterNxTimestamp():
sub get_CounterNxTimestamp() {
my $timestamp_time = ReadingsVal("COUNTER","STROM_TimeStamp_time","000000");;
while (length($timestamp_time) < 6) {
$timestamp_time = "0".$timestamp_time;;
}
my $timestamp_date = ReadingsVal("COUNTER","STROM_TimeStamp_date","0000000");;
my $time_str = "20".$timestamp_date."T".$timestamp_time."Z";
return str2time($time_str);;
}
Der Firlefanz mit den führenden Nullen ergänzen ergibt sich daraus, dass mein Zähler über Tasmota und MQTT die Werte Zahlen ausliest, dann kann 00Uhr00Minuten00Sekunden halt auch "" nichts sein, das ergänzt man halt mit führenden Nullen bis wieder 000000 rauskommt.
Aber wie Jörg schon sagt, es kann sein, dass du in einem 5Minuten-Interval sowohl eine positive Bezugsleistung als auch eine positive Einspeiseleistung hast, das kann halt passieren, wenn du 2,5min beziehst und 2,5min lieferst. Aber Abrechnungsrelevant sind eher nur Zählerwerte, daher ist das andere Gedöns alles nice to have und muss daher nur hinreichend genau sein. Falls dein Zähler keinen Zeitstempel liefert, dann könnte man das auch mir ReadingsTimestamp versuchen, aber das ist ungenau, da nicht klar ist von wann der Zählerwert überhaupt ist, der Zeitstempel wird gesetzt, wenn der ReadingWert beim FHEM ankam, das muss nicht zwingend zeitgleich zur Ausgabe durch den Zähler passiert sein.
Grüße
Andreas
Vielen Dank für Eure Rückmeldungen.
@JoWieman: Danke für die Info. Ich habe noch einen Solarzähler, mit dem ich die momentane Leistung erfasse. Vielleicht schaffe ich es mit der Kombination der beiden Datensätze.
@bartman121: Vielen Dank für die umfangreichen Erklärungen, das Teilen Deiner Einstellungen und die Tipps mit dem Statistik Modul und dem userReading. Ich werde das als Basis nehmen und dann versuchen anzupassen. Ob ich einen Zeitstempel bekomme muss ich nachschauen wenn der neue Kopf da ist. Ich glaube aber, dass das nicht der Fall ist. Ich bekomme nur das Event mit der Eventzeit. Aber grob sollte das reichen.
Gruß,
Jogi