Zeige doch mal deine UserReadings und DOIFs, dann muss ich es nicht neu erfinden.
ok, du hast es so gewollt...:p
Mein Stromzähler
define powermeter OBIS /dev/serial/by-id/usb-Silicon_Labs_CP2102.....@9600,8,N,1 SML
liefert die folgenden selbstsprechenden Readings:
- power
- power_L1
- power_L2
- power_L3
- total_consumption
- total_feed
Der Sensor liefert zwar jede Sekunde aktuelle Werte, ich habe mich FHEM-seitig für ein Interval von 5 Minuten entschieden (dies gilt für den Wechselrichter genauso). Beim Stromzähler erreiche ich das über:
attr powermeter pollingMode on
attr powermeter interval 300
Per Attribut userReadings erzeuge ich zudem weitere Readings, wo die PV-Werte (Device httpSolar) mit betrachtet werden:
power_combined:power.* {
## add solar power to main power (positiv or negative)
ReadingsVal("httpSolar","current_power-1",0) +
ReadingsVal($name,"power",0)
},
power_L3_combined:power_L3.* {
## add solar power to main power (positiv or negative)
ReadingsVal("httpSolar","current_power-1",0) +
ReadingsVal($name,"power_L3",0)
},
day_consume:day_(feed|consumption).* {
## calculate total consume (including produced solar power) on consumption or feed change
(ReadingsVal("httpSolar","day_yield",0)*1000) +
ReadingsVal($name,"day_consumption",0) -
ReadingsVal($name,"day_feed",0)
}
Das letzte UserReading geht auf noch unbekannte day_* Readings. Diese erzeuge ich per DOIF, da der Trigger nicht das Device ist, ich mehrere Readings in einem befülle, oder ich einfach erst später über die Möglichkeit mit UserReadings gestoßen bin

.
Zunächst initialisiere ich täglich ein paar Tageswerte (Verbrauch, Einspeisung, Max-Leistung), sowie für die Berechnung notwendige Tagesstartwerte (Gesamtverbrauch, Gesamteinspeisung)
([00:01])
## initialize daily Power consumption and feed values..
(setreading powermeter day_start_total_consumption [powermeter:total_consumption],
setreading powermeter day_start_total_feed [powermeter:total_feed],
setreading powermeter day_consumption 0,
setreading powermeter day_feed 0,
setreading powermeter day_max_power 0)
Diese Tageswerte update ich dann mit 3 weiteren DOIFs:
([powermeter:power])
## update daily max power value if current is higher..
(IF ([powermeter:day_max_power] < [powermeter:power])
(setreading powermeter day_max_power [powermeter:power]))
([powermeter:total_feed])
## update daily feed value by calculation..
{
my $v = [powermeter:total_feed] - [powermeter:day_start_total_feed];
$v = round($v,1);
if ($v > [powermeter:day_feed]){
fhem("setreading powermeter day_feed ${v}");
}
}
([powermeter:total_consumption])
## update daily consumption value by calculation..
{
my $v = [powermeter:total_consumption] - [powermeter:day_start_total_consumption];
$v = round($v,1);
if ($v > [powermeter:day_consumption]){
fhem("setreading powermeter day_consumption ${v}");
}
}
Diese Tageswerte schreibe ich am Tagesende dann wiederum in weitere day_end_* Readings, die dann fürs die Tages-Logs herangezogen werden
([23:59])
## set day end values..
(setreading powermeter day_end_consume [powermeter:day_consume],
setreading powermeter day_end_consumption [powermeter:day_consumption],
setreading powermeter day_end_feed [powermeter:day_feed],
setreading powermeter day_end_max_power [powermeter:day_max_power])
Damit das Log übersichtlich bleibt und nur die wichtigen Daten gelogt werden, sind die Events per Attribut event-on-change-reading eingeschränkt:
(power.*|total_consumption|total_feed|day_consumption|day_feed|day_consume|day_end_.*)
Beim Wechselrichter
define httpSolar HTTPMOD http://<user>:<pw>@<ip/hostname>/status.html 300
sieht es ähnlich aus. Die per Modul ausgelesenen Readings sind:
- current_power-1
- total_yield-1
- yield_today-1
Mit dem yield_today-1 kann ich nichts anfangen, da es identisch zum total_yield-1 ist. Vermutlich weil mein Wechselrichter nicht nach Hause telefonieren darf und daher keine Information über Standort bzw. Zeitzone hat.
Demnach ermittel ich den Ertrag am Tag (und die max. Leistung am Tag) wiederum über diverse Readings per DOIFs.
Initialisierung:
([00:01])
## initialize daily Solar yield values..
(setreading httpSolar day_start_total_yield [httpSolar:actual_total_yield],
setreading httpSolar day_yield 0,
setreading httpSolar day_max_power 0)
Update:
([httpSolar:total_yield-1])
## save total yield (cause it sometimes gives 0)
## and update daily yield value by calculation..
{
if ([httpSolar:total_yield-1] > 0){
fhem("setreading httpSolar actual_total_yield [httpSolar:total_yield-1]");
my $v = [httpSolar:total_yield-1] - [httpSolar:day_start_total_yield];
$v = round($v,1);
if ($v > [httpSolar:day_yield]){
fhem("setreading httpSolar day_yield ${v}");
}
}
}
([httpSolar:current_power-1])
## update daily max power value if current is higher..
(IF ([httpSolar:day_max_power] < [httpSolar:current_power-1])
(setreading httpSolar day_max_power [httpSolar:current_power-1]))
Tages-Endwerte:
([23:59])
## set day end values..
(setreading httpSolar day_end_yield [httpSolar:day_yield], setreading httpSolar day_end_max_power [httpSolar:day_max_power])
Da der Wechselrichter nicht immer zuverlässig den aktuellen Wert im Web-Interface ausspuckt, ist der Update-Code etwas komplexer und ich speichere zusätzlich den aktuellen Wert in einem zusätzlichen Reading (actual_total_yield), da ich sonst u.U. 5 Minuten lang 0W angezeigt bekommen, was völlig falsch ist.
Abschließend sei noch erwähnt, dass ich das Setup im Nachhinein evt. etwas anders aufbauen würde. Bei einigen "meiner" Readings war ich mir unschlüssig ob an den Zähler oder eher an den Wechselrichter. Hatte schonmal überlegt alles selbstdefinierte und berechnete an ein oder zwei Dummies zu hängen, statt den Misch aus Modul- und Custom-Readings zu betreiben....
So, ich hoffe ich habe nichts wichtiges vergessen. Entschuldige bitte, dass ich nicht die kompletten Befehle hierein haue, das liegt einfach daran, dass ich alles über die Oberfläche mache und nicht in der riesen config-Datei rumspringe... und die Befehle zum posten zusammenzuschreiben ist mir zu aufwändig
