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?
Die Befehlsreferenz sagt dazu:
ZitatDie logische Verknüpfung "and" mehrerer Ereignisse ist nicht sinnvoll, da zu einem Zeitpunkt immer nur ein Ereignis zutreffen kann.
Wie soll ich das denn dann anstellen? :/
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
Ich verstehe nicht ganz. Kannst du mir das mal bitte anhand eines Beispieles erklären? Meinst du per ReadingsVal?
z.b. einfach statt [PurgatoryN4:"presence:.absent"] (ReadingsVal("PurgatoryN4","presence","xyz")eq"absent") benutzen
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.
@Thyrador: siehe Antwort #3
@antonwinden: ReadingsVal löst keine Bedingungsprüfung aus.
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?
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 ;)
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?
Es kommt immer auf das zu lösende Problem an.
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 :)
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.