diff options
| author | xengineering <me@xengineering.eu> | 2026-03-25 21:00:13 +0100 |
|---|---|---|
| committer | xengineering <me@xengineering.eu> | 2026-03-25 21:09:11 +0100 |
| commit | 6001997a66c4c4b12e9d8b0853fef0fc0ff14768 (patch) | |
| tree | fc4b97bdb6b91caff22b771bb9d8f5ca64791772 | |
| parent | 476db7047a9c650057c034c647ea66f3c38e8a53 (diff) | |
| download | sia-server-6001997a66c4c4b12e9d8b0853fef0fc0ff14768.tar sia-server-6001997a66c4c4b12e9d8b0853fef0fc0ff14768.tar.zst sia-server-6001997a66c4c4b12e9d8b0853fef0fc0ff14768.zip | |
Add Shelly command sending
This allows basic control of Covers connected to Shelly devices.
| -rw-r--r-- | shelly.go | 35 |
1 files changed, 34 insertions, 1 deletions
@@ -5,6 +5,8 @@ import ( "log" "net" "strings" + + "github.com/gorilla/websocket" ) func ShellyRun(config ShellyConfigs, route Route) { @@ -15,7 +17,10 @@ func ShellyRun(config ShellyConfigs, route Route) { continue } - log.Printf("Send '%s' to '%s'.", command, ip) + err = shellySendCommand(ip, command) + if err != nil { + log.Printf("Could not send command '%s' to %v: %v", command, ip, err) + } } } @@ -55,3 +60,31 @@ func parseMessage(config ShellyConfigs, m MQTTMessage) (ip *net.IP, command stri return nil, "", fmt.Errorf("Got message for unknown cover '%s'", id) } + +func shellySendCommand(ip *net.IP, command string) error { + template := ` +{ + "jsonrpc":"2.0", + "id": 1, + "src":"user_1", + "method":"%s", + "params": { + "id":0 + } +} +` + message := fmt.Appendf([]byte{}, template, command) + + c, _, err := websocket.DefaultDialer.Dial("ws://" + ip.String() + "/rpc", nil) + if err != nil { + return fmt.Errorf("Could not connect to Shelly: %w", err) + } + defer c.Close() + + err = c.WriteMessage(websocket.TextMessage, message) + if err != nil { + return fmt.Errorf("Failed writing websocket message to Shelly: %w", err) + } + + return nil +} |
