[gelöst] DOIF mit mehreren Bedingungen schaltet nicht

Begonnen von Thyrador, 11 August 2016, 11:18:52

Vorheriges Thema - Nächstes Thema

Thyrador

Moin moin, hab da mal ein Problem.

Ich habe folgenden Trigger definiert, der mir bei Abwesenheit und/oder Inaktivität des Nachts das WLAN an der FritzBox abschalten soll.
An den entsprechenden Endgeräten wird per Automatismus das WLAN abgeschalten, wenn sie nach 0 Uhr länger inaktiv sind. Da ich in der Regel bereits nach 7 Uhr nicht mehr Zuhause bin, sind diese Geräte auch nicht mehr im Heimnetz aktiv.
Nun war ja die Idee, über das PRESENCE-Modul mir den Anwesenheitsstatus eines Gerätes als Notify anzulegen und danach entsprechend zu triggern.
Das funktioniert auch soweit alles super, solange ich nur EINE einzige Bedingung im DOIF eingestellt habe. Setze ich hier eine zweite Bedingung ein, so verweigert der Trigger direkt den Dienst und wird einfach nicht ausgeführt.
Ich stehe hier jetzt aber auf dem Schlauch, weil die Reihenfolge und Struktur erscheint mir hier nicht der Fehler zu sein (oder übersehe ich etwas?).

Hier mal die Definition des DOIF:
(([00:00-05:30] or [07:30 - 12:00]) and ([PurgatoryN4:"presence:.absent"] and [PurgatoryN12_2:"presence:.absent"]) and ([FritzBoxBasis:"box_wlan_5GHz:.on"] or [FritzBoxBasis:"box_wlan_2.4GHz:.on"])) (set FritzBoxBasis wlan off)


Anbei ein LIST des Triggers:
(Hinweis: Ich habe mir mal das Recht vorbehalten, einige Parameter/Werte aus e_FritzBoxBasis_events zu entfernen. Diese haben m.M.n. nichts mit dem genannten Problem zu tun und stellen ein mögliches Sicherheitsrisiko dar (öffentliche IP, MAC-Adressen, User). Deswegen werden diese Werte hier nicht angezeigt.)
Internals:
   DEF        (([00:00-05:30] or [07:30 - 12:00]) and ([PurgatoryN4:"presence:.absent"] and [PurgatoryN12_2:"presence:.absent"]) and ([FritzBoxBasis:"box_wlan_5GHz:.on"] or [FritzBoxBasis:"box_wlan_2.4GHz:.on"])) (set FritzBoxBasis wlan off)
   NAME       WiFiTimer
   NR         62
   NTFY_ORDER 50-WiFiTimer
   STATE      Purgatory N4: absent | Purgatory N12.2: absent
   TYPE       DOIF
   Readings:
     2016-08-11 10:26:00   Device          PurgatoryN12_2
     2016-08-11 10:23:03   cmd             0
     2016-08-11 10:25:07   e_FritzBoxBasis_events box_cpuTemp: 67,box_guestWlan: off,box_powerRate: 55,box_guestWlanCount: 0,box_wlan_2.4GHz: on,tam1_state: on,box_wlan_5GHz: on,box_dect: on,box_rateUp: 0.525,box_wlanCount: 2,box_moh: default,box_tr064: on,box_connect: 5,box_tr069: on,box_rateDown: 0.711,box_stdDialPort: dect1,box_guestWlanRemain: 0,WLAN: on gWLAN: off,lastReadout: 233 values captured in 0.00 s
     2016-08-11 10:26:00   e_PurgatoryN12_2_events absent,presence: absent
     2016-08-11 10:25:02   e_PurgatoryN4_events absent,presence: absent
     2016-08-11 10:23:03   state           initialized
     2016-08-11 10:23:04   timer_1_c1      12.08.2016 00:00:00
     2016-08-11 10:23:04   timer_2_c1      12.08.2016 05:30:00
     2016-08-11 10:23:04   timer_3_c1      12.08.2016 07:30:00
     2016-08-11 10:23:04   timer_4_c1      11.08.2016 12:00:00
   Condition:
     0          (DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") or DOIF_time($hash,$hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"")) and (EventDoIf('PurgatoryN4',$hash,'presence:.absent',1) and EventDoIf('PurgatoryN12_2',$hash,'presence:.absent',1)) and (EventDoIf('FritzBoxBasis',$hash,'box_wlan_5GHz:.on',1) or EventDoIf('FritzBoxBasis',$hash,'box_wlan_2.4GHz:.on',1))
   Days:
   Devices:
     0           PurgatoryN4 PurgatoryN12_2 FritzBoxBasis
     all         PurgatoryN4 PurgatoryN12_2 FritzBoxBasis
   Do:
     0:
       0          set FritzBoxBasis wlan off
     1:
   Helper:
     event      absent,presence: absent
     globalinit 1
     last_timer 4
     sleeptimer -1
     triggerDev PurgatoryN12_2
     triggerEvents:
       absent
       presence: absent
     triggerEventsState:
       state: absent
       presence: absent
   Internals:
   Interval:
     0          -1
     1          0
     2          -1
     3          2
   Itimer:
   Localtime:
     0          1470952800
     1          1470972600
     2          1470979800
     3          1470909600
   Readings:
   Realtime:
     0          00:00:00
     1          05:30:00
     2          07:30:00
     3          12:00:00
   Regexp:
     0:
     All:
   State:
   Time:
     0          00:00:00
     1          05:30:00
     2          07:30:00
     3          12:00:00
   Timecond:
     0          0
     1          0
     2          0
     3          0
   Timer:
     0          0
     1          0
     2          0
     3          0
   Timers:
     0           0  1  2  3
   Trigger:
     all         PurgatoryN4 PurgatoryN12_2 FritzBoxBasis
   Triggertime:
     1470909600:
       localtime  1470909600
       Hash:
     1470952800:
       localtime  1470952800
       Hash:
     1470972600:
       localtime  1470972600
       Hash:
     1470979800:
       localtime  1470979800
       Hash:
Attributes:
   do         always
   group      Fritz!
   room       Trigger
   stateFormat {"Purgatory N4: ".ReadingsVal("PurgatoryN4", "presence", "")." | Purgatory N12.2: ".ReadingsVal("PurgatoryN12_2", "presence", "")}



Wie gesagt: enthält das DOIF eine einzige Bedingung, funktioniert das problemlos. Kommt mindestens eine zweite hinzu, passiert hier einfach gar nichts.
Da greift dann nicht mal ein:
([PurgatoryN4:"presence:.absent"] and [PurgatoryN12_2:"presence:.absent"]) (set FritzBoxBasis wlan off)

Kann mir da einer auf den rechten Weg helfen oder sagen, was ich übersehe?

Ellert

Die Befehlsreferenz sagt dazu:
ZitatDie logische Verknüpfung "and" mehrerer Ereignisse ist nicht sinnvoll, da zu einem Zeitpunkt immer nur ein Ereignis zutreffen kann.

Thyrador


Ellert

#3
Benutze die Readings und nicht die Events, statt [PurgatoryN4:"presence:.absent"], so [PurgatoryN4:presence] eq "absent" siehe: http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung

Thyrador

Ich verstehe nicht ganz. Kannst du mir das mal bitte anhand eines Beispieles erklären? Meinst du per ReadingsVal?

antonwinden

z.b. einfach statt [PurgatoryN4:"presence:.absent"] (ReadingsVal("PurgatoryN4","presence","xyz")eq"absent") benutzen
KNX, Raspberry, Denon 3313, Philips TV, Xtrend9X00 und viel Optimismus...

Thyrador

Ah, dann hab ich das doch richtig gedacht. Allerdings frage ich mich, wofür das xyz stehen soll. Kann ich das nicht leer lassen?

Sieht aktuell nun so aus:
(([00:00-05:30] or [07:30 - 15:00]) and (ReadingsVal("PurgatoryN4", "presence", "") eq "absent" and ReadingsVal("PurgatoryN12_2", "presence", "") eq "absent") and (ReadingsVal("FritzBoxBasis", "box_wlan_5GHz", "") eq "on" or ReadingsVal("FritzBoxBasis", "box_wlan_2.4GHz", "") eq "on")) (set FritzBoxBasis wlan off)

Mal schauen, ob das jetzt funktioniert.

Ellert

@Thyrador: siehe Antwort #3
@antonwinden: ReadingsVal löst keine Bedingungsprüfung aus.

Thyrador

#8
Das werde ich nochmal überprüfen. Mir wurde nur hier im Forum, zu einem anderen Problem mit DOIF gesagt, ich soll's genau nicht so machen, sondern so, wie es nun bei mir definiert war.

EDIT: Danke @Ellert, jetzt funktioniert das auch. Gibt's denn da jetzt ne klare Regelung, wann was zu verwenden ist? Also ob [PurgatoryN4:"presence:.absent"] oder [PurgatoryN4:presence] eq "absent"?
Was ist da genau der Unterschied?

Ellert

#9
Zitat von: Thyrador am 11 August 2016, 13:29:59
Das werde ich nochmal überprüfen. Mir wurde nur hier im Forum, zu einem anderen Problem mit DOIF gesagt, ich soll's genau nicht so machen, sondern so, wie es nun bei mir definiert war.
Andere Probleme verlangen ggf. andere Antworten.
Du kannst Events benutzen, "oder" verknüpft, aber nicht "und" verknüpft, das funktioniert nur mit Stati.

ZitatGibt's denn da jetzt ne klare Regelung, wann was zu verwenden ist?
Ja, die steht in der Befehlsreferenz, ich hatte sie zitiert  ;)

Thyrador

Also zählt das dann für "einfache" Abfragen, aber nicht für komplexe? Für komplexe dann immer in der form [Gerät:reading] operator "Wert", richtig?

Ellert


Thyrador

Naja, das hat mein's jetzt gelöst. Auch wenn ich da jetzt nicht ganz verstehe, warum das so funktioniert, aber auf dem ersten Wege nicht. Danke trotzdem :)

Per

Zitat von: Thyrador am 11 August 2016, 13:39:33
Also zählt das dann für "einfache" Abfragen, aber nicht für komplexe? Für komplexe dann immer in der form [Gerät:reading] operator "Wert", richtig?
Nur der Trigger: [PurgatoryN4:"presence:.absent"]
Trigger und Event: [PurgatoryN4:presence] eq "absent"
Nur Event: [?PurgatoryN4:presence] eq "absent"
oder (ReadingsVal("PurgatoryN4", "presence", "")
Der Trigger ist nur im Moment des Schaltens wahr, zwei Trigger gleichzeitig (außer Zeiten) sind wie ein Siebener im Lotto. Deshalb greift dort und eher selten.
Nur Event löst nicht aus, sondern wird nur abgefragt. Für dein aktuelles Problem ist 2. die richtige Lösung.