Hallo,
ich würde gerne die Anzahl der Brennerstarts meiner Gastherme der letzten Stunde immer vom aktuellen Zeitpunkt zurückblickend ermitteln.
Anbei das Device, welches die Brennerstarts hochzählt:
Internals:
DEF /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0 /opt/fhem/89_VCONTROL300_VScotHO1.cfg 180 300
DeviceName /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0@4800,8,E,2
FUUID 5e9c9f50-f33f-a976-fe15-0733b6601772e855
INTERVAL 180
NAME Vitodens200W
NR 46
PROTOCOL 300
STATE 24 °C Heizen_und_Warmwasser
TYPE VCONTROL300
UPDATESTATUS INACTIVE
READINGS:
2021-05-28 21:00:15 Aussentemperatur 14
2021-05-28 21:00:16 Betriebsart Heizen_und_Warmwasser
2021-05-28 21:00:16 Betriebsart_Party off
2021-05-28 21:00:16 Betriebsart_Spar off
2021-05-28 21:00:15 Brennerlaufzeit 15483.43
2021-05-28 21:00:15 Brennerlaufzeit_Today 2.24
2021-05-28 00:00:15 Brennerlaufzeit_TodayStart 15481.19
2021-05-28 00:00:15 Brennerlaufzeit_Yesterday 3.13
2021-05-28 21:00:15 Brennerleistung 0
2021-05-28 21:00:15 Brennerstarts 41457
2021-05-28 21:00:15 Brennerstarts_Today 33.00
2021-05-28 00:00:15 Brennerstarts_TodayStart 41424.00
2021-05-28 00:00:15 Brennerstarts_Yesterday 51.00
2021-05-28 21:00:16 Heizkennlinie_Neigung 0.8
2021-05-28 21:00:15 Heizkennlinie_Niveau 0
2021-05-28 21:00:15 Kesseltemperatur_Ist 37.3
2021-05-28 21:00:16 Kesseltemperatur_Soll 5
2021-05-28 21:00:15 Raumtemperatur_Party_Soll 20
2021-05-28 21:00:16 Raumtemperatur_Red_Soll 3
2021-05-28 21:00:15 Raumtemperatur_Soll 24
2021-05-28 21:00:15 Stoerung off
2021-05-28 21:00:16 Systemzeit Fr,28.05.2021 21:01:33
2021-04-24 13:01:54 Timer_Haus_1MO 06:00,21:00,--,--,--,--,--,--,
2021-04-24 13:01:54 Timer_Haus_2DI 06:00,21:00,--,--,--,--,--,--,
2021-04-24 13:01:55 Timer_Haus_3MI 06:00,21:00,--,--,--,--,--,--,
2021-04-24 13:01:54 Timer_Haus_4DO 06:00,21:00,--,--,--,--,--,--,
2021-04-24 13:01:54 Timer_Haus_5FR 06:00,21:00,--,--,--,--,--,--,
2021-04-24 13:01:55 Timer_Haus_6SA 07:00,21:00,--,--,--,--,--,--,
2021-04-24 13:01:54 Timer_Haus_7SO 07:00,21:00,--,--,--,--,--,--,
2021-04-24 13:01:55 Timer_Wasser_1MO --,--,--,--,--,--,--,--,
2021-04-24 13:01:55 Timer_Wasser_2DI --,--,--,--,--,--,--,--,
2021-04-24 13:01:54 Timer_Wasser_3MI --,--,--,--,--,--,--,--,
2021-04-24 13:01:55 Timer_Wasser_4DO --,--,--,--,--,--,--,--,
2021-04-24 13:01:54 Timer_Wasser_5FR --,--,--,--,--,--,--,--,
2021-04-24 13:01:54 Timer_Wasser_6SA --,--,--,--,--,--,--,--,
2021-04-24 13:01:54 Timer_Wasser_7SO --,--,--,--,--,--,--,--,
2021-05-28 21:00:16 Umwaelzpumpe_Heizkreis2 off
2021-05-28 21:00:15 Umwaelzpumpe_Intern off
2021-05-28 21:00:16 UpdateStatus Inactive
2021-05-28 21:00:16 UpdateTime 2021-05-28_21:00:16
2021-05-28 21:00:15 Urlaubs-Beginn Do,01.01.1970 00:00:00
2021-05-28 21:00:16 Urlaubs-Ende Do,01.01.1970 00:00:00
2021-05-28 21:00:16 Vorlauftemperatur_Ist 34
2021-05-28 21:00:16 Vorlauftemperatur_Soll 0
2021-05-28 21:00:16 Warmwassertemperatur_Ist 37.4
2021-05-28 21:00:15 Warmwassertemperatur_Soll 40
helper:
Attributes:
icon sani_boiler_temp
room 10_Spitzboden
stateFormat Raumtemperatur_Soll °C Betriebsart
vitotronicType 200_HOxx
webCmd Betriebsart
Hey @z0lt1,
interessante Fragestellung bei einem Device, das per dev alle 180 Sekunden aktuelle Werte erhält.
Den idealen Lösungsansatz wüßte ich auch ganz gerne.
Das Modul selbst setzt scheinbar um 00:00:15 Uhr den Startwert für den Tag. Bei jeder Datenübermittlung wird dann die Differenz ermittelt und in das reading Brennerstarts_today geschrieben.
Das könnte man theoretisch mit fhem auch für die volle Stunde so umsetzen.
Also jede volle Stunde den aktuellen Wert der Brennerstarts per "at" Befehl z.B. als reading Brennerstarts_lhStart setzen und Brennerstarts_lhFull errechnen lassen und setzen. Zusätzlich könnte mit einem userReading Brennerstarts_lh die Anzahl der Brennerstarts der aktuellen Stunde ermittelt werden.
Darüberhinaus könnte man dann über das Attribut oldreadings auf das Reading Brennerstarts_lhFull dann noch den Wert der vorletzten vollen Stunde setzen lassen. (lh = Last Hour)
Aber vielleicht geht es auch viel einfacher, ich bin absoluter Laie und interessiere mich für die Lösungsansätze der Profis ...
lg
Gernot
Moin @z0lt1,
da ist meiner Meinung nach das Modul statistics genau das Richtige. Wenn ich es recht verstehe zählt das Reading Brennerstarts kontinuierlich hoch, richtig? Dieses in statistics wie einen Stromzähler konfigurieren. Du bekommst dann Reading wie diese:
ZitatstatEnergy Hour: 281.6 Day: 3377.8 Month: 97202.5 Year: 97202.5 (since: )
2021-05-29 09:29:13
statEnergyLast Hour: 479.9 Day: 15164.1 Month: - Year: -
Die sind von meinem Stromzähler. Im Readings Hour hast Du die Summe seit dem letzten Stundenwechsel, und im Reading Last Hour die Starts der letzten vollen Stunde. Und on Top das Ganze noch für Tag, Monat, Jahr.
Ansonsten kannst Du ein DOIF nehmen, das schreibt jede Stunde den Brennerstarts-Wert in ein Reading "letzteStunde" und bei jedem neuen Wert von Brennerstarts die Differenz von aktuell - "letzteStunde". Erweitern z.B. jede Stunde wird zuerst der Stundenwert ins Reaging "vorletzteStunde" geschrieben, dann der aktuelle Wert in "letzteStunde". Rest wie oben. Dann hättest Du noch die Anzahl der vergangenen ganzen Stunde.
Versuch macht kluch!
Viel Erfolg!
Sany
Hier mein Beispiel. Ich zähle die Brennerstarts pro Tag.
defmod Startcounter DOIF ([Vitodens222ws2:Brennerstatus]>0)\
(setreading Vitodens222ws2 Starts {([Vitodens222ws2:Starts]+1)})\
DOELSEIF ([00:01|Mo Di Mi Do Fr Sa So])\
(setreading Vitodens222ws2 Starts 0)
attr Startcounter do always
attr Startcounter room 01.Heizung_UG
setstate Startcounter cmd_1
setstate Startcounter 2021-05-29 10:18:03 Device Vitodens222ws2
setstate Startcounter 2020-10-20 07:48:36 Starts 1
setstate Startcounter 2021-05-29 10:14:49 cmd 1
setstate Startcounter 2021-05-29 10:14:49 cmd_event Vitodens222ws2
setstate Startcounter 2021-05-29 10:14:49 cmd_nr 1
setstate Startcounter 2021-05-29 10:18:03 e_Vitodens222ws2_Brennerstatus 0
setstate Startcounter 2020-10-21 23:02:50 mode enabled
setstate Startcounter 2021-05-29 10:14:49 state cmd_1
setstate Startcounter 2021-05-29 00:01:00 timer_01_c02 30.05.2021 00:01:00|MoDiMiDoFrSaSo
Gruß schwatter
Wäre nicht auch HourCounter eine Möglichkeit: https://wiki.fhem.de/wiki/HourCounter
Gruß, Joachim
Ich danke euch allen mal wieder recht herzlich für die Antworten, ich hab doch gewusst dass es dafür eine elegante Lösung gibt. Jetzt muss ich mich nur noch entscheiden ;-)
Ich sage hier auf jeden Fall Bescheid wie ich es umgesetzt habe!
So, ich habe es jetzt erstmal so umgesetzt, DOIF sind für meine bescheidenen FHEM-Kenntnisse noch am ehesten verständlich, vor allem wenn ich dann wieder in einem halben Jahr nachschauen muss, was ich da fabriziert habe ;-)
([+:00]) (
setreading VitodensStartsHour lastHourValue [VitodensStartsHour:actualHourValue],
setreading VitodensStartsHour actualHourValue [Vitodens200W:Brennerstarts],
setreading VitodensStartsHour startsLastHour {([VitodensStartsHour:actualHourValue]-[VitodensStartsHour:lastHourValue])}
)
DOELSE ()
Die anderen, viel mächtigeren Module, werde ich mir aber auch auf jeden Fall anschauen!
Hallo @z0lt1,
sehr interessanter Lösungsansatz es mit einen DOIF umzusetzen.
Damit auch die Anzahl der Brennerstarts der "aktuell angebrochenen" Stunde ermittelt werden, könnte man ein userReading am Vitodens200W device ergänzen, dass "Brennerstarts - startsLastHour" bei jedem event des Vitodens200W devices jeweils aktuell berechnet (also bei Deiner Definition mind. alle 180 Sekunden).
Ob man, - wie in Deinem DOIF -, die readings für die Berechnung am DOIF device ablegt, oder, diese am Vitodens200W device alle zusammenführt, kommt halt darauf an, was man damit machen will. (Im ersten Fall würde ich jedoch über ein notify oder eine Erweiterung des "userreadings perl Scripts" den "Wert der aktuellen angebrochenen Stunde" auch noch in das DOIF device kopieren.)
Aber, ich bin nur ein "Anwender" und kein "Perl Programmierer" und kann nicht sagen, ob die vorgeschlagenen Profi - Lösungen nicht geeigneter sind, oder, ob es bessere Lösungen gibt.
lg
Gernot
Zitat von: supernova1963 am 30 Mai 2021, 06:52:44
Damit auch die Anzahl der Brennerstarts der "aktuell angebrochenen" Stunde ermittelt werden, könnte man ein userReading am Vitodens200W device ergänzen, dass "Brennerstarts - startsLastHour" bei jedem event des Vitodens200W devices jeweils aktuell berechnet (also bei Deiner Definition mind. alle 180 Sekunden).
Das ist nochmal "schöner" da hast du Recht, das werde ich umsetzen. Wie gesagt, versuche ich meine Definitionen möglichst einfach zu halten, da ich auch nur ein User bin, und es vorkommen kann, dass ich mehrere Monate mal nichts mache.
dito ...
defmod di_brennerStarts DOIF {[+:00];;\
set_Reading ("lastHourValue",get_Reading("actualHourValue",ReadingsVal("Vitodens200W","Brennerstarts")));;\
set_Reading ("actualHourValue",ReadingsVal("Vitodens200W","Brennerstarts"));;\
set_Reading ("startsLastHour" ,get_Reading("actualHourValue")-get_Reading("lastHourValue"),1);;\
}
Effizienter wirst du es nicht hinbekommen, da alles in Perl. Ich würde eine Lösung "an einer Stelle" bevorzugen.
Rein interessehalber hier ein laienhafter Versuch ohne DOIF (ungetestet):
# at für das Setzen der stündlichen (Start-)Werte als readings des Vitodens200W devices: Brennerstarts_HourFullLast, Brennerstarts_HourFull und Brennerstarts_HourFullStart
defmod Vitodens200W_Hourly at +*01:00:00 { fhem("setreading Vitodens200W Brennerstarts_HourFullLast ".ReadingsVal("Vitodens200W","Brennerstarts_HourFull",0),"setreading Vitodens200W Brennerstarts_HourFull ".ReadingsVal("Vitodens200W","Brennerstarts_HourFull",0) - ReadingsVal("Vitodens200W","Brennerstarts_HourFullStart",0),"setreading Vitodens200W Brennerstarts_HourFullStart ". ReadingsVal("Vitodens200W","Brennerstarts",0))}
attr Vitodens200W_Hourly alignTime 00:00
# userreadings Definition am Vitidens200W device: Brennerstarts_HourActual
attr Vitodens200W userReadings Brennerstarts_HourActual { ReadingsVal("Vitodens200W","Brennerstarts",0) - ReadingsVal("Vitodens200W","Brennerstarts_HourFullStart",0) }
Fragen:
- Funktioniert das überhaupt?
- Was könnte man ggf. an diesem Lösungsansatz optimieren?
Danke,
Gernot