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 /cache.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 'cache.go')
| -rw-r--r-- | cache.go | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/cache.go b/cache.go new file mode 100644 index 0000000..081621d --- /dev/null +++ b/cache.go @@ -0,0 +1,44 @@ +package main + +import ( + "fmt" + "log" + + mqtt "github.com/eclipse/paho.mqtt.golang" +) + +type States map[string]bool + +type Cache struct { + Client mqtt.Client + States map[string]bool +} + +func NewCache(client mqtt.Client) Cache { + var cache Cache + + cache.Client = client + cache.States = make(States) + + return cache +} + +func (c *Cache) Update(states States) { + if c.States == nil { + log.Fatal("Cache states is nil.") + } + + if states == nil { + log.Fatal("Given states is nil.") + } + + for id, state := range states { + cached, known := c.States[id] + if !known || cached != state { + topic := fmt.Sprintf("%s/contact/%s/state", TOPIC_PREFIX, id) + payload := []byte(fmt.Sprintf("%t", state)) + _ = c.Client.Publish(topic, QOS, RETAINED, payload) + } + c.States[id] = state + } +} |
