[gelöst] RegEx zum Filtern von Logeinträgen nach Uhrzeit

Begonnen von dadoc, 06 August 2018, 17:01:23

Vorheriges Thema - Nächstes Thema

dadoc

Hallo zusammen,
ich möchte erreichen, dass von einem Device (myPoolcontroller) nur bestimmte Logeinträge in ein Log geschrieben werden (Redox-Wert), und das auch nur in einem bestimmten Zeitfenster (z.B. 15:00:00 - 15:59:59)

Der betreffende Event erscheint so im Monitor:
2018-08-06 15:14:37 myPoolcontroller Pool Redox: 662.69
und so im Log:
2018-08-06_15:14:37 Pool Redox: 662.69

Nun dachte ich, ich könnte die Regex eines Filelogs einfach so definieren:
.*\s15:.*Redox.*
Im Regex-Tester funktioniert es zwar, da wird aber nichts ins Log eingetragen. Ebenso wenig mit
.*_15:.*Redox.*
Dagegen werden mit
.*Redox.*
die Redoxzeilen ins Log geschrieben, aber eben nicht auf 15:xx Uhr gefiltert.
Mit
.*15:.*
dagegen werden nur Zeilen wie
2018-08-06_15:29:37 Pool poolControllerTime: 15:29
2018-08-06_15:32:37 Pool poolControllerTime: 15:32
ins Log geschrieben, was mich zusätzlich verwirrt (d.h. die Tatsache, dass hier die Regex anscheinend nur auf den Wert, nicht aber auf die Uhrzeit des Events anspringt).
Was mache ich hier falsch?
Danke für Eure Hilfe
Martin

Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

dadoc

Ich glaube, ich kann mir die Antwort zumindest teilweise selbst geben: Die Regex wird nicht auf den Timestamp angewandt, auch wenn das an anderer Stelle mal (von pah) behauptet wurde (https://groups.google.com/forum/#!topic/fhem-users/DP3Ia1909AY).
Jede Idee für einen Workaround wird dankend entgegen genommen...
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

mumpitzstuff

Ein Userreading erzeugen und dort die Filterung vornehmen. Dann im Log nur noch auf das Userreading filtern.

dadoc

Danke! Allerdings klappt das bei mir nicht so wie gewünscht. Ich dachte, wenn ich das "echte" Reading "poolControllerTime" gefiltert auf "enthält 15:.*" setze, müsste das mit der Beschränkung auf 15:00:00 bis 15:59:59 Uhr klappen.
attr Pool userReadings MyPoolReading Pool:poolControllerTime\:15:.* {ReadingsVal("Pool","Redox",0)}
Passt aber nicht. Einerseits muss man wohl zwingend mindestens ein event-on-change-reading auf ein echtes Reading setzen, damit etwas ins Log geschrieben wird; dann aber wird auch nur noch dieses Reading gelogged. Bei den Readings des Device taucht MyPoolReading nicht auf - normal?
Andererseits klappt das Triggern so nicht, sondern es wird durchgehend gelogged - was mache ich da falsch?
Danke & Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

mumpitzstuff

#4
attr Pool userReadings MyRedox:Redox.* {if (TimeNow() !~ /\s15:/) ReadingsVal("Pool","Redox",0);}

Ich hätte an sowas gedacht... Ist aber ungetestet und mir ist nicht ganz klar was das Userreading macht, wenn man nichts zurück gibt. Ich hoffe, es macht dann einfach nichts.

dadoc

Vielen Dank, das bringt mich evtl. weiter
Zitat von: mumpitzstuff am 07 August 2018, 20:25:45
attr Pool userReadings MyRedox:Redox.* {if (TimeNow() !~ /\s15:/) ReadingsVal("Pool","Redox",0);}
Nach kleinen Korrekturen (Klammerung sowie EIN- und nicht AUSschließen von 15) läuft das jetzt zur Probe:
attr Pool userReadings MyRedox:Redox.* {if (TimeNow() =~ /\s15:/) { ReadingsVal("Pool","Redox",0);}}
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

dadoc

Zitat von: mumpitzstuff am 07 August 2018, 20:25:45
mir ist nicht ganz klar was das Userreading macht, wenn man nichts zurück gibt. Ich hoffe, es macht dann einfach nichts.
Es schreibt MyRedox mit Timestamp, aber ohne Wert ins Log. Hmm..., mal sehen, wie sich das bei der Visualisierung mit dem Chart Widget macht...
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

mumpitzstuff

#7
Versuch mal ein Else mit undef oder einem Wert den du garantiert nicht erreichst. Mit dem unmöglichen Wert geht dann im Plot sowas:

$fld[3]==5000?undef:$fld[3]

betateilchen

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

mumpitzstuff

Das habe ich mich auch schon gefragt... Aber er wird schon wissen was er tut.

betateilchen

vor allen Dingen, weil man einen bestimmten Zeitraum aus dem Log ja genau spezifizoiert abrufen kann...

get <name> <infile> <outfile> <from> <to> <column_spec>
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dadoc

Zitat von: betateilchen am 08 August 2018, 20:03:08
welchen Sinn hat der Aufwand eigentlich?
Berechtigte Frage. Hintergrund ist folgender: Ein Pool, dessen Chlorproduktion (per Salzwasserelektrolyse), ph-Dosierung uvm. über den PoolController gesteuert wird. Der hat zwar ein eigenes Web UI, aber mit der Visualisierung z.B. der Redox-Werte (als Indiz für den Chlorgehalt) war ich nicht happy. Grund ist, dass diese - ebenso wie ph, Temperatur usw. - nur dann aussagekräftig sind, wenn das Wasser durch die Messzelle fließt, wenn also die Filterpumpe läuft. Die Pumpe läuft aber nur ein paar Stunden am Tag, z.B. von 14 - 16 Uhr. In der restlichen Zeit werden Phantasiewerte gemessen. Ich habe in das fhem-myPoolcontroller-Modul schon eine attr-Option eingebaut, mit der ich das Loggen auf die Laufzeit der Filterpumpe einschränken kann. Aber selbst wenn sie läuft, dauert es eine Weile, bis sich die Messungen auf einen stabilen Wert einpendelt.
Ich wollte eine Visualisierung (mit dem ftui Chart Widget), in der die Zeiten, in denen die Pumpe nicht läuft sowie die Laufzeit, bis sich die Werte stabilisieren, komplett ausgeblendet sind, d.h. einen kontinuierlichen Plot, der die Entwicklung des Redox-Wertes über die Tage zeigt. Mit dem Chart Widget ist das (noch) nicht möglich, aber Eki arbeitet wohl gerade an einer entsprechenden Clipping-Option. Daher ein spezielles User-Reading für das fhem-myPoolcontroller-Modul.

@mumpitzstuff: else undef scheint zu funktionieren - vielen Dank!
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

dadoc

Hallo,,
Zitat von: dadoc am 09 August 2018, 10:30:29
@mumpitzstuff: else undef scheint zu funktionieren - vielen Dank!
MyRedox:Redox.* {if (TimeNow() =~ /\s03:/) { ReadingsVal("Pool","Redox",0);} else {undef}}, MyPh:pH:.* {if (TimeNow() =~ /\s03:/) { ReadingsVal("Pool","pH:",0);} else {undef}}
läuft soweit prima, einziger Schönheitsfehler ist, dass das undef zwischen 2 und 3 Uhr zwar wie gewünscht keinen Eintrag ins Pool-Log, dafür aber alle drei Minuten (Abfrageintervall des Controllers) eine fhem-Fehlermeldung im fhem-Log generiert:
[Thu Aug 16 02:02:12 2018] fhem.pl: Pool userReadings MyRedox evaluated to undef at fhem.pl line 4484.

Kriegt man das noch irgendwie weg?
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

frank

andere idee:
für filelog gibt es auch "attr disabledForIntervals".
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

dadoc

Danke für den Hinweis, da war ich bislang noch nicht drübergestolpert. Das hilt auf jeden Fall mal auf die Schnelle.
Da sich die Uhrzeiten und Zeiträume, in denen die Pumpe läuft, aber öfters ändern (Sommer/Winter, viel oder wenig Badebetrieb, abgedeckt oder offen...) und auch je nach Wochentag unterschiedlich sein können, will ich das im nächsten Schritt automatisieren, damit ich nicht jedesmal an drei Stellen die Zeiten ändern muss.
Im Prinzip heißt das, das Pumpenrelais in fhem zu überwachen (z.B. Status bzw. Startzeit in einen Dummy schreiben) und eine Stunde, nach dem es geschaltet wurde, das Loggen des Userreadings anwerfen, d.h. in der Filelog-Def \s03: durch die Startzeit + 1h ersetzen.
Da fällt mir jetzt nicht ein, wie ich disabledForIntervals nutzen könnte, da die Endzeit fhem ja unbekannt ist.
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods