Hauptmenü

DOIF Anwesenheitssimulation

Begonnen von oelidoc, 15 März 2015, 12:28:37

Vorheriges Thema - Nächstes Thema

oelidoc

Hallo,
ich habe hier eine Anwesenheitssimulation mit RandomTimer, die Licht ein- und ausschalten. Diese werden jedoch mittels eines DOIF in Abhängigkeit vom Zustand eines Dummy per disable an- oder abgeschaltet. Der Dummy wertet u.a. das Ergebnis eines PRESENCE aus. Das funktioniert auch größtenteils alles ganz gut. Nur am Wochenende genauer gesagt meist Samstags geht morgens das Licht an, obwohl die zugehörigen RandomTimer eigentlich abgeschaltet sein müssten. Es muss also in meinem DOIF irgendwo ein (Denk-) Fehler sein, den ich aber alleine nicht finde...
Daher hier mein DOIF:
([Anwesenheit] eq "Anwesend") (attr zufall_.* disable 1)
DOELSEIF ([Anwesenheit] eq "Abwesend" and !$we) (attr zufall_.* disable 0)
DOELSEIF ([Anwesenheit] eq "Abwesend" and $we) (attr zufall_.*_abends disable 0,attr zufall_.*_morgens disable 1)
DOELSEIF ([Anwesenheit] eq "Ferien" and ([Wolfgang] eq "present" or [Brigitte] eq "present")) (attr zufall_.* disable 1)
DOELSEIF ([Anwesenheit] eq "Ferien" and [Wolfgang] eq "absent" and [Brigitte] eq "absent") (attr zufall_.*_abends disable 0,attr zufall_.*_morgens disable 1)
DOELSEIF ([Anwesenheit] eq "Urlaub") (attr zufall_.* disable 0)


Dummy = Anwesenheit (anwesend, abwesend, Ferien,Urlaub per notify gesetzt)
RandomTimer = zufall_.*_morgens, zufall_.*_abends
PRESENCE = Brigitte, Wolfgang

Also gemäß cmd 3 möchte ich, daß am WE trotz Abwesenheit das Licht morgens ausbleibt und bei Abwesenheit abends angeht.
Ich hoffe, ich habe mein Problem verständlich geschildert. Das ganze wirkt etwas kompliziert, ist jedoch mit der Zeit gewachsen...

Gruß

oelidoc

Brockmann

Wie und wann wird Anwesenheit denn gesetzt?
Wenn Du Anwesenheit beispielsweise am Freitag auf "Abwesend" setzt und dann bleibt er bis Samstag so, dann wird das DOIF nicht getriggert und kann seinen Zustand dementsprechend auch nicht ändern.
$we ist ja eine reine Abfrage, also führt eine Änderungen am Wahrheitsgehalt von $we nicht zum Triggern und somit auch nicht zum Ändern des Zustands.

oelidoc

Hallo Brockmann,
ja das ist glaube ich genau das Problem. Anwesenheit wird über ein notify auf die PRESENCE zweier Smartphones im Wlan gesetzt. Wenn die Smartphones Freitag abend ausgeschaltet sind, geht der Dummy Anwesenheit auf abwesend und dieser Status ändert sich am Samstag morgen nicht   >:(
Irgend ein Vorschlag, wie ich $we dazu bringe, das DOIF zu triggern?

Gruß

oelidoc

oelidoc

#3
Hallo,
ich habe jetzt mein notify um ein elsif erweitert:
Wolfgang { if ( Value("Wolfgang") eq "present" || Value("Brigitte") eq "present") {fhem("set Anwesenheit Anwesend") } elsif ($we) {fhem("set Anwesenheit Abwesend_WE") } else {fhem("set Anwesenheit Abwesend") } }

und dann das DOIF um den neuen Anwesenheitstatus Abwesend_WE erweitert:
([Anwesenheit] eq "Anwesend") (attr zufall_.* disable 1)
DOELSEIF ([Anwesenheit] eq "Abwesend" and !$we) (attr zufall_.* disable 0)
DOELSEIF ([Anwesenheit] eq "Abwesend_WE") (attr zufall_.*_abends disable 0,attr zufall_.*_morgens disable 1)
DOELSEIF ([Anwesenheit] eq "Ferien" and ([Wolfgang] eq "present" or [Brigitte] eq "present")) (attr zufall_.* disable 1)
DOELSEIF ([Anwesenheit] eq "Ferien" and [Wolfgang] eq "absent" and [Brigitte] eq "absent") (attr zufall_.*_abends disable 0,attr zufall_.*_morgens disable 1)
DOELSEIF ([Anwesenheit] eq "Urlaub") (attr zufall_.* disable 0)


Jetzt müsste es doch klappen, oder? Sprich Freitag 24:00 Uhr müsste das notify den Dummy Anwesenheit von Abwesend auf Abwesend_WE umstellen, richtig?

Gruß

oelidoc

Brockmann

Zitat von: oelidoc am 15 März 2015, 17:07:46
Jetzt müsste es doch klappen, oder? Sprich Freitag 24:00 Uhr müsste das notify den Dummy Anwesenheit von Abwesend auf Abwesend_WE umstellen, richtig?
Wodurch wird das notify denn um 24:00 Uhr ausgeführt?

oelidoc

Ähem,
ich dachte das notify lauscht auch darauf, ob WE ist oder nicht...

Oder brauch ich noch ein weiters notify:
Brigitte { if ( Value("Wolfgang") eq "absent" && Value("Brigitte") eq "absent" && "$we") {fhem("set Anwesenheit Abwesend_WE")} }

Gruß

oelidoc

Brockmann

Zitat von: oelidoc am 15 März 2015, 17:34:11
ich dachte das notify lauscht auch darauf, ob WE ist oder nicht...
Ein notify lauscht auf ein Event, das Du in der Definition vorgegeben hast. Wenn es kein Event gibt, das den Wechsel von !$we zu $we begleitet (und standardmäßig gibt es das nicht), dann bekommt das notify von diesem Wechsel nichts mit.

Entscheidend ist, dass irgendetwas dafür sorgt, dass Dein DOIF morgens um [00:01] einmal getriggert wird, damit es ggf. seinen Status anpassen kann.

Aber was willst Du eigentlich hiermit erreichen?
attr zufall_.* disable 1

Bei allen Devices die mit "zufall_." beginnen die Attribute auf einmal verändern? Das geht in FHEM so nicht.

oelidoc

Hallo,

also das mit dem attr zufall_.* disable 1 funktioniert problemlos bei sechs RandomTimer gleichzeitig. Auch per Eingabezeile.

Aber:
ZitatEntscheidend ist, dass irgendetwas dafür sorgt, dass Dein DOIF morgens um [00:01] einmal getriggert wird, damit es ggf. seinen Status anpassen kann.
wie könnte man das erreichen?

Gruß

oelidoc

Brockmann

Zitat von: oelidoc am 15 März 2015, 22:13:47
also das mit dem attr zufall_.* disable 1 funktioniert problemlos bei sechs RandomTimer gleichzeitig. Auch per Eingabezeile.

Hast Recht, sorry, mein Fehler.

Zitat von: oelidoc am 15 März 2015, 22:13:47
Aber:wie könnte man das erreichen?

Was Du machen kannst wäre folgendes:

define DI_Anwesenheit_refresh ([00:01])(trigger Anwesenheit [Anwesenheit])
attr DI_Anwesenheit do always


Das sollte jeden Tag kurz nach Mitternacht den Dummy nochmal auf seinen aktuellen Wert setzen und dadurch das DOIF triggern. Wenn sich was bei $we geändert hat, ändert das DOIF dann seinen Zustand und nimmt die entsprechenden Aktionen vor.

oelidoc

Hallo Brockmann,
vielen Dank für den Code. Werde ich einbauen. Ob alles klappt, kann ich erst in 5 Wochen sagen, da ich die nächsten 4 Wochenenden in Urlaub bin  ;D
Bis dahin und vielen Dank für deine Hilfe

oelidoc