FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: dadoc am 06 August 2018, 17:01:23

Titel: [gelöst] RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: dadoc am 06 August 2018, 17:01:23
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

Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: dadoc am 06 August 2018, 17:22:25
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...
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: mumpitzstuff am 06 August 2018, 17:36:00
Ein Userreading erzeugen und dort die Filterung vornehmen. Dann im Log nur noch auf das Userreading filtern.
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: dadoc am 07 August 2018, 16:45:26
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
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: mumpitzstuff am 07 August 2018, 20:25:45
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.
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: dadoc am 08 August 2018, 11:28:58
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);}}
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: dadoc am 08 August 2018, 12:15:53
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...
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: mumpitzstuff am 08 August 2018, 18:35:40
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]
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: betateilchen am 08 August 2018, 20:03:08
welchen Sinn hat der Aufwand eigentlich?
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: mumpitzstuff am 08 August 2018, 21:46:09
Das habe ich mich auch schon gefragt... Aber er wird schon wissen was er tut.
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: betateilchen am 08 August 2018, 22:02:39
vor allen Dingen, weil man einen bestimmten Zeitraum aus dem Log ja genau spezifizoiert abrufen kann...

get <name> <infile> <outfile> <from> <to> <column_spec>
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: dadoc am 09 August 2018, 10:30:29
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!
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: dadoc am 16 August 2018, 15:22:51
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?
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: frank am 16 August 2018, 15:38:00
andere idee:
für filelog gibt es auch "attr disabledForIntervals".
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: dadoc am 16 August 2018, 16:21:52
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.
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: frank am 16 August 2018, 17:57:42
mit attr disable 0/1, kannst du auch explizit an- und ausschalten.
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: dadoc am 18 August 2018, 19:32:45
Du meinst, das Log dynamisch ein- bzw. auszuschalten, abhängig von der Pumpenüberwachung?
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: frank am 18 August 2018, 20:37:59
wenn die zeiten variabel sind, ist das so eventuell einfacher.
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: dadoc am 18 August 2018, 20:49:41
Gute Idee, vielen Dank, das werde ich mal testen.
Momentan habe ich das Log mit der Regex
MyRedox:Redox.*
{my $filtertime =  ReadingsVal("PoolPumpeStatus_Dummy","state",0) + 1;
if (TimeNow() =~ /\s$filtertime/) {
ReadingsVal("Pool","Redox",0);}
else {undef}}

im Testlauf, wobei filtertime die hour des Einschaltens der Pumpe ist.
Titel: Antw:RegEx zum Filtern von Logeinträgen nach Uhrzeit
Beitrag von: dadoc am 21 August 2018, 14:53:19
Zitat von: frank am 16 August 2018, 17:57:42
mit attr disable 0/1, kannst du auch explizit an- und ausschalten.
So habe ich es letztlich mit einem DOIF gemacht:
([Pool:Pumpe] eq "1")
(attr FileLog_Pool disable 0)
DOELSE
(attr FileLog_Pool disable 1)

und noch ein wait von 3600 s, damit das Loggen erst eine Stunde nach Pumpenstart beginnt.
Das ist schön schlank und elegant, vielen Dank nochmal für den Hinweis, Frank.