From 8d6f93834e6c3d101b7d21cd6fc95bf955fd8829 Mon Sep 17 00:00:00 2001
From: jkerdreux-imt <jerome.kerdreux@imt-atlantique.fr>
Date: Sun, 17 Nov 2024 03:32:10 +0100
Subject: [PATCH] Added config file parsing

Still a work in progress, but config parser is Ok.
---
 config.go | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 main.go   | 14 +++++--------
 z2m.go    |  8 +++----
 3 files changed, 69 insertions(+), 15 deletions(-)

diff --git a/config.go b/config.go
index c8f7ae3..b5a0469 100644
--- a/config.go
+++ b/config.go
@@ -1,8 +1,68 @@
 package main
 
-import "github.com/google/uuid"
+import (
+	"gitlab.imt-atlantique.fr/xaal/code/go/core/uuid"
+	"gitlab.imt-atlantique.fr/xaal/code/go/core/xaal"
+	"gopkg.in/ini.v1"
+)
 
 var (
 	mqttTopic    = "zigbee2mqtt"
 	mqttClientID = "z2m-" + uuid.New().String()
 )
+
+type Config struct {
+	brokerHost string
+	topic      string
+	logLevel   string
+	brokerPort int
+	baseAddr   uuid.UUID
+}
+
+func parseConfig() (*Config, error) {
+	// Default configuration
+	config := Config{brokerHost: "mqtt", topic: "zigbee2mqtt", logLevel: "INFO", brokerPort: 1883}
+	// Parse the configuration file
+	cfg, err := ini.Load(xaal.GetConfigDir() + "/z2m.ini")
+	if err != nil {
+		return nil, err
+	}
+	sec := cfg.Section(ini.DefaultSection)
+
+	// NOTE: This parsing is painful to write, I should look for a better way to do it
+
+	// broker
+	broker, err := sec.GetKey("broker")
+	if err == nil {
+		config.brokerHost = broker.String()
+	}
+	// topic
+	topic, err := sec.GetKey("topic")
+	if err == nil {
+		config.topic = topic.String()
+	}
+	// log level
+	level, err := sec.GetKey("log_level")
+	if err == nil {
+		config.logLevel = level.String()
+	}
+	// port
+	port, err := sec.GetKey("port")
+	if err == nil {
+		value, err := port.Int()
+		if err != nil {
+			return nil, err
+		}
+		config.brokerPort = value
+	}
+	// base address
+	addr, err := sec.GetKey("base_addr")
+	if err == nil {
+		baseAddr, err := uuid.FromString(addr.String())
+		if err != nil {
+			return nil, err
+		}
+		config.baseAddr = baseAddr
+	}
+	return &config, nil
+}
diff --git a/main.go b/main.go
index 3f7a569..4973312 100644
--- a/main.go
+++ b/main.go
@@ -1,25 +1,21 @@
 package main
 
 import (
-	"flag"
-	"fmt"
 	"log/slog"
 
 	"gitlab.imt-atlantique.fr/xaal/code/go/core/xaal"
 )
 
 func main() {
-	mqttBroker := flag.String("broker", "", "The MQTT broker URL")
-	flag.Parse()
-
-	if *mqttBroker == "" {
-		fmt.Println("Error: MQTT broker URL is required")
+	cfg, err := parseConfig()
+	if err != nil {
+		slog.Error("Error parsing configuration file: ", "err", err)
 		return
 	}
+	// spew.Dump(cfg)
 
 	xaal.SetupLogger()
-	client := mqttSetup(*mqttBroker, 1883)
-	// client.Publish("zigbee2mqtt/0x70b3d52b600f89d3/set", 0, false, `{"state": "toggle"}`)
+	client := mqttSetup(cfg.brokerHost, cfg.brokerPort)
 
 	eng := xaal.NewEngine()
 	gw := NewGW(client)
diff --git a/z2m.go b/z2m.go
index 52ccfb9..5619364 100644
--- a/z2m.go
+++ b/z2m.go
@@ -91,11 +91,10 @@ func (zDev *Z2MDevice) HandleMessage(msg MQTT.Message) {
 	if err != nil {
 		slog.Error("Error decoding JSON", "err", err)
 	} else {
-		slog.Info("Updating device:", "name", zDev.FriendlyName)
+		slog.Debug("Updating device:", "name", zDev.FriendlyName)
 		for _, dev := range zDev.XAALDevices {
 			dev.update(data)
 		}
-
 	}
 }
 
@@ -259,14 +258,13 @@ func mqttPublishHander(client MQTT.Client, msg MQTT.Message) {
 	if slices.Contains(ignoredTopics, msg.Topic()) {
 		return
 	}
-	slog.Debug("Received message on", "topic", msg.Topic())
-
+	// slog.Debug("Received message on", "topic", msg.Topic())
 	// Is it devices definitions ?
 	if msg.Topic() == mqttTopic+"/bridge/devices" {
 		jsonParseDevices(msg.Payload())
 	} else {
 		dev := GetGW().GetZDeviceByTopic(msg.Topic())
-		mqttDumpMsg(msg)
+		// mqttDumpMsg(msg)
 		if dev != nil {
 			dev.HandleMessage(msg)
 		}
-- 
GitLab