Moin,
ich habe einen Stromzähler der die Leistung in Watt positiv und negativ (PV-Anlage) anzeigt.
Nun möchte ich positive Werte in einem Reading und negative Werte in einem anderen Reading haben.
Reading: E_ZAEHLER_HAUS:0_VIF_ELECTRIC_POWER_value
Wie stelle ich das an ?
Kaspi :(
Mit einem doif kannst du prüfen, ob grösser null oder kleiner null und dann in dein entsprechendes reading schreiben.
Gesendet von meinem MI 9 mit Tapatalk
oder userReadings.
Eine Lösung mittels userReading wäre mir am liebsten.
Aber wie??? Perl ist nicht gerade mein Ding :o
Darf man nach dem Hintergrund fragen? Wieso möchtest Du positive nummerische Werte und negative trennen?
Berechnung des momentanen Autarkie und der Eigenverbrauchsquote.
Etwas Hilfe zur Selbsthilfe biete ich gerne an. Bei Problemen schreibe bitte die Fehlermeldung und ein List vom eigentlichen Device.
Hier mal ein Beispiel für ein Userreading auf Basis vom Reading temperature.
pos:temperature:.\d+(\.\d+)? { ReadingsVal($name,'temperature',10000) },neg:temperature:.-\d+(\.\d+)? { ReadingsVal($name,'temperature',10000) }
Guten Morgen,
Die Eigenverbrauchsquote und Autarkiequote wird gebildet aus:
Eigenverbrauchsquote (%) = (Erzeugung - Einspeisung) / Erzeugung * 100
Autarkiequote (%) = (Erzeugung - Einspeisung) / (Erzeugung - Einspeisung + Bezug) * 100
Du brauchst also dazu auch noch die Werte des Wechselrichters dazu. Im Wiki hatte ich eine umfassende Lösung mit Hilfe einer Datenabnkauswertung mal beschrieben:
https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#datenbankgest.C3.BCtzte_Erstellung_der_Energiebilanz_einer_SMA_PV-Anlage_mit_.C3.9Cberschu.C3.9Feinspeisung
Grüße,
Heiko
Jaja....
die Werte des Wechselrichters habe ich.
Aber die Werte von Einspeisung und Bezug nicht direkt.
Ich habe nur einen Wert. Positiv bzw. negativ.
Darum muss ich den Wert trennen.
PS: Der Link klappt nicht
ZitatPS: Der Link klappt nicht
Sorry, habs korrigiert.
BEZUG:0_VIF_ELECTRIC_POWER_value:.\d+(\.\d+)? { ReadingsVal($name,'0_VIF_ELECTRIC_POWER_value',0) },
EINSPEISUNG:0_VIF_ELECTRIC_POWER_value:.-\d+(\.\d+)? { ReadingsVal($name,'0_VIF_ELECTRIC_POWER_value',0) }
es sieht gut aus :)
nun bekomme ich natürlich ein Division by Zero wenn die Erzeugung "0" ist.
Wie umgehe ich das?
EIGENVERBRAUCH__AKTUELL {(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("E_ZAEHLER_HAUS","EINSPEISUNG",0))/ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)*100;;},
Und wenn der Wert von positiv auf negativ (oder umgekehrt) wechselt, bleibt der letzte Wert stehen, statt auf 0 zu gehen. :-\
Frage:
Loggst du deine Evets mit Filelog oder DbLog ?
DbLog
Dann hätte ich noch einen Lösungsvorschlag mit dem Attribut DbLogValueFn. Das setzt du in deinem Strommesser.
Etwa so als Beispiel mit Device SMA_Energymeter :
attr SMA_Energymeter DbLogValueFn
{
if ($READING eq "0_VIF_ELECTRIC_POWER_value") {
if $READING =~ /^\s-(\d+|\d+\.\d+)$/ {
$READING = "ELECTRIC_POWER_value_neg";
$VALUE = $1;
} else {
$READING = "ELECTRIC_POWER_value_pos";
}
}
}
Das bedeutet wenn Readingwert 0_VIF_ELECTRIC_POWER_value negativ, wird dieser Wert als positiver Wert im Reading ELECTRIC_POWER_value_neg in die DB geschrieben.
Ist das Reading 0_VIF_ELECTRIC_POWER_value positiv, wird dieser Wert als ELECTRIC_POWER_value_pos in die DB geschrieben.
Neg und pos könnte man besser als Einspeisung bzw Bezug benennen.
Hat den Vorteil, du hast beide Richtungen für Lieferung und Bezug gleich getrennt in der DB und kannst nach Bedarf umfassend auswerten wie als Beispiel im Wiki erwähnt.
Edit: Hatte noch " vergessen.
Grüße,
Heiko
Das ist mir zu hoch :-\
Im Moment sieht es so aus:
BEZUG:0_VIF_ELECTRIC_POWER_value:.\d+(\.\d+)? { ReadingsVal($name,'0_VIF_ELECTRIC_POWER_value',0) },
EINSPEISUNG:0_VIF_ELECTRIC_POWER_value:.-\d+(\.\d+)? { ReadingsVal($name,'0_VIF_ELECTRIC_POWER_value',0)*-1 },
EIGENVERBRAUCH_AKTUELL {(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("E_ZAEHLER_HAUS","EINSPEISUNG",0))/
ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)*100;;},
AUTARKIE_AKTUELL {(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("E_ZAEHLER_HAUS","EINSPEISUNG",0))/
(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("E_ZAEHLER_HAUS","EINSPEISUNG",0)+ReadingsVal("E_ZAEHLER_HAUS","BEZUG",0))*100;;}
Moin.
Kannst Du bei dem Zähler nicht durch eine PIN den erweiterten Infomodus aktivieren?
Bei mir werden für Bezug und Lieferung jeweils eigenen Register bereitgestellt.
Gesendet von meinem SM-G930F mit Tapatalk
No. Easymeter.
N'abend
define BEZUG_0 DOIF ([E_ZAEHLER_HAUS:EINSPEISUNG] >0) (setreading E_ZAEHLER_HAUS BEZUG 0)
define EINSPEISUNG_0 DOIF([E_ZAEHLER_HAUS:BEZUG] >0) (setreading E_ZAEHLER_HAUS EINSPEISUNG 0)
löst das Problem
bleibt noch das Division by Zero Problem bei der Berechnung des Eigenverbrauchs, wenn die Erzeugung "0" ist.
Wie umgehe ich das?
KASPI :)
hab immer noch das "Division by Zero Problem" :-\
EIGENVERBRAUCH_AKTUELL {(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("EINSPEISUNG","*",0))/
ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)*100;;},
AUTARKIE_AKTUELL {(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("EINSPEISUNG","*",0))/
(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("EINSPEISUNG","*",0)+ReadingsVal("BEZUG","*",0))*100;;}
Kaspi
Im DOIF müsstest Du vorher noch auf ungleich Null prüfen.
Gesendet von meinem SM-G930F mit Tapatalk