Ich habe ein dummy device DoorStatus angelegt in welches ich zwei Readings schreibe: "DoorClosed" und "DoorOpened" Die Readings beinhalten jeweils den Namen der Person (Vorname Nachname) welche die Türe öffnet bzw. schliesst.
Nun möchte ich, dass jedesmal wenn jemand die Türe öffnet sein rr_User den Status "home" bekommt bzw. beim Schliessen der Türe den Status "away".
Ich habe dazu folgendes DOIF erstellt:
define DoorANDResident DOIF ([WEBDoorClosed:"Vorname1 Nachname1"]) (set rr_user1 absent) DOELSEIF ([WEBDoorClosed:"Vorname2 Nachname2"]) (set rr_user2 absent) DOELSEIF ([WEBDoorOpened:"Vorname 1 Nachname1"]) (set rr_user1 home) DOELSEIF ([WEBDoorOpened:"Vorname2 Nachname2"]) (set rr_user2 home) DOELSE ""
leider passiert hier gar nichts.
wenn ich das DOIF ändere:
define DoorANDResident DOIF (["DoorStatus:WEBDoorClosed" eq "Vorname1 Nachname1"]) (set rr_user1 absent) DOELSEIF (["DoorStatus:WEBDoorClosed" eq "Vorname2 Nachname2"]) (set rr_user2 absent) DOELSEIF (["DoorStatus:WEBDoorOpened" eq "Vorname1 Nachname1"]) (set rr_user1 home) DOELSEIF (["DoorStatus:WEBDoorOpened" eq "Vorname2 Nachname2"]) (set rr_user2 home) DOELSE ""
dann springt es zwar an, nimmt aber immer nur den ersten user.
Was mache ich falsch, bzw. wie würde man so etwas richtig definieren?
Richtig beurteilen kann ich das nicht, weil ich z.B. nicht weiss, ob es ein Kopierfehler ist oder du wirklich mit den falschen Anführungsstrichen arbeitest.
Als zweites würde ich dir Code-Tags (der #-Button im Menü) empfehlen, da kann man den Code besser lesen.
Drittens hat das zweite Beispiel eine völlig falsche Syntax, da solltest du nochmal in die CommandRef schauen.
Und wenn du im zweiten Beispiel nach DoorStatus:WEBDoorOpened suchst, warum im ersten nur nach WEBDoorOpened? So viel Zeit damit gespart?
Danke für den Hinweis. Ich habe die Anführungszeichen korrigiert, leider mit dem selben Ergebnis:
(["DoorStatus:WEBDoorClosed:" eq "Vorname1 Nachname1"]) (set rr_User1 absent) DOELSEIF (["DoorStatus:WEBDoorClosed:" eq "Vorname2 Nachname2"]) (set rr_User2 absent) DOELSEIF (["DoorStatus:WEBDoorOpened:" eq "Vorname1 Nachname1"]) (set rr_User1 home) DOELSEIF (["DoorStatus:WEBDoorOpened:" eq "Vorname12 Nachname2"]) (set rr_User2 home) DOELSE ""
führt zu cmd_5 als Resultat. Die Command Referenz habe ich gelesen, verstehe aber immer noch nicht wo ich den Fehler mache.
Nimm Mal bitte als erstes das DOELSE samt Anhang weg.
Und dann Gib Mal bitte ein list vom DOIF und wenigstens ein list eines Devices auf das getriggert wird.
Danke für den Tip, habe ich gerade geändert:
define DoorANDResident DOIF (["DoorStatus:WEBDoorClosed:" eq "Vorname1 Nachname"]) (set rr_User1 absent) DOELSE ""
Damit bekomme ich jetzt ein cmd_2
Hier der list DoorStatus:
Internals:
NAME DoorStatus
NR 371
STATE locked
TYPE dummy
READINGS:
2018-04-20 10:31:52 WEBDoorClosed Vorname1 Nachname1
2018-04-19 13:49:41 WEBDoorOpened Vorname1 Nachname1
2018-04-20 10:31:52 state locked
Attributes:
devStateIcon locked:status_locked unlocked:status_open
room Frontdoor
Bitte die list Ausgaben in Codetags. Also bitte noch mal vom dummy ein list vernünftig und ganz wichtig ein list vom DOIF.
hi,
wie oben schon erwähnt:
(["DoorStatus:WEBDoorClosed:" eq "Vorname1 Nachname"])
ist falsch.
Es müsste so aussehen, zumindest was die ] und den : betrifft
(["DoorStatus:WEBDoorClosed"] eq "Vorname1 Nachname")
Grüße
Achim
Und das geht so. Ist das dann reagieren auf Event? Ich glaube das ist falsch, oder?
Wenn man es einfach haben will dann vielleicht erstmal so testen
([DoorStatus:WEBDoorClosed] eq "Vorname1 Nachname")
O.K. Das sieht schon mal vielversprechender aus:
Der Vorschlag von @CBSnake gibt einen cmd_2 aus (genau gleich wie mein vorheriges setting) aber die Idee von @CoolTux gibt jetzt ein cmd_1. Leider wird der Status von User1 aber noch nicht geändert.
list vom DOIF:
Internals:
CFGFN
DEF ([DoorStatus:WEBDoorClosed] eq "Vorname1 Nachname1") (set rr_User1 absent) DOELSE ""
MODEL FHEM
NAME DoorANDResident
NR 1051
NTFY_ORDER 50-DoorANDResident
STATE cmd_1
TYPE DOIF
READINGS:
2018-04-20 10:56:10 Device DoorStatus
2018-04-20 10:56:10 cmd 1
2018-04-20 10:56:10 cmd_event DoorStatus
2018-04-20 10:56:10 cmd_nr 1
2018-04-20 10:56:10 e_DoorStatus_WEBDoorClosed Vorname1 Nachname1
2018-04-20 10:55:33 mode enabled
2018-04-20 10:56:10 state cmd_1
Regex:
condition:
0 ReadingValDoIf($hash,'DoorStatus','WEBDoorClosed') eq "Vorname1 Nachname1"
devices:
0 DoorStatus
all DoorStatus
do:
0:
0 set rr_User1 absent
1:
0
helper:
DOIF_Readings_events
DOIF_eventas
event WEBDoorClosed: Vorname1 Nachname1
globalinit 1
last_timer 0
sleeptimer -1
timerdev DoorStatus
timerevent WEBDoorClosed: Vorname1 Nachname1
triggerDev DoorStatus
timerevents:
WEBDoorClosed: Vorname1 Nachname1
locked
timereventsState:
WEBDoorClosed: Vorname1 Nachname1
locked
triggerEvents:
WEBDoorClosed: Vorname1 Nachname1
locked
triggerEventsState:
WEBDoorClosed: Vorname1 Nachname1
locked
internals:
itimer:
readings:
0 DoorStatus:WEBDoorClosed
all DoorStatus:WEBDoorClosed
trigger:
uiState:
uiTable:
Attributes:
room Residents
und der list vom DoorStatus:
Internals:
NAME DoorStatus
NR 371
STATE locked
TYPE dummy
READINGS:
2018-04-20 10:56:10 WEBDoorClosed Vorname1 Nachname1
2018-04-19 13:49:41 WEBDoorOpened Vorname1 Nachname1
2018-04-20 10:56:10 state locked
Attributes:
devStateIcon locked:status_locked unlocked:status_open
room Frontdoor
Ok ich ahnte es. Du solltest das DOELSE plus "" löschen.
define DoorANDResident DOIF ([DoorStatus:WEBDoorClosed] eq "Vorname1 Nachname1") (set rr_user1 absent) DOELSEIF ([DoorStatus:WEBDoorClosed] eq "Vorname2 Nachname2") (set rr_user2 absent) DOELSEIF ([DoorStatus:WEBDoorOpened] eq "Vorname1 Nachname1") (set rr_user1 home) DOELSEIF ([DoorStatus:WEBDoorOpened] eq "Vorname2 Nachname2") (set rr_user2 home)
So sollte er wenigstens erstmal korrekt schalten. Das ganze kann man mit Variablen von DOIF sicherlich noch viel kürzer schreiben. Aber so fit bin ich in DOIF nicht.
funktioniert denn der Befehl
set rr_user1 absent
in der fhem-kommandozeile ??
ansonsten bitte ein list rr_user1 (evtl. auch mal im Eventmonitor gucken und hier anhängen.... bitte alles in code-tags !!!!)
Hallo CoolTux
Ich habe das mal auf eine Person geändert. Das DOIF läuft, gibt allerdings immer cmd_1 aus und macht keinen Update im Resident Modul:
define DoorANDResident DOIF ([DoorStatus:WEBDoorClosed] eq "Vorname1 Nachname1") (set rr_User1 absent) DOELSEIF ([DoorStatus:WEBDoorOpened] eq "Vorname1 Nachname1") (set rr_User1 home)
Das Weglassen von DOELSE hat nichts gebracht.
@nils_ set rr_user1 absent funktioniert einwandfrei
list rr_user1:
Internals:
DEF rgr_Test
DURATIONTIMER 1524219444.66684
NAME rr_User1
NOTIFYDEV global,
NR 302
NTFY_ORDER 50-rr_User1
READY 1
RESIDENTGROUPS rgr_Test
STATE home
TYPE ROOMMATE
READINGS:
2018-04-20 12:04:08 durTimerAbsence 00:00:00
2018-04-20 12:04:08 durTimerAbsence_cr 0
2018-04-20 12:16:24 durTimerPresence 00:12:16
2018-04-20 12:16:08 durTimerPresence_cr 12
2018-01-10 09:28:14 durTimerSleep 00:00:00
2018-01-10 09:28:14 durTimerSleep_cr 0
2018-04-20 12:04:08 lastArrival 2018-04-20 12:04:08
2018-04-20 10:56:10 lastDeparture 2018-04-20 10:56:10
2018-04-20 12:04:08 lastDurAbsence 01:07:58
2018-04-20 12:04:08 lastDurAbsence_cr 68
2018-04-20 10:56:10 lastDurPresence 194:01:56
2018-04-20 10:56:10 lastDurPresence_cr 11642
2018-04-20 10:56:10 lastLocation Home
2018-04-06 12:49:26 lastLocationAddr -
2018-04-06 12:49:26 lastLocationLat XX.XXXX
2018-04-06 12:49:26 lastLocationLong X.XXXXXXX
2018-04-20 12:16:24 lastMood sleepy
2018-04-20 12:16:24 lastState gotosleep
2018-04-20 12:04:08 location Home
2018-04-06 12:49:26 locationAddr -
2018-04-06 12:49:26 locationLat XX.XXXXX
2018-04-06 12:49:26 locationLong X.XXXXXXX
2018-04-06 12:49:26 locationPresence present
2018-04-20 12:16:24 mood calm
2018-04-20 12:04:08 presence present
2018-04-20 12:16:24 state home
2018-01-10 09:35:00 wayhome 0
TIMER:
rr_TomAndroid_DurationTimer:
HASH rr_User1
MODIFIER DurationTimer
NAME rr_User1_DurationTimer
Attributes:
alias User1-Mobile1
comment Auto-created by rgr_Test
devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown:home
event-on-change-reading state,wayhome
genericDeviceType switch
group 07-User1-Mobile1
homebridgeMapping On=state,valueOn=/home|awoken|asleep|gotosleep/,valueOff=/gone|absent/,cmdOn=home,cmdOff=absent
icon people_sensor
room Residents
rr_realname group
sortby 1
webCmd state
Ok ich verstehe. Das macht auch Sinn da die erste Abfrage in der Tat immer passt.
Wenn das DOIF aus welchen Grund auch immer ausgelöst wird, passt ja DoorStatus:WEBDoorClosed] eq "Vorname1 Nachname1" immer, ausser der andere hat sie vorher geschlossen. Das ist also schon mal mist.
Muss es denn unbedingt DOIF sein?
Nein, ich häng überhaupt nicht an dem DOIF, dachte aber, dass es einfacher wäre als unzählige NOTIFY's zu schreiben. Oder hast Du an etwas Anderes gedacht?
Gib mir mal ein paar Stunden. Ich kuck es mir mal an.
Internals:
CFGFN
DEF ([dummyDoorStatus:"^WEBDoorClosed:.Leon.Gaultier"]) () DOELSEIF ([dummyDoorStatus:"^WEBDoorClosed:.Maria.Magdalena"]) () DOELSEIF ([dummyDoorStatus:"^WEBDoorOpened:.Leon.Gaultier"]) () DOELSEIF ([dummyDoorStatus:"^WEBDoorOpened:.Maria.Magdalena"]) ()
MODEL FHEM
NAME DoorANDResident
NR 140
NTFY_ORDER 50-DoorANDResident
STATE cmd_2
TYPE DOIF
READINGS:
2018-04-20 18:43:56 Device dummyDoorStatus
2018-04-20 18:43:56 cmd 2
2018-04-20 18:43:56 cmd_event dummyDoorStatus
2018-04-20 18:43:56 cmd_nr 2
2018-04-20 18:43:56 e_dummyDoorStatus_events WEBDoorClosed: Maria Magdalena
2018-04-20 18:43:27 mode enabled
2018-04-20 18:43:56 state cmd_2
Regex:
condition:
0 EventDoIf('dummyDoorStatus',$hash,'^WEBDoorClosed:.Leon.Gaultier',1)
1 EventDoIf('dummyDoorStatus',$hash,'^WEBDoorClosed:.Maria.Magdalena',1)
2 EventDoIf('dummyDoorStatus',$hash,'^WEBDoorOpened:.Leon.Gaultier',1)
3 EventDoIf('dummyDoorStatus',$hash,'^WEBDoorOpened:.Maria.Magdalena',1)
devices:
0 dummyDoorStatus
1 dummyDoorStatus
2 dummyDoorStatus
3 dummyDoorStatus
all dummyDoorStatus
do:
0:
0
1:
0
2:
0
3:
0
4:
helper:
DOIF_Readings_events
event WEBDoorClosed: Maria Magdalena
globalinit 1
last_timer 0
sleeptimer -1
timerdev dummyDoorStatus
timerevent WEBDoorClosed: Maria Magdalena
triggerDev dummyDoorStatus
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: dummyDoorStatus
state: cmd_2
timerevents:
WEBDoorClosed: Maria Magdalena
timereventsState:
WEBDoorClosed: Maria Magdalena
triggerEvents:
WEBDoorClosed: Maria Magdalena
triggerEventsState:
WEBDoorClosed: Maria Magdalena
internals:
itimer:
readings:
trigger:
all dummyDoorStatus
uiState:
uiTable:
Attributes:
do always
Mach es erstmal so und schaue ob die CMDs korrekt sind. Danach kannst Du dann die Aktionen entsprechend in die () einsetzen. Bei mir klappt das auf jeden Fall so.
Wow. Du bist der Held! Jetzt wird cmd_1 bis cmd_4 ausgegeben. Ich werde die entsprechenden Aktionen für das Residents Modul morgen einbauen. Melde mich wieder ob es geklappt hat.
Nur als Tipp: den Ausführungsteil kann man weglassen:
DOIF ([dummyDoorStatus:"^WEBDoorClosed:.Leon.Gaultier"])
DOELSEIF ([dummyDoorStatus:"^WEBDoorClosed:.Maria.Magdalena"])
DOELSEIF ([dummyDoorStatus:"^WEBDoorOpened:.Leon.Gaultier"])
DOELSEIF ([dummyDoorStatus:"^WEBDoorOpened:.Maria.Magdalena"])
Damian, das Problem ist das ja bei Deinem Beispiel dann die set Befehle nicht ausgeführt werden oder? Oder meinst jetzt bei meinem Beispiel wo ich nur () gemacht habe? Die () hätte ich also weg lassen können, korrekt?
@kuhmelker
Wenn das dann funktioniert kann man das ganze mit etwas Perlcode im Ausführungsteil noch kürzen. Muss nur schauen wie man da mit dem Event am besten um geht.
Es funktioniert!
Ich habe jetzt nur noch den Code:
set rr_UserX absent
bzw.
set rr_UserX home
in die Formel gepackt. Damit ist das DOIF zwar etwas lang geworden (8 Personen) aber es läuft einwandfrei.
Danke allen die geholfen haben (speziell CoolTux).