DOIF Generalisierung funktioniert nicht

Begonnen von Christian1982, 24 März 2016, 10:12:48

Vorheriges Thema - Nächstes Thema

Christian1982

Ich hab mal eine Frage zu DOIF, da ich das Verhalten nicht verstehe.

Ich habe mehrere Fensterkontrakte (z.B. Kueche_Fenster.tss) vom Typ HM-SEC-SCo.
Ich möchte jetzt beim öffnen und schließen eine pushover Nachricht aus Handy bekommen (später auch mit Anwesenheitskontrolle), als kleine Alarmanlage.

Aus der Programmierung bin ich es gewohnt Dinge zu generalisieren, daher wollte ich nicht für jeden einzelne Sensor ein DOIF schreiben.
Ich habe daher zunächst ein DOIF wie folgt angelegt:
([".*\.tss$:^open|closed$"])
     (set pushmsg msg '$DEVICE' 'ist [$DEVICE:state]')

Dies hat leider nur ein einziges mal funktioniert, daher habe ich dann "attr ... do always" gesetzt, damit hat es dann auch bei jedem öffnen/schließen funktioniert.

Nachteil war jedoch, dass ich jetzt jede Stunde eine Benachrichtigung bekomme, weil in den Fensterkontrakte folgendes gesetzt ist.
           event-min-interval.*:3600
           event-on-change-reading  .*

Also habe ich das ganze Umgebaut (ohne "attr ... do always"):
   
([".*\.tss$:^open$"])
       (set pushmsg msg '$DEVICE' 'ist [$DEVICE:state]')
DOELSEIF ([".*\.tss$:^closed$"])
       (set pushmsg msg '$DEVICE' 'ist [$DEVICE:state]')

Eigentlich funktioniert es, jedoch gibt es folgende unschöne Effekte:
    - Wenn man zwei Fenster nacheinander öffnet, erhalte ich nur eine Nachricht. Dies liegt wohl daran, dass es nicht zwei "if" Bedingungen nacheinander geben darf, sondern immer erst "if" und dann "DOELSEIF".
    - Wenn ein Fenster länger geöffnet ist erhalte ich jede Stunde vom offenen Fenster eine Nachricht, und von einem beliebigen Fenster eine geschlossen Nachricht, somit bekomme ich dann pro Stunden zwei Nachrichten (offen und geschlossen)


Frage:
   -Wie richte ich diese DOIF Generalisierung korrekt ein, oder muss man wirklich pro Fensterkontakt ein DOIF einrichten?
   - Wenn die Generalisierung irgendwie funktioniert, kann man dann anstelle des Namens (.*\.tss$) auch den Type (HM-SEC-SCo) verwenden?

Per

Eigentlich macht DOIF das, was du ihm sagst.
Nimm die erste Definition und lösche das event-min-interval.*:3600.

CoolTux

Du könntest das mit einem Notify machen. Ich denke das sollte genau das tun was Du beabsichtigst.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Christian1982

Ich werde dann wohl "event-min-interval.*:3600" entfernen, das hat jedoch den Nachteil das im Log nur noch Einträge bei Veränderung geschrieben werden.

Per

Deine Benachrichtigung ist nichts anderes als ein Logging. Entweder beide stündlich oder beide nur bei Bedarf. Egal ob DOIF oder notify!
Oder nochmal extra Dummies einfügen mit event-on-change-reading und diese Triggern. Oder einzelne DOIFs ohne do always. Aber das wird mehr Aufwand als du willst.

Was noch relativ einfach geht ist ein DOIF mit stündlicher Ausführung, welches das Logging aller Fenster übernimmt.

Christian1982

Ich werde dann einfach "event-min-interval.*:3600" weglassen, so funktioniert es ja.

Hat noch jemand eine Idee warum folgendes DOIF nicht funktioniert.
Idee war, dass alle Temperatursensoren [(TX 29 DTH) (Name z.B. Kueche.room_temp)]  mit ".room_temp" im Namen bei bestimmten "kritischen Zuständen" eine pushmsg senden.

So wie die Bedingung unten steht funktioniert sie irgendwie nicht, wenn ich das $ (regex für Zeilenende) hinter temperature$ weglasse wird immer nur der Fall [T < 15] benachrichtigt obwohl die Temperatur z.B. 20.9 Grad ist. So ganz verstehe ich das nicht oder verstehe ich etwas falsch http://fhem.de/commandref_DE.html#DOIF)?


("do always" ist gesetzt)
(INFO: [$DEVICE:&STATE] -> z.B. T: 16.8°C H: 54% D: 7.3)

([".*\.room_temp$:^temperature$"] > 45)   
    (set pushmsg msg '$DEVICE' 'ACHTUNG! [T > 45] - [$DEVICE:&STATE]')
DOELSEIF ([".*\.room_temp$:^temperature$"] < 15)
    (set pushmsg msg '$DEVICE' 'ACHTUNG! [T < 15] - [$DEVICE:&STATE]')
DOELSEIF ([".*\.room_temp$:^humidity$"] > 65)
    (set pushmsg msg '$DEVICE' 'ACHTUNG! [H > 65] - [$DEVICE:&STATE]')

Damian

Zitat von: Christian1982 am 24 März 2016, 13:11:31

([".*\.room_temp$:^temperature$"] > 45)
Kann nicht funktionieren, da es sich hier um keine Angabe eines Readings handelt, sondern um einen Eventtrigger. Ein Eventtrigger kann immer nur wahr (zum Zeitpunkt der Triggerung) ohne nicht wahr sein. Er wird aber niemals eine Temperatur liefern.

Das, was du möchtest sieht dann eher so aus:

([".*\.room_temp$:^temperature$"] and [$DEVICE:temperature] > 45) ...

Gruß

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

Christian1982

Ich teste dann mal :-)

Du noch viel lernen musst, junger Padawan