[gelöst] Wochen und Monatsverbrauch berechnen - Bitte Code gegenlesen

Begonnen von Panger1337, 19 Dezember 2017, 23:13:43

Vorheriges Thema - Nächstes Thema

Panger1337

Hallo zusammen,

nachdem ich nun mein Ecometer erfolgreich an FHEM am laufen habe versuche ich grade sinnvolle Dinge damit anzustellen, dazu gehört für mich auch die Auswertung des Tages-, Wochen- und Monatsverbrauchs.
Da es mit GasCounter etc. leider nicht so geht wie ich mir das vorstelle, habe ich mich quer durchs Forum gelesen und auch die Commandref durchforstet.

Aktueller Zustand:
Ecometer ist definiert und gibt regelmäßg ein "RemainingUsableLevel" aus
Um das Auswerten zu können habe ich einen Dummy angelegt wie folgt:

define heizoelverbrauch dummy
attr heizoelverbrauch readingList tagesverbrauch,wochenverbrauch,monatsverbrauch,jahresverbrauch,cumwoche,cummonat,cumjahr
attr heizoelverbrauch room 4.1_Heizoel

Dann habe ich mir einen Code zusammengestellt. Folgendes soll erreicht werden:
jeden Tag 23:55 wird der aktuelle Level als state in den Heizoelverbrauchdummy geschrieben
ein Userreadings mit difference ist angelegt und errechnet nach jedem neuen Eintrag (also 23:55 nach dem Eintrag) die Differenz. Diese ist leider negativ, daher muss ich per Anweisung das Vorzeichen von Minus auf Plus ändern.
Danach werden cummonat und cumwoche (als kumulierte) Werte hochgezählt
Mit einer Abfrage ob der erste Wochentag oder der erste Monatstag ist, sollen dann die Verbräuche aus dem cumwoche und cummonat in die entsprechenden Readings wochenverbrauch und monatsverbrauch geschrieben werden.

Folgend der Code den ich zusammengeschrieben habe mit der Bitte das kurz zu prüfen ob das so klappen kann und natürlich gerne auch ein Hinweis wenn das ganze einfacher geht ;-)
Habe die ganzen at Befehle etwas zeitversetzt gemacht, bin mir nicht sicher ob das nötig ist bzw. ggfs besser.




#aktueller Heizölstand als state an heizoelverbrauch dummy. Difference wird automatisch berechnet durch userReadings difference
define heizoelverbrauch_andummy at *23:55:00 { my $d= ReadingsVal("ecometer","RemainingUsableLevel",0);; fhem("set heizoelverbrauch $d");;}

#Userreadings zur automatischen berechnung der Differenz zwischen heutigem und gestrigem Füllstand
attr heizoelverbrauch userReadings tagesverbrauch difference { ReadingsVal("heizoelverbrauch","state",0)}

#tagesverbrauch nach difference Berechnung im Userreading von negativem Wert auf positiven Wert umrechnen
define tagesverbrauch_vorzeichenaendern at *23:56:00 {\
my $d1=ReadingsVal ("ecometer";"tagesverbrauch",0);;\
my $d2=$d1*-1;;\
fhem ("set tagesverbrauch $d2");;\}

#Zähler cumwoche und cummonat hochzählen bzw tagesverbrauch addieren
define heizoelverbrauch_zaehlersetzen at *23:57:00 {\
my $d1=ReadingsVal("ecometer","tagesverbrauch",0);;
my $d2=ReadingsVal("ecometer","cumwoche",0);;
my $d3=ReadingsVal("ecometer","cummonat",0);;
my $d4=$d1+$d2;;\
my $d5=$d1+$d3;;\
fhem ("set cumwoche $d4");;\
fhem ("set cummonat $d5");;\
}

