/
main.go
72 lines (67 loc) · 2.55 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package main
import (
"fmt"
"log"
"time"
"github.com/cespedes/smarthome"
)
func main() {
log.Println("Reading config...")
c := readConfig()
log.Println("Creating MQTT client...")
mqtt, err := smarthome.NewMQTTClient(c.MQTT.Addr)
if err != nil {
log.Fatal(err)
}
log.Println("Beginning loop.")
tick := time.Tick(time.Duration(c.Interval) * time.Second)
for range tick {
log.Println("tick")
for _, s := range c.Shelly {
go func(hostname string) {
shelly, err := smarthome.ShellyGetInfo(hostname)
if err != nil {
log.Println(err)
return
}
// log.Printf("got info from %s: %v\n", s.Host, shelly)
log.Printf("%s: type=%s inputs=%d relays=%d rollers=%d meters=%d emeters=%d\n",
hostname, shelly.Settings.Device.Type,
len(shelly.Status.Inputs), len(shelly.Status.Relays),
len(shelly.Status.Rollers), len(shelly.Status.Meters),
len(shelly.Status.Emeters))
mqtt.Publish(fmt.Sprintf("%s/mac", hostname), shelly.Settings.Device.MAC)
mqtt.Publish(fmt.Sprintf("%s/type", hostname), shelly.Settings.Device.Type)
if shelly.Status.Voltage != 0.0 {
mqtt.Publish(fmt.Sprintf("%s/voltage", hostname), fmt.Sprint(shelly.Status.Voltage))
}
if shelly.Status.Temperature != 0.0 {
mqtt.Publish(fmt.Sprintf("%s/temperature", hostname), fmt.Sprint(shelly.Status.Temperature))
}
for i, input := range shelly.Status.Inputs {
mqtt.Publish(fmt.Sprintf("%s/input%d", hostname, i), fmt.Sprint(input.Input))
}
for i, relay := range shelly.Status.Relays {
mqtt.Publish(fmt.Sprintf("%s/relay%d/is-on", hostname, i), fmt.Sprint(relay.IsOn))
mqtt.Publish(fmt.Sprintf("%s/relay%d/source", hostname, i), relay.Source)
}
for i, roller := range shelly.Status.Rollers {
mqtt.Publish(fmt.Sprintf("%s/roller%d/state", hostname, i), fmt.Sprint(roller.State))
mqtt.Publish(fmt.Sprintf("%s/roller%d/source", hostname, i), roller.Source)
if roller.Positioning {
mqtt.Publish(fmt.Sprintf("%s/roller%d/pos", hostname, i), fmt.Sprint(roller.CurrentPos))
}
}
for i, emeter := range shelly.Status.Emeters {
mqtt.Publish(fmt.Sprintf("%s/emeter%d/power", hostname, i), fmt.Sprintf("%.02f", emeter.Power))
mqtt.Publish(fmt.Sprintf("%s/emeter%d/reactive", hostname, i), fmt.Sprintf("%.02f", emeter.Reactive))
mqtt.Publish(fmt.Sprintf("%s/emeter%d/voltage", hostname, i), fmt.Sprintf("%.02f", emeter.Voltage))
mqtt.Publish(fmt.Sprintf("%s/emeter%d/total", hostname, i), fmt.Sprintf("%.02f", emeter.Total))
}
}(s.Host)
}
for len(tick) > 0 {
<-tick
}
}
}