From e395ceb3a79fb164f6e84507b05f4236dee8f5f8 Mon Sep 17 00:00:00 2001 From: jkerdreux-imt <jerome.kerdreux@imt-atlantique.fr> Date: Wed, 20 Nov 2024 15:46:45 +0100 Subject: [PATCH] Big refactoring Code is quite production ready.. --- config.go | 2 ++ gateway.go | 27 +++++++++++++++------------ mqtt.go | 8 ++++---- xaal.go | 4 ++-- z2m.go | 7 +++---- 5 files changed, 26 insertions(+), 22 deletions(-) diff --git a/config.go b/config.go index 3d93bc8..4e2e92b 100644 --- a/config.go +++ b/config.go @@ -20,6 +20,8 @@ var ( "bridge/state", "bridge/logging", "bridge/config", + "bridge/event", + "bridge/log", } ) diff --git a/gateway.go b/gateway.go index b64f454..198ada6 100644 --- a/gateway.go +++ b/gateway.go @@ -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() diff --git a/mqtt.go b/mqtt.go index d568a2c..557869a 100644 --- a/mqtt.go +++ b/mqtt.go @@ -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 { diff --git a/xaal.go b/xaal.go index 6088e19..17f68a2 100644 --- a/xaal.go +++ b/xaal.go @@ -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 } diff --git a/z2m.go b/z2m.go index ce60d87..c8fab24 100644 --- a/z2m.go +++ b/z2m.go @@ -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 } } -- GitLab