summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)
+ }
+}