Hmm, schwierig zu formulieren.
Ich habe zig DOIFs angelegt, die alle ähnlich wie unten konfiguriert sind. Alle haben ein im "stateFormat" den Modus "P_mode", welche "aktiv" und "inaktiv" annehmen kann. Alle DOIFs behalten auch dauerhaft das Icon. Nur das folgende DOIF nicht. Ich kann den Status ändern und das Icon bleibt bestehen. Irgendwann (nach einem Neustart?) wird anstatt des Icons nur der Text "P_mode" angezeigt.
Das ist kein Weltuntergang, aber vielleicht hat ja jemand einen Tipp. Danke.
Internals:
DEF (
[":^MISSING.ACK|NACK"] and
[?$SELF:P_mode,"inaktiv"] eq "aktiv"
)
(
(msg push ...)
)
NAME di_missing_ack
NR 344
NTFY_ORDER 50-di_missing_ack
STATE P_mode
TYPE DOIF
Readings:
2017-04-17 09:07:45 Device hz_kwl_switch
2017-04-27 11:43:48 P_mode aktiv
2017-04-17 09:08:06 cmd 1
2017-04-17 09:08:06 cmd_event hz_kwl_switch
2017-04-17 09:08:06 cmd_nr 1
2017-04-17 09:07:45 matched_event_c1_1 MISSING ACK
2017-04-17 09:08:06 state cmd_1
2017-05-15 08:40:09 wait_timer no timer
Condition:
0 EventDoIf('',$hash,'^MISSING.ACK|NACK',0) and ReadingValDoIf($hash,'di_missing_ack','P_mode','"inaktiv"') eq "aktiv"
Devices:
Do:
0:
0 (msg push ....)
1:
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Itimer:
Regexp:
0:
0 :^MISSING.ACK|NACK
All:
0 :^MISSING.ACK|NACK
State:
State:
Attributes:
devStateIcon aktiv:general_an@green inaktiv:general_aus@Crimson
do always
readingList P_mode
setList P_mode:aktiv,inaktiv
stateFormat P_mode
wait 20
webCmd P_mode
Zitat von: FunkOdyssey am 15 Mai 2017, 10:53:11
Ich habe zig DOIFs angelegt, die alle ähnlich wie unten konfiguriert sind.
Häng doch mal eins dieser zig funktionierenden Exemplare mit an.
Internals:
DEF (
[global:"INITIALIZED"] and
[?$SELF:P_mode,"inaktiv"] eq "aktiv"
)
(
(msg mail ...)
)
NAME di_fheminit
NR 457
NTFY_ORDER 50-di_fheminit
STATE aktiv
TYPE DOIF
Readings:
2017-05-15 11:19:04 Device global
2017-02-08 18:16:55 P_mode aktiv
2017-05-15 11:19:04 cmd 2
2017-05-15 11:19:04 cmd_event global
2017-05-15 11:19:04 cmd_nr 2
2017-05-15 11:19:04 e_global_events DEFINED telnetForBlockingFn_1494839944.40651
2017-05-15 11:19:04 state cmd_2
Condition:
0 EventDoIf('global',$hash,'INITIALIZED',1) and ReadingValDoIf($hash,'di_fheminit','P_mode','"inaktiv"') eq "aktiv"
Devices:
0 global
all global
Do:
0:
0 (msg mail ...)
1:
Helper:
event DEFINED telnetForBlockingFn_1494839944.40651
globalinit 1
last_timer 0
sleeptimer -1
timerdev global
timerevent DEFINED telnetForBlockingFn_1494839944.40651
triggerDev global
timerevents:
DEFINED telnetForBlockingFn_1494839944.40651
timereventsState:
DEFINED telnetForBlockingFn_1494839944.40651
triggerEvents:
DEFINED telnetForBlockingFn_1494839944.40651
triggerEventsState:
DEFINED telnetForBlockingFn_1494839944.40651
Internals:
Itimer:
Readings:
Regexp:
0:
All:
State:
State:
Trigger:
all global
Attributes:
devStateIcon aktiv:general_an@green inaktiv:general_aus@Crimson
readingList P_mode
setList P_mode:aktiv,inaktiv
stateFormat P_mode
webCmd P_mode
Zu deinem Problem kann ich dir gerade nicht weiterhelfen (bin unterwegs), aber dass das wait im ersten DOIF funktioniert, glaube ich nicht, da das DOIF nicht unterscheidet, welches Device aktiviert und welches wieder ok meldet.
Per hat Recht: siehe CommandREF:
ZitatVerzögerte "Fenster offen"-Meldung
define di_window_open DOIF ["^window_:open|tilted"])
(defmod at_$DEVICE at +00:05 set send window $DEVICE open)
DOELSEIF (["^window_:closed"])
(delete at_$DEVICE)
attr di_window_open do always
Alternative mit sleep
define di_window_open DOIF ["^window_:open|tilted"])
(sleep 300 $DEVICE quiet;set send window $DEVICE open)
DOELSEIF (["^window_:closed"])
(cancel $DEVICE quiet)
attr di_window_open do always
In den obigen beiden Beispielen ist eine Verzögerung über das Attribut wait nicht sinnvoll, da pro Fenster ein eigener Timer (hier mit Hilfe von at/sleep) gesetzt werden muss.
Es gibt nur 1 Wait Timer pro DOIF. Und mit do always wird es permanent zurückgesetzt, sobald andere Geräte sich melden.
Gruß
Okay, damit kann ich leben. Dann kann ich das Attribut auch löschen.
Ich glaube sogar, dass ich mich bereits darüber gewundert habe, warum ich eine Push-Nachricht erhalte, obwohl der Device-Status zeitnah wieder korrigiert wurde.
Zitat von: FunkOdyssey am 15 Mai 2017, 14:11:27warum ich eine Push-Nachricht erhalte, obwohl der Device-Status zeitnah wieder korrigiert wurde.
Erstaunlich, andersherum wäre es logischer...
Da hat er Recht. :-)
Vllt. versuchst du es gleich mal mit der neuen Aggregationsfunktion (https://forum.fhem.de/index.php/topic,70624.0.html)?
Zitatwarum ich eine Push-Nachricht erhalte, obwohl der Device-Status zeitnah wieder korrigiert wurde.
Weil, soweit ich weiss, mit do_always: (Bedingung = wahr) => wait und dann Befehl ohne die Bedingung wieder zu bewerten.
ABER: wenn ein anderes Gerät (oder das gleiche) wieder die Bedingung wahr macht => Timer zurückgesetzt
Wenn einen Haufen von Events, weiss ich nicht wie das DOIF reagiert. Vermutlich nur <timer> Sekunden nach dem letzten. Dazu wird mit webCMD mit einer Komische Liste gespielt... insgesamt weiss ich nicht wie das Ding reagieren soll. M.A sollte man nicht auf STATE=P_mode kommen, sondern nur aktiv oder inaktiv durch stateFormat.