Skip to content
Snippets Groups Projects
Commit e395ceb3 authored by KERDREUX Jerome's avatar KERDREUX Jerome
Browse files

Big refactoring

Code is quite production ready..
parent ac745cb1
No related branches found
No related tags found
No related merge requests found
......@@ -20,6 +20,8 @@ var (
"bridge/state",
"bridge/logging",
"bridge/config",
"bridge/event",
"bridge/log",
}
)
......
......@@ -19,9 +19,8 @@ type Gateway struct {
func NewGW(cfg *Config, eng *xaal.Engine) *Gateway {
gw := &Gateway{Devices: make(map[string]*Z2MDevice)}
gw.Config = cfg
gw.Client = mqttSetup(cfg, gw.mqttPublishHander)
// NOTE: Wondering if we can setup engine before
gw.Engine = eng
gw.Client = MQTTSetup(cfg, gw.MQTTHandler)
return gw
}
......@@ -31,7 +30,7 @@ func (gw *Gateway) GetZDevice(name string) *Z2MDevice {
func (gw *Gateway) AddZDevice(zDev *Z2MDevice) {
for _, xDev := range zDev.XAALDevices {
dev := xDev.getXAALDevice()
dev := xDev.GetXAALDevice()
slog.Debug("Adding device", "dev", dev.String())
gw.Engine.AddDevice(dev)
}
......@@ -41,7 +40,7 @@ func (gw *Gateway) AddZDevice(zDev *Z2MDevice) {
func (gw *Gateway) RemoveZDevice(zDev *Z2MDevice) {
for _, xDev := range zDev.XAALDevices {
dev := xDev.getXAALDevice()
dev := xDev.GetXAALDevice()
slog.Debug("Removing device", "dev", dev.String())
gw.Engine.RemoveDevice(dev)
}
......@@ -58,17 +57,21 @@ func (gw *Gateway) GetZDeviceByTopic(topic string) *Z2MDevice {
return gw.GetZDevice(name)
}
// mqttPublishHander handles all incoming MQTT messages
// MQTTHandler handles all incoming MQTT messages
// If the topic is /bridge/devices it will parse the json and create new devices
// Else it will find the device with the topic and call the mqttDeviceHandler
func (gw *Gateway) mqttPublishHander(client mqtt.Client, msg mqtt.Message) {
// Else it will find the device with the topic and call the HandleMessage
func (gw *Gateway) MQTTHandler(client mqtt.Client, msg mqtt.Message) {
// we ignore some topics
if slices.Contains(gw.Config.ignoredTopics, msg.Topic()) {
return
}
// some messages are empty
if len(msg.Payload()) == 0 {
return
}
// Is it devices definitions ?
if msg.Topic() == gw.Config.topic+"/bridge/devices" {
gw.jsonParseDevices(msg)
gw.Z2MParseDevices(msg)
} else {
zDev := gw.GetZDeviceByTopic(msg.Topic())
// mqttDumpMsg(msg)
......@@ -78,14 +81,14 @@ func (gw *Gateway) mqttPublishHander(client mqtt.Client, msg mqtt.Message) {
}
}
// jsonParseDevices parses the bridge/devices json and creates new xAAL devices
// if they don't exist
func (gw *Gateway) jsonParseDevices(msg mqtt.Message) {
// Z2MParseDevices parses the bridge/devices json and and sync xAAL with results
func (gw *Gateway) Z2MParseDevices(msg mqtt.Message) {
var devices []Z2MDevice
slog.Debug("Parsing devices")
err := json.Unmarshal(msg.Payload(), &devices)
if err != nil {
slog.Error("Error decoding JSON", "err", err)
return
}
// search for new devices
......@@ -96,7 +99,7 @@ func (gw *Gateway) jsonParseDevices(msg mqtt.Message) {
}
slog.Debug("Found new device", "name", zDev.FriendlyName)
zDev.Dump()
zDev.setupXAALDevices(gw)
zDev.FindXAALDevices(gw)
gw.AddZDevice(&zDev)
zDev.Sync()
// zDev.Available()
......
......@@ -10,8 +10,8 @@ import (
"github.com/jedib0t/go-pretty/v6/table"
)
// mqttSetup creates a new MQTT client
func mqttSetup(cfg *Config, publishHandler mqtt.MessageHandler) mqtt.Client {
// MQTTSetup creates a new MQTT client
func MQTTSetup(cfg *Config, publishHandler mqtt.MessageHandler) mqtt.Client {
// This JS style of creating a client is awfully verbose
opts := mqtt.NewClientOptions().
AddBroker(fmt.Sprintf("tcp://%s:%d", cfg.brokerHost, cfg.brokerPort)).
......@@ -29,8 +29,8 @@ func mqttSetup(cfg *Config, publishHandler mqtt.MessageHandler) mqtt.Client {
return client
}
// mqttDumpMsg displays the MQTT message
func mqttDumpMsg(msg mqtt.Message) {
// MQTTDumpMsg displays the MQTT message
func MQTTDumpMsg(msg mqtt.Message) {
var data map[string]interface{}
err := json.Unmarshal(msg.Payload(), &data)
if err != nil {
......
......@@ -55,7 +55,7 @@ type ButtonRemote struct {
type XAALDeviceInterface interface {
update(map[string]interface{})
getXAALDevice() *xaal.Device
GetXAALDevice() *xaal.Device
}
func (dev *XAALDevice) setup() {
......@@ -67,7 +67,7 @@ func (dev *XAALDevice) setup() {
dev.Info = "z2m:" + zDev.Type + ":" + zDev.FriendlyName
}
func (dev *XAALDevice) getXAALDevice() *xaal.Device {
func (dev *XAALDevice) GetXAALDevice() *xaal.Device {
return dev.Device
}
......
......@@ -79,7 +79,7 @@ func (zDev *Z2MDevice) HandleMessage(msg mqtt.Message) {
var data map[string]interface{}
err := json.Unmarshal(msg.Payload(), &data)
if err != nil {
slog.Error("Error decoding JSON", "err", err)
slog.Error("Error decoding JSON", "err", err, "topic", msg.Topic(), "data", msg.Payload())
} else {
slog.Debug("Updating device:", "name", zDev.FriendlyName)
for _, dev := range zDev.XAALDevices {
......@@ -89,8 +89,7 @@ func (zDev *Z2MDevice) HandleMessage(msg mqtt.Message) {
}
// creates new xAAL devices from a bridge device
func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) {
// TODO: Handle errors
func (zDev *Z2MDevice) FindXAALDevices(gw *Gateway) {
baseAddr := gw.Config.baseAddr
ieeeAddr, _ := hexStringToInteger(zDev.IeeeAddress)
baseAddr, _ = baseAddr.Add(int64(ieeeAddr))
......@@ -123,7 +122,7 @@ func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) {
if dev != nil {
zDev.XAALDevices = append(zDev.XAALDevices, dev)
xaalDev := dev.getXAALDevice()
xaalDev := dev.GetXAALDevice()
xaalDev.GroupID = grpAdd
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment