[GELÖST]..simples Beispiel eines einfachen DOIF - Timers/Einschaltverzögerers

Begonnen von daedalus0815, 19 August 2022, 16:08:53

Vorheriges Thema - Nächstes Thema

daedalus0815

... als Anregung ein EIN/AUS-Timer als DOIF...für uns Anfänger  :-[:

Interessant finde ich, den DOIF-Statuswechsel durch den at-Befehl => quasi Selbstvernichtung  ;)

set Timer_di start
set Timer_di stop


EIN/AUS-Timer:

( [Timer_di:"start"] )
( delete Timer_di_at )
( define -temporary Timer_di_at  at  +00:30:00   set Timer_di stop )   ## ..in 30Min stop

( set Wasser ein )    ### action !

DOELSEIF
( [Timer_di:"stop"] )
( delete Timer_di_at )
( set Wasser aus )   ###   ..hier steht aber ggfs. eine User-Funktion



...oder als Einschaltverzögerung

( [Timer_di:"start"] )
( delete Timer_di_at )
( define -temporary Timer_di_at   at  +00:00:10  set Timer_di stop )

DOELSEIF
( [Timer_di:"stop"] )
( delete Timer_di_at )
( set Wasser ein)   ### action !




defmod Timer_di DOIF ( [Timer_di:"start"] )\
( delete Timer_di_at )\
( define -temporary Timer_di_at   at  +00:00:10  set Timer_di stop )\
\
( set Wasser ein )    ### action !\
\
\
DOELSEIF\
( [Timer_di:"stop"] )\
\
( set Wasser aus )   ### action !\

attr Timer_di DbLogExclude .*
attr Timer_di alias Schaltverzögerung
attr Timer_di devStateIcon cmd_1:on cmd_2:off\

attr Timer_di do always
attr Timer_di setList start stop
attr Timer_di startup set Timer_di stop

setstate Timer_di initialized
setstate Timer_di 2022-08-19 15:40:58 cmd 0
setstate Timer_di 2022-08-19 15:40:58 mode enabled
setstate Timer_di 2022-08-19 15:40:58 state initialized




...weitere Anpassung:
statt Ausschalten in 10 Min ( define -temporary Timer_di_at   at  +00:10:00  set Timer_di stop )
könnte man auch zu einer fixen Uhrzeit (z.B. 06:00) ausschalten: ( define -temporary Timer_di_at   at  06:00:00  set Timer_di stop )




Damian

Kann man machen. Oder einfach ohne at:

( [Timer_di:"start"] ) ## an/aus
(set Wasser ein )(set Wasser aus)    ### action !
DOELSEIF( [Timer_di:"stop"] )
(set Wasser aus )   ###   ..hier steht aber ggfs. eine User-Funktion

attr do resetwait
attr wait 0,30


( [Timer_di:"start"] ) ## verzögertes Einschalten
   ( set Wasser ein )    ### action !
DOELSEIF ([Timer_di:"stop"]) ## Abbruch der Verzögerung

attr do resetwait
attr wait 10


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

daedalus0815

Hallo Damian,

Danke auch für deine Teilnahme am Trivialstatements  ;D

Super elegant und funktional, da lernt man als Neuling was.

...aber ...aus dem Status cmd_1 kommt man mit "set Timer_di start" nicht automatisch raus...

....und das war für mich das interessante:
man startet, auf der GUI steht ON und nach Ablauf des Zeitlimits dann automatisch OFF.

Das liefe dann in deiner eleganten Form als "Symbiose" darauf hinaus:

... und da ist das pöse  ;) at-Statement wieder:

P.S: leider existiert kein:   defmod -temporary


( [Timer_di:"start"] ) ## an/aus
(set Wasser ein )
         (set Wasser aus)    ### action !
         ( delete Timer_di_at )    ##  leider existiert kein defmod -temporary
         ( define -temporary Timer_di_at  at  +00:30:00   set Timer_di stop )   
         
DOELSEIF( [Timer_di:"stop"] or [08:00] )   ### 08:00 safety first, da ist dann spätestens Schluss
         ( delete Timer_di_at )
(set Wasser aus )   ###   ..hier steht aber ggfs. eine User-Funktion

attr do resetwait
attr wait 0,30,0,0



Wer es auf der GUI nicht benötigt, hat jetzt deine o.e. schöne, knackige Alternative ....

So war's gemeint  ::)   



Damian

Zitat von: daedalus0815 am 19 August 2022, 18:40:28

...aber ...aus dem Status cmd_1 kommt man mit "set Timer_di start" nicht automatisch raus...

....und das war für mich das interessante:
man startet, auf der GUI steht ON und nach Ablauf des Zeitlimits dann automatisch OFF.


Muss man auch nicht. Wenn du:

attr cmdState on,off|off

setzt, dann siehst du immer den richtigen Status.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

daedalus0815

#4
Danke Damian,

...echt super ... cmdState hab ich noch NIE benutzt und jetzt verstehe ich/wir? das erstmals  ;D


Die Endlösung/Zusammenfassung:


( [Timer_di:"start"] )
(set Wasser ein )
         (set Wasser aus)   
DOELSEIF( [Timer_di:"stop"] )
(set Wasser aus ) 

attr do resetwait
attr wait 0,30:0
attr cmdState on,off|off
attr setList start stop
attr startup set Timer_di stop
attr webCmd on:off


mit Kommando:
set Timer_di start
set Timer_di stop

@Damian
Wie immer ein Nachzügler der Nimmersatten :
Mit "webCmd on:off" kann ich nun schalten,
allerdings mit "webCmd :" funktioniert das Schalten mit dem Icon leider NICHT...Idee zur Abschlussperfektion ?

P.S.:   
...denke gerade drüber nach, vielleicht sollte ich mit mal
mit eventMap wegen on/start und off/stop experementieren !!  => Versuch gescheitert

...und das ist nun das funktionierende Resultat....


( [Timer2_di:"start|on"] ) ## an/aus
(set FIBARO5 on )
(set FIBARO5 off)    ### action !

DOELSEIF( [Timer2_di:"stop|off"] )
(set FIBARO5 on )   ###   ..hier steht aber ggfs. eine User-Funktion


attr do resetwait
attr wait 0,30:0
attr cmdState on,off|off
attr setList start stop
attr startup set Timer_di stop
attr webCmd :




Coole Sache unsere Diskussion und die resultierende Entwicklung  ;D



Aufruf an @alle: ......für Neulinge ist es immer hilfreich, wenn
wirklich gaaaaaaaaaanz am Ende auch mal ein funktionierendes copy/paste-Beispiel steht ....sollten wir machen, wenn eure/unsere Probleme hier schon so toll gelöst werden  !


.... das war jetzt hoffentlich nicht zu schlimm  8)