Hallo,
ich hänge hier mit einem eigentlich ganz einfachen DOIF, aber irgendwie löst es einfach nicht aus...
Internals:
CFGFN
DEF ([HomeStatus_test:"undefined"])(
set HomeStatus_test KurzWeg
)
DOELSE
NAME Abwesend
NR 645
NTFY_ORDER 50-Abwesenheit
STATE initialize
TYPE DOIF
READINGS:
2017-09-16 18:14:58 mode enable
2017-09-16 18:14:35 state initialize
condition:
0 EventDoIf('HomeStatus_test',$hash,'undefined',1)
devices:
0 HomeStatus_test
all HomeStatus_test
do:
0:
0 set HomeStatus_test KurzWeg
1:
0
helper:
globalinit 1
last_timer 0
sleeptimer -1
bm:
DOIF_Attr:
cnt 1
dmx 0
mAr
mTS
max 0
tot 0
DOIF_Notify:
cnt 171
dmx 0
mAr
mTS
max 0
tot 0
DOIF_Set:
cnt 31
dmx 0
mTS 16.09. 18:14:35
max 12
tot 23
mAr:
HASH(0x36fb090)
Abwesend
initialize
itimer:
regexp:
all:
state:
STATE:
trigger:
all HomeStatus_test
Attributes:
do always
room Anwesenheit
wait 900
Wenn ich HomeStatus_test händisch von nem anderen Wert auf "undefined" stelle, sollte doch eigentlich der WAIT mit 900 loslaufen und dann irgendwann das HomeStatus_test auf "Zuhause" setzen... passiert nur leider gar nicht.
Das HomeStatus_test sieht so aus:
Internals:
CHANGED
NAME HomeStatus_test
NR 364
STATE undefined
TYPE dummy
READINGS:
2017-09-16 18:15:12 state undefined
helper:
bm:
dummy_Set:
cnt 126
dmx 0
mTS 16.09. 17:30:03
max 26
tot 284
mAr:
HASH(0x2cd7dc0)
HomeStatus_test
undefined
Attributes:
event-on-change-reading STATE
room Anwesenheit
setList Zuhause KurzWeg LangWeg Party undefined
Irgendwie stehe ich gerade aufm Schlauch, wer kann mir helfen?
Danke!
Wie sieht das Event aus, das zu Deiner Aktion erzeugt wird?
Übrigens, STATE ist kein Reading sondern ein Internal.
Blöde Frage... was meinst Du? ;)
Was genau hast Du an meiner Frage nicht verstanden?
Vorab: Nicht dass Du das "Blöde Frage..." auf Dich gesehen hast, es war auf mich als Anfänger gesehen.
Ausgelöst werden soll das DOIF, wenn folgendes DOIF den Status von HomeStatus_test ändert:
Internals:
CFGFN
DEF ([th_ug_bm_Motion:"motion"])(
set HomeStatus_test Zuhause
)
DOELSEIF
([ug_eb_fk:"closed"])(
set HomeStatus_test undefined
)
NAME Anwesend
NR 382
NTFY_ORDER 50-Anwesenheit
STATE cmd_1
TYPE DOIF
READINGS:
2017-09-16 19:02:44 Device th_ug_bm_Motion
2017-09-16 19:01:55 cmd 1
2017-09-16 19:01:55 cmd_event th_ug_bm_Motion
2017-09-16 19:01:55 cmd_nr 1
2017-09-16 19:02:44 e_th_ug_bm_Motion_events motion: off,motionDuration: 65,noMotion
2017-09-16 19:01:47 e_ug_eb_fk_events battery: ok,contact: closed (to vccu),closed,trigger_cnt: 240
2017-09-16 19:01:55 state cmd_1
condition:
0 EventDoIf('th_ug_bm_Motion',$hash,'motion',1)
1 EventDoIf('ug_eb_fk',$hash,'closed',1)
devices:
0 th_ug_bm_Motion
1 ug_eb_fk
all th_ug_bm_Motion ug_eb_fk
do:
0:
0 set HomeStatus_test Zuhause
1:
0 set HomeStatus_test undefined
2:
helper:
event motion: off
globalinit 1
last_timer 0
sleeptimer -1
timerdev th_ug_bm_Motion
timerevent motion: off
triggerDev th_ug_bm_Motion
bm:
DOIF_Attr:
cnt 3
dmx 0
mAr
mTS
max 0
tot 0
DOIF_Notify:
cnt 2248
dmx 0
mTS 16.09. 19:01:55
max 51
tot 570
mAr:
HASH(0x2565b38)
HASH(0x2e22938)
DOIF_Set:
cnt 64
dmx 0
mAr
mTS
max 0
tot 0
timerevents:
motion: off
motionDuration: 65
noMotion
timereventsState:
motion: off
motionDuration: 65
state: noMotion
triggerEvents:
motion: off
motionDuration: 65
noMotion
triggerEventsState:
motion: off
motionDuration: 65
state: noMotion
internals:
itimer:
readings:
regexp:
0:
1:
all:
state:
STATE:
trigger:
all th_ug_bm_Motion ug_eb_fk
Attributes:
room Anwesenheit
selftrigger all
Das event-on-change-reading habe ich wieder rausgenommen, dann nochmal in der Commandline
set HomeStatus_test undefined
eingegeben, jetzt hat komischerweise das DOIF gezogen.
Ich beobachte mal...
Was ich eigentlich möchte:
Ich habe einen Bewegungsmelder sowie einen Türkontakt an der Haustüre.
Wenn jetzt die Haustüre auf- und wieder zugemacht wird, soll ein timer von 900 sec loslaufen, der sollte er durch eine Motion über den Bewegungsmelder nicht unterbrochen werden, den HomeStatus auf "KurzWeg" stellen soll.
Der BWM stellt jedesmal, wenn er ausgelöst wird, den HomStatus auf "Zuhause".
Habe ich das richtig verstanden?
Haustür auf, dann Haustür zu, Timer startet, nach Ablauf des Timers soll der set-Befehl "KurzWeg" ausgeführt werden.
Wenn "KurzWeg" gesetzt ist, soll bei erkannter Bewegung "Zuhause" gesetzt werden.
Fast... wenn während des Timers eine Bewegung erkannt wird, soll der Timer beendet und HomeStatus auf "Zuhause" gesetzt bleiben.
Das "Tür auf" braucht nicht berücksichtigt werden, ein "closed" reicht natürlich.
Das DOIF zur Überprüfung von Motion im BWM hab ich so abgeändert, dass es nicht bei jedem motion den HomeStatus auf "Zuhause" setzt, sondern nur wenn er ungleich "Zuhause" ist.
Ich glaub, darüber hab ich es jetzt hinbekommen:
Internals:
DEF ([th_ug_bm_Motion:"motion"] and [HomeStatus_test] ne "Zuhause")(
set HomeStatus_test Zuhause
)
DOELSEIF
([ug_eb_fk:"closed"])(
set HomeStatus_test undefined
)
NAME Anwesend
NR 365
NTFY_ORDER 50-Anwesend
STATE cmd_1
TYPE DOIF
READINGS:
2017-09-16 20:14:14 Device HomeStatus_test
2017-09-16 20:14:14 cmd 1
2017-09-16 20:14:14 cmd_event th_ug_bm_Motion
2017-09-16 20:14:14 cmd_nr 1
2017-09-16 20:14:14 e_HomeStatus_test_STATE Zuhause
2017-09-16 20:14:14 e_HomeStatus_test_events Zuhause
2017-09-16 20:14:14 e_th_ug_bm_Motion_events brightness: 0,motion: on (to vccu),motionCount: 5_next:240s,motion,trigger_cnt: 5
2017-09-16 20:13:38 e_ug_eb_fk_events closed
2017-09-16 20:14:14 state cmd_1
condition:
0 EventDoIf('th_ug_bm_Motion',$hash,'motion',1) and InternalDoIf($hash,'HomeStatus_test','STATE') ne "Zuhause"
1 EventDoIf('ug_eb_fk',$hash,'closed',1)
devices:
0 th_ug_bm_Motion HomeStatus_test
1 ug_eb_fk
all th_ug_bm_Motion HomeStatus_test ug_eb_fk
do:
0:
0 set HomeStatus_test Zuhause
1:
0 set HomeStatus_test undefined
2:
helper:
event Zuhause
globalinit 1
last_timer 0
sleeptimer -1
timerdev th_ug_bm_Motion
timerevent motion: on (to vccu)
triggerDev HomeStatus_test
bm:
DOIF_Notify:
cnt 317
dmx 0
mTS 16.09. 20:05:52
max 50
tot 149
mAr:
HASH(0x29b4ed0)
HASH(0x29acf90)
DOIF_Set:
cnt 17
dmx 0
mAr
mTS
max 0
tot 0
timerevents:
brightness: 0
motion: on (to vccu)
motionCount: 5_next:240s
motion
trigger_cnt: 5
timereventsState:
brightness: 0
motion: on (to vccu)
motionCount: 5_next:240s
state: motion
trigger_cnt: 5
triggerEvents:
Zuhause
triggerEventsState:
state: Zuhause
internals:
0 HomeStatus_test:STATE
all HomeStatus_test:STATE
itimer:
readings:
regexp:
0:
1:
all:
state:
STATE:
trigger:
all th_ug_bm_Motion ug_eb_fk
Attributes:
do always
room Anwesenheit
selftrigger all
Internals:
DEF ([HomeStatus_test:"undefined"])(
set HomeStatus_test KurzWeg
)
DOELSE
NAME Abwesend
NR 367
NTFY_ORDER 50-Abwesend
STATE cmd_2
TYPE DOIF
READINGS:
2017-09-16 20:14:14 Device HomeStatus_test
2017-09-16 20:05:52 cmd 2
2017-09-16 20:05:52 cmd_event HomeStatus_test
2017-09-16 20:05:52 cmd_nr 2
2017-09-16 20:14:14 e_HomeStatus_test_events Zuhause
2017-09-16 18:14:58 mode enable
2017-09-16 20:05:52 state cmd_2
2017-09-16 20:14:14 wait_timer no timer
condition:
0 EventDoIf('HomeStatus_test',$hash,'undefined',1)
devices:
0 HomeStatus_test
all HomeStatus_test
do:
0:
0 set HomeStatus_test KurzWeg
1:
0
helper:
event Zuhause
globalinit 1
last_timer 0
sleepdevice HomeStatus_test
sleepsubtimer 0
sleeptimer -1
timerdev HomeStatus_test
timerevent Zuhause
triggerDev HomeStatus_test
bm:
DOIF_Attr:
cnt 1
dmx 0
mAr
mTS
max 0
tot 0
DOIF_Notify:
cnt 1892
dmx 0
mTS 16.09. 20:05:52
max 18
tot 127
mAr:
HASH(0x27a3ff8)
HASH(0x27a34e0)
DOIF_Set:
cnt 28
dmx 0
mAr
mTS
max 0
tot 0
timerevents:
Zuhause
timereventsState:
state: Zuhause
triggerEvents:
Zuhause
triggerEventsState:
state: Zuhause
internals:
itimer:
readings:
regexp:
0:
all:
state:
STATE:
trigger:
all HomeStatus_test
Attributes:
room Anwesenheit
wait 900
Brauch ich das "selftrigger all" Attribut eigentlich noch?
Ich würde gerne noch den Status "undefined" vom HomeStatus wegbekommen... vielleicht über einen "Zwischen-Dummy"?
Eine recht zuvelässige Methode die Anwesendheit festzustellen, ist die Butzung von G-Tag über PRESENCE, das soll sogar Raum/Stockwerk bezogen funktionieren, ohne undefinierte Zustände.
Hatte ich auch schon mal ausprobiert und dann wieder bleiben lassen.
Ich hatte die PebbleBee ausprobiert, aber da ist schon innerhalb des Zimmers der Kontakt zum BT-Dongle am Raspberry hinterm Fernseher abgerissen, wenn der Schlüsselanhänger in einer Tasche auf der anderen Seite des Zimmers war. Und ich bekomme meine Familie einfach nicht dazu, ihre Schlüssel am Schlüsselbrett aufzuhängen.
Hallo,
ich habe mal einen etwas anderen Ansatz gerade ausprobiert. Ich habe auf den Türkontakt ein Watchdog gesetzt. Allerdings auf das open Event. Wenn dann nach x Zeit kein Bewegungsmeder:motion kommt setze Dummy auf abwesend.
Türkontakt:open.* 00:00:15 Bewegung:motion.* set dummy_Anwesend Abwesend;
Als Attribut bei Watchdog autoRestart 1
Und als Notify oder Doif. Wenn Bewegung erkannt und Dummy_Anwesend ungleich Anwesend setzte ihn auf Anwesend. Den Code muß du selber basteln. Ich würde halt auf open Triggern. Vielleicht kannst du ja damit was anfangen.
Gruß Rolf
Ich hab es mir jetzt einfacher gemacht...
Erstmal ein DOIF, das loslegt sobald die Haustüre geschlossen wird:
([ug_eb_fk:"closed"])(
{fhem("delete AbwesendWAIT");
fhem("define AbwesendWAIT at +00:15:00 {fhem('set HomeStatus_test KurzWeg') }");
fhem("attr AbwesendWAIT room Anwesenheit")}
)
DOELSE
Dann, wenn der BWM etwas erkennt, löscht er das at wieder:
([th_ug_bm_Motion:"motion"])(
{fhem ("set HomeStatus_test Zuhause");
fhem ("delete AbwesendWAIT")}
)
DOELSE
Funktioniert grundsätzlich gut, ich bekomme aber Fehlermeldungen ins Log, wenn sowohl beim ersten als zweiten DOIF das AT beim "delete" nicht vorhanden ist.
Da jetzt noch eine Möglichkeit zu erkennen, ob es überhaupt existiert wäre toll.
Und dann noch beim "set HomeStatus..." vorher eine Abfrage, ob der Status nicht evtl. schon auf Zuhause steht.
Ich stehe etwas mit den unterschiedlichen Syntaxen in den Befehlsfolgen auf dem Kriegsfuß, bekomm da ein "if..." nicht zum Laufen.
Dein ganzer Ansatz ist großer Käse. Wie kommt man nur auf so ein Konstrukt wo doch die Commandref sowas von ausführlich ist.
([ug_eb_fk:"closed"]) (set HomeStatus_test:FILTER=STATE!=KurzWeg KurzWeg) DOELSEIF ([th_ug_bm_Motion:"motion"]) (set HomeStatus_test:FILTER=STATE!=Zuhause Zuhause)
attr wait 900
Wenn der Türkontakt ein closed liefert läuft ein Timer. Wird binnen 15min keine Bewegung ausgelöst wird HomeStatus auf KurzWeg gesetzt ansonsten wird HomeStatus auf Zuhause gesetzt.
Äh... wow.
Das ist es, und sogar ganz einfach zu lesen und zu verstehen!
Ich hab mich da anscheinend echt total verrannt, dazu kommt dann noch zuwenig Erfahrung mit der Optimierung z.B. mit den Filtern
Es kann alles so einfach sein, wenn man weiß was man zu machen hat...
Vielen Dank!
Zitat von: AndyMu am 17 September 2017, 15:21:48
Ich hab es mir jetzt einfacher gemacht...
Erstmal ein DOIF, das loslegt sobald die Haustüre geschlossen wird:
([ug_eb_fk:"closed"])(
{fhem("delete AbwesendWAIT");
fhem("define AbwesendWAIT at +00:15:00 {fhem('set HomeStatus_test KurzWeg') }");
fhem("attr AbwesendWAIT room Anwesenheit")}
)
DOELSE
Dann, wenn der BWM etwas erkennt, löscht er das at wieder:
([th_ug_bm_Motion:"motion"])(
{fhem ("set HomeStatus_test Zuhause");
fhem ("delete AbwesendWAIT")}
)
DOELSE
Funktioniert grundsätzlich gut, ich bekomme aber Fehlermeldungen ins Log, wenn sowohl beim ersten als zweiten DOIF das AT beim "delete" nicht vorhanden ist.
Da jetzt noch eine Möglichkeit zu erkennen, ob es überhaupt existiert wäre toll.
Und dann noch beim "set HomeStatus..." vorher eine Abfrage, ob der Status nicht evtl. schon auf Zuhause steht.
Ich stehe etwas mit den unterschiedlichen Syntaxen in den Befehlsfolgen auf dem Kriegsfuß, bekomm da ein "if..." nicht zum Laufen.
Du könntest ein benanntes sleep nehmen, das kannst Du über seinen Namen löschen, auch wenn es nicht mehr existiert, ohne Fehlermeldung, s.
https://fhem.de/commandref_DE.html#sleep
https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events dort Alternative mit sleep
Zitat von: CoolTux am 17 September 2017, 15:34:28
Dein ganzer Ansatz ist großer Käse. Wie kommt man nur auf so ein Konstrukt wo doch die Commandref sowas von ausführlich ist.
([ug_eb_fk:"closed"]) (set HomeStatus_test:FILTER=STATE!=KurzWeg KurzWeg) DOELSEIF ([th_ug_bm_Motion:"motion"]) (set HomeStatus_test:FILTER=STATE!=Zuhause Zuhause)
attr wait 900
Wenn der Türkontakt ein closed liefert läuft ein Timer. Wird binnen 15min keine Bewegung ausgelöst wird HomeStatus auf KurzWeg gesetzt ansonsten wird HomeStatus auf Zuhause gesetzt.
Muss ich da noch das "do always" Attribut setzen?
Zitat von: Ellert am 17 September 2017, 16:22:00
Du könntest ein benanntes sleep nehmen, das kannst Du über seinen Namen löschen, auch wenn es nicht mehr existiert, ohne Fehlermeldung, s.
https://fhem.de/commandref_DE.html#sleep
https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events dort Alternative mit sleep
Ok, damit hatte ich mich noch nicht beschäftigt, sieht aber auch elegant aus.
Danke!
Zitat von: AndyMu am 17 September 2017, 17:15:39
Muss ich da noch das "do always" Attribut setzen?
Ohne jetzt weitere Voraussetzungen zu kennen sage ich mal nein. Wieso?
Du kommst oder gehst ja schließlich nur einmal.
So, meine Anwesenheitssteuerung ist (in meinen Augen) sauber komprimiert und bezieht nun div. auslösende Ereignisse im Haus mit ein, um einen möglichst schnellen Wechsel auf "Zuhause" zu erreichen, falls die Haustüre geschlossen wird.
Dazu zählen das Schalten von Licht, Umschalten am Receiver, öffnen einiger Fenster (die ein potentieller Einbrecher nicht erreichen kann) und natürlich auch Bewegungsmelder. Beim Receiver wurde der Zeitraum 18:45 ausgeklammert, weil hier eine automatische Umschaltung des Programms passiert.
([ug_eb_fk] eq "closed")
(set HomeStatus:FILTER=STATE!=KurzWeg KurzWeg,set Marc:FILTER=STATE!=absent absent,set Eltern:FILTER=STATE!=absent absent)
DOELSEIF ((![18:44-18:46] and [SATReceiver:channel])
or [th_eg_bm_Motion] eq "motion"
or [SichereFenster]
or [":Btn"])
(set HomeStatus:FILTER=STATE!=Zuhause Zuhause,set Eltern:FILTER=STATE!=present present)
Ich hab hier leider doch noch ein Thema...
Beim Bewegungsmelder ug_marc_bm möchte ich eine Aktion auslösen, sobald eine Bewegung erkannt wird.
Dafür habe ich ein eigenes DOIF erstellt:
([ug_marc_bm_Motion:"motion"])
(set HomeStatus:FILTER=STATE!=Zuhause Zuhause,set Marc:FILTER=STATE!=present present)
DOELSEIF ([ug_marc_bm_Motion:"noMotion"])
(set Marc:FILTER=STATE!=absent absent)
Das funktioniert soweit auch, im zweiten Fall soll, wenn der BM keine Bewegung mehr erkennt, nach x Sekunden der Status auf "absent" gesetzt werden.
Irgendwie aber startet cmd1, wenn der BM auf "noMotion" geht. Was übersehe ich?
Das list vom DOIF:
Internals:
CFGFN
DEF ([ug_marc_bm_Motion:"motion"])
(set HomeStatus:FILTER=STATE!=Zuhause Zuhause,set Marc:FILTER=STATE!=present present)
DOELSEIF ([ug_marc_bm_Motion:"noMotion"])
(set Marc:FILTER=STATE!=absent absent)
NAME DOIF_SteuerungAnwesenheitMarc
NR 813
NTFY_ORDER 50-DOIF_SteuerungAnwesenheitMarc
STATE cmd_1
TYPE DOIF
READINGS:
2017-10-03 12:07:08 Device ug_marc_bm_Motion
2017-10-03 12:07:08 cmd 1
2017-10-03 12:07:08 cmd_event ug_marc_bm_Motion
2017-10-03 12:07:08 cmd_nr 1
2017-10-03 12:07:08 e_ug_marc_bm_Motion_events motion: off,motionDuration: 242,noMotion
2017-10-03 12:07:08 state cmd_1
condition:
0 EventDoIf('ug_marc_bm_Motion',$hash,'motion',1)
1 EventDoIf('ug_marc_bm_Motion',$hash,'noMotion',1)
devices:
0 ug_marc_bm_Motion
1 ug_marc_bm_Motion
all ug_marc_bm_Motion
do:
0:
0 set HomeStatus:FILTER=STATE!=Zuhause Zuhause,set Marc:FILTER=STATE!=present present
1:
0 set Marc:FILTER=STATE!=absent absent
2:
helper:
event motion: off
globalinit 1
last_timer 0
sleeptimer -1
timerdev ug_marc_bm_Motion
timerevent motion: off
triggerDev ug_marc_bm_Motion
bm:
DOIF_Attr:
cnt 1
dmx 0
mAr
mTS
max 0
tot 0
DOIF_Notify:
cnt 239
dmx 0
mTS 03.10. 12:07:08
max 52
tot 52
mAr:
HASH(0x4c06240)
HASH(0x3b83fd8)
DOIF_Set:
cnt 37
dmx 0
mTS 03.10. 12:04:23
max 337
tot 337
mAr:
HASH(0x4c06240)
DOIF_SteuerungAnwesenheitMarc
cmd_1
timerevents:
motion: off
motionDuration: 242
noMotion
timereventsState:
motion: off
motionDuration: 242
state: noMotion
triggerEvents:
motion: off
motionDuration: 242
noMotion
triggerEventsState:
motion: off
motionDuration: 242
state: noMotion
internals:
itimer:
readings:
regexp:
0:
all:
state:
STATE:
trigger:
all ug_marc_bm_Motion
Attributes:
do always
room Anwesenheit
wait 0:60
Hallo,
nur ein Versuch. Bei mir funktioniert das: ([ug_marc_bm_Motion:"motion"]) meistens auch nicht.
Ich schreibe das immer so: ([ug_marc_bm_Motion] eq "motion").
Vielleicht geht's.
Ja, so funktioniert es... danke!
([ug_marc_bm_Motion:state] eq "motion")
(set HomeStatus:FILTER=STATE!=Zuhause Zuhause,set Marc:FILTER=STATE!=present present)
DOELSEIF ([ug_marc_bm_Motion] eq "noMotion")
(set Marc:FILTER=STATE!=absent absent)