Skip to content
Snippets Groups Projects
Select Git revision
  • 99d0a36216752dcf649aa2b3cc269339d5798164
  • main default protected
2 results

config.go

Blame
  • config.go 1.77 KiB
    package main
    
    import (
    	"fmt"
    
    	"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()
    	ignoredTopics = []string{
    		"bridge/groups",
    		"bridge/definitions",
    		"bridge/extensions",
    		"bridge/info",
    		"bridge/state",
    		"bridge/logging",
    		"bridge/config",
    	}
    )
    
    type Config struct {
    	brokerHost    string
    	topic         string
    	logLevel      string
    	ignoredTopics []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
    	}
    	for _, topic := range ignoredTopics {
    		config.ignoredTopics = append(config.ignoredTopics, fmt.Sprintf("%s/%s", config.topic, topic))
    	}
    	return &config, nil
    }