package main import ( "fmt" "log" "net" "strings" ) func ShellyRun(config ShellyConfigs, rx chan MQTTMessage) { for message := range rx { 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) }