Logik: Lichtsteuerung
In diesem Beispiel wird eine Lichtsteuerung realisiert, welche das Licht 1 Minute nach dem Einschalten wieder ausschaltet.
Um ein Licht einzuschalten, wird eine 1 and 0/0/1 gesendet. Ändert sich der Status des Lichts, so wird das über die Status-Gruppenadresse 0/0/2 mitgeteilt.
Das Skript fängt Schreib-Telegramme an die 0/0/2 ab und überprüft ob das Licht eingeschaltet wurde. Dann wird ein Timer von 1 Minute gestartet. Nach Ablauf des Timers wird das Licht, durch Senden von 0 an 0/0/1 wieder ausgeschaltet.
Die Aufgabenstellung scheint zunächst sehr simpel aber aufgepasst. Wird das Licht vor Ablauf der einen Minute ausgeschaltet, sollte kein Aus-Telegram mehr gesendet werden. Es könnte sich sonst folgendes Problem ergeben.
- Licht wird eingeschaltet (Timer wird gestartet)
- 10 Sekunden später: Licht wird ausgeschaltet
- 20 Sekunden später: Licht wird eingeschaltet (weiterer Timer wird gestatet)
- 60 Sekunden später: Timer läuft ab und Licht wird ausgeschaltet obwohl das Licht vor 40 Sekunden eingeschaltet wurde.
Wenn also während der einen Minute Wartezeit ein Aus-Telegram an die 0/0/2 gesendet wird, muss der Timer beendet werden.
Ablaufdiagramm
Skriptcode
1// Dieses Skript schaltet ein Licht eine Minute
2// nach dem Einschalten wieder aus.
3var hkknx, time = import("hkknx"), import("time")
4
5// Empfange Status-Telegramme von 0/0/2 mit der Variable "ch"
6var ch = hkknx.GroupWriteBoolNotify("0/0/2")
7
8for {
9 // Warte bis ein Status-Telegram emfpangen wird
10 on = <-ch
11 // Überprüfe, ob das Licht eingeschaltet wurde
12 if on == true {
13 println("light is turned on → start timer")
14 // Erstelle einen Timer mit der Dauer von 1 Minute.
15 walltime = time.After(1 * time.Minute)
16
17 // Erstelle 2. For-Schleife
18 for {
19 // Warte bis entweder
20 // - das Licht ausgeschaltet wurde
21 // oder
22 // - der Timer abgelaufen ist
23 select {
24 case on = <-ch:
25 if on == false {
26 println("light is turned off → stop timer")
27 break // Beende 2. For-Schleife
28 }
29 case <-walltime:
30 println("turning off light")
31 hkknx.GroupWrite(false, "0/0/1")
32 break // Beende 2. For-Schleife
33 }
34 }
35 }
36}
In diesem Beispiel werden zwei For-Schleifen verwenden um kontinuierlich Telegramme von der Gruppenadresse 0/0/2 empfangen zu können.
Die zweite For-Schleife wird beendet, sobald entweder der Timer abgelaufen ist, oder ein Aus-Telegram (on == false
) empfangen wird.