#if und elseif für at jede Woche bzw. jeden Monatsersten um Wochen und Monatsverbrauch in die entsprechenden Readings zu schreiben und damit zu loggen und die Zähler wieder auf 0 zu setzen
define heizoelverbrauch_abfrage at *23:59:00 {if($mday = 1){;;\
my $d1=ReadingsVal("ecometer","cummonat";0);;\
fhem ("set monatsverbrauch $d1");;\
fhem ("set cummonat 0");;\
}\
{elsif($wday = 1){;;\
my $d1=ReadingsVal("ecometer","cumwoche";0);;\
fhem ("set wochenverbrauch $d1");;\
fhem ("set cumwoche 0);;\
}\


Vielen Dank im Voraus für eure Unterstützung.

Grüße
Panger
Chromebox 3 mit 16GB RAM und 128GB SSD als FHEM Instanz
10x TX29DTH, WLAN Gateway PCA301 und LaCrosse, IR Lesekopf für Stromzähler, WLAN Gateway für Onewire (Heizung)
Modbus Heizung und PV, Wetter, Abfall etc
Weiterer Ausbau: TBD

Panger1337

Hallo zusammen

habe schon einen Fehler festgestellt. Statt set benötige ich an diversen Stellen setreading da ich ja ein Reading verändern muss und kein device bzw state

neuer Code

define tagesverbrauch_vorzeichenaendern at *23:56:00 {my $d1=ReadingsVal("ecometer","tagesverbrauch",0);;my $d2=$d1*-1;;fhem ("setreading heizoelverbrauch tagesverbrauch $d2");;}
attr tagesverbrauch_vorzeichenaendern room 4.1_Heizoel
define heizoelverbrauch_zaehlersetzen at *23:57:00 {my $d1=ReadingsVal("ecometer","tagesverbrauch",0);;my $d2=ReadingsVal("ecometer","cumwoche",0);;my $d3=ReadingsVal("ecometer","cummonat",0);;my $d4=$d1+$d2;;my $d5=$d1+$d3;;fhem ("setreading heizoelverbrauch cumwoche $d4");;fhem ("setreading heizoelverbrauch cummonat $d5");;}
attr heizoelverbrauch_zaehlersetzen room 4.1_Heizoel
define heizoelverbrauch_abfrage at *23:59:00 {if($mday = 1) {my $d1=ReadingsVal("ecometer","cummonat",0);;fhem ("setreading heizoelverbrauch monatsverbrauch $d1");;fhem ("setreading heizoelverbrauch cummonat 0");;}}
attr heizoelverbrauch_abfrage room 4.1_Heizoel
define heizoelverbrauch_abfrage2 at *23:59:30 {if($wday = 1){my $d1=ReadingsVal("ecometer","cumwoche",0);;fhem ("setreading heizoelverbrauch wochenverbrauch $d1");;fhem ("setreading heizoelverbrauch cumwoche 0");;}}
attr heizoelverbrauch_abfrage2 room 4.1_Heizoel


Grüße
Panger
Chromebox 3 mit 16GB RAM und 128GB SSD als FHEM Instanz
10x TX29DTH, WLAN Gateway PCA301 und LaCrosse, IR Lesekopf für Stromzähler, WLAN Gateway für Onewire (Heizung)
Modbus Heizung und PV, Wetter, Abfall etc
Weiterer Ausbau: TBD

Panger1337

Habe den Code jetzt eingespielt, gibt keine Fehler zurück, denke es sollte alles soweit richtig sein.

Habe nur einen Fehler entdeckt, bzw. komme an einer Stelle nicht weiter:

das reading tagesverbrauch wird automatisch gefüllt sobald sich der state ändert, durch ein userreading mit difference
Versuche ich nun manuell das reading auf Zahl x zu setzen ist dies immer 0. ich kann das reading nicht manuell ändern
Hat jemand eine Idee warum? Einen Fehler erhalte ich leider nicht zurück :-(

Wenn ich nun manuell das userreading mit difference triggere indem ich einen neuen state manuell setze, erscheint auch brav der tagesverbrauch als Zahl.
Aber sobald ich irgendeine der Funktionen unten ausführe wird alles wieder auf 0 gesetzt.
Ich verstehe aber nicht warum :-(

AUs dem Filelog erkennt man ganz klar, dass direkt nach dem ich manuell das setreading ausgeführt habe direkt wieder das reading "tagesverbrauch" auf 0 gesetzt wird:
2017-12-20_08:47:13 heizoelverbrauch tagesverbrauch: 20
2017-12-20_08:47:13 heizoelverbrauch tagesverbrauch: 0

Woran kann das liegen?

Grüße
Panger
Chromebox 3 mit 16GB RAM und 128GB SSD als FHEM Instanz
10x TX29DTH, WLAN Gateway PCA301 und LaCrosse, IR Lesekopf für Stromzähler, WLAN Gateway für Onewire (Heizung)
Modbus Heizung und PV, Wetter, Abfall etc
Weiterer Ausbau: TBD

Panger1337

Fehler gefunden. Hatte jeweils Readingsval falsch gesetzt auf "ecometer" statt auf "heizoelverbrauch"
Daher hatte er sich immer 0 als Wert genommen und damit gerechnet.
Logisch, dass das setreading dann immer 0 als Wert erhalten hat.

Da es aber auch mit richtigem ReadingsVal nicht geklappt hat, habe ich jetzt einen zweiten Dummy erstellt für die Zählwerte, also Tagesverbrauch positiv gerechnet, cumwoche,cummonat etc.
Das ist jetzt ein eigener Dummy

So habe ich es jetzt gelöst:
define tagesverbrauch_vorzeichenaendern at *23:56:00 {my $d1=ReadingsVal("heizoelverbrauch","tagesverbrauch",0);;my $d2=$d1*-1;;fhem ("setreading heizoelzaehler tagesverbrauch $d2");;}
attr tagesverbrauch_vorzeichenaendern room 4.1_Heizoel
define heizoelverbrauch_zaehlersetzen at *23:57:00 {my $d1=ReadingsVal("heizoelzaehler","tagesverbrauch",0);;my $d2=ReadingsVal("heizoelzaehler","cumwoche",0);;my $d3=ReadingsVal("heizoelzaehler","cummonat",0);;my $d4=$d1+$d2;;my $d5=$d1+$d3;;fhem ("setreading heizoelzaehler cumwoche $d4");;fhem ("setreading heizoelzaehler cummonat $d5");;}
attr heizoelverbrauch_zaehlersetzen room 4.1_Heizoel
define heizoelverbrauch_abfrage at *23:59:00 {if($mday == 1) {my $d1=ReadingsVal("heizoelverbrauch","cummonat",0);;fhem ("setreading heizoelverbrauch monatsverbrauch $d1");;fhem ("setreading heizoelverbrauch cummonat 0");;}}
attr heizoelverbrauch_abfrage room 4.1_Heizoel
define heizoelverbrauch_abfrage2 at *23:59:30 {if($wday == 1){my $d1=ReadingsVal("heizoelverbrauch","cumwoche",0);;fhem ("setreading heizoelverbrauch wochenverbrauch $d1");;fhem ("setreading heizoelverbrauch cumwoche 0");;}}
attr heizoelverbrauch_abfrage2 room 4.1_Heizoel


Grüße
Panger
Chromebox 3 mit 16GB RAM und 128GB SSD als FHEM Instanz
10x TX29DTH, WLAN Gateway PCA301 und LaCrosse, IR Lesekopf für Stromzähler, WLAN Gateway für Onewire (Heizung)
Modbus Heizung und PV, Wetter, Abfall etc
Weiterer Ausbau: TBD