gelöst: Doif erkennt Bedingung 1 aber Bedingung 2 nicht

Begonnen von Bäschdler, 09 Oktober 2020, 17:19:55

Vorheriges Thema - Nächstes Thema

Bäschdler

Hallo,

ich habe einen Doif im Einsatz der nicht so funktioniert wie ich es erwarten würde.


([OG_SZ_auf_lange_schlafen:"^auf$"]) (
set OG_SZ_lange_schlafen lange_schlafen ,
sleep 0.5 ,
set OG_SZ_auf_lange_schlafen nicht_betaetigt ,
set OG_SZ_Roll_Hof off ,
set OG_SZ_Roll_Strasse off ,
)


Wenn der Dummy OG_SZ_auf_lange_schlafen auf "auf" schaltet erkennt dieses der Doif und schaltet auf cmd_1. Der triggernde Dummy OG_SZ_auf_lange_schlafen wird auch vom Doif wieder auf "lange_schlafen" gesetzt. Nun hat ja der triggernde Dummy nicht mehr den Status "auf", daher würde ich erwarten, dass der Doif auf cmd_2 wechselt. Das tut er aber nicht. Stosse ich die Prüfung im Doif mit set checkall manuell an, dann wechselt der Status des Doif auf cmd_2.

Was mache ich falsch bzw. was kann ich tun, dass der Doif dann wieder auf cmd_2 geht? Ein setzen mittels set di_OG_SZ_auf_lange_schlafen cmd_2 oder set di_OG_SZ_auf_lange_schlafen checkall im delben Doif habe ich schon probiert, das funktioniert aber leider auch nicht.


Danke für eure Hilfe.

Viele Grüsse
Bäschdler

amenomade

#1
1. Ein DOIF triggert sich nicht selbst, um endlose Schleifen zu vermeiden. https://fhem.de/commandref_DE.html#DOIF_selftrigger
2. dein "sleep 0.5" ist so nicht mit den folgenden Befehlen verknüpft, sondern ist blockierend
3. Dein DOIF erkennt nicht den Zustand sondern nur die Ereignisse

Folgendes sollte funktionieren:
([OG_SZ_auf_lange_schlafen] eq "auf")
   (set OG_SZ_lange_schlafen lange_schlafen)
   (set OG_SZ_auf_lange_schlafen nicht_betaetigt, set OG_SZ_Roll_Hof off, set OG_SZ_Roll_Strasse off)

attr <DOIFname> selftrigger wait
attr <DOIFname> wait 0:0.5


4. ein "set di_OG_SZ_auf_lange_schlafen cmd_2" setzt nich den Zustand des DOIFs auf cmd_2 sondern führt nur Befehl2 aus
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Bäschdler

Hallo,

danke für deine schnelle Antwort. Ich habe jetzt den Code so wie von dir vorgeschlagen umgebaut, es funktioniert leider noch immer nicht. Der Doif bleibt auch auf cmd_1 "hängen" und erst nachdem ich manuell ein set checkall gemacht habe wechselt er auf cmd_2.

So sieht der code jetzt aus:

([OG_SZ_auf_lange_schlafen] eq "auf")
(set OG_SZ_lange_schlafen lange_schlafen,
set OG_SZ_auf_lange_schlafen nicht_betaetigt,
set OG_SZ_Roll_Hof off,
set OG_SZ_Roll_Strasse off)


Die beiden Attribute habe ich wie von Dir beschrieben gesetzt.

Hier noch eine Erklärung weshalb ich den sleep 0.5 eingebaut hatte: es war meine Vermutung, dass der Status des triggernden Dummy so schnell auf "nicht_betaetigt" wechselt, dass deshalb der Doif nicht funktioniert. Tatsächlich hatte ich vor dem einbauen des sleep öfters den Fall, dass der Dummy noch auf "auf" gesetzt war. Die halbe Sekunde ist daher eigentlich eine Hilfskrücke mit der ich aber gut leben könnte.

Danke und Gruss
Bäschdler

amenomade

#3
Zitat von: Bäschdler am 09 Oktober 2020, 20:48:19

So sieht der code jetzt aus:

([OG_SZ_auf_lange_schlafen] eq "auf")
(set OG_SZ_lange_schlafen lange_schlafen,
set OG_SZ_auf_lange_schlafen nicht_betaetigt,
set OG_SZ_Roll_Hof off,
set OG_SZ_Roll_Strasse off)


Und das sieht nicht so aus, wie ich es geschrieben habe. Guck mal besser ;)

Allerdings, habe ich einen Fehler im wait Attribut gemacht: es mus "wait 0,0.5" sein.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Bäschdler

Ich nehme mal an, du meinst das mit den Klammern. Hatte ich erst so, dann kam aber eine Fehlermeldung von FHEM.
Seltsam, nachdem ich es jetzt nochmal versucht habe ging's... Ich scheine wohl beim ersten Mal einen Fehler gemacht zu haben.

So sieht's jetzt aus:

([OG_SZ_auf_lange_schlafen] eq "auf")
(set OG_SZ_lange_schlafen lange_schlafen)
(set OG_SZ_auf_lange_schlafen nicht_betaetigt,
set OG_SZ_Roll_Hof off,
set OG_SZ_Roll_Strasse off)


Im Attribut habe ich jetzt das Komma statt dem Doppelpunkt drin.

Das Verhalten ist aber immer noch dasselbe. Oder habe ich noch etwas übersehen ?

Danke und Gruss
Bäschdler

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Bäschdler

hier das Ergebnis des list:

Zitat
Internals:
   CFGFN     
   DEF        ([OG_SZ_auf_lange_schlafen] eq "auf")
(set OG_SZ_lange_schlafen lange_schlafen)
(set OG_SZ_auf_lange_schlafen nicht_betaetigt,
set OG_SZ_Roll_Hof off,
set OG_SZ_Roll_Strasse off)
   FUUID      5f7071d6-f33f-c344-049f-fda703e339d0638c
   MODEL      FHEM
   NAME       di_OG_SZ_auf_lange_schlafen
   NOTIFYDEV  global,OG_SZ_auf_lange_schlafen
   NR         972
   NTFY_ORDER 50-di_OG_SZ_auf_lange_schlafen
   STATE      cmd_2
   TYPE       DOIF
   VERSION    22834 2020-09-23 17:50:00
   READINGS:
     2020-10-09 21:26:41   Device          OG_SZ_auf_lange_schlafen
     2020-10-09 21:26:56   cmd             2
     2020-10-09 21:26:56   cmd_event       di_OG_SZ_auf_lange_schlafen
     2020-10-09 21:26:56   cmd_nr          2
     2020-10-09 21:26:41   e_OG_SZ_auf_lange_schlafen_STATE nicht_betaetigt
     2020-10-09 21:26:35   mode            enabled
     2020-10-09 21:26:56   state           cmd_2
     2020-10-09 21:26:41   wait_timer      no timer
   Regex:
     accu:
     cond:
       OG_SZ_auf_lange_schlafen:
         0:
           &STATE     ^OG_SZ_auf_lange_schlafen$
   attr:
     cmdState:
     wait:
       0:
         0
         0.5
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'OG_SZ_auf_lange_schlafen','STATE') eq "auf"
   do:
     0:
       0          set OG_SZ_lange_schlafen lange_schlafen
       1          set OG_SZ_auf_lange_schlafen nicht_betaetigt,  set OG_SZ_Roll_Hof off,  set OG_SZ_Roll_Strasse off
     1:
   helper:
     DEVFILTER  ^global$|^OG_SZ_auf_lange_schlafen$
     NOTIFYDEV  global|OG_SZ_auf_lange_schlafen
     event      nicht_betaetigt
     globalinit 1
     last_timer 0
     sleepdevice OG_SZ_auf_lange_schlafen
     sleepsubtimer -1
     sleeptimer -1
     timerdev   
     timerevent nicht_betaetigt
     timerevents
     timereventsState
     triggerDev
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: di_OG_SZ_auf_lange_schlafen
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: di_OG_SZ_auf_lange_schlafen
       state: cmd_2
   internals:
     all         OG_SZ_auf_lange_schlafen:STATE
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   selftrigger wait
   wait       0,0.5

amenomade

#7
code Tags (# Zeichen) wären besser als quote Tags für ein "list".

Du brauchst noch ein attr do always, und wait muss ergänzt werden: wait 0,0.5:0.5

Statt 0.5 geht auch 0.1 oder 0.01
EDIT: und ein DOELSE am Ende der DEF

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Bäschdler

Sorry, geht auch nicht.
Aber jetzt funktioniert's auch nicht nach einem set checkall und das cmd_2 ist seit dem do always in der Auswahl von set verschwunden. Wenn ich diese attribut wieder lösche dann ist cmd_2 wieder da.

Danke und Gruss
Bäschdler

amenomade

#9
Da hast Du wahrscheinlich einen anderen Fehler reingebaut. Zeig mal wieder ein "list" bitte, diesmal in code Tags

EDIT: do always ist nicht in der "set" Liste sondern in der "attr" Liste.
Hast Du auch mein EDIT im vorherigen Post mitberücksichtigt (die DOELSE Geschichte)?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Bäschdler

Hi,

das do always hatte schon bei den Attributen.

Das DOELSEIF hatte ich nicht gesehen, wahrscheinlich hatte ich "zu früh" reingeschaut, gleich als ich die Mail über einen neuen Eintrag gesehen hatte. Habe es aber eben ausprobiert und da hat mir FHEM vorgeworfen, dass das ohne nachfolgenden Befehl nicht geht. Ich setze da gleich mal noch einen Testdummy rein der auf irgendwas gesetzt wird.

Hier das List:

Internals:
   DEF        ([OG_SZ_auf_lange_schlafen] eq "auf")
(set OG_SZ_lange_schlafen lange_schlafen)
(set OG_SZ_auf_lange_schlafen nicht_betaetigt,
set OG_SZ_Roll_Hof off,
set OG_SZ_Roll_Strasse off)
   FUUID      5f7071d6-f33f-c344-049f-fda703e339d0638c
   MODEL      FHEM
   NAME       di_OG_SZ_auf_lange_schlafen
   NOTIFYDEV  global,OG_SZ_auf_lange_schlafen
   NR         881
   NTFY_ORDER 50-di_OG_SZ_auf_lange_schlafen
   STATE      initialized
   TYPE       DOIF
   VERSION    22834 2020-09-23 17:50:00
   READINGS:
     2020-10-09 22:27:51   cmd             0
     2020-10-09 22:27:51   mode            enabled
     2020-10-09 22:27:51   state           initialized
   Regex:
     cond:
       OG_SZ_auf_lange_schlafen:
         0:
           &STATE     ^OG_SZ_auf_lange_schlafen$
   attr:
     wait:
       0:
         0
         0.5
       1:
         0.5
   condition:
     0          ::InternalDoIf($hash,'OG_SZ_auf_lange_schlafen','STATE') eq "auf"
   do:
     0:
       0          set OG_SZ_lange_schlafen lange_schlafen
       1          set OG_SZ_auf_lange_schlafen nicht_betaetigt,  set OG_SZ_Roll_Hof off,  set OG_SZ_Roll_Strasse off
     1:
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   internals:
     all         OG_SZ_auf_lange_schlafen:STATE
   uiTable:
Attributes:
   do         always
   selftrigger wait
   wait       0,0.5:0.5

amenomade

Ich habe von DOELSE, nicht von DOELSEIF gesprochen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Bäschdler

sorry, es ist schon spät... 8)


Habe es korrigiert und jetzt hat's funktioniert.  :)

Vielen herzlichen Dank für deine Hilfe!!!

Ich wünsche Dir einen schönen Abend.

Viele Grüsse
Bäschdler