summaryrefslogtreecommitdiff
path: root/shelly.go
diff options
context:
space:
mode:
Diffstat (limited to 'shelly.go')
-rw-r--r--shelly.go48
1 files changed, 47 insertions, 1 deletions
diff --git a/shelly.go b/shelly.go
index 0d33182..7396bbb 100644
--- a/shelly.go
+++ b/shelly.go
@@ -1,11 +1,57 @@
package main
import (
+ "fmt"
"log"
+ "net"
+ "strings"
)
func ShellyRun(config ShellyConfigs, rx chan MQTTMessage) {
for message := range rx {
- log.Printf("Got MQTT message: %v", message)
+ ip, command, err := parseMessage(config, message)
+ if err != nil {
+ log.Println(err)
+ continue
+ }
+
+ log.Printf("Send '%s' to '%s'.", command, ip)
+ }
+}
+
+func parseMessage(config ShellyConfigs, m MQTTMessage) (ip *net.IP, command string, err error) {
+ elements := strings.Split(m.Topic, "/")
+
+ if len(elements) != 3 {
+ return nil, "", fmt.Errorf(
+ "Expected three topic levels but got %d in '%s'.",
+ len(elements), m.Topic,
+ )
+ }
+
+ if elements[0] != "cover" || elements[2] != "movement" {
+ return nil, "", fmt.Errorf("Expected cover/<id>/movement but got: %s", m.Topic)
}
+
+ switch string(m.Payload) {
+ case "extend":
+ command = "Cover.Close"
+ case "retract":
+ command = "Cover.Open"
+ case "stop":
+ command = "Cover.Stop"
+ default:
+ return nil, "", fmt.Errorf("Invalid payload '%s'.", m.Payload)
+ }
+
+ id := elements[1]
+
+ for _, c := range config {
+ if c.ID == id {
+ ip := net.ParseIP(c.IP)
+ return &ip, command, nil
+ }
+ }
+
+ return nil, "", fmt.Errorf("Got message for unknown cover '%s'", id)
}