From e0da20bd878589dc257d76e18b9d533925a5c5f0 Mon Sep 17 00:00:00 2001 From: jkerdreux-imt <jerome.kerdreux@imt-atlantique.fr> Date: Tue, 19 Nov 2024 01:01:25 +0100 Subject: [PATCH] Refactoring in progress - UperCasing name .. not really sure. - Support for log_level in config file --- config.go | 16 +++++++++++++--- gateway.go | 38 +++++++++++++++++++------------------- main.go | 4 ++-- mqtt.go | 10 +++++----- z2m.go | 12 ++++++------ 5 files changed, 45 insertions(+), 35 deletions(-) diff --git a/config.go b/config.go index 8d46475..3d93bc8 100644 --- a/config.go +++ b/config.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "log/slog" "gitlab.imt-atlantique.fr/xaal/code/go/core/uuid" "gitlab.imt-atlantique.fr/xaal/code/go/core/xaal" @@ -25,7 +26,7 @@ var ( type Config struct { brokerHost string topic string - logLevel string + logLevel slog.Level ignoredTopics []string brokerPort int baseAddr uuid.UUID @@ -33,7 +34,7 @@ type Config struct { func parseConfig() (*Config, error) { // Default configuration - config := Config{brokerHost: "mqtt", topic: "zigbee2mqtt", logLevel: "INFO", brokerPort: 1883} + config := Config{brokerHost: "mqtt", topic: "zigbee2mqtt", logLevel: slog.LevelError, brokerPort: 1883} // Parse the configuration file cfg, err := ini.Load(xaal.GetConfigDir() + "/z2m.ini") if err != nil { @@ -56,7 +57,16 @@ func parseConfig() (*Config, error) { // log level level, err := sec.GetKey("log_level") if err == nil { - config.logLevel = level.String() + switch level.String() { + case "DEBUG": + config.logLevel = slog.LevelDebug + case "INFO": + config.logLevel = slog.LevelInfo + case "WARN": + config.logLevel = slog.LevelWarn + default: + config.logLevel = slog.LevelError + } } // port port, err := sec.GetKey("port") diff --git a/gateway.go b/gateway.go index 7341ac8..4b5de72 100644 --- a/gateway.go +++ b/gateway.go @@ -5,59 +5,59 @@ import ( "log/slog" "slices" - MQTT "github.com/eclipse/paho.mqtt.golang" + mqtt "github.com/eclipse/paho.mqtt.golang" "gitlab.imt-atlantique.fr/xaal/code/go/core/xaal" ) type Gateway struct { - client MQTT.Client - engine *xaal.Engine - devices map[string]*Z2MDevice - config *Config + Client mqtt.Client + Engine *xaal.Engine + Devices map[string]*Z2MDevice + Config *Config } func NewGW(cfg *Config, eng *xaal.Engine) *Gateway { - gw := &Gateway{devices: make(map[string]*Z2MDevice)} - gw.config = cfg - gw.client = mqttSetup(cfg, gw.mqttPublishHander) + 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.Engine = eng return gw } func (gw *Gateway) GetZDevice(name string) *Z2MDevice { - return gw.devices[name] + return gw.Devices[name] } func (gw *Gateway) AddZDevice(zDev *Z2MDevice) { - gw.devices[zDev.FriendlyName] = zDev + gw.Devices[zDev.FriendlyName] = zDev zDev.Gateway = gw } func (gw *Gateway) RemoveZDevice(zDev *Z2MDevice) { zDev.Gateway = nil - delete(gw.devices, zDev.FriendlyName) + delete(gw.Devices, zDev.FriendlyName) } func (gw *Gateway) GetZDevices() map[string]*Z2MDevice { - return gw.devices + return gw.Devices } func (gw *Gateway) GetZDeviceByTopic(topic string) *Z2MDevice { - name := topic[len(gw.config.topic+"/"):] + name := topic[len(gw.Config.topic+"/"):] return gw.GetZDevice(name) } // mqttPublishHander 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) { +func (gw *Gateway) mqttPublishHander(client mqtt.Client, msg mqtt.Message) { // we ignore some topics - if slices.Contains(gw.config.ignoredTopics, msg.Topic()) { + if slices.Contains(gw.Config.ignoredTopics, msg.Topic()) { return } // Is it devices definitions ? - if msg.Topic() == gw.config.topic+"/bridge/devices" { + if msg.Topic() == gw.Config.topic+"/bridge/devices" { gw.jsonParseDevices(msg) } else { zDev := gw.GetZDeviceByTopic(msg.Topic()) @@ -70,7 +70,7 @@ 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) { +func (gw *Gateway) jsonParseDevices(msg mqtt.Message) { var devices []Z2MDevice err := json.Unmarshal(msg.Payload(), &devices) if err != nil { @@ -82,7 +82,7 @@ func (gw *Gateway) jsonParseDevices(msg MQTT.Message) { if known != nil { continue } - zDev.dump() + zDev.Dump() zDev.setupXAALDevices(gw) gw.AddZDevice(&zDev) zDev.Sync() diff --git a/main.go b/main.go index 2c8b37d..98726ff 100644 --- a/main.go +++ b/main.go @@ -14,13 +14,13 @@ func main() { } // start xAAL stack - xaal.SetupLogger() + xaal.SetupLogger(cfg.logLevel) eng := xaal.NewEngine() // start the gateway gw := NewGW(cfg, eng) // start the xAAL engine eng.Run() // Engine stops, disconnect MQTT - gw.client.Disconnect(250) + gw.Client.Disconnect(250) slog.Debug("MQTT disconnected") } diff --git a/mqtt.go b/mqtt.go index 05288f5..1e79716 100644 --- a/mqtt.go +++ b/mqtt.go @@ -6,19 +6,19 @@ import ( "log/slog" "sort" - MQTT "github.com/eclipse/paho.mqtt.golang" + mqtt "github.com/eclipse/paho.mqtt.golang" "github.com/jedib0t/go-pretty/v6/table" ) // mqttSetup creates a new MQTT client -func mqttSetup(cfg *Config, publishHandler MQTT.MessageHandler) MQTT.Client { +func mqttSetup(cfg *Config, publishHandler mqtt.MessageHandler) mqtt.Client { // This JS style of creating a client is awfully verbose - opts := MQTT.NewClientOptions(). + opts := mqtt.NewClientOptions(). AddBroker(fmt.Sprintf("tcp://%s:%d", cfg.brokerHost, cfg.brokerPort)). SetClientID(mqttClientID). SetDefaultPublishHandler(publishHandler).SetAutoReconnect(true) - client := MQTT.NewClient(opts) + client := mqtt.NewClient(opts) if token := client.Connect(); token.Wait() && token.Error() != nil { panic(token.Error()) } @@ -30,7 +30,7 @@ func mqttSetup(cfg *Config, publishHandler MQTT.MessageHandler) MQTT.Client { } // mqttDumpMsg displays the MQTT message -func mqttDumpMsg(msg MQTT.Message) { +func mqttDumpMsg(msg mqtt.Message) { var data map[string]interface{} err := json.Unmarshal(msg.Payload(), &data) if err != nil { diff --git a/z2m.go b/z2m.go index 7ffc34b..0c63d08 100644 --- a/z2m.go +++ b/z2m.go @@ -6,7 +6,7 @@ import ( "log/slog" "strings" - MQTT "github.com/eclipse/paho.mqtt.golang" + mqtt "github.com/eclipse/paho.mqtt.golang" "github.com/jedib0t/go-pretty/v6/table" "gitlab.imt-atlantique.fr/xaal/code/go/core/uuid" ) @@ -75,7 +75,7 @@ func (zDev *Z2MDevice) GetExpose(name string) *Expose { } // updates the xAAL device with the MQTT message -func (zDev *Z2MDevice) HandleMessage(msg MQTT.Message) { +func (zDev *Z2MDevice) HandleMessage(msg mqtt.Message) { var data map[string]interface{} err := json.Unmarshal(msg.Payload(), &data) if err != nil { @@ -91,7 +91,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 - baseAddr := gw.config.baseAddr + baseAddr := gw.Config.baseAddr ieeeAddr, _ := hexStringToInteger(zDev.IeeeAddress) baseAddr, _ = baseAddr.Add(int64(ieeeAddr)) @@ -125,7 +125,7 @@ func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) { zDev.XAALDevices = append(zDev.XAALDevices, dev) xaalDev := dev.getXAALDevice() xaalDev.GroupID = grpAdd - gw.engine.AddDevice(xaalDev) + gw.Engine.AddDevice(xaalDev) } } } @@ -138,7 +138,7 @@ func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) { func (zDev *Z2MDevice) Publish(topic string, payload interface{}) { topic = zDev.getTopic() + "/" + topic slog.Debug("Sending", "topic", topic, "payload", payload) - client := zDev.Gateway.client + client := zDev.Gateway.Client if token := client.Publish(topic, 0, false, payload); token.Wait() && token.Error() != nil { slog.Error("PUBLISH Error", ":", token.Error()) } @@ -161,7 +161,7 @@ func (zDev *Z2MDevice) Sync() { zDev.Publish("dump", "{}") } -func (zDev *Z2MDevice) dump() { +func (zDev *Z2MDevice) Dump() { tab := table.NewWriter() tab.SetTitle("Def:" + zDev.FriendlyName) tab.SetStyle(table.StyleRounded) -- GitLab