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
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
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
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.
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
Mach mal ein "list" vom DOIF bitte
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
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
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
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)?
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
Ich habe von DOELSE, nicht von DOELSEIF gesprochen.
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