(Erledigt) Wait-timer wird nicht gelöscht...

Begonnen von misux, 27 März 2022, 08:50:28

Vorheriges Thema - Nächstes Thema

misux

Hallo!

Ich habe ein recht simples DOIF welches mir sagt ob einer zu hause ist oder nicht...

DAs Abwesendsein soll 900sek verzögert werden. und ich dachte immer sobald in dieser zeit einer doch anwesend ist wird der timer gelöscht?

Hier das DOIF:
([DavidHandy] eq "absent" and [ChrissiHandy] eq "absent"  and [?Haus] eq "present")
(set Haus absent)
DOELSEIF
([DavidHandy] eq "present" and [?Haus] eq "absent")
(set Haus present)
DOELSEIF
([ChrissiHandy] eq "present" and [?Haus] eq "absent")
(set Haus present)



Hier mein List wo man sieht das David_Handy present geworden ist während der Timer lief und dieser wurde nicht gelöscht.
Internals:
   DEF        ([DavidHandy] eq "absent" and [ChrissiHandy] eq "absent"  and [?Haus] eq "present")
(set Haus absent)
DOELSEIF
([DavidHandy] eq "present" and [?Haus] eq "absent")
(set Haus present)
DOELSEIF
([ChrissiHandy] eq "present" and [?Haus] eq "absent")
(set Haus present)
   FUUID      60172871-f33f-e7ed-cc03-dc921ad4b91a090c
   FVERSION   98_DOIF.pm:0.256630/2022-02-09
   MODEL      FHEM
   NAME       DOIFPresence
   NOTIFYDEV  ChrissiHandy,global,DavidHandy
   NR         68
   NTFY_ORDER 50-DOIFPresence
   STATE      initialized
   TYPE       DOIF
   VERSION    25663 2022-02-09 17:05:11
   READINGS:
     2022-03-27 08:41:36   Device          DavidHandy
     2022-03-27 08:30:54   cmd             0
     2022-03-27 08:41:28   e_ChrissiHandy_STATE absent
     2022-03-27 08:41:36   e_DavidHandy_STATE present
     2022-03-27 08:30:54   mode            enabled
     2022-03-27 08:30:54   state           initialized
     2022-03-27 08:33:34   wait_timer      27.03.2022 08:43:34 cmd_1 DavidHandy
   Regex:
     accu:
     collect:
     cond:
       ChrissiHandy:
         0:
           &STATE     ^ChrissiHandy$
         1:
         2:
           &STATE     ^ChrissiHandy$
       DavidHandy:
         0:
           &STATE     ^DavidHandy$
         1:
           &STATE     ^DavidHandy$
         2:
   attr:
     cmdState:
     wait:
       0:
         600
       1:
         0
       2:
         0
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'DavidHandy','STATE') eq "absent" and ::InternalDoIf($hash,'ChrissiHandy','STATE') eq "absent"  and ::InternalDoIf($hash,'Haus','STATE') eq "present"
     1          ::InternalDoIf($hash,'DavidHandy','STATE') eq "present" and ::InternalDoIf($hash,'Haus','STATE') eq "absent"
     2          ::InternalDoIf($hash,'ChrissiHandy','STATE') eq "present" and ::InternalDoIf($hash,'Haus','STATE') eq "absent"
   do:
     0:
       0          set Haus absent
     1:
       0          set Haus present
     2:
       0          set Haus present
     3:
   helper:
     NOTIFYDEV  ChrissiHandy,global,DavidHandy
     event      present,presence: present
     globalinit 1
     last_timer 0
     sleepdevice DavidHandy
     sleepsubtimer 0
     sleeptimer 0
     timerdev   ChrissiHandy
     timerevent absent,presence: absent
     triggerDev DavidHandy
     timerevents:
       absent
       presence: absent
     timereventsState:
       state: absent
       presence: absent
     triggerEvents:
       present
       presence: present
     triggerEventsState:
       state: present
       presence: present
   hmccu:
   internals:
     all         DavidHandy:STATE ChrissiHandy:STATE Haus:STATE
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   do         always
   room       DOIF,PRESENCE
   wait       600:0:0


Was mache ich falsch? Was muss ich tun damit das Verzögerte Kommando doch nicht ausgeführt wird wenn eine von den beiden anderen Bedingungen wahr wird?


misux

