summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorxengineering <me@xengineering.eu>2025-12-20 12:55:57 +0100
committerxengineering <me@xengineering.eu>2025-12-20 12:55:57 +0100
commit8205200e73ff45c09aaa67dacb7ceb9b33845f5d (patch)
treee3587e9d34af25a9fba7b792a3d5fef6a11592ee /main.go
parentd5b189640ccbd8ed14154fe0f21712194c8e319d (diff)
downloadsia-server-8205200e73ff45c09aaa67dacb7ceb9b33845f5d.tar
sia-server-8205200e73ff45c09aaa67dacb7ceb9b33845f5d.tar.zst
sia-server-8205200e73ff45c09aaa67dacb7ceb9b33845f5d.zip
Add continuous polling execution
This state polls the device states with 500 milliseconds period and publishes the state on every poll.
Diffstat (limited to 'main.go')
-rw-r--r--main.go48
1 files changed, 39 insertions, 9 deletions
diff --git a/main.go b/main.go
index f0dfb95..6ef4c63 100644
--- a/main.go
+++ b/main.go
@@ -3,6 +3,9 @@ package main
import (
"fmt"
"log"
+ "os"
+ "os/signal"
+ "syscall"
"time"
mqtt "github.com/eclipse/paho.mqtt.golang"
@@ -18,22 +21,33 @@ const (
RETAINED = false
MQTT_CONNECT_TIMEOUT = time.Second * 5
MQTT_DISCONNECT_TIMEOUT_US = 500
+ POLLING_PERIOD = 500 * time.Millisecond
)
func main() {
log.Println("+++ Started Sia server +++")
defer log.Println("--- Stopped Sia server ---")
- req, inventory, client, err := Start()
- defer Stop(client)
- if err != nil {
- log.Fatalf("Failed startup process: %v", err)
- }
+ go func() {
+ req, inventory, client, err := Start()
+ defer Stop(client)
+ if err != nil {
+ log.Fatalf("Failed startup process: %v", err)
+ }
- err = Poll(req, inventory, client)
- if err != nil {
- log.Fatalf("Failed to poll states: %v", err)
- }
+ for {
+ start := time.Now()
+
+ err = Poll(req, inventory, client)
+ if err != nil {
+ log.Fatalf("Failed to poll states: %v", err)
+ }
+
+ WaitUntil(start.Add(POLLING_PERIOD))
+ }
+ }()
+
+ Await(syscall.SIGTERM, syscall.SIGINT)
}
func ConnectMQTT(broker string, id string) (mqtt.Client, error) {
@@ -104,3 +118,19 @@ func Poll(req homematic.Requester, inventory homematic.Devices, client mqtt.Clie
return nil
}
+
+func Await(signals ...syscall.Signal) {
+ listener := make(chan os.Signal)
+ for _, s := range signals {
+ signal.Notify(listener, s)
+ }
+ sig := <-listener
+ log.Printf("Received OS signal '%v'\n", sig)
+}
+
+func WaitUntil(deadline time.Time) {
+ duration := time.Until(deadline)
+ if duration > 0 {
+ time.Sleep(duration)
+ }
+}