diff options
| author | xengineering <me@xengineering.eu> | 2025-12-20 13:00:52 +0100 |
|---|---|---|
| committer | xengineering <me@xengineering.eu> | 2025-12-20 13:00:52 +0100 |
| commit | 853e3fd5f2b4e622d4e35c0e3c2fad6c358cb8ae (patch) | |
| tree | 6939b0a0b92635c5dad80da30079c5b07645bf76 /main.go | |
| parent | 8205200e73ff45c09aaa67dacb7ceb9b33845f5d (diff) | |
| download | sia-server-853e3fd5f2b4e622d4e35c0e3c2fad6c358cb8ae.tar sia-server-853e3fd5f2b4e622d4e35c0e3c2fad6c358cb8ae.tar.zst sia-server-853e3fd5f2b4e622d4e35c0e3c2fad6c358cb8ae.zip | |
Add cache implementation
This avoids frequent MQTT messages containing the same state.
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 19 |
1 files changed, 11 insertions, 8 deletions
@@ -35,14 +35,18 @@ func main() { log.Fatalf("Failed startup process: %v", err) } + cache := NewCache(client) + for { start := time.Now() - err = Poll(req, inventory, client) + states, err := Poll(req, inventory) if err != nil { log.Fatalf("Failed to poll states: %v", err) } + cache.Update(states) + WaitUntil(start.Add(POLLING_PERIOD)) } }() @@ -102,21 +106,20 @@ func Stop(c mqtt.Client) { log.Println("Disconnected from MQTT broker.") } -func Poll(req homematic.Requester, inventory homematic.Devices, client mqtt.Client) error { +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 fmt.Errorf("Failed to get value: %w", err) + return states, fmt.Errorf("Failed to get value: %w", err) } - - topic := fmt.Sprintf("%s/contact/%s/state", TOPIC_PREFIX, device.Address) - payload := []byte(fmt.Sprintf("%t", state)) - _ = client.Publish(topic, QOS, RETAINED, payload) + states[device.Address] = state } } - return nil + return states, nil } func Await(signals ...syscall.Signal) { |
