summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxengineering <me@xengineering.eu>2026-03-25 21:00:13 +0100
committerxengineering <me@xengineering.eu>2026-03-25 21:09:11 +0100
commit6001997a66c4c4b12e9d8b0853fef0fc0ff14768 (patch)
treefc4b97bdb6b91caff22b771bb9d8f5ca64791772
parent476db7047a9c650057c034c647ea66f3c38e8a53 (diff)
downloadsia-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.go35
1 files changed, 34 insertions, 1 deletions
diff --git a/shelly.go b/shelly.go
index 5f6f2ad..508b393 100644
--- a/shelly.go
+++ b/shelly.go
@@ -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
+}