Files
koolnova2mqtt/main.go
2020-12-22 01:22:00 +01:00

65 lines
1.3 KiB
Go

package main
import (
"koolnova2mqtt/kn"
"log"
"os"
"os/signal"
"syscall"
"time"
)
// newBridges builds all bridges from a list of Modbus slaves
func newBridges(slaves map[byte]string, templateConfig *kn.Config) []*kn.Bridge {
var bridges []*kn.Bridge
for id, name := range slaves {
config := *templateConfig
config.ModuleName = name
config.SlaveID = id
bridge := kn.NewBridge(&config)
bridges = append(bridges, bridge)
}
return bridges
}
func main() {
// configure CTRL+C as a way to stop the application
ctrlC := make(chan os.Signal, 1)
signal.Notify(ctrlC, os.Interrupt, syscall.SIGTERM)
// read configuration from the command line
config := ParseCommandLine()
go func() {
ticker := time.NewTicker(2 * time.Second)
var sessionID int
var bridges []*kn.Bridge
for range ticker.C {
newSessionID := config.MqttClient.ID
if sessionID != newSessionID {
bridges = newBridges(config.slaves, config.BridgeTemplateConfig)
for _, b := range bridges {
err := b.Start()
if err != nil {
log.Printf("Error starting bridge: %s\n", err)
break
} else {
sessionID = newSessionID
}
}
} else {
for _, b := range bridges {
b.Tick()
}
}
}
}()
<-ctrlC
config.MqttClient.Close()
config.BridgeTemplateConfig.Modbus.Close()
}