From 2211582db34eaaab253ac156640c45c47e465210 Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 3 Apr 2022 16:51:08 +0200 Subject: [PATCH] Introduce covers attribute for obsolete templates (#3070) --- charger/template.go | 2 +- cmd/configure/flow.go | 2 +- cmd/configure/helper.go | 2 +- meter/template.go | 2 +- .../charger/tinkerforge-warp-pro.yaml | 31 ------------------- .../definition/charger/tinkerforge-warp.yaml | 2 ++ util/templates/config.go | 23 +++++--------- util/templates/init.go | 7 +++-- util/templates/template.go | 8 ++--- util/templates/template_modbus.go | 4 +-- util/templates/template_types.go | 1 + vehicle/template.go | 2 +- 12 files changed, 26 insertions(+), 60 deletions(-) delete mode 100644 templates/definition/charger/tinkerforge-warp-pro.yaml diff --git a/charger/template.go b/charger/template.go index 67b57c5dd..647a8feb5 100644 --- a/charger/template.go +++ b/charger/template.go @@ -21,7 +21,7 @@ func NewChargerFromTemplateConfig(other map[string]interface{}) (api.Charger, er return nil, err } - tmpl, err := templates.ByTemplate(cc.Template, templates.Charger) + tmpl, err := templates.ByName(cc.Template, templates.Charger) if err != nil { return nil, err } diff --git a/cmd/configure/flow.go b/cmd/configure/flow.go index feaad3a71..5616c0b0a 100644 --- a/cmd/configure/flow.go +++ b/cmd/configure/flow.go @@ -111,7 +111,7 @@ func (c *CmdConfigure) configureLinkedTypes(templateItem templates.Template) { } } - linkedTemplateItem, err := templates.ByTemplate(linkedTemplate.Template, string(DeviceClassMeter)) + linkedTemplateItem, err := templates.ByName(linkedTemplate.Template, string(DeviceClassMeter)) if err != nil { fmt.Println("Error: " + err.Error()) return diff --git a/cmd/configure/helper.go b/cmd/configure/helper.go index f10c99f38..2ab5719a8 100644 --- a/cmd/configure/helper.go +++ b/cmd/configure/helper.go @@ -566,7 +566,7 @@ func (c *CmdConfigure) processModbusConfig(templateItem *templates.Template, dev return } - config := templateItem.ConfigDefaults.Config.Modbus + config := templateItem.ConfigDefaults.Modbus for _, choice := range modbusParam.Choice { if config.Interfaces[choice] == nil { diff --git a/meter/template.go b/meter/template.go index 03bed7eb3..c4e1f6ff0 100644 --- a/meter/template.go +++ b/meter/template.go @@ -21,7 +21,7 @@ func NewMeterFromTemplateConfig(other map[string]interface{}) (api.Meter, error) return nil, err } - tmpl, err := templates.ByTemplate(cc.Template, templates.Meter) + tmpl, err := templates.ByName(cc.Template, templates.Meter) if err != nil { return nil, err } diff --git a/templates/definition/charger/tinkerforge-warp-pro.yaml b/templates/definition/charger/tinkerforge-warp-pro.yaml deleted file mode 100644 index 93395b47f..000000000 --- a/templates/definition/charger/tinkerforge-warp-pro.yaml +++ /dev/null @@ -1,31 +0,0 @@ -template: tinkerforge-warp-pro -products: - - brand: TinkerForge - description: - generic: WARP Charger Pro -requirements: - description: - en: A MQTT Broker software needs to be running on a computer. The MQTT connection also needs to be configured in the wallbox. - de: Es muss ein sogennanter MQTT Broker auf einem Computer installiert sein. Die MQTT Verbindung muss in der Wallbox eingerichtet sein. - uri: https://docs.evcc.io/docs/devices/chargers#tinkerforge-warp-charger -params: - - name: host - required: true - example: 192.0.2.2 - help: - de: Die IP Adresse oder der Hostname des MQTT Brokers - en: The IP address or hostname of the MQTT broker - - name: port - default: 1883 - help: - de: Der Port des MQTT Brokers - en: The port of the MQTT broker - - name: topic - default: warp - - name: timeout - default: 30s -render: | - type: warp - broker: {{ .host }}:{{ .port }} - topic: {{ .topic }} - timeout: {{ .timeout }} diff --git a/templates/definition/charger/tinkerforge-warp.yaml b/templates/definition/charger/tinkerforge-warp.yaml index 56f82f10b..38ca1c9f3 100644 --- a/templates/definition/charger/tinkerforge-warp.yaml +++ b/templates/definition/charger/tinkerforge-warp.yaml @@ -1,4 +1,6 @@ template: tinkerforge-warp +covers: + - tinkerforge-warp-pro products: - brand: TinkerForge description: diff --git a/util/templates/config.go b/util/templates/config.go index d2746ccea..f4537c2c9 100644 --- a/util/templates/config.go +++ b/util/templates/config.go @@ -7,7 +7,7 @@ import ( "gopkg.in/yaml.v3" ) -type ConfigDefaultsDefinition struct { +type ConfigDefaults struct { Params []Param // Default values for common parameters Presets map[string]struct { Params []Param @@ -23,27 +23,20 @@ type ConfigDefaultsDefinition struct { DeviceGroups map[string]TextLanguage // Default device groups } -type ConfigDefaults struct { - read bool - - Config ConfigDefaultsDefinition -} - // read the actual config into the struct, but only once func (c *ConfigDefaults) LoadDefaults() { - if c.read { + // if params are initialized, defaults have been loaded + if c.Params != nil { return } - if err := yaml.Unmarshal([]byte(definition.DefaultsContent), &c.Config); err != nil { + if err := yaml.Unmarshal([]byte(definition.DefaultsContent), &c); err != nil { panic(fmt.Errorf("Error: failed to parse deviceGroupListDefinition: %v\n", err)) } - c.read = true - // resolve modbus param references - for k := range c.Config.Modbus.Types { - for i, p := range c.Config.Modbus.Types[k].Params { + for k := range c.Modbus.Types { + for i, p := range c.Modbus.Types[k].Params { // if this is a reference, get the referenced values and then overwrite it with the values defined here if p.Reference { finalName := p.Name @@ -55,7 +48,7 @@ func (c *ConfigDefaults) LoadDefaults() { referencedParam.OverwriteProperties(p) referencedParam.Name = finalName p = referencedParam - c.Config.Modbus.Types[k].Params[i] = p + c.Modbus.Types[k].Params[i] = p } } } @@ -63,7 +56,7 @@ func (c *ConfigDefaults) LoadDefaults() { // return the param with the given name func (c *ConfigDefaults) ParamByName(name string) (int, Param) { - for i, param := range c.Config.Params { + for i, param := range c.Params { if param.Name == name { return i, param } diff --git a/util/templates/init.go b/util/templates/init.go index 2951ef2c9..45ab8d282 100644 --- a/util/templates/init.go +++ b/util/templates/init.go @@ -6,6 +6,7 @@ import ( "path" "github.com/evcc-io/evcc/templates/definition" + "golang.org/x/exp/slices" "gopkg.in/yaml.v3" ) @@ -79,14 +80,14 @@ func ByClass(class string) []Template { return templates[class] } -func ByTemplate(t, class string) (Template, error) { +func ByName(name, class string) (Template, error) { loadTemplates(class) for _, tmpl := range templates[class] { - if tmpl.Template == t { + if tmpl.Template == name || slices.Contains(tmpl.Covers, name) { return tmpl, nil } } - return Template{}, fmt.Errorf("template not found: %s", t) + return Template{}, fmt.Errorf("template not found: %s", name) } diff --git a/util/templates/template.go b/util/templates/template.go index 6b1e38850..afba7d75b 100644 --- a/util/templates/template.go +++ b/util/templates/template.go @@ -132,7 +132,7 @@ func (t *Template) ResolvePresets() error { t.Params = []Param{} for _, p := range currentParams { if p.Preset != "" { - base, ok := t.ConfigDefaults.Config.Presets[p.Preset] + base, ok := t.ConfigDefaults.Presets[p.Preset] if !ok { return fmt.Errorf("Error: Could not find preset definition: %s\n", p.Preset) } @@ -157,7 +157,7 @@ func (t *Template) ResolveGroup() error { return nil } - _, ok := t.ConfigDefaults.Config.DeviceGroups[t.Group] + _, ok := t.ConfigDefaults.DeviceGroups[t.Group] if !ok { return fmt.Errorf("Error: Could not find devicegroup definition: %s\n", t.Group) } @@ -167,7 +167,7 @@ func (t *Template) ResolveGroup() error { // return the language specific group title func (t *Template) GroupTitle() string { - tl := t.ConfigDefaults.Config.DeviceGroups[t.Group] + tl := t.ConfigDefaults.DeviceGroups[t.Group] return tl.String(t.Lang) } @@ -295,7 +295,7 @@ func (t *Template) RenderResult(renderMode string, other map[string]interface{}) values = t.ModbusValues(renderMode, false, values) // add the common templates - for _, v := range t.ConfigDefaults.Config.Presets { + for _, v := range t.ConfigDefaults.Presets { if !strings.Contains(t.Render, v.Render) { t.Render = fmt.Sprintf("%s\n%s", t.Render, v.Render) } diff --git a/util/templates/template_modbus.go b/util/templates/template_modbus.go index e0755f090..6ffb64859 100644 --- a/util/templates/template_modbus.go +++ b/util/templates/template_modbus.go @@ -28,7 +28,7 @@ func (t *Template) ModbusParams(modbusType string, values map[string]interface{} return } - modbusParams := t.ConfigDefaults.Config.Modbus.Types[values[ParamModbus].(string)].Params + modbusParams := t.ConfigDefaults.Modbus.Types[values[ParamModbus].(string)].Params // add the modbus params at the beginning t.Params = append(modbusParams, t.Params...) @@ -50,7 +50,7 @@ func (t *Template) ModbusValues(renderMode string, setDefaults bool, values map[ return values } - modbusConfig := t.ConfigDefaults.Config.Modbus + modbusConfig := t.ConfigDefaults.Modbus _, modbusParam := t.ParamByName(ParamModbus) modbusInterfaces := []string{} diff --git a/util/templates/template_types.go b/util/templates/template_types.go index 4e55d9814..8921729ff 100644 --- a/util/templates/template_types.go +++ b/util/templates/template_types.go @@ -257,6 +257,7 @@ type Product struct { // TemplateDefinition contains properties of a device template type TemplateDefinition struct { Template string + Covers []string // list of covered outdated tempate names Products []Product // list of products this template is compatible with Capabilities []string Requirements Requirements diff --git a/vehicle/template.go b/vehicle/template.go index bfb27ecdf..910e45bd0 100644 --- a/vehicle/template.go +++ b/vehicle/template.go @@ -21,7 +21,7 @@ func NewVehicleFromTemplateConfig(other map[string]interface{}) (api.Vehicle, er return nil, err } - tmpl, err := templates.ByTemplate(cc.Template, templates.Vehicle) + tmpl, err := templates.ByName(cc.Template, templates.Vehicle) if err != nil { return nil, err }