diff options
| author | xengineering <me@xengineering.eu> | 2026-03-23 21:34:58 +0100 |
|---|---|---|
| committer | xengineering <me@xengineering.eu> | 2026-03-23 21:36:30 +0100 |
| commit | 5296918ff6e1fa5ded9091489050c92b6285e00e (patch) | |
| tree | 19007bb7d38b5dc1fc8a64c61d41cf66c65d8bd8 /shelly.go | |
| parent | 2463ce39f4aeb99e38b5d7f83d0179e9547aa3eb (diff) | |
| download | sia-server-shelly.tar sia-server-shelly.tar.zst sia-server-shelly.zip | |
Add Shelly cover message parsingshelly
This results in the information of which command is to issue and which
IP address the command has to be sent to.
This is what is needed to deliver the message with Websockets. This
delivery is the last step to implement basic Shelly cover support.
Diffstat (limited to 'shelly.go')
| -rw-r--r-- | shelly.go | 44 |
1 files changed, 43 insertions, 1 deletions
@@ -1,11 +1,53 @@ 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, + ) } + + 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) } |
