Hallo zusammen
ich habe ein Problem bei dem ich leider nicht mehr weiterkomme.
Ich habe ein Ecometer definiert und ein Userreading eingestellt welches mir die Differenz zwischen aktuellem Stand und letztem Stand ausrechnen soll.
Ich habe dazu einen Dummy angelegt, der einmal pro Tag (23:55) den aktuellen Stand bekommt. Die Differenz wäre damit der Tagesverbrauch an Heizöl.
Hier die defines:
define heizoelverbrauch dummy
attr heizoelverbrauch readingList tagesverbrauch
attr heizoelverbrauch room 4.1_Heizoel
attr heizoelverbrauch userReadings tagesverbrauch difference { ReadingsVal("heizoelverbrauch","state",0)}
define FileLog_heizoelverbrauch FileLog ./log/heizoelverbrauch-%Y.log heizoelverbrauch
attr FileLog_heizoelverbrauch room 4.1_Heizoel
Wenn ich manuell set heizoelverbrauch ausführe wird mir auch schön die Differenz berechnet. Wenn das automatisch passiert durch das "at", allerdings nicht.
#Übergabe des Tagesstands an den Dummy
define heizoelverbrauch_andummy at *23:55:00 { my $d= ReadingsVal("ecometer","RemainingUsableLevel",0);; fhem("set heizoelverbrauch $d");;}
attr heizoelverbrauch_andummy room 4.1_Heizoel
Ich bin hier leider mit meinem Latein am Ende :-(
Das hier ist ein Auszug aus dem Filelog (06:40 war ein manueller Eintrag, da wird das Userreading auch gesetzt, 23:55 war dann der at, kein Userreading)
2017-12-21_06:40:05 heizoelverbrauch 2412
2017-12-21_06:40:05 heizoelverbrauch tagesverbrauch: 0
2017-12-21_23:55:00 heizoelverbrauch 2393
Woran könnte das liegen?
Grüße
Panger
Bitte immer ein list der beteiligten Devices posten. Die Defines helfen nur bedingt weiter.
Es könnte zum Beispiel sein, dass keine Events kommen und deshalb nichts berechnet wird.
Hi Marvin
danke schon mal für dein Feedback.
Habe das jetzt mal komplett auf manuelle Bearbeitung umgestellt, in dem ich einige at Befehle zusammengeschrieben habe.
Die schreiben mir jetzt morgens und abends den Stand in ein Reading und berechnen dann die Differenz.
ein list rufe ich dann mit
list "device"
auf, korrekt?
Habe das Device wo es nicht geklappt hat schon gelöscht. Ich erstelle aber nochmal ein neues Userreading im Device Ecometer zum testen (würde mir dann die manuellen ats sparen) und poste dann hier nochmal das Ergebnis.
Grüße
Panger
userreading neu gemacht. Stand jetzt
Internals:
DEF /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0
DeviceName /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0
FD 13
NAME ecometer
NR 116
PARTIAL
PORTSTATE open
STATE opened
TYPE TEK603
buffer 534900160210072d2f0000017161004909450f3f6292
READINGS:
2017-12-22 07:51:11 RemainingUsableLevel 2393
2017-12-22 07:48:15 RemainingUsablePercent 60.8
2017-12-22 07:48:15 Temperature 13.89
2017-12-22 07:48:15 Time 07:45:47
2017-12-22 07:48:15 TotalUsableCapacity 3903
2017-12-22 07:48:15 Ullage 73
2017-12-22 07:03:07 abendstand 2373
2017-12-22 07:02:35 morgenstand 2393
2017-12-22 07:52:38 remainingusablelevel alt
2017-12-22 06:55:22 state opened
2017-12-22 07:03:22 tagesdifferenz -20
2017-12-22 07:52:38 tagesverbrauch 0
Attributes:
room 4.1_Heizoel
userReadings tagesverbrauch difference { ReadingsVal("ecometer","RemainungUsableLevel",0)}
Ich schaue gegen Mittag nochmal rein, dann müsste das Ecometer einen neuen Wert geliefert haben, dann sehe ich ob das Userreading jetzt geht.
Grüße
Panger
Also ich sehe da überhaupt nicht durch. Was genau macht Dein userReadings?
Das userReading berechnet die Differenz aus neuem und altem Wert.
Bau dein at mal um auf
define heizoelverbrauch_andummy at *23:55:00 set heizoelverbrauch [ecometer:RemainingUsableLevel]
Hi CoolTux
das Userreading soll mir die Differenz zwischen aktuellem Wert eines readings und dem vorangegangenen liefern.
Wenn ich die Commandref richtig verstanden habe ist genau das die Funktion von "difference"
difference: das Reading wird auf die Differenz zw. dem aktuellen und dem vorherigen Wert gesetzt.
Das klappt aber leider nicht bzw. nur wenn ich manuell das Reading aus dem "difference" seinen Wert berechnet setze
@Marvin:
Korrekt, das at sollte einen Dummy befüllen (das habe ich aber jetzt geändert)
In dem Dummy sollte dann der Tagesverbrauch (die Differenz zwischen altem und neuem Wert) berechnet werden
Das versuche ich gerade statt im Dummy im originalen Ecometer abzubilden, also ohne Dummy
Grüße
Panger
Ah, ok. Vielen Dank. Habe mal eben in der Commandref gesucht. Das ganze ist Teil von userReadings, ich habe verzweifelt den FHEM Befehl oder die Funktion difference gesucht :-X
Hatte bei der neu erstellten Zusammenstellung noch einen Tippfehler.
Korrigiert, jetzt warte ich auf ein neues Reading des Ecometer (ca., 9:50)
Er hat aber eben zumindest den Wert 0 in tagesverbrauch geschrieben (weil er aufgrund des Tippfehlers keinen Wert bekommen hat). Also scheint das userreading was ich neu gemacht habe zumindest getriggert zu werden.
Das war im Dummy nicht der Fall. Da wurde zwar das Reading gesetzt, aber das userreading dann nicht...
definiert war das at wie folgt (zwischenzeitlich habe ich den Dummy rausgeworfen und versuche das über den Ecometer selbst zu regeln.
#Übergabe des Tagesstands an den Dummy
define heizoelverbrauch_andummy at *23:55:00 { my $d= ReadingsVal("ecometer","RemainingUsableLevel",0);; fhem("set heizoelverbrauch $d");;}
attr heizoelverbrauch_andummy room 4.1_Heizoel
Der DUmmy wie folgt
#Dummy für Tracking des Stands und FIlelog
define heizoelverbrauch dummy
attr heizoelverbrauch readingList tagesverbrauch
attr heizoelverbrauch room 4.1_Heizoel
attr heizoelverbrauch userReadings tagesverbrauch difference { ReadingsVal("heizoelverbrauch","state",0)}
define FileLog_heizoelverbrauch FileLog ./log/heizoelverbrauch-%Y.log heizoelverbrauch
attr FileLog_heizoelverbrauch room 4.1_Heizoel
Ich kann mir darauf keinen Reim machen.
Vielleicht lag es daran, dass ich im Dummy mit "set" gearbeitet habe und den state geändert habe.
Beim Ecometer jetzt arbeite ich mit setreading.
Vielleicht lag es daran.
Komisch war nur wenn ich manuell in der Befehlszeile "set heizoelverbrauch XYZ" gemacht habe, dann hat er das Userreading gesetzt, wenn das über den at Befehl gelaufen ist, dann nicht, obwohl gleicher Befehl.
Grüße
Panger
Zitat von: Panger1337 am 22 Dezember 2017, 08:48:19
@Marvin:
Korrekt, das at sollte einen Dummy befüllen (das habe ich aber jetzt geändert)
In dem Dummy sollte dann der Tagesverbrauch (die Differenz zwischen altem und neuem Wert) berechnet werden
Das versuche ich gerade statt im Dummy im originalen Ecometer abzubilden, also ohne Dummy
Das halte ich für eine gute Idee. Ich sehe hier keinen offensichtlichen Fehler. Schau mal, ob das so klappt. Wie oft aktualisiert sich das Reading? Du kannst auch mal mit setreading testen.
Ich musste das leider in einen Dummy machen weil das Ecometer sich etwa jede Stunde aktualisiert, aber nur alle 24 Stunden den Wert neu berechnet (Heizölstand)
Daher wäre bei 23 Berechnungen in difference der Wert 0 rausgekommen.
Den Dummy habe ich daher nur einmal am Tag befüllt um die Differenz zu bekommen.
Das neue Userreading im Ecometer ist jetzt eigentlich nur zu Testzwecken ob es geht.
Habe die Berechnung des Heizölverbrauchs jetzt über diverse at Befehle geregelt (morgens Stand schreiben, Abends Stand schreiben, Differenz berechnen und Zähler hochzählen
Wie gesagt: Wenn ich den Dummy manuell per Befehlszeile geändert habe "set heizoelverbrauch XYZ" dann hat das Userreading gerechnet
Wenn das AT den Stand geändert hat, dann wurde es nicht berechnet
2017-12-21_06:40:05 heizoelverbrauch 2412 -- hier manuell gesetzt
2017-12-21_06:40:05 heizoelverbrauch tagesverbrauch: 0 -- Userreading hat reading neu gesetzt
2017-12-21_23:55:00 heizoelverbrauch 2393 -- hier wurde per at-Befehl neu gesetzt, Eintrag userreading fehlt
Grüße
Panger
Schau dir auch mal das statistics Modul an. Das macht sowas für dich.
Hi Marvin
ja, das habe ich mir schon angeschaut, hat da aber nicht für mich gepasst.
Hab das beim Stromzähler jetzt laufen und da ist es super.
Vielleicht versuche ich es beim Heizöl auch nochmal damit
Habe aber generell das Problem dass der Verbrauch eigentlich vom Vortag ist (da der Ecometer nachts um 00:48 Uhr den neuen Stand berechnet, ausgibt)
Wenn ich das dann in einen Plot setze mit Tagesmitteltemperatur habe ich eine Verschiebung um einen Tag zwischen Temperatur und Heizölverbrauch.
Kann ich beim Plot aus einem Filelog das Datum um einen Tag fix verschieben?
ALso z.B. im Filelog Datum heute, will ich im Plot als gestrigen Wert darstellen, geht das?
Grüße
Panger
Sicher bin ich nicht aber schau dir mal logProxy an. Damit kann man einiges anstellen.
Im Device Ecometer hat sich das Userreading jetzt aktualisiert
Vielleicht teste ich es mit einem Dummy nochmal.
Grüße
Panger