Ein(!) DOIF verliert das DevStateIcon auf Basis eines DOIF-Readings

Begonnen von FunkOdyssey, 15 Mai 2017, 10:53:11

Vorheriges Thema - Nächstes Thema

FunkOdyssey

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

Per

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.

FunkOdyssey



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

Per

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.

amenomade

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ß
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

FunkOdyssey

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.

Per

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...


Per


amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus