Readings in Logfile täglich um 23:59

Begonnen von Dracolein, 19 Februar 2020, 13:24:06

Vorheriges Thema - Nächstes Thema

Dracolein

Hallo zusammen

wie stelle ich es an, dass mir diverse Readings eines Devices jeden Tag um 23:59 Uhr in ein Filelog geschrieben werden? Ich kenne mich zu wenig aus.

Das Device Gaszaehler enthält die interessanten Readings. Ein Logfile würde ich so definieren:

define Log_Gaszaehler FileLog ./log/Log_Gaszaehler-%Y-%m.log Gaszaehler:EnergyCostDayLast:.*

mit der Folge,dass bei jeder Änderung des Readings (hier alle 60 Sek) ein Eintrag gemacht wird, was ich verhindern möchte.
Ich will jedoch nicht am Device rumdoktern, da z.B. obiges Reading fortlaufend in einer grafischen Oberfläche landen soll, wo man in Abhängigkeit der aktuellen Uhrzeit den bisherigen Verbrauch dargestellt bekommt.

Mein Gedanke wäre nun, ein at zu definieren....
define WriteToLog_EnergyCostDayLast at +*23:59:00 {....}
... um den Schreibvorgang damit nur 1x täglich zur vorgegebenen Zeit anzustoßen. Aber wie formuliere ich dies und weiterhin wie nehme ich Einfluss auf o.g. Filelog, damit es nicht weiter auf ständige Events des Gaszaehlers hört?

Danke vorab für Eure Hilfe.
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

rabehd

Auch funktionierende Lösungen kann man hinterfragen.

Dracolein

Hmm, der Link hilft mir leider nicht weiter.
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

rabehd

#3
ZitatHmm, der Link hilft mir leider nicht weiter.
Er sagt, dass man nicht selbst in ein Log schreiben kann. Er zeigt eine Lösungsidee auf.
Was ist das Problem?
Lösung: Erzeuge einfach ein Event des gewünschten Reading um 23:59  ;D.

Ich glaube mir LogDB geht es, da gibt es (glaube ich) einen Schreibbefehl.

Du hast doch schon ein Log, auch wenn Du von einer grafischen Oberflche schreibst. Was ist eigentlich das Ziel der Aktion?
Auch funktionierende Lösungen kann man hinterfragen.

Beta-User

Na ja, etwas komplizierter gedacht, könnte man das "addlog-at" aus https://wiki.fhem.de/wiki/Plot-Abriss_vermeiden#Timerbasierte_Zusatzeintr.C3.A4ge verwenden:

Die Regexp müßte dann eben so gestaltet sein, dass _nur_ Events überhaupt erst erfaßt werden, die mit "<< addLog" enden:

define Log_Gaszaehler FileLog ./log/Log_Gaszaehler-%Y-%m.log Gaszaehler:EnergyCostDayLast:.*...addLog
Falls du dann die "<< addLog" - Bemerkungen raus haben willst, kannst du auch das Reading nachbearbeiten, bevor es geloggt wird, siehe "template" zu
https://fhem.de/commandref_modular_DE.html#SingleFileLog
(Insgesamt frage ich mich, ob es nicht geschickter wäre, "statistics" zu nutzen und die von diesem Modul generierten Werte zu loggen...).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Dracolein

