package cmd import ( "time" "github.com/andig/evcc/api" "github.com/andig/evcc/charger" "github.com/andig/evcc/core" "github.com/andig/evcc/meter" "github.com/andig/evcc/push" "github.com/andig/evcc/server" "github.com/andig/evcc/vehicle" ) type config struct { URI string Log string Interval time.Duration Mqtt mqttConfig Influx influxConfig Menu []server.MenuConfig Messaging messagingConfig Meters []qualifiedConfig Chargers []qualifiedConfig Vehicles []qualifiedConfig LoadPoints []core.Config } type qualifiedConfig struct { Name, Type string Other map[string]interface{} `mapstructure:",remain"` } type typedConfig struct { Type string Other map[string]interface{} `mapstructure:",remain"` } type messagingConfig struct { Events map[string]push.EventTemplate Services []typedConfig } type mqttConfig struct { Broker string User string Password string } type influxConfig struct { URL string Database string User string Password string Interval time.Duration } // ConfigProvider provides configuration items type ConfigProvider struct { meters map[string]api.Meter chargers map[string]api.Charger vehicles map[string]api.Vehicle } // Meter provides meters by name func (c *ConfigProvider) Meter(name string) api.Meter { if meter, ok := c.meters[name]; ok { return meter } log.FATAL.Fatalf("config: invalid meter %s", name) return nil } // Charger provides chargers by name func (c *ConfigProvider) Charger(name string) api.Charger { if charger, ok := c.chargers[name]; ok { return charger } log.FATAL.Fatalf("config: invalid charger %s", name) return nil } // Vehicle provides vehicles by name func (c *ConfigProvider) Vehicle(name string) api.Vehicle { if vehicle, ok := c.vehicles[name]; ok { return vehicle } log.FATAL.Fatalf("config: invalid vehicle %s", name) return nil } func (c *ConfigProvider) configure(conf config) { c.configureMeters(conf) c.configureChargers(conf) c.configureVehicles(conf) } func (c *ConfigProvider) configureMeters(conf config) { c.meters = make(map[string]api.Meter) for _, cc := range conf.Meters { c.meters[cc.Name] = meter.NewFromConfig(log, cc.Type, cc.Other) } } func (c *ConfigProvider) configureChargers(conf config) { c.chargers = make(map[string]api.Charger) for _, cc := range conf.Chargers { c.chargers[cc.Name] = charger.NewFromConfig(log, cc.Type, cc.Other) } } func (c *ConfigProvider) configureVehicles(conf config) { c.vehicles = make(map[string]api.Vehicle) for _, cc := range conf.Vehicles { c.vehicles[cc.Name] = vehicle.NewFromConfig(log, cc.Type, cc.Other) } }