FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Jojo11 am 23 April 2015, 19:53:24

Titel: Wiederholende Schaltsequenz
Beitrag von: Jojo11 am 23 April 2015, 19:53:24
Hallo,

ich würde gerne eine Art Schaltsequenz umsetzen, bei der ein Verbraucher eingeschaltet wird, nach einer gewissen Zeit dieser wieder ausgeschaltet wird, ein weiterer eingeschaltet wird, nach einer gewissen Zeit dieser wieder ausgeschaltet wird usw. Insgesamt sind es zur Zeit 3 Verbraucher und diese Sequenz würde ich gerne 3x durchlaufen lassen. Es könnten aber auch 5 Verbraucher sein, die ich 10x aktiviere. Das alles soll für eine Bewässerungssteuerung sein. Für drei Verbraucher und drei Durchläufe habe ich den Code mal zusammengeschrieben:

define testsequenz01 notify testbutton:on {\
fhem("set test_001 on;;define Bewseq01 at +00:00:05 \
set test_001 off;;;;set test_002 on;;;;define Bewseq02 at +00:00:05 \
set test_002 off;;;;;;;;set test_003 on;;;;;;;;define Bewseq03 at +00:00:05 \
set test_003 off;;;;;;;;;;;;;;;;set test_001 on;;;;;;;;;;;;;;;;define Bewseq04 at +00:00:05 \
set test_001 off;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;set test_002 on;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;define Bewseq05 at +00:00:05 \
set test_002 off;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;set test_003 on;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;define Bewseq06 at +00:00:05 \
set test_003 off;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;set test_001 on;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;define Bewseq07 at +00:00:05 \
set test_001 off;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;set test_002 on;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;define Bewseq08 at +00:00:05 \
set test_002 off;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;set test_003 on;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;define Bewseq09 at +00:00:05 \
set test_003 off");;\
}


Auch wenn er seltsam ausschaut - er funktioniert.
Gibt es für eine solche Anwendung evtl. schon ein Modul oder eine einfachere Methode? Evtl. mit Schleifen im ausgelagerten perl-Code? Ich würde gerne vermeiden, dass diese Sequenz das System bremst.

schöne Grüße
Jo
Titel: Antw:Wiederholende Schaltsequenz
Beitrag von: rudolfkoenig am 24 April 2015, 08:06:44
Kannst du erklaeren, wie du auf die Unmengen von Strichpunkten gekommen bist?

Wenn es ein "Einzeiler" sein soll, dann wuerde ich sowas bauen.

define testsequenz02 notify testsequenz02 \
  set test_001 on-for-timer 5;; sleep 5;;\
  set test_002 on-for-timer 5;; sleep 5;;\
  set test_003 on-for-timer 5
define testsequenz01 notify testbutton:on \
  trigger testsequenz02;; sleep 15;;\
  trigger testsequenz02;; sleep 15;;\
  trigger testsequenz02


Wenn es aufwendiger wird, dann wuerde ich einen externen Skript aufrufen, ein Beispiel dafuer ist fhem/contrib/garden.pl, das laeuft bei mir seit 8 Jahren ohne Probleme. Ist fuer Programmier-Laien am ehesten zu erklaeren, und man kann eine beliebige Programmiersprache verwenden.

Man kann auch eine Perl-Funktion schreiben, was innerhalb von FHEM laeuft, und in 99_myUtils.pm implementiert ist, allerdings darf man dann kein sleep verwenden. Stattdessen baut man eine Status-Maschine, und ruft sich selbst mit InternalTimer auf. Wer sowas nicht beherrscht, der kann BlockingCall verwenden.

Die FHEM-Einzeiler sind schoen und gut, aber man sollte es nicht uebertreiben: hilft weder einem selbst, noch einem Neuling, der was abschreiben will.
Titel: Antw:Wiederholende Schaltsequenz
Beitrag von: Jojo11 am 24 April 2015, 12:35:27
Hallo,

danke für die Erklärungen. Die Anzahl der Semikolons ergibt sich aus der Verschachtelung. Ich habe verstanden, dass sich die Anzahl mit jeder Ebene verdoppelt. Ich werde mir dein Beispiel mal anschauen.

schöne Grüße
Jo

Titel: Antw:Wiederholende Schaltsequenz
Beitrag von: rudolfkoenig am 25 April 2015, 14:37:24
ZitatIch habe verstanden, dass sich die Anzahl mit jeder Ebene verdoppelt.

Das ist wohl korrekt, und ich habe es ausgeblendet.