Lampe soll SOS blinken - aber wie??

Begonnen von mhelgers, 02 März 2016, 16:03:56

Vorheriges Thema - Nächstes Thema

mhelgers

Hallo FHEMler,

Riesenproblem :-\

ich möchte, dass eine Lampe SOS blinkt.
Zur Verfügung habe ich ein FS20 Steckdose.
mit zum Beispiel
set Lampe1 blink 3 1;;set Lampe1 blink 3 2;;set Lampe1 blink 3 1
komme ich nicht weiter, da die Befehle nicht nacheinander sondern quasi gleichzeitig gesendet werden.
Wie kann ich nach dem ersten Befehl eine Pause von 6  Sekunden einbauen und dann erst den nächsten Befehl senden??

Danke im Voraus

marvin78


mhelgers

ok danke, mit sleep bekomme 3 x kurz - 3x lang - 3x kurz hin, aber wie kann ich das endlos wiederholen??

marvin78

Eine Schleife in einer myUtils oder at. Endlos wird allerdings schwierig.

mhelgers

Gelöst

Es gibt wahrscheinlich elegantere Lösungen aber das Folgende funktioniert und ist auch verständlich.
(Zumindest verständlicher als so manche Ein-Wort-Sätze die man gerne in dem Forum als Antwort erhält 8))

zuerst habe ich mir zwei Hilfsvariablen gebaut.
SOS dient zum toggeln zwischen 3xlang und 3xkurz

define SOS dummy
attr SOS room Alarm
attr SOS setList state:kurz,lang

Blinken unterbricht das Toggeln

define Blinken dummy
attr Blinken setList state:ein,aus
attr Blinken webCmd state

jetzt definiere ich ein notify der prüft ob der Schalter 'ein' ist

define SchalteON notify Schalter:on set Blinken ein

mit den folgenden beiden Zeilen wird die Steckdose geschaltet
#schalte 3 x kurz, danach eine Sekunde Pause
define SOSKurz DOIF ([Blinken] eq "ein" and [SOS] eq "kurz")(set Steckdose blink 3 1;;sleep 7;;set SOS lang)
#schalte 3x lang, danach eine Sekunde Pause
define SOSLang DOIF ([Blinken] eq "ein" and [SOS] eq "lang" )(set Steckdose blink 3 2;;sleep 13;;set SOS kurz)

mit dem folgenden Befehl kann das Blinken ausgeschaltet werden
define SOSaus notify Blinken:aus set Steckdose blink 0 0


...na geht doch ;D

marvin78

Und wenn du das nun noch editierst und in Code-Tags schreibst, kann es eventuell auch jemand lesen ;)

mhelgers

Gelöst

Es gibt wahrscheinlich elegantere Lösungen aber das Folgende funktioniert und ist auch verständlich.
(Zumindest verständlicher als so manche Ein-Wort-Sätze die man gerne in dem Forum als Antwort erhält 8))

zuerst habe ich mir zwei Hilfsvariablen gebaut.
SOS dient zum toggeln zwischen 3xlang und 3xkurz

define SOS dummy
attr SOS room Alarm
attr SOS setList state:kurz,lang


Blinken unterbricht das Toggeln

define Blinken dummy
attr Blinken setList state:ein,aus
attr Blinken webCmd state

jetzt definiere ich ein notify der prüft ob der Schalter 'ein' ist

define SchalteON notify Schalter:on set Blinken ein

mit den folgenden beiden Zeilen wird die Steckdose geschaltet
#schalte 3 x kurz, danach eine Sekunde Pause
define SOSKurz DOIF ([Blinken] eq "ein" and [SOS] eq "kurz")(set Steckdose blink 3 1;;sleep 7;;set SOS lang)
#schalte 3x lang, danach eine Sekunde Pause
define SOSLang DOIF ([Blinken] eq "ein" and [SOS] eq "lang" )(set Steckdose blink 3 2;;sleep 13;;set SOS kurz)


mit dem folgenden Befehl kann das Blinken ausgeschaltet werden
define SOSaus notify Blinken:aus set Steckdose blink 0 0


oder alles :

define SOS dummy
attr SOS room Alarm
attr SOS setList state:kurz,lang

define Blinken dummy
attr Blinken setList state:ein,aus
attr Blinken webCmd state

define SchalteON notify Schalter:on set Blinken ein

#schalte 3 x kurz, danach eine Sekunde Pause
define SOSKurz DOIF ([Blinken] eq "ein" and [SOS] eq "kurz")(set Steckdose blink 3 1;;sleep 7;;set SOS lang)
#schalte 3x lang, danach eine Sekunde Pause
define SOSLang DOIF ([Blinken] eq "ein" and [SOS] eq "lang" )(set Steckdose blink 3 2;;sleep 13;;set SOS kurz)

define SOSaus notify Blinken:aus set Steckdose blink 0 0

Ellert

DOIF zu nutzen ist eine gute Idee und Du sagst selbst "Es gibt wahrscheinlich elegantere Lösungen ..."

Es könnte sehr kurz formuliert werden:
define SOS_di DOIF ([Schalter] eq "on") (set Steckdose blink 3 1) (set Steckdose blink 3 2)
DOELSEIF  ([Schalter] eq "off") (set Steckdose blink 0 0)


und die Attribute

wait 0,7:0
repeatcmd 13


Funktion: Bei Schalter "on" wird die 1. Sequenzen ausgeführt, 7 s gewartet und die 2. Sequenz ausgeführt, dann werden nach 13 s beide Sequenzen wiederholt bis Schalter "off" wird.