openpdu/src/outlets.go

138 lines
3.6 KiB
Go

package main
import (
"encoding/json"
"fmt"
"strings"
"time"
"git.openpdu.org/OpenPDU/openpdu/board"
"git.openpdu.org/OpenPDU/openpdu/events"
"git.openpdu.org/OpenPDU/openpdu/mqtt"
"git.openpdu.org/OpenPDU/openpdu/outlet"
"git.openpdu.org/OpenPDU/openpdu/syslog"
"git.openpdu.org/OpenPDU/openpdu/webui"
"github.com/spf13/viper"
)
func CreateOutlets() {
outletsConfig := viper.Sub("outlets")
if outletsConfig == nil {
syslog.Warning("No outlet configured")
return
}
outlet.Outlets = make([]*outlet.Outlet, len(board.AllChannels))
for key := range outletsConfig.AllSettings() {
outletConfig := outletsConfig.Sub(key)
num := outletConfig.GetUint("num")
outletConfig.SetDefault("description", "no description")
description := outletConfig.GetString("description")
channelID := strings.ToLower(outletConfig.GetString("channelID"))
channel := board.AllChannels[channelID]
// TODO: channel non esistente
o := outlet.Outlet{
ID: key,
Num: num,
Description: description,
Channel: channel,
}
outlet.Outlets[num] = &o
}
}
func init() {
webui.SetMQTTReconfigFunction(MQTTreconfigure)
events.AddListener("outlet_config_changed", MQTTreconfigure)
// mqtt.MQTTReconfig = MQTTreconfigure()
}
func MQTTSetup() {
mqtt.Setup()
for o := range outlet.Outlets {
c := outlet.Outlets[o].Channel
topic := c.MQTTCommandTopic()
if topic == "" {
continue
}
mqtt.Subscribe(topic, c.MQTTHandler)
hAssTopic := "homeassistant/switch/" + viper.GetString("Mqtt.Prefix") + "/" + fmt.Sprint(o) + "/config"
v := ""
if viper.GetBool("Mqtt.HomeAssistant") {
cfg := map[string]interface{}{
"name": outlet.Outlets[o].Description,
"state_topic": viper.GetString("Mqtt.Prefix") + "/switch/" + c.MQTTStateTopic(),
"command_topic": viper.GetString("Mqtt.Prefix") + "/switch/" + c.MQTTCommandTopic(),
"payload_off": "off",
"payload_on": "on",
"avty_t": viper.GetString("Mqtt.Prefix") + "/" + viper.GetString("Mqtt.LWTTopic"),
"pl_avail": viper.GetString("Mqtt.LWTMessageOnline"),
"pl_not_avail": viper.GetString("Mqtt.LWTMessageOffline"),
"unique_id": viper.GetString("Mqtt.Prefix") + "_" + fmt.Sprint(o),
"device": map[string]interface{}{
"identifiers": []string{viper.GetString("Mqtt.Prefix")},
},
}
s, err := json.Marshal(cfg)
if err != nil {
v = ""
} else {
v = string(s)
}
}
mqtt.PublishRoot(hAssTopic, v)
}
hAssTopic := "homeassistant/switch/" + viper.GetString("Mqtt.Prefix") + "/config"
v := ""
if viper.GetBool("Mqtt.HomeAssistant") {
cfg := map[string]interface{}{
"name": viper.GetString("system.hostname"),
"avty_t": viper.GetString("Mqtt.Prefix") + "/" + viper.GetString("Mqtt.LWTTopic"),
"pl_avail": viper.GetString("Mqtt.LWTMessageOnline"),
"pl_not_avail": viper.GetString("Mqtt.LWTMessageOffline"),
"unique_id": viper.GetString("Mqtt.Prefix"),
"device": map[string]interface{}{
"identifiers": []string{viper.GetString("Mqtt.Prefix")},
"name": viper.GetString("system.hostname"),
"model": "OpenPDU",
"sw_version": version,
"manufacturer": "OpenPDU",
},
}
s, err := json.Marshal(cfg)
if err != nil {
v = ""
} else {
v = string(s)
}
}
mqtt.PublishRoot(hAssTopic, v)
}
func MQTTreconfigure() {
if mqtt.Connected() {
mqtt.Disconnect()
}
MQTTSetup()
}
func MQTTRefreshLoop() {
for {
if mqtt.Connected() {
for o := range outlet.Outlets {
topic := outlet.Outlets[o].Channel.MQTTStateTopic()
value := outlet.Outlets[o].Channel.ToString()
mqtt.Publish(topic, value)
}
}
time.Sleep(30 * time.Second)
}
}