119 lines
2.1 KiB
Go
119 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"strings"
|
|
|
|
MQTT "github.com/eclipse/paho.mqtt.golang"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
type Channel interface {
|
|
Toggle() (bool, error)
|
|
On() error
|
|
Off() error
|
|
ToString() string
|
|
UpdateMQTT()
|
|
Status() bool
|
|
Parent() Board
|
|
Dump()
|
|
Name() string
|
|
OnBoot() string
|
|
SetOnBoot(string)
|
|
SetMQTTStateTopic(string)
|
|
SetMQTTCommandTopic(string)
|
|
MQTTCommandTopic() string
|
|
MQTTHandler(MQTT.Client, MQTT.Message)
|
|
}
|
|
|
|
type Board interface {
|
|
Init()
|
|
Dump()
|
|
Channel(uint64) Channel
|
|
}
|
|
|
|
type Outlet struct {
|
|
ID string
|
|
Num uint
|
|
Description string
|
|
Channel Channel
|
|
}
|
|
|
|
var boards []Board
|
|
var allChannels map[string]Channel
|
|
var outlets []*Outlet
|
|
|
|
func parseBoardsConfig() {
|
|
// TODO: init boards array?
|
|
|
|
allChannels = make(map[string]Channel)
|
|
|
|
boardsConfig := viper.Sub("boards")
|
|
if boardsConfig == nil {
|
|
logWarning("No board configured")
|
|
return
|
|
}
|
|
|
|
for key := range boardsConfig.AllSettings() {
|
|
boardConfig := boardsConfig.Sub(key)
|
|
|
|
boardType := boardConfig.GetString("type")
|
|
switch boardType {
|
|
case "mqtt":
|
|
b := newMQTTBoard(boardConfig, key)
|
|
boards = append(boards, b)
|
|
case "gpio":
|
|
default:
|
|
b := newDummyBoard(boardConfig, key)
|
|
boards = append(boards, b)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
outlets = make([]*Outlet, len(allChannels))
|
|
|
|
outletsConfig := viper.Sub("outlets")
|
|
if outletsConfig == nil {
|
|
logWarning("No outlet configured")
|
|
return
|
|
}
|
|
|
|
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 := allChannels[channelID]
|
|
// TODO: channel non esistente
|
|
o := Outlet{
|
|
ID: key,
|
|
Num: num,
|
|
Description: description,
|
|
Channel: channel,
|
|
}
|
|
|
|
outlets[num] = &o
|
|
}
|
|
|
|
for b := range boards {
|
|
go boards[b].Init()
|
|
}
|
|
|
|
// dumpa tutto
|
|
for b := range boards {
|
|
boards[b].Dump()
|
|
}
|
|
|
|
// dumpa tutto
|
|
for o := range outlets {
|
|
outlets[o].Dump()
|
|
}
|
|
|
|
}
|
|
|
|
func (o *Outlet) Dump() {
|
|
log.Printf("Outlet %v: channel name: %v\n", o.Num, o.Channel.Name())
|
|
}
|