summaryrefslogtreecommitdiff
path: root/homematic.go
diff options
context:
space:
mode:
Diffstat (limited to 'homematic.go')
-rw-r--r--homematic.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/homematic.go b/homematic.go
new file mode 100644
index 0000000..ae12760
--- /dev/null
+++ b/homematic.go
@@ -0,0 +1,77 @@
+package main
+
+import (
+ "fmt"
+ "log"
+ "time"
+
+ "xengineering.eu/homematic-go/homematic"
+)
+
+const (
+ OPENCCU = `http://127.0.0.1:8080`
+ POLLING_PERIOD = 50 * time.Millisecond
+)
+
+func HomematicRun(tx chan MQTTMessage) {
+ req, inventory, err := Start()
+ if err != nil {
+ log.Fatalf("Failed startup process: %v", err)
+ }
+
+ cache := NewCache(tx)
+
+ for {
+ start := time.Now()
+
+ states, err := Poll(req, inventory)
+ if err != nil {
+ log.Fatalf("Failed to poll states: %v", err)
+ }
+
+ cache.Update(states)
+
+ WaitUntil(start.Add(POLLING_PERIOD))
+ }
+
+}
+
+func Start() (homematic.Requester, homematic.Devices, error) {
+ var req homematic.Requester
+ var inventory homematic.Devices
+ var err error
+
+ req = homematic.NewRequester(OPENCCU)
+ log.Printf("Created Homematic requester (%s).", OPENCCU)
+
+ inventory, err = req.ListDevices()
+ if err != nil {
+ return req, inventory, fmt.Errorf("Failed getting initial device list: %w", err)
+ }
+ log.Printf("Retrieved Homematic inventory with %d devices.", len(inventory))
+
+ return req, inventory, nil
+}
+
+func Poll(req homematic.Requester, inventory homematic.Devices) (States, error) {
+ states := make(States)
+
+ for _, device := range inventory {
+ if device.Type == `SHUTTER_CONTACT` {
+ state, err := req.GetValue(device.Address)
+ if err != nil {
+ return states, fmt.Errorf("Failed to get value: %w", err)
+ }
+ states[device.Address] = state
+ }
+ }
+
+ return states, nil
+}
+
+func WaitUntil(deadline time.Time) {
+ duration := time.Until(deadline)
+ if duration > 0 {
+ time.Sleep(duration)
+ }
+}