Zitat von: rabehd am 19 Februar 2020, 13:53:47
Was ist eigentlich das Ziel der Aktion?
Ziel ist eine grafische Darstellung der vergangenen täglichen Gasverbräuche.
Das Reading summiert sich über den Tag verteilt langsam auf und den letzten Wert kurz vor Mitternacht will ich abspeichern.
1 Messwert pro Tag soll in der Logfile enthalten sein.
Das Reading wird mit dem Tageswechsel überschrieben und muss vorher gesichert werden für das Diagramm.
(Modul Gascalculator https://forum.fhem.de/index.php?topic=47909.270 )
Ich wollte meine laienhafte Frage nicht im Thread des Moduls starten, um dessen Übersichtlichkeit zu erhalten.

Zitat von: rabehd am 19 Februar 2020, 13:53:47
Was ist das Problem?
Augenscheinlich ich  ;D

Gelernt habe ich, dass ein Filelog immer dann einen Eintrag macht, wenn dessen verknüpftes Reading durch ein Event aktualisiert wird.
In meinem Fall tut es dies alle 60 Sekunden, ergo wäre die Logdatei voll mit Werten, die ich gar nicht benötige.

Nun ist mein Verständnisproblem
a) wie kann ich im FileLog weiterhin definiert lassen, was geloggt werden soll, ohne jedoch die Verknüpfung mit einem Event zu haben (wie es derzeit ist)?
b) wie sage ich dem Filelog, dass es exakt um 23:59 Uhr - und nur dann - das besagte Reading in der Logdatei abspeichert?

Einen alten Thread  ( https://forum.fhem.de/index.php?topic=40426.0 ) fand ich grade mit Google, jedoch habe ich Verständnisprobleme mit den dort genannten Beispielen  :-[
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Beta-User

Zitat von: Dracolein am 19 Februar 2020, 14:59:09
a) wie kann ich im FileLog weiterhin definiert lassen, was geloggt werden soll, ohne jedoch die Verknüpfung mit einem Event zu haben (wie es derzeit ist)?
Gar nicht: FileLog ist ein Eventhandler... Kein Event, keine Aktion, so einfach ist das!
Zitatb) wie sage ich dem Filelog, dass es exakt um 23:59 Uhr - und nur dann - das besagte Reading in der Logdatei abspeichert?
Indem du ein Event generierst, das muß nur "anders" sein als ein "normales" Event (stand schon in meinem vorigen Beitrag. Überlesen?)...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rabehd

#7
Ich habe ein Userreading Regenmengeyesterday, das bilde und logge ich um 23:55.
Sollte sinngemäß bei Dir auch gehen.
Auch funktionierende Lösungen kann man hinterfragen.

Dracolein

Zitat von: rabehd am 19 Februar 2020, 17:21:18
Ich habe ein Userreading Regenmengeyesterday, da bilde und logge ich um 23:55.
Sollte sinngemäß bei Dir auch gehen.
Kannst Du mir ein Beispiel zeigen bitte?
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

rabehd

ZitatKannst Du mir ein Beispiel zeigen bitte?

Das Bilden des Userredings Regenmengetoday, oder das Übertragen des Inhaltes von Regenmengetoday zu Regenmengeyesterday um 23:58?
Woran scheitert es?
Auch funktionierende Lösungen kann man hinterfragen.

jkriegl

Er hat nicht die Regenmenge today, sondern einen Zählerstand, daher muss er sich den Stand  in einem reading merken und den Tagesverbrauch berechnen. Ein DOIF-Beispiel für Solarertrag. ([23:58]) (setreading HK.SOL S.Ertrag_g {([HK.SOL:S.Zaehler]-[HK.SOL:S.Zaehler_g])},
setreading HK.SOL S.Zaehler_g [HK.SOL:S.Zaehler])
Zum Säulendiagramm ist es dann nicht mehr weit.
Rpi 3, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

Dracolein

Zitat
Internals:
   CFGFN     
   CHANGED   
   DEF        ESPEasy_ESP_Easy1_reedkontakt:Total.*
   FUUID      5e4baed4-f33f-4dec-be3f-33e43dfbfa3752e1
   NAME       Gaszaehler
   NOTIFYDEV  ESPEasy_ESP_Easy1_reedkontakt
   NR         5872
   NTFY_ORDER 10-Gaszaehler
   REGEXP     ESPEasy_ESP_Easy1_reedkontakt:Total.*
   STATE      active
   TYPE       GasCalculator
   READINGS:
[...]
     2020-02-19 00:00:18   ESPEasy_ESP_Easy1_reedkontakt_Total_EnergyCostDayLast 2.177
[...]
Attributes:
[...]
Ich hab zur Übersicht mal alles Unwichtige rausgeklammert.  In diesem obigen Device steht das besagte Reading, was jeden Tag um 00:00 Uhr überschrieben wird. Die 2.177 wird dort morgen früh verschwunden sein und ein Wert vom heutigen Tag stehen. Dieses eine Reading ist nur eins von mehreren in vergleichbarer Form, hier Abspeichern des Vortages, in gleicher Form gibt es das auch für den Vormonat und das Vorjahr.

Wenn ich ein Filelog hätte, wo - um bei diesem Beispiel-Reading zu bleiben - die letzten 7 Tage enthalten sind, könnte ich mir daraus ein schönes Balkendiagramm erstellen. Das Diagramm dürfte mir keine Schwierigkeiten machen, da ich damit schon Erfahrungen sammeln konnte.  Ich wiederhole mich, mein Problem ist das Erzeugen eines solchen FileLogs.

Zitat von: Beta-User am 19 Februar 2020, 16:36:26
Indem du ein Event generierst, das muß nur "anders" sein als ein "normales" Event (stand schon in meinem vorigen Beitrag. Überlesen?)...
Nein, ich habe es nicht überlesen, ganz im Gegenteil. Aber es fällt mir schwer, Deinen Hinweis nachzuvollziehen und exakt für meinen Anwendungsfall umzusetzen. Dein Beispielcode ist am Ende noch unvollständig, wenn ich es richtig interpretiere, oder?

Zitatdefine Log_Gaszaehler FileLog ./log/Log_Gaszaehler-%Y-%m.log Gaszaehler:EnergyCostDayLast:.*...addLog
Bitte mich korrigieren, das ganze soll einen Lerneffekt für mich haben. Ich interepretiere hier wie folgt:

Erstelle ein Device mit Name "Log_Gaszaehler" vom Typ "FileLog" am Speicherort "./log/" mit Dateiname "Log_Gas[...].log" und logge dort vom Device "Gaszaehler" das Reading "EnergyCostDayLast" .... und dann?  :-[

Das hier, aus Deinem Beispiel übertragen:
define EnergyCostDayLastToLog at +*23:59 {addLog("Gaszaehler","ESPEasy_ESP_Easy1_reedkontakt_Total_EnergyCostDayLast")}
würde zur definierten Zeit einen Eintrag erzwingen, eigentlich genau was ich suche.
Aber wie kriege ich den Zusammenhang hin zwischen obigem Filelog und diesem at ? Denn, wenn ich richtig interpretiere, ist in dieser Codezeile nicht definiert, wohin ein Logeintrag geschrieben werden soll.


Sorry, bitte habt Nachsicht mit mir. Ich gebe mir Mühe, aber ich tue mich schwer. Ohne Informatik- und Programmierkenntnisse ist FHEM für Laien nicht ohne Hilfe zu begreifen.
Dafür hat die große Mehrheit von Euch unwissend Teile in Eurer Wohnung / Haus eingebaut, die auch mit meiner Kompetenz produziert wurden. Sozusagen habe ich Euch schon geholfen  ;D ;D ;D

Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Beta-User

Jein. Mein Beispielcode würde schon passen, was fehlt, ist die myUtils-Routine wie im Wiki dargestellt.

Aber erst nochmal zum Verständnis:
Ein FileLog-Device (auch die "SingleFileLog-Variante) ist ein Eventhandler. Wir brauchen also ein Event.

Hier im Thread sind dazu zwei Ansätze dargestellt:

1. "Mein" Vorschlag mit dem "addLog" generiert ein Event über ein at, indem es (über den "Umweg" myUtils) einen "trigger"-Befehl absetzt. Das Schlagwort solltest du in der commandref nachlesen. Dieser trigger ist aber als "addLog"-Trigger gekennzeichnet. Der Teil des Codes, den ich gepostet hatte (das define), erkennt dann speziell nur diese von myUtils-addLog erzeugten Events und schreibt auch nur diese in ein eigenes Log (man kann genausogut ein anderes FileLog-Device um die regex erweitern).

2. Die andere Variante ist das "Umpacken" in das "Vortages"-Reading.
a. Das tut der DOIF-Code von jkriegl (auch wenn ich niemals verstehen werde, warum man für eine reine Timer-Anweisung ein komplexes Modul bemüht und kein at nimmt.) Als at sähe das z.B. so aus:
define at_EnergyGasCosts2359 at +*23:59 setreading Gaszaehler EnergyGasCosts2359 [Gaszaehler:ESPEasy_ESP_Easy1_reedkontakt_Total_EnergyCostDayLast](Ich finde set magic immer noch komisch und würde das in Perl machen, aber für's erste geht es auch so...)
Dieses "setreading" erzeugt nicht nur einen neuen Readingswert, sondern auch ein Event, das man mit der passenden regex loggen kann (diese bitte selber machen, das at kann man zu Testzwecken mit "execNow" auslösen...).

b. Die weitere, hier auch schon kurz genannte Variante war, mit "statistics" zu arbeiten. Das hat - anders als der GasCalculator, bei dem man ggf. mal in der cref nachschauen sollte, ob der das nicht auch kann - Routinen, um Verbräuche über sinnvollen Zeitabschnitten ((Stunden), Tage, Wochen, Jahr) in Readings zu packen. Das würde dann ohne separates at die entsprechenden Werte erfassen und in Readings schreiben, was wieder Events erzeugt... (aber eben dann jeweils nur, wenn die betreffende Periode um ist...).

Meine Lektüre-Empfehlungen zum Grundverständnis:   Wiki zu Event Monitor und notify (das dort gesagte gilt praktisch 1:1 auch für FileLog).

Hoffe, das (als ebenfalls nicht-IT'ler...) jetzt so erläutert zu haben, dass das besser verständlich ist.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

KölnSolar

Bin hier gerade reingestolpert und wundere mich über die Anfrage. ???
ZitatGaszaehler:EnergyCostDayLast:.*
Ist doch ein GasCalculator-device und dann passt doch
Zitatmit der Folge,dass bei jeder Änderung des Readings (hier alle 60 Sek) ein Eintrag gemacht wird, was ich verhindern möchte.
nicht. Die ...DayLast-readings werden doch nur einmal am Tag(1. Aufruf aufgrund des ersten updates des ESPEasy_ESP_Easy1_reedkontakt nach 0 Uhr ) verändert(event), oder ? Oder liegt es bei mir daran, dass mein "ESPEasy_ESP_Easy1_reedkontakt " mit attr event-on-change-reading .* definiert ist ? Dann wäre das aber die einfachste Lösung für die ...Last-readings.

Ansonsten hat Beta natürlich recht.
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

rabehd

Ich kenne den GasCalculator nicht und es gibt hier sicher verschiedene Lösungen.

Um in ein Filelog Daten eines Readings zu bekommen benötigt man ein Event des Readings.

Der GasCalculator zählt wohl, wie jeder Zähler, irgendwas (Regen, Strom, Gas, Erbsen). Bei mir wird fortlaufend die Regenmenge gezählt.
Hier gibt es schon einen Tageszähler. Den musste ich mir selbst als Userreading bauen.
Wissen willst Du den Gesamtverbrauch des Tages, das ist der höchste, letzte Wert des Tageszählers. Was heute Dein höchster Wert ist, dass weist Du erst morgen. Somit weißt Du heute den Verbrauch von gestern. Das wäre also ein Userreading lastday. Dieses wird nur einmal am Tag geschrieben, Du hast also auch nur ein event.
Das kannst Du per at um 23:5x machen. Schreibe den Wert von heute in das Reading lastday. Fertig.
Das ist bei mir die Grundlage für Balkendiagramme mit der vergangenen Tagesmenge. Im Diagramm habe ich auch noch den jeweils aktuellen Wert von heute als Balken für heute.

Man könnte das auch über ein notify machen. Wenn sich das Reading für heute ändert und der alte Wert größer war, dann ist es ein neuer Tag und dann schreibe den alten Wert in Lastday.
Auch funktionierende Lösungen kann man hinterfragen.