Regex in DOIF - was mache ich falsch?

Begonnen von Master_Nick, 12 März 2018, 14:41:23

Vorheriges Thema - Nächstes Thema

Damian

#30
Zitat von: Master_Nick am 12 März 2018, 21:39:04
Absolut richtig Sorry! :-D Der Fehler schlich sich durch fieses Copy Paste ein ....

Aber dennoch bringt es mir Devicenamen und nicht die Namen der Räume von den Devices :-)

Und vom Gefühl her macht =~ auch nicht so wirklich was an der stelle zumindest nicht als negation ;-) eher als inklusion denn sonst würde der Sensor im Badezimmer nicht auftauchen dürfen.

state In folgenden Zimmern ist es zu feucht: [@"_Sensor_":humidity:$_ > 20 and $room =~ "Badezimmer|Messungen|Echo","keinem"]


Ich würde aber gerne haben, dass dort die Namen der Räume stehen in denen sich der jeweilige Device befindet  ;D



Edit auch ein konkreter Ausschluss eines devices scheint nicht zu wirken:

state In folgenden Zimmern ist es zu feucht: [@"_Sensor_":humidity:$_ > 20 and $device ne "Badezimmer_Sensor_1","keinem"]

Rooms wirst du auf diese Weise auch nicht bekommen, @ liefert lediglich Devicenamen, die du z. B. in Perl weiter auswerten kannst.

$device habe ich bisher in der Aggregationsbedingung nicht vorgesehen/definiert, da man aufgrund der Device-Regex im ersten Teil hier "_Sensor_" nach bestimmten Devices filtern kann.

Edit:

mit (Zitat aus der Commandref):

ZitatFür reine Perlangaben gibt es eine entsprechende Perlfunktion namens AggrDoIf(<function>,<regex Device>,<reading>,<condition>,<default>) diese liefert bei der Angabe @ ein Array statt einer Stringliste, dadurch lässt sie sich gut bei foreach-Schleifen verwenden.

und DOIF-Perl https://forum.fhem.de/index.php/topic,84969.0.html

kannst du in kürzester Zeit, die tollsten Sachen zaubern, wenn du dich auf Perl einlässt.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Master_Nick

Moin  :)
Sorry für die verspätete Rückmeldung und vielen Dank für deine Antwort.

Stimmt dann filter ich das Badezimmer (_Sensor_1) einfach mit  _Sensor_[2-6] raus. :-)

Dann schau ich mal wie und ob ich es so baue :-)

Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Master_Nick

Ich wollte meine funktionierende Lösung noch kund tun :-)
Ich habe mir in jedem Sensor ein Reading gesetzt namens alias, dass den Raumnamen enthält.
(Eventuell weiß noch jemand wie ich Umlaute nutzen kann lueften -> lüften wäre nun das I-Tüpfelchen)

Danke nochmals für die Hilfe :-)

Hier die funktionierende Lösung für mich:
Internals:
   CFGFN     
   DEF        ([@"_Sensor_[2-5]":humidity:$_ > 54])

{fhem ("set GoogleCloudMessages send Homeland|Achtung|Luftfeuchtigkeit im [$DEVICE:alias:"(.*)":"$1"] bei [$DEVICE:humidity:"(.*)":"$1"]\% - bitte lueften!")}
   NAME       Luftfeuchtigkeitskontrolle_DI
   NR         152
   NTFY_ORDER 50-HumidityWatch
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-03-19 16:10:49   Device          Schlafzimmer_Sensor_4
     2018-03-19 16:10:25   cmd             0
     2018-03-19 16:10:25   mode            enabled
     2018-03-19 16:10:25   state           initialized
     2018-03-19 16:10:34   wait_timer      no timer
   Regex:
     cond:
       :
         0:
           "_Sensor_[2-5]" _Sensor_[2-5]
   condition:
     0          AggregateDoIf($hash,'@','_Sensor_[2-5]','humidity','$_ > 54')
   devices:
   do:
     0:
       0          {fhem ("set GoogleCloudMessages send Homeland|Achtung|Luftfeuchtigkeit im [$DEVICE:alias:"(.*)":"$1"] bei [$DEVICE:humidity:"(.*)":"$1"]\% - bitte lueften!")}
     1:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      humidity: 51
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev Schlafzimmer_Sensor_4
     triggerEvents:
       humidity: 51
     triggerEventsState:
       humidity: 51
   internals:
   itimer:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   room       Technikraum
   wait       2700
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Master_Nick

#33
 :) Ein wenig zu früh gefreut...
Also Raum und Device und Luftfeuchtigkeit habe ich ja nun ausgegeben.

Was nicht passt: Er meldet irgendeinen Sensor mit 46% statt 54% solange eines der 4 Möglichen Devices bei mir die 54% Luftfeuchtigkeit übersteigt.

Muss ich jetzt ein DOIF für jeden der 4 Sensoren bauen oder kann man da noch was tweaken? :-D Dachte eigentlich da er das Device in den Wait timer schreibt, dass er dann pro Device ein Wait machen würde und dann nach 45 Minuten bei Überschreitung eines Devices genau dies Melden würde (wahrscheinlich müsste ich ihm diese Logik erst bauen?).


*EDIT* Interessant aktuell scheint es tatsächlich ohne Veränderung zu gehen wie es gedacht ist.


**EDIT** ok das war quatsch ich hatte wohl etwas geändert und es vergessen :-)
([@"_Sensor_[2-5]":humidity:$_ > 54])

{ if ([$DEVICE:humidity:"(.*)":"$1"] >54) {fhem ("set GoogleCloudMessages send Homeland|Achtung|Luftfeuchtigkeit im [$DEVICE:alias:"(.*)":"$1"] bei [$DEVICE:humidity:"(.*)":"$1"]\% - bitte lueften!")}}

Es wird so zumindest nicht der falsche Device ausgegeben, dafür kann es mal vorkommen, dass eine Meldung aus bleibt weil es in dem Moment der falsche Sensor ist :-D
Ich glaube aber die sauberste Lösung ist wohl ein Doif zu machen pro Sensor oder mit DOELSEIF zu arbeiten oder mit einem userreading wo der Device der über 54% war drin steht und beim If wird genau dieser geprüft.
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Damian

#34
Wenn du ohnehin ereignisgesteuert arbeitest, reicht eine einfache allgemeine Abfrage:

(["_Sensor_[2-5]:humidity",0] > 54) (set Google.... bitte Lüften [$DEVICE:alias] bei [$DEVICE:humidity])

Eine elegantere Lösung ist, zeitverzögert eine Meldung zu produzieren, denn ein paar Minuten über 54 % sind normalerweise unkritisch. Allerdings reicht dafür ein wait-Timer nicht aus.   

Ab heute gibt es auch die Möglichkeit zeitverzögert so etwas in einem DOIF-Modul für mehrere Sensoren zu lösen. Siehe Anwendungsbeispiele (z. B. Verzögerte Fenster-offen-Meldung mit Wiederholung für mehrere Fenster) mit Timern:
https://fhem.de/commandref_DE.html#DOIF_Einfache_Anwendungsbeispiele_Perl
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Master_Nick

Geil! :-)

Das ist ja genau was ich brauchte.  8)

Danke!
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)