Filelog Regex funktioniert nicht wie erwartet

Begonnen von netbus, 25 Januar 2016, 12:40:25

Vorheriges Thema - Nächstes Thema

netbus

Mein SVG streikt weil er ein + in den Werten hat.
Ich dachte kein Problem, mittels regex kann ich es ausklammern nur scheinbar verhält sich das logfile regex anders.
Mein Log sieht so aus
2016-01-25_12:33:49 Fahrzeit1 duration_diff_hr: +66
2016-01-25_12:34:49 Fahrzeit1 duration_diff_hr: +66

Meine Regex so:
./log/stau-%Y-%m.log Fahrzeit1:(duration_diff_hr:)\s*\+(\d+)
Laut Regext Tester (regex101) matched "duration_diff_hr:" und "66" trotzdem schreibt er mir ins Log immer auch das "+"
Wie kann ich verhindern, dass das "+" im Log erscheint?

Markus Bloch

Hallo,

die FileLog Regexp dient nur dazu Events zu ermitteln welche in ein Filelog geschrieben werden sollen. Die Regexp unterstützt keinerlei Grouping durch Klammern. Wenn eine Regexp auf ein Event matcht, wird das gesamte Event unverändert in das FileLog geschrieben.

Ich würde vorschlagen das + entweder direkt an der Quelle (Definition: "Fahrzeit1") oder im SVG durch eine Regexp zu entfernen.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

netbus

ich habe es versucht im svg aber leider greift meine regex nicht.
#Filelog_Stau 4:Fahrzeit1.duration_diff_hr\x3a\s+\+(\d+):0:

hast du vielleicht einen Tipp?

Markus Bloch

Auch hier bei SVG wird wieder nur ein Match auf die Zeile durchgeführt, ohne Grouping.

Mein Vorschlag:
#FileLog 4:duration_diff_hr:0:$fld[3]=~s/\+//

Die FileLog Zeile bei gnuplots besteht aus folgenden Einzelwerten:

Column:Regexp:DefaultValue:Function

Die Regex dient wieder nur der Identifikation der richtigen Zeilen in der Datei selber (vorzugsweise der Readingname) .Ich nutze nun als Funktion: $fld[3]=~s/\+// um das "+" wegzuersetzen.

Gruß
Markus

Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

netbus

Danke das funktioniert.
Aber gibt es das irgendwo dokumentiert?

Markus Bloch

Auch auf die Gefahr, dass ich jetzt wieder Haue bekomme. Es steht in der Commandref.

Wenn man sich den Abschnitt für gnuplot-syntax durchliest, wird hierbei auf die <columspec> Beschreibung zum FileLog get-Kommando verwiesen.

Dort steht:

Zitat
<column_spec>
Jede column_spec sendet die gewünschten Daten entweder in eine gesonderte Datei oder über die gegenwärtige Verbindung durch "-" getrennt.
Syntax: <col>:<regexp>:<default>:<fn>

  • <col> gibt die Spaltennummer zurück, beginnend mit 1 beim Datum. Wenn die Spaltenmummer in doppelten Anführungszeichen steht, handelt es sich um einen festen Text und nicht um eine Spaltennummer.
  • <regexp> gibt, falls vorhanden, Zeilen mit Inhalten von regexp zurück. Groß- und Kleinschreibung beachten.
  • <default>
    Wenn keine Werte gefunden werden, und der Default-Wert (Voreinstellung) wurde gesetzt, wird eine Zeile zurückgegeben, die den von-Wert (from) und diesen Default-Wert enthält. Dieses Leistungsmerkmal ist notwendig, da gnuplot abbricht, wenn ein Datensatz keine Daten enthält.

  • <fn> Kann folgende Inhalte haben:

    • int
      Löst den Integer-Wert zu Beginn eines Strings heraus. Wird z.B. bei 10% gebraucht.
    • delta-h oder delta-d
      Gibt nur den Unterschied der Werte-Spalte pro Stunde oder pro Tag aus. Wird benötigt, wenn die Spalte einen Zähler enthält, wie im Falles des KS300 in der Spalte für die Regenmenge.
    • alles andere
      Dieser String wird als Perl-Ausdruck ausgewertet. @fld enthaelt die aktuelle Zeile getrennt durch Leerzeichen. Achtung: Dieser String/Perl-Ausdruck darf keine Leerzeichen enthalten.


Beim lesen ist mir dann die fett-gedruckte Passage wieder eingefallen. Somit reicht folgendes:

#FileLog 4:duration_diff_hr:0:int

Was ich vorgeschlagen habe, war die 3. Variante, welche ich nur kursiv markiert habe.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

netbus

$fld[3]=~s/\+//
schreibt mir alles auf eine 1 um.
preprocessed input:
get Filelog_Stau CURRENT INT 2016-01-26_12:45:00 2016-01-27_12:45:01 4:Fahrzeit1.duration_diff_hr\x3a:0:$fld[3]=~s/\+//
2016-01-26_15:07:33 1
2016-01-26_15:08:33 1
2016-01-26_15:09:33 1
2016-01-26_15:21:33 1
2016-01-26_15:23:34 1
2016-01-26_15:45:45 1


int greift nicht.
dürfte scheinbar nur funktionieren wenn symbole hinter einem integer sind aber nicht davor.  :(

Markus Bloch

#7
Dann so:

$fld[3]=~s/\+//?$fld[3]:$fld[3]
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

netbus

danke das funkt.
ich glaube ich werde mir perl mal genauer ansehen  :D