Problem mit Attribut event-min-interval

Begonnen von DerBurner, 16 September 2023, 15:34:28

Vorheriges Thema - Nächstes Thema

DerBurner

Ich möchte den Wert der Dummyvariablen 'DG.Fenster01' (Reading 'state') continuierlich im Abstand von 60 Sekunden in die Datenbank (zwecks eines Plots) schreiben. Früher ging das mit den Attributen wie folgt:
DbLogExclude .*
DbLogInclude .*
event-min-interval .*:60
Seit irgendeinem Update (vielleicht schon > 10 Monate her), funktionieren die Attribute nicht mehr in der gewünschten Form. Es wird lediglich beim manuellen Setzen 1x der Wert der Variablen in die Datenbank geschrieben, die weiteren Werten Werte im Abstand von 60 Sekunden leider nicht. Hat jemand eine Idee, woran es liegen könnte und kann eine Lösung anbieten?

DS_Starter

#1
ZitatSeit irgendeinem Update (vielleicht schon > 10 Monate her), funktionieren die Attribute nicht mehr in der gewünschten Form. Es wird lediglich beim manuellen Setzen 1x der Wert der Variablen in die Datenbank geschrieben, die weiteren Werten Werte im Abstand von 60 Sekunden leider nicht. Hat jemand eine Idee, woran es liegen könnte und kann eine Lösung anbieten?
Ich glaube du bist einem Irrtum aufgesessen. Das Attr event-min-interval bedeutet nicht dass Events mit einer Frequenz von mindestens X Sekunden erzeugt werden, die dann auch geloggt würden.
Vielmehr beschreibt es die Mindestzeit in Sekunden die vergehen muß, bevor ein Event erzeugt wird nachdem ein solcher Event bereits erzeugt wurde.
Auszug aus der ComRef:

Zitatevent-min-interval
Dieses Attribut enthält eine durch Kommata getrennte Liste von "readings:minInterval" Paare. readings kann ein regexp sein. Ein Event wird nur dann generiert, falls seit dem letzten Auftreten des gleichen Events mindestens minInterval Sekunden vergangen sind. Falls event-on-change-reading auch spezifiziert ist, dann werden sie mit ODER kombiniert, d.h. wenn einer der beiden Bedingungen wahr ist.

Das war auch noch nie anders. Es wäre möglich, dass du Events geloggt hast die per default mit einer Frequenz < 60 Sekunden erzeugt wurden. Dann funktioniert event-min-interval .*:60 "zufällig".

Wenn du einen Event Wert kontinuierlich alle X Sekunden in die DB loggen willst, benutzt du das "set ... addLog" Kommando im DbLog. Dieses Kommando führst du alle X Sekunden z.B. in einem at-Device aus.
ESXi 6.5 @NUC6i5SYH+FHEM auf Debian, DbLog/DbRep MariaDB
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DerBurner

Vielen Dank für Deine ausführliche Erklärung. Ich hatte die Wirkung dieses Attributes offenbar falsch interpretiert und schaue mir mal "set ... addLog" jetzt genauer an ;)

DerBurner

Die Lösung sieht nun wie folgt aus:

+*00:01:00
set logdb addLog MQTT2_MQTT2_Server:products_0_currentPosition;
set logdb addLog MQTT2_MQTT2_Server:products_1_currentPosition

Danke nochmal für den Hinweis;-)

bartman121

Dir ist aber schon bewusst, dass du jetzt fast 3000 Zeilen täglich in die DB schreibst? Für eine Visualisierung?

Das sind im Jahr eine Million Zeilen?!

Die hier verwendete Lösung erscheint auf den ersten Blick richtig, aber gerade solche "einfachen Lösungen" verführen zum nachahmen und dann später zu dem Thema: "Hilfe, meine DB ist zu groß!!!!11111" oder "Hilfe, Plots bauen sich extrem langsam aus!!!!1111"

Es gibt doch deutlich bessere Methoden:
https://wiki.fhem.de/wiki/LogProxy


betateilchen

Man kann das mit addLog schon so machen, man sollte sich aber dann tatsächlich auch Gedanken über das Thema spätere Datenreduktion machen.

Bei mir gibt es ein Szenario, in dem ich Kurswerte alle 10 Minuten logge, um einen möglichst exakten Verlauf darstellen zu können. Diese hohe Genauigkeit brauche ich aber nur für heute und ggf. wenige Vortage.

Deshalb wird jeweils zu ultimo die Datenmenge reduziert, indem ich von den Werten des Vormonats immer nur den Durchschnittswert eines jeden Tages in der Datenbank behalte. Also am 30.09. wird der Bestand des Monats August reduziert, Ende Oktober dann der September usw.

Dadurch habe ich immer den laufenden Monat + den Vormonat in hoher Auflösung, für frühere Zeiten reichen mir die Durchschnittswerte pro Tag völlig.

DbRep bietet für aolche Bereinigungen ja jede Menge Möglichkeiten.
-----------------------
Mach es möglichst simpel und mach es richtig,
dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

bartman121

Das ist schon richtig, wer aber sowas macht:
DblogExclude .*
DblogInclude .*

Den darf man sicher auch auf solche unbedachten Sachen hinweisen.

Trotzdem muss ich anmerken, dass die Auflösung natürlich nicht durch durch zusätzliches Logging größer wird. Die Auflösung bliebt die gleiche.

Wie gesagt, es gibt logProxy, für Grafana hab ich mir eine Funktion gebaut, die einfach den letzten wert vor der Zeitspanne am Beginn der Zeitspanne ausgibt und genauso für das Ende der Zeitspanne.

Lediglich für tabletUi nutze ich auch addlog, weil ich bei chart.js keine andere Möglichkeit gefunden hatte, was nicht heißt, dass es diese nicht gibt.




betateilchen

Zitat von: bartman121 am 17 September 2023, 09:46:17Trotzdem muss ich anmerken, dass die Auflösung natürlich nicht durch durch zusätzliches Logging größer wird. Die Auflösung bliebt die gleiche.

Das hab ich nicht verstanden. Bezogen auf den dargestellten Zeitraum (z.B. eine Stunde oder einen Viertel-Tag) wird die Auflösung im SVG plot natürlich höher, wenn ich mehr Datenpunkte innerhalb dieses Zeitraumes habe.
Der Hintergrund meines Vorgehens ist eben, dass mich heute am 17.09. der Tagesverlauf von vor vier Monaten eben nicht mehr im 10-Minuten-Takt interessiert und mir deshalb der Durchschnittswert des 17.05. als Wert für den ganzen Tag bei der Darstellung eines Halbjahres- oder Jahresintervalls völlig ausreicht.
-----------------------
Mach es möglichst simpel und mach es richtig,
dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

bartman121

#8
Keine Ahnung ob ich dein Vorhaben nicht verstehe oder du etwas nicht erwähnst.

Hier im Beispiel kommen einfach keine geänderten werte, mittels addlog wird einfach stumpf der aktuelle Wert neu eingetragen. Das wiederholen des vorherigen Messwertes wird unter keinen Umständen eine Verbesserung der Auflösung ergeben. Am Ende hast du halt x-mal den gleichen Wert, der aber nicht aus deiner Messeinrichtung stammt und damit nicht den aktuellen Zustand widerspiegeln muss.

Anders wäre es, wenn die Werte sich ändern  und du immer zur zehnten Minute den aktuellen Wert in der DB haben willst, dann wären aber üblicherweise auch Events da, die man nutzen könnte.


DerBurner

Danke für das wertvolle Feedback, konnte damit schließlich eine Lösung modelieren.
Die Testeinstellungen mit dem Minutenintervall nutzte ich nur um Test um festzustellen, ob überhaupt Daten in die Datenbank eingetragen worden sind. Aktuell sieht die Einstellung wie folgt aus:

+*00:01:00
set logdb addLog MQTT2_MQTT2_Server:products_0_currentPosition;
set logdb addLog MQTT2_MQTT2_Server:products_1_currentPosition

Zum Hintergrund der Aufgabenstellung:
Per MQTT2-Schnittstelle erhalte ich den Öffungsstatus eines Velux-Fensters sowie dessen Rollos. Diese Werte werden jedoch nur einmalig bei einer Änderung übermittelt. Sollte sich über viele Stunden (oder auch Tage) der Status nicht ändern, dann erhalte ich auch keine Informationen als notwendige Stützstellen für meine Grafik. Man kann dann allein aus dem Plot nicht erkennen, welchen Öffnungsstatus Fenster und Rollo haben. Mit der o.a. Einstellung erhalte ich nun stündlich zwei Stützwerte, die Grafik ist daher perfekt. Danke nochmal für die Anmerkungen.

Ich bräuchte allerdings nochmals Eure Hilfe an anderer Stelle:
Aktuell kann ich nur per Timer den Öffnungswinkel von Fenster und Rollo wie folgt triggern:

{fhem "set MQTT2_Server publish klf200/0/products/0/targetPosition 40";}
bzw.
{fhem "set MQTT2_Server publish klf200/0/products/1/targetPosition 80";}

Das funktioniert prima.

Leider kann ich nicht direkt mit Hilfe der fhem GUI den Wert situativ ändern, da keine Edit-Felder für die TargetPositions zur Verfügung stehen.
Habt Ihr in diesem Fall eine Lösung?
 

DerBurner

Sorry Schreibfehler, richtig heißt es natürlich:

+*01:00:00
set logdb addLog MQTT2_MQTT2_Server:products_0_currentPosition;
set logdb addLog MQTT2_MQTT2_Server:products_1_currentPosition

bartman121

Also, zu deiner Visualisierung, wozu nutzt du denn einen Plot für eine solche Visualisierung?

Geht's dir darum zu sehen wann das Fenster offen war? ->Readingshistory

Zu deiner Frage wegen des Vorgabewertes....

Ich befürchte du musst da noch ein bisschen lesen, aber im Grunde solltest du mittels https://wiki.fhem.de/wiki/FHEMWEB/Widgets und setlist was geeignetes bauen können.

Es ist nicht schlimm als Anfänger das zu nutzen was man schon kennt.

Es ist aber hilfreich deine Frage immer vollständig zu beschreiben und nicht gleich den Lösungsweg festzulegen, addlog ist für diesen Anwendungsfall eine einfache aber schlechte Lösung. Weil du das auch in Zukunft an anderer Stelle nutzen wirst und irgendwann ist die DB riesig.


DS_Starter

ZitatWeil du das auch in Zukunft an anderer Stelle nutzen wirst und irgendwann ist die DB riesig.
Das kann natürlich passieren, aber wie betateilchen schon schrieb, sollte man sich als DB-Nutzer generell Gedanken um die Datenpflege machen.
Wenn man bestimmte Daten, oder generell alle Daten in der DB nach einem bestimmten Zeitraum nicht mehr benötigt, löscht man diese Daten einfach aus der Datenbank. ;)
Das erledigt ein regelmäßiger Task mit "set <DbRep> delEntries" ganz einfach.

Ich habe zum Beispiel mehrere DB's. Eine für Langzeitdaten (Energiemanagement PV Anlage etc.). Die bleiben erhalten um Jahresvergleiche u.a. anfertigen zu können.
Alle anderen Daten kommen in eine Kurzzeit-DB. In dieser DB werden alle Daten älter als 3 Monate gelöscht.
Das wars.

ESXi 6.5 @NUC6i5SYH+FHEM auf Debian, DbLog/DbRep MariaDB
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter