33_readingsHistory: Absturz bei meiner Regex

Begonnen von vbs, 22 November 2015, 15:33:43

Vorheriges Thema - Nächstes Thema

vbs

Hi Andre,

ich benutze readingsHistory, um mir Events von meinem presence-Device (ein Dummy) anzuzeigen. Ich möchte alle Änderungen an 'state' anzeigen. Da ich jedoch auch statistics für mein presence laufen habe, möchte ich keine anderen Events außer 'state' loggen. Da state ja einen Sonderstatus hat und 'state' nicht mit im Event drin steht, habe ich einen (scheinbar kläglichen) Versuche gestartet, um wirklch nur auf 'state' zu triggern. Das sieht dann so aus:

define rhPresence readingsHistory presence:[^:]*

Also er soll auf alle presence-Events triggern, die kein zweites ':' enthalten. Das war mein Plan um alle nicht-state-Events zu filtern.

Bei jedem Event auf presence stürzt dann jedoch fhem ab mit folgender Meldung:
Unmatched [ in regex; marked by <-- HERE in m/^[ <-- HERE ^$/ at ./FHEM/33_readingsHistory.pm line 472.

Also scheinbar scheint readingsHistory meine RegEx nicht zu schmecken " presence:[^:]*". Ich steh irgendwie auf dem Schlauch. Was mache ich falsch? Online-Regex-Tester finden es ok :)
Danke!

vbs

Bin mittlerweile einen Schritt weiter: Ich hab mal eine Logausgabe in readingHistory eingebaut. Die RegEx, die in Zeile 472 ankommt ist:
[^

Damit ist ja auch klar, dass ihm das so nicht passt.

Ursache ist mMn in Funktion "readingsHistory_updateDevices" das split:
    my @device = split(":", $param);
Da wird ja der ganze String an Doppelpunkten geteilt, dürfen als in der Regex, die man dem Modul übergibt nicht vorkommen.

Kann man da irgendwas machen? Bzw. was ist eigentlich der "Best Practice"-Ansatz um in FHEM auf state zu triggern? Warum das Wort "state" bei den state-Events fehlt, ist eine der Sachen, die sich mir nie erschlossen hat, mir aber regelmäßig auf die Füße fällt :(

justme1968

ja. der : ist nicht erlaubt. manchmal geht \x3a in der regex oder du kannst etwas wie presence:(present|absent) verwenden.

aber bei readingsHistory ist das gar nicht nötig. du kannst einfach define rhPresence readingsHistory presence:stateschreiben selbst wenn state im event nicht auftaucht :)


der best-practice ansatz ist den modul autor darauf aufmerksam zu machen und ihn drum zu bitten deviceEvents und eventuell addStateEvent zu verwenden.

das attribut kannst du unter anderem schon für notify, filelog und watchdog setzen und dann state wie jedes andere event verwenden.

für readingsHistory kann ich das nicht so einfach rückwärts kompatibel einbauen weil dann bei state in der history eben auch state: auftauchen würde.

gruss
  andre

ps: das wort state fehlt aus dem historischen grund das so bei schalten und lampen on und off ohne zusatz erscheint und z.b. als icon name verwendet werden kann.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

vbs

Klasse! Danke dir! Vor allem "addStateEvent" war mir neu und wird bestimmt noch sehr nützlich für mich!

vbs

Zitat von: justme1968 am 22 November 2015, 21:22:17
ja. der : ist nicht erlaubt. manchmal geht \x3a in der regex oder du kannst etwas wie presence:(present|absent) verwenden.

aber bei readingsHistory ist das gar nicht nötig. du kannst einfach define rhPresence readingsHistory presence:stateschreiben selbst wenn state im event nicht auftaucht :)
Sorry, ich nochmal zu dem Thema. Das mit "presence:state" klappt super. Ich bekomme alle Events von "state". Da ich aber nun für presence so "Zwischenstates" (arriving, leaving) benutze, wollte ich gerne auch auf den Inhalt filtern und wollte es dann doch so machen, wie von dir oben vorgeschlagen. Ich hab daher nun eingetragen:
presence:(home|away|sleep)

Und wollte eben nur home,away und sleep loggen, nicht jedoch zB "arriving" und "leaving". Leider wird damit aber gar nichts mehr getriggert. Ich hab mir Logausgaben gebaut und sehe folgendes:
Logs
          Log3 $name, 3, "REGEX: " . $regex . " READING: " . $reading;
          next if( defined($regex) && $reading !~ m/^$regex$/);


ergibt:
2015.11.24 18:25:44.591 3: REGEX: (home|away|sleep) READING: state
2015.11.24 18:25:44.591 3: REGEX: (home|away|sleep) READING: statHomeDuration
2015.11.24 18:25:44.592 3: REGEX: (home|away|sleep) READING: statHomeDurationDay
2015.11.24 18:25:44.592 3: REGEX: (home|away|sleep) READING: statHomeDurationMonth
2015.11.24 18:25:44.593 3: REGEX: (home|away|sleep) READING: statHomeDurationYear

Scheinbar wird also nur auf den Namen des Readings gematcht, aber nicht auf den Inhalt desselben. Ist vermutlich sogar so gedacht, oder? Hatte ich wohl einfach missverstanden. Auf den Inhalt zu filtern ist nicht vorgesehen, richtig?

justme1968

sorry. das war missverständlich. das beispiel war nicht für readingsHistory sondern eher für notify oder watchdog.

readingsHistory (und readingsGroup) verwenden das deine nur um die devices zu identifizieren die überhaupt berücksichtigt werden sollen.

bei beiden ist dann valueFormat dafür zuständig zu bestimmen was mit den jeweiligen werten passieren soll.

wenn valueFormat undef zurück gibt wird der wert komplett ignoriert. also z.b. so:attr rhPresence {return undef if( $VALUE =~m/ing$/ ); return $VALUE}

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

vbs

Fantastisch, funktioniert bestens! Nochmals vielen Dank!

Depechem

ich würde gern z.B.: bei einem Schalter nur den state:on in der readingsHistory anzeigen lassen wollen. Also nicht alle state.

Im Moment sieht meine readingsHistory so aus: "DEF    AA:state; internscharf:state; unscharf:state" <dies funktioniert auch aber es werden halt alle state angezeigt.
ich habe es so versucht aer dies geht leider nicht:  "DEF    internscharf:on; unscharf:on"

kann ich mit  readingsHistory imme rnur alle state abfangen oder wie müsste der Code für einen einzelnen Schaltbefehl aussehen?

Gruß Thomas
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

ph1959de

Zitat von: Depechem am 18 Januar 2016, 10:35:31
ich würde gern z.B.: bei einem Schalter nur den state:on in der readingsHistory anzeigen lassen wollen...
Thomas, in wie vielen Threads willst Du die Frage jetzt noch unterbringen? Mach doch bitte wenigstens in Deinen eigenen Thread einen Hinweis, dass das Thema woanders fortgeführt werden soll.

Peter
Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"

frank

ich grenze die "erlaubten" state-zustände über das attr valueFormat ein:

{if($READING eq "state"){($VALUE~~['RESPONSE TIMEOUT:RegisterRead','CMDs_done_Errors:1','MISSING ACK','unreachable']&&$DEVICE!~m/^Ventil\..*/)?"%s":undef}}

damit "filtere" ich 4 zustände in state von allen devices, die nicht mit "Ventil." im namen beginnen.
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

Depechem

Zitat von: frank am 18 Januar 2016, 11:51:51
ich grenze die "erlaubten" state-zustände über das attr valueFormat ein:

{if($READING eq "state"){($VALUE~~['RESPONSE TIMEOUT:RegisterRead','CMDs_done_Errors:1','MISSING ACK','unreachable']&&$DEVICE!~m/^Ventil\..*/)?"%s":undef}}

damit "filtere" ich 4 zustände in state von allen devices, die nicht mit "Ventil." im namen beginnen.

soll das heißen das ich die readingsHistory so in in die fhem.cfg eintragen muss?

define ALARM_LOGFENSTER readingsHistory AAA:state, unscharf:state
attr ALARM_LOGFENSTER valueFormat {if($READING eq "state"){($VALUE~~['state:on']&&$DEVICE!~m/^Ventil\..*/)?"%s":undef}

oder wie müsste das attr heißen?

RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

frank

bei dir genügt wohl das:
{($VALUE eq "on")?"%s":undef}
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

Depechem

Zitat von: frank am 18 Januar 2016, 12:42:04
bei dir genügt wohl das:
{($VALUE eq "on")?"%s":undef}

dies hier funktioniert:

{if($READING eq "state"){($VALUE~~['on']&&$DEVICE!~m/^Balkontuer\..*/)?"%s":undef}}

damit werden aber bei allen Devices nur noch die state:on angezeigt.
bei 2-3 Devices sollten weiterhin alle state/readings einlaufen dies habe ich damit probiert(Balkontuer):

  &&$DEVICE!~m/^Balkontuer\..*/)?"%s":undef}}

leider werden aber weiterhin nur die state:on bei der Balkontuer angezeigt.
Wie würde der Code richtig heißen um einzelne Devices komplett anzeigen zu lassen?



RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

Depechem

Zitat von: frank am 18 Januar 2016, 11:51:51
ich grenze die "erlaubten" state-zustände über das attr valueFormat ein:

{if($READING eq "state"){($VALUE~~['RESPONSE TIMEOUT:RegisterRead','CMDs_done_Errors:1','MISSING ACK','unreachable']&&$DEVICE!~m/^Ventil\..*/)?"%s":undef}}

damit "filtere" ich 4 zustände in state von allen devices, die nicht mit "Ventil." im namen beginnen.

Frank, kannst du bitte nochmal kurz erklären was ich für einen Code eingeben muss wenn ich von 2 devices nur den on-State haben möchte, und von einem anderen device weiterhin alle states angezeigt bekommen möchte!
{if($READING eq "state"){($VALUE~~['on']&&$DEVICE!~m/^Balkontuer\..*/)?"%s":undef}}
Damit habe ich es schon hinbekommen das bei allen devices nur noch der on-state kommt

RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

frank

{if(($READING eq "state") && ($DEVICE ne "anderes_devices")){($VALUE eq "on")?"%s":undef}}
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