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.

  1. Licht wird eingeschaltet (Timer wird gestartet)
  2. 10 Sekunden später: Licht wird ausgeschaltet
  3. 20 Sekunden später: Licht wird eingeschaltet (weiterer Timer wird gestatet)
  4. 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

F o r - S S t c a h r l t e i f e W e 1 r t M 0 i / = n 0 u W / 0 t e 2 e r t e a m b V p g o f e n a l n a g W u e e F f n r o e t r n - = S c 1 h l e W i e f r e t 0 / = 0 W / 0 e 2 r t e m V p o f n a n g W e e n r t = 1

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.

Dieses Beispiel zeigt, dass auch einfache Logiken im Detail doch nicht so trivial sind, wie zu Beginn gedacht. Um diese Details nicht zu übersehen, empfiehlt sich ein Ablaufdiagramm zu erstellen, um besseren Überblick über die Problemstellung zu erhalten.

Auf dieser Seite
Ähnliche Beiträge
© Matthias Hochgatterer – MastodonGithubRésumé