Filelog eingrenzen auf Ober- und Untergrenze

Begonnen von Superposchi, 10 Juli 2025, 11:42:43

Vorheriges Thema - Nächstes Thema

Superposchi

Da ich kein besseres Unterforum gefunden habe frage ich mal hier:
Ich habe ein Filelog erstellt umd zu loggen wann mein Handy - per AMAD - in Fhem als geladen bzw. nicht geladen erscheint. Da der Ladeprozess zum Schutz des Akkus oftmals in der Nacht unterbrochen wird habe ich ins Log auch den Ladezustand des Akkus mit aufgenommen:
GalaxyS25ultra_Marko:batteryPercent:.*
GalaxyS25ultra_Marko:powerPlugged:.*

Leider wird dadurch das Logfile natürlich mit Prozentangaben des Akkustandes überschwemmt, da ja jede Änderung des Prozentwertes ein Event auslöst. Da die relevanten Schaltaktionen des Readings PowerPlugged lediglich bei einem Akkustand von über 90% bzw. unter 45% auftreten würde ich gerne auch nur diese Bereiche mitloggen. Mir fallen aber aktuell nur die Beschränkungen des Readings zur Eventerzeugung ein mit denen zb. festgelegt wird, dass nur ein Event nur erzeugt wird bei einer Größenänderung von mindestens. Doch das löst mein Problem ja nicht. Ich müsste irgendwie im regulären Ausdruck eingrenzen das nur die beiden Bereiche am Ende aufgenommen werden.
GalaxyS25ultra_Marko:batteryPercent:>90.*würde aber nur den oberen Bereich mitloggen, nicht aber den unteren und umgekehrt.

Daher meine Frage:
Gibt es eine Möglichkeit das Reading nur bei Änderungen des Werten zwischen 0-45% und 90-100% mitzuloggen und dazwischen nicht?


list zum Device:
Internals:
   DEF        ./log/Devices/FileLog_GalaxyS25ultra_Marko-%Y.log GalaxyS25ultra_Marko:batteryPercent:.*|GalaxyS25ultra_Marko:powerPlugged:.*|GalaxyS25ultra_Marko:powerOn:.*
   FD         54
   FUUID      67a546bb-f33f-7706-8edd-f14de06b2673172f
   FVERSION   92_FileLog.pm:0.295270/2025-01-16
   NAME       FileLog_GalaxyS25ultra_Marko
   NOTIFYDEV  GalaxyS25ultra_Marko
   NR         523
   NTFY_ORDER 50-FileLog_GalaxyS25ultra_Marko
   REGEXP     GalaxyS25ultra_Marko:batteryPercent:.*|GalaxyS25ultra_Marko:powerPlugged:.*|GalaxyS25ultra_Marko:powerOn:.*
   STATE      active
   TYPE       FileLog
   currentlogfile ./log/Devices/FileLog_GalaxyS25ultra_Marko-2025.log
   logfile    ./log/Devices/FileLog_GalaxyS25ultra_Marko-%Y.log
   READINGS:
     2025-07-10 10:49:56   linesInTheFile  81717
Attributes:
   logtype    text
   room       Logging
   verbose    0

passibe

Mal den freundlichen Bot von nebenan befragt:

Give me a regex that does 0-45 and 90-100

ChatGPT:
Here's a regex that matches numbers from 0 to 45 and 90 to 100, assuming you're matching whole numbers only:

^(?:[0-9]|[1-3][0-9]|4[0-5]|9[0-9]|100)$
Denke mal, darauf kannst du aufbauen.

Ansonsten: Seiten wie regex101.com nicht vergessen.

betateilchen

  • man lese die commandref zu FileLog...
  • nach dem Lesen benutze man das Attribut acceptedRange...

ZitatacceptedRange col1:min:max[:regexp] ...
This attribute takes a space separated list of ranges. An event wont be logged, if the column of the event (counted from 0) is a number, and it is outside of the specified range. The optional regexp will check the event only, without the usual ^ and $ added to it. Example:
attr fl acceptedRange 1:5:35:[Tt]emperature 1:-90:-40:RSSI
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Superposchi

@passible

Weil die Regex an den Pipes immer aufgetrennt wurde habe ich es jetzt in verschiedene Einträge unterteilt. Mal sehen ob das jetzt so funktioniert:
GalaxyS25ultra_Marko:batteryPercent:^(?:[0-9])$
GalaxyS25ultra_Marko:batteryPercent:^(?:[1-3][0-9])$
GalaxyS25ultra_Marko:batteryPercent:^(?:4[0-5])$
GalaxyS25ultra_Marko:batteryPercent:^(?:9[0-9])$
So komplex hatte ich gar nicht gedacht, ich habe mich immer darauf konzentriert irgendwie den mittleren Bereich auszuklammern statt den vorderen und hinteren einzugrenzen.

Das mit ChatGPT ist einfach nicht meine Welt. Klingt alles so einfach, aber ich komme damit nicht mehr zurecht. Ich wüsste nicht mal wo ich die Frage eingeben müsste. Ist das eine extra App/Programm oder? Gibts da Kurse für  ;D

Gibt es eigentlich eine Möglichkeit das Filelog zeitlich zu begrenzen, so dass nur nachts mitgelogged wird?

passibe

Also nach dem Hinweis von betateilchen würde ich jetzt eher mit acceptedRange arbeiten.

Zitat von: Superposchi am 10 Juli 2025, 13:18:47Ist das eine extra App/Programm oder?
Gibts als Website (chatgpt.com) oder App. Einfach einen Account anlegen und los gehts. Alternativ kann man das auch ohne Account nutzen, aber dann gibts nicht das beste Modell.

Gibt dazu sicherlich auch viele Tutorials im Netz, wobei es ja eigentlich selbsterklärend ist. Wenn man nicht weiter weiß, kann ChatGPT ja immer auch selbst fragen :D

Natürlich nicht alles für bare Münze nehmen, was der einem erzählt. Das gilt jetzt aber mehr für Themen wie Gesundheit, rechtliche Fragen, Politik/kürzliche Ereignisse, usw. Für Dinge wie Übersetzungen und Computerkram ist es hingegen schon sehr zuverlässig und jedenfalls äußerst hilfreich.

betateilchen

Zitat von: Superposchi am 10 Juli 2025, 13:18:47Gibt es eigentlich eine Möglichkeit das Filelog zeitlich zu begrenzen, so dass nur nachts mitgelogged wird?

Natürlich. Es gilt das gleiche wie für das Festlegen akzeptierter Werte, das ich weiter oben beschrieben habe.

  • man lese die commandref zu FileLog...
  • nach dem Lesen benutze man das Attribut disabledForIntervals...

ZitatdisabledForIntervals HH:MM-HH:MM HH:MM-HH:MM ...
Space separated list of HH:MM or D@HH:MM tupels. If the current time is between the two time specifications, the current device is disabled. Instead of HH:MM you can also specify HH or HH:MM:SS.

Das alles funktioniert komplett ohne ChatGPT, einfach durch Nachlesen in der Beschreibung zu FileLog.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Superposchi

#6
@betateilchen
Ich kapiere das nicht, versuche das bis gerade irgendwie zu durchschauen, aber je öfter ich es lese, desto mehr Fragen habe ich.
acceptedRange col1:min:max[:regexp] ...
Dieses Attribut spezifiert eine durch Leerzeichen getrennte Liste von Bereichen. Falls die Spalte (gerechnet ab 0) eines Events eine Zahl ist, und ausserhalb dieses Bereiches liegt, wird das Event nicht geloggt. regexp ist optional, und prüft nur das Event, ohne die Ergauml;nzung durch die üblichen ^ und $. Beispiel:
attr fl acceptedRange 1:5:35:[Tt]emperature 1:-90:-40:RSSI
Worauf bezieht sich Spalte? Die Textausgabe des Logs?
Worauf bezieht sich die 1 im Beispiel? Soll das die Nummer der erwähnten spalte sein?
Sind der Wert und die Readingbenennung zwei unterschiedliche Spalten oder ein und die gleiche?
2025-04-13_00:17:58 GalaxyS25ultra_Marko batteryPercent: 78Sind das 4 Spalten?
Wozu muss da eine Regexp angegeben werden? Die ist doch schon im Def vorhanden oder muss die dann dort ausgelassen werden?
Wäre folgendes richtig um zwischen 90-100 zu loggen??
attr FileLog_GalaxyS25ultra_Marko acceptedRange 3:90:100:batteryPercent
Das disabledForIntervals ist da logischer. Es bezieht sich aber auf den auszuklammernden Zeitbereich, richtig?
Um also nur in der Zeit von 22 Uhr bis 9 Uhr zu loggen müsste das Attribut folgendermaßen aussehen:
attr FileLog_GalaxyS25ultra_Marko disabledForIntervals 09:00-22:00

betateilchen

Zitat von: Superposchi am 10 Juli 2025, 22:36:09Ich kapiere das nicht, versuche das bis gerade irgendwie zu durchschauen, aber je öfter ich es lese, desto mehr Fragen habe ich.

Denke doch einfach mal ganz simpel und logisch - für 5 Cent wäre völlig ausreichend.

Zitat von: Superposchi am 10 Juli 2025, 22:36:09Worauf bezieht sich Spalte? Die Textausgabe des Logs?

Logische Überlegung: Auf die Textausgabe des Logs kann es sich doch gar nicht beziehen, denn anhand des Attributes soll ja erst entschieden werden, ob es überhaupt eine Textausgabe ins Log geben soll.

In dem von Dir zitierten deutschen (!) Text der commandref ist doch Deine Frage schon beantwortet:

Zitat von: Superposchi am 10 Juli 2025, 22:36:09Dieses Attribut spezifiert eine durch Leerzeichen getrennte Liste von Bereichen. Falls die Spalte (gerechnet ab 0) eines Events eine Zahl ist,

Was ist daran unverständlich? Es ist quasi die gleiche Zählung wie bei $EVTPARTx

Zitat von: Superposchi am 10 Juli 2025, 22:36:09Worauf bezieht sich die 1 im Beispiel? Soll das die Nummer der erwähnten spalte sein?

Natürlich.
Auch das steht doch in dem von Dir zitierten Text in der Syntaxbeschreibung des Attributes:

Zitat von: Superposchi am 10 Juli 2025, 22:36:09acceptedRange col1:min:max[:regexp]

Zitat von: Superposchi am 10 Juli 2025, 22:36:09Wozu muss da eine Regexp angegeben werden?

Muss doch gar nicht. Steht in dem von Dir zitierten Text ausdrücklich drin:

Zitat von: Superposchi am 10 Juli 2025, 22:36:09regexp ist optional

Exkurs: Warum kann es trotzdem Sinn machen, die regex anzugeben?

Angenommen, Du definierst in dem Attribut acceptedRange einen Ausdruck

3:80:100

ohne Angabe einer regex. Dann würden für ALLE readings von allen in dem Log enthaltenden devices nur Werte zwischen 80 und 100 gelogged, wenn der Wert in der 4. Spalte steht. Das kann aber auch readings betreffen, die Du gar nicht einschränken wolltest. Zwischen 80 und 100 kann zum Beispiel auch eine Luftfeuchtigkeit liegen.

Deshalb gibt es die Möglichkeit, den Namen des readings (oder einer anderen zutreffenden regex) mit anzugeben, um das Loggen nur dafür einzuschränken.

Zitat von: Superposchi am 10 Juli 2025, 22:36:09Wäre folgendes richtig um zwischen 90-100 zu loggen??
attr FileLog_GalaxyS25ultra_Marko acceptedRange 3:90:100:batteryPercent

Probier es doch einfach aus.



Und wie schon gesagt: Es reicht völlig aus, die commandref genau zu lesen - alle Deine Fragen sind dort eindeutig beantwortet.



--
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: Superposchi am 10 Juli 2025, 11:42:43Da ich kein besseres Unterforum gefunden habe

"help filelog" hilft wie immer weiter:

Module: 92_FileLog.pm Maintainer: rudolfkoenig Forum: Automatisierung
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!