Ach mist... Ich sehe den Fehler... Meine Abfrege [?Haus] eq "absent" verhindert das löschen des Timers... Mist... ist ja klar weil es ja noch nicht absent ist solange der timer läuft...

Habe damit verhindern wollen das das cmd 2 oder 3 alle 30 Sekunden durchgeführt wird...

okay, fehler gefunden..

Aber eine Frage... WIe lege ich fest ich in diesem Fall das cmd 2 oder/und 3 ausgeführt werden NUR wenn ein Timer in diesem DOIF läuft... ???

Stelaku

Moin misux

versuch es mal so


([DavidHandy] eq "absent" and [ChrissiHandy] eq "absent"  and [?Haus] eq "present")
()
(set Haus absent)
DOELSEIF
([DavidHandy] eq "present" and $cmd == 1.1)
(set Haus present)
DOELSEIF
([ChrissiHandy] eq "present" and $cmd == 1.1)
(set Haus present)

misux

klappt leider nicht... er löscht so den Timer wieder nicht...

Stelaku

stimmt kann auch nicht.

Du musst Dein wait anpassen

0,600:0:0

Otto123

#5
Hi,

ich verstehe weder den Sinn von and [?Haus] eq "present" noch von einem leeren Kommando () Ich weiß auch nicht ob in dem Fall do always richtig ist?

Ich packe die Logik in eine Struktur und mache den wait Timer bei der einzelnen Person. Das "Haus" wie in deinem Fall ist wieder einfach eine Struktur aller Personen.
Sieht aufwendig aus, ist aus meiner Anfangszeit mit FHEM, läuft aber sehr flexibel und wartungsfreundlich. An ROOMMATE wollte ich nie ran ;)

  • Mehrere Geräte können die Anwesenheit einer Person repräsentieren. st_Dev_Gast, Bei Gerätewechsel kommt das neue Gerät einfach in die Struktur.
  • Es sind Aktionen pro Person present / absent möglich. Hier wird die Toleranz "mal kurz weg" eingebaut.
  • Es sind Aktionen bei st_Bewohner present / absent möglich.
Mal mit Dummies zum testen/spielen:
defmod di_Dev_Gast DOIF ([st_Dev_Gast] eq "absent")(set PersonGast absent) DOELSEIF ([st_Dev_Gast] eq "present")(set PersonGast present)
attr di_Dev_Gast room Status
attr di_Dev_Gast wait 30

defmod PersonGast dummy
attr PersonGast userattr bewohner bewohner_map structexclude
attr PersonGast bewohner st_Bewohner
attr PersonGast devStateIcon present:10px-kreis-gruen absent:10px-kreis-rot
attr PersonGast event-on-change-reading state
attr PersonGast room Status

defmod st_Dev_Gast structure bewohner WL_Gast
attr st_Dev_Gast clientstate_behavior relative
attr st_Dev_Gast clientstate_priority present|1 absent|0
attr st_Dev_Gast event-on-change-reading state
attr st_Dev_Gast room Status

defmod WL_Gast dummy
attr WL_Gast userattr bewohner bewohner_map structexclude
attr WL_Gast devStateIcon present:10px-kreis-gruen absent:10px-kreis-rot
attr WL_Gast event-on-change-reading state
attr WL_Gast room Status
attr WL_Gast setList absent present
attr WL_Gast webCmd present:absent


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

misux

Hab ja geschrieben das es Dumm war die Abfrage ?Haus zu setzen... Der Gedanke war das nicht alle 30sek den set befehl auszuführen wenn Haus present ist sondern nur ein mal.
Dennoch vielen Dank @Otto123 für dein Beispiel!


Naja, wie dem auch sei...
Das Teil mit attr wait 0,600:0:0 funktioniert hervorragent! Ist einfach und in einem DOIF übersichtlich... und erlaubt kurze abwesenheiten von 15 Minuten ohne das der abwesenheitsmodus gestaret wird.

"Haus" ist übrigens ein Dummy auf den viele andere Dinge triggern wenn er aktiv oder nicht aktiv ist...

Zitat von: Stelaku am 27 März 2022, 09:24:20
Moin misux

versuch es mal so


([DavidHandy] eq "absent" and [ChrissiHandy] eq "absent" and [?Haus] eq "present")
()
(set Haus absent)
DOELSEIF
([DavidHandy] eq "present" and $cmd == 1.1)
(set Haus present)
DOELSEIF
([ChrissiHandy] eq "present" and $cmd == 1.1)
(set Haus present)