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