Beispiel: Mitteilung "Fenster zu lange offen"


In diesem Beispiel wird eine Mitteilung versendet, wenn ein Fenster bereits 1 Stunde offen steht und die Außentemperatur weniger als 10°C beträgt.

Küchenfenster
Jetzt
Das Küchenfenster in seit 1 Stunde offen und es hat nur 2°C draußen!

Programmiert wurde dieses Beispiel mit folgendem Skript.

 1hkknx, time, fmt = import("hkknx"), import("time"), import("fmt")
 2
 3// isTrueForDuration returns true, if channel ch receives 
 4// the value *true* (or nothing) within a duration.
 5isTrueForDuration = func(ch, duration) {
 6    timeout = time.After(duration)
 7    for {
 8        select {
 9		case value = <-ch:
10			if !value {
11				return false
12			}
13        case <-timeout:
14            return true
15        }
16    }
17}
18
19// observeWindow waits for group write telegrams to addr.
20// A value *1* indicates that a window is opened.
21// If a window stays open for more than 1 hour, and the
22// outside temperature value is <= 10°C, a notification 
23// is sent to inform the people in the home.
24observeWindow = func(addr, name) {
25	var ch = hkknx.GroupWriteBoolNotify(addr)
26	for {
27		open = <-ch
28		println(open, name)
29		if !open {
30			continue
31		}
32		
33		if !isTrueForDuration(ch, 1 * time.Hour) {
34			// Restart loop because the window 
35			// was closed within 1 hour
36			continue
37		}
38        
39        // Get the outside temperature
40        weather, err = hkknx.GetCurrentWeather()
41		if err != nil {
42			println(err)
43			continue
44		}
45        
46		// Check if outside temperature is above 10°C
47		if weather.Temp > 10 {
48			// Do not send a notification, if
49			// outdoor temperature is above 10°C.
50			continue
51		}
52		
53		// Send notification that window is open for too long
54		msg = fmt.Sprintf("Das %s in seit 1 Stunde offen und es hat nur %.0f°C draußen!", name, weather.Temp)
55		hkknx.SendNotification(name, msg)
56	}
57}
58
59// We store the group address, which indicates if
60// a window is opened or not, alongside the window name.
61// If a window is opened, the contact sensor will
62// write a *1* to the corresponding group address.
63windows = map[string]string{}
64windows["0/0/1"] = "Küchenfenster"
65windows["0/0/2"] = "Schlafzimmerfenster"
66windows["0/0/3"] = "Kinderzimmerfenster"
67
68for addr, name in windows {
69	go observeWindow(addr, name)
70}
71
72// Wait indefinitely
73select {}

In der Variable windows werden die Gruppenadressen gespeichert, die den Status der Fensterkontakte angeben. Sobald ein Fenster geöffnet wird, überwacht das Skript für die Dauer von 1 Stunde den Status des Fensters. Bleibt das Fenster länger als eine Stunde geöffnet, wird mit der Funktion GetCurrentWeather die Außentemperatur aus dem Internet geladen. Falls die Außentemperatur weniger (oder gleich) 10°C beträgt, wird mit SendNotification eine Mitteilung versendet.


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