Templates: remove per-template config defaults (#6465)

This commit is contained in:
andig 2023-02-26 17:57:05 +01:00 • committed by GitHub
parent 48931c4a65
commit 7412b0a4a9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
53 changed files with 182 additions and 189 deletions

View file

@ -263,10 +263,10 @@ func (c *CmdConfigure) configureMQTT(templateItem templates.Template) (map[strin
for {
fmt.Println()
_, paramHost := templateItem.ConfigDefaults.ParamByName("host")
_, paramPort := templateItem.ConfigDefaults.ParamByName("port")
_, paramUser := templateItem.ConfigDefaults.ParamByName("user")
_, paramPassword := templateItem.ConfigDefaults.ParamByName("password")
_, paramHost := templates.ConfigDefaults.ParamByName("host")
_, paramPort := templates.ConfigDefaults.ParamByName("port")
_, paramUser := templates.ConfigDefaults.ParamByName("user")
_, paramPassword := templates.ConfigDefaults.ParamByName("password")
host := c.askParam(paramHost)
port := c.askParam(paramPort)
@ -309,7 +309,6 @@ func (c *CmdConfigure) fetchElements(deviceCategory DeviceCategory) []templates.
for _, t := range tmpl.Titles(c.lang) {
titleTmpl := templates.Template{
TemplateDefinition: tmpl.TemplateDefinition,
ConfigDefaults: tmpl.ConfigDefaults,
}
title := t
groupTitle := titleTmpl.GroupTitle(c.lang)
@ -500,7 +499,7 @@ func (c *CmdConfigure) processModbusConfig(templateItem *templates.Template, dev
return
}
config := templateItem.ConfigDefaults.Modbus
config := templates.ConfigDefaults.Modbus
for _, choice := range modbusParam.Choice {
if config.Interfaces[choice] == nil {

View file

@ -8,6 +8,6 @@ capabilities: ["mA"]
requirements:
evcc: ["eebus"]
params:
- preset: eebusmeter
- preset: eebus-meter
render: |
{{ include "eebus-meter" . }}

View file

@ -21,7 +21,7 @@ requirements:
The support is in beta state and problems can occur!
params:
- preset: eebusnometer
- preset: eebus-no-meter
- name: ip
required: true
render: |

View file

@ -21,7 +21,7 @@ requirements:
The support is in beta state and problems can occur!
params:
- preset: eebusmeter
- preset: eebus-meter
- name: ip
required: true
render: |

View file

@ -7,6 +7,6 @@ capabilities: ["iso151182", "mA"]
requirements:
evcc: ["eebus"]
params:
- preset: eebusmeter
- preset: eebus-meter
render: |
{{ include "eebus-meter" . }}

View file

@ -6,6 +6,6 @@ products:
requirements:
evcc: ["eebus"]
params:
- preset: eebusmeter
- preset: eebus-meter
render: |
{{ include "eebus-meter" . }}

View file

@ -2,10 +2,5 @@ package definition
import "embed"
var (
//go:embed charger/*.yaml meter/*.yaml vehicle/*.yaml
YamlTemplates embed.FS
//go:embed defaults.yaml
DefaultsContent string
)
//go:embed charger/*.yaml meter/*.yaml vehicle/*.yaml
var YamlTemplates embed.FS

View file

@ -2,8 +2,8 @@ template: aiways
products:
- brand: Aiways
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: vin
required: true
render: |

View file

@ -4,8 +4,8 @@ products:
description:
generic: e-tron
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: vin
example: WAUZZZ...
render: |

View file

@ -5,8 +5,8 @@ products:
de: Andere
en: Others
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: vin
example: WAUZZZ...
render: |

View file

@ -2,8 +2,8 @@ template: bmw
products:
- brand: BMW
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: vin
example: WBMW...
render: |

View file

@ -4,8 +4,8 @@ products:
description:
generic: Leaf (pre 2019)
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
render: |
type: carwings
{{ include "vehicle-base" . }}

View file

@ -2,8 +2,8 @@ template: citroen
products:
- brand: Citroën
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
render: |
type: citroen
{{ include "vehicle-base" . }}

View file

@ -2,8 +2,8 @@ template: dacia
products:
- brand: Dacia
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: capacity
default: 27.4
render: |

View file

@ -2,8 +2,8 @@ template: ds
products:
- brand: DS
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
render: |
type: ds
{{ include "vehicle-base" . }}

View file

@ -16,7 +16,7 @@ params:
- name: icon
default: car
advanced: true
- preset: vehicleidentify
- preset: vehicle-identify
render: |
type: custom
{{- if ne .title "" }}

View file

@ -2,12 +2,12 @@ template: fiat
products:
- brand: Fiat
params:
- preset: vehiclebase
- preset: vehicle-base
- name: vin
example: ZFAE...
- name: pin
mask: true
- preset: vehicleidentify
- preset: vehicle-identify
render: |
type: fiat
{{ include "vehicle-base" . }}

View file

@ -2,8 +2,8 @@ template: ford
products:
- brand: Ford
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: vin
example: WF0FXX...
render: |

View file

@ -4,9 +4,9 @@ products:
description:
generic: Bluelink
params:
- preset: vehiclebase
- preset: vehiclelanguage
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-language
- preset: vehicle-identify
render: |
type: hyundai
{{ include "vehicle-base" . }}

View file

@ -3,8 +3,8 @@ products:
- brand: Jaguar
- brand: Land Rover
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
render: |
type: jaguar
{{ include "vehicle-base" . }}

View file

@ -4,9 +4,9 @@ products:
description:
generic: Bluelink
params:
- preset: vehiclebase
- preset: vehiclelanguage
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-language
- preset: vehicle-identify
render: |
type: kia
{{ include "vehicle-base" . }}

View file

@ -2,8 +2,8 @@ template: mini
products:
- brand: Mini
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: vin
example: WBMW...
render: |

View file

@ -4,8 +4,8 @@ products:
description:
generic: Leaf
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
render: |
type: nissan
{{ include "vehicle-base" . }}

View file

@ -20,7 +20,7 @@ params:
default: 4
- name: icon
default: scooter
- preset: vehicleidentify
- preset: vehicle-identify
render: |
type: niu
{{- if ne .title "" }}

View file

@ -2,8 +2,8 @@ template: opel
products:
- brand: Opel
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: vin
example: WP0...
render: |

View file

@ -23,7 +23,7 @@ params:
- name: icon
default: car
advanced: true
- preset: vehicleidentify
- preset: vehicle-identify
render: |
type: ovms
{{- if ne .title "" }}

View file

@ -2,8 +2,8 @@ template: peugeot
products:
- brand: Peugeot
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
render: |
type: peugeot
{{ include "vehicle-base" . }}

View file

@ -2,8 +2,8 @@ template: porsche
products:
- brand: Porsche
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
render: |
type: porsche
{{ include "vehicle-base" . }}

View file

@ -2,8 +2,8 @@ template: renault
products:
- brand: Renault
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: vin
example: WREN...
render: |

View file

@ -4,8 +4,8 @@ products:
description:
generic: Cupra Born, My Cupra
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
render: |
type: cupra
{{ include "vehicle-base" . }}

View file

@ -5,8 +5,8 @@ products:
de: Andere
en: Others
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
render: |
type: seat
{{ include "vehicle-base" . }}

View file

@ -8,7 +8,7 @@ products:
# generic: MÓ
group: scooter
params:
- preset: vehiclebase
- preset: vehicle-base
- name: vin
example: W...
- name: icon

View file

@ -4,8 +4,8 @@ products:
description:
generic: Enyaq
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
render: |
type: enyaq
{{ include "vehicle-base" . }}

View file

@ -5,8 +5,8 @@ products:
de: Andere
en: Others
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
render: |
type: skoda
{{ include "vehicle-base" . }}

View file

@ -4,8 +4,8 @@ products:
description:
generic: EQ
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: capacity
default: 17.6
render: |

View file

@ -37,7 +37,7 @@ params:
- name: icon
default: car
advanced: true
- preset: vehicleidentify
- preset: vehicle-identify
render: |
type: tesla
{{- if ne .title "" }}

View file

@ -20,7 +20,7 @@ params:
- name: icon
default: car
advanced: true
- preset: vehicleidentify
- preset: vehicle-identify
render: |
type: tronity
{{- if ne .title "" }}

View file

@ -2,8 +2,8 @@ template: volvo-connected
products:
- brand: Volvo
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: vccapikey
required: true
help:

View file

@ -2,8 +2,8 @@ template: volvo
products:
- brand: Volvo (legacy)
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
render: |
type: volvo
{{ include "vehicle-base" . }}

View file

@ -8,8 +8,8 @@ requirements:
de: ID.3, ID.4 (funktioniert auch für e-Golf, e-Up)
en: ID.3, ID.4 (also works for e-Golf, e-Up)
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: vin
example: WVWZZZ...
render: |

View file

@ -8,8 +8,8 @@ requirements:
de: ältere Modelle wie e-Up, e-Golf, etc.
en: older Models like e-Up, e-Golf, etc.
params:
- preset: vehiclebase
- preset: vehicleidentify
- preset: vehicle-base
- preset: vehicle-identify
- name: vin
example: WVWZZZ...
render: |

View file

@ -1,17 +1,19 @@
package templates
import (
_ "embed"
"fmt"
"github.com/evcc-io/evcc/templates/definition"
"gopkg.in/yaml.v3"
)
type ConfigDefaults struct {
//go:embed defaults.yaml
var defaults []byte
type configDefaults struct {
Params []Param // Default values for common parameters
Presets map[string]struct {
Params []Param
Render string
}
Modbus struct { // Details about possible ModbusInterfaces and ModbusConnectionTypes
Interfaces map[string][]string // Information about physical modbus interface types (rs485, tcpip)
@ -24,13 +26,13 @@ type ConfigDefaults struct {
}
// read the actual config into the struct, but only once
func (c *ConfigDefaults) LoadDefaults() {
func (c *configDefaults) Load() {
// if params are initialized, defaults have been loaded
if c.Params != nil {
return
}
if err := yaml.Unmarshal([]byte(definition.DefaultsContent), &c); err != nil {
if err := yaml.Unmarshal(defaults, &c); err != nil {
panic(fmt.Errorf("failed to parse deviceGroupListDefinition: %v", err))
}
@ -55,7 +57,7 @@ func (c *ConfigDefaults) LoadDefaults() {
}
// return the param with the given name
func (c *ConfigDefaults) ParamByName(name string) (int, Param) {
func (c *configDefaults) ParamByName(name string) (int, Param) {
for i, param := range c.Params {
if param.Name == name {
return i, param

View file

@ -290,7 +290,7 @@ params:
de: Die AIN ist auf dem Typenschild auf der Geräterückseite aufgedruckt. Bei führenden Nullen bitte in doppelte Hochkommata setzen.
presets:
vehiclebase:
vehicle-base:
params:
- name: title
- name: user
@ -308,30 +308,7 @@ presets:
default: 15m
advanced: true
type: duration
render: |
{{define "vehicle-base"}}
{{- if ne .title "" }}
title: {{ .title }}
{{- end }}
{{- if ne .icon "" }}
icon: {{ .icon }}
{{- end }}
user: {{ .user }}
password: {{ .password }}
{{- if ne .capacity "" }}
capacity: {{ .capacity }}
{{- end }}
{{- if ne .vin "" }}
vin: {{ .vin }}
{{- end }}
{{- if ne .phases "" }}
phases: {{ .phases }}
{{- end }}
{{- if ne .cache "" }}
cache: {{ .cache }}
{{- end }}
{{end}}
vehicleidentify:
vehicle-identify:
params:
- name: mode
advanced: true
@ -348,64 +325,17 @@ presets:
type: stringlist
- name: priority
advanced: true
render: |
{{define "vehicle-identify"}}
{{- if or (ne .mode "") (ne .minSoc "") (ne .targetSoc "") (ne .minCurrent "") (ne .maxCurrent "") (ne .priority "") }}
onIdentify:
{{- if (ne .mode "") }}
mode: {{ .mode }}
{{- end }}
{{- if (ne .minSoc "") }}
minSoc: {{ .minSoc }}
{{- end }}
{{- if (ne .targetSoc "") }}
targetSoc: {{ .targetSoc }}
{{- end }}
{{- if (ne .minCurrent "") }}
minCurrent: {{ .minCurrent }}
{{- end }}
{{- if (ne .maxCurrent "") }}
maxCurrent: {{ .maxCurrent }}
{{- end }}
{{- if (ne .priority "") }}
- priority: {{ .priority }}
{{- end }}
{{- end }}
{{- if ne (len .identifiers) 0 }}
identifiers:
{{- range .identifiers }}
- {{ . }}
{{- end }}
{{- end }}
{{end}}
vehiclelanguage:
vehicle-language:
params:
- name: language
render: |
{{define "vehicle-language"}}
language: {{ .language }}
{{end}}
eebusmeter:
eebus-meter:
params:
- name: ski
- name: ip
render: |
{{define "eebus-meter"}}
type: eebus
ski: {{ .ski }}
{{ if ne .ip "" }}ip: {{ .ip }}{{ end }}
meter: true
{{end}}
eebusnometer:
eebus-no-meter:
params:
- name: ski
- name: ip
render: |
{{define "eebus-no-meter"}}
type: eebus
ski: {{ .ski }}
{{ if ne .ip "" }}ip: {{ .ip }}{{ end }}
{{end}}
switchsocket:
params:
- name: integrateddevice
@ -416,9 +346,6 @@ presets:
en: Integrated device (no vehicle connection)
- name: icon
advanced: true
render: |
{{ if eq .integrateddevice "true" }}features: ["integrateddevice"]{{ end }}
{{ if ne .icon "" }}icon: {{ .icon }}{{ end }}
modbus:
interfaces:

View file

@ -96,10 +96,9 @@ func (t *Template) RenderDocumentation(product Product, values map[string]interf
}
tmpl, err := template.New("yaml").Funcs(template.FuncMap(sprig.FuncMap())).Parse(documentationTmpl)
if err != nil {
panic(err)
if err == nil {
err = tmpl.Execute(out, data)
}
err = tmpl.Execute(out, data)
// trim empty lines with whitespace
regex, _ := regexp.Compile("\n *\n")

View file

@ -0,0 +1,6 @@
{{define "eebus-meter"}}
type: eebus
ski: {{ .ski }}
{{ if ne .ip "" }}ip: {{ .ip }}{{ end }}
meter: true
{{end}}

View file

@ -0,0 +1,5 @@
{{define "eebus-no-meter"}}
type: eebus
ski: {{ .ski }}
{{ if ne .ip "" }}ip: {{ .ip }}{{ end }}
{{end}}

View file

@ -0,0 +1,4 @@
{{define "switchsocket"}}
{{ if eq .integrateddevice "true" }}features: ["integrateddevice"]{{ end }}
{{ if ne .icon "" }}icon: {{ .icon }}{{ end }}
{{end}}

View file

@ -0,0 +1,22 @@
{{define "vehicle-base"}}
{{- if ne .title "" }}
title: {{ .title }}
{{- end }}
{{- if ne .icon "" }}
icon: {{ .icon }}
{{- end }}
user: {{ .user }}
password: {{ .password }}
{{- if ne .capacity "" }}
capacity: {{ .capacity }}
{{- end }}
{{- if ne .vin "" }}
vin: {{ .vin }}
{{- end }}
{{- if ne .phases "" }}
phases: {{ .phases }}
{{- end }}
{{- if ne .cache "" }}
cache: {{ .cache }}
{{- end }}
{{end}}

View file

@ -0,0 +1,29 @@
{{define "vehicle-identify"}}
{{- if or (ne .mode "") (ne .minSoc "") (ne .targetSoc "") (ne .minCurrent "") (ne .maxCurrent "") (ne .priority "") }}
onIdentify:
{{- if (ne .mode "") }}
mode: {{ .mode }}
{{- end }}
{{- if (ne .minSoc "") }}
minSoc: {{ .minSoc }}
{{- end }}
{{- if (ne .targetSoc "") }}
targetSoc: {{ .targetSoc }}
{{- end }}
{{- if (ne .minCurrent "") }}
minCurrent: {{ .minCurrent }}
{{- end }}
{{- if (ne .maxCurrent "") }}
maxCurrent: {{ .maxCurrent }}
{{- end }}
{{- if (ne .priority "") }}
- priority: {{ .priority }}
{{- end }}
{{- end }}
{{- if ne (len .identifiers) 0 }}
identifiers:
{{- range .identifiers }}
- {{ . }}
{{- end }}
{{- end }}
{{end}}

View file

@ -0,0 +1,3 @@
{{define "vehicle-language"}}
language: {{ .language }}
{{end}}

View file

@ -2,10 +2,12 @@ package templates
import (
"bytes"
"embed"
"fmt"
"io/fs"
"path"
"sync"
"text/template"
"github.com/evcc-io/evcc/templates/definition"
"golang.org/x/exp/slices"
@ -13,15 +15,22 @@ import (
)
var (
templates = make(map[Class][]Template)
configDefaults = ConfigDefaults{}
//go:embed includes/*.tpl
includeFS embed.FS
// baseTmpl holds all included template definitions
baseTmpl *template.Template
templates = make(map[Class][]Template)
ConfigDefaults configDefaults
mu sync.Mutex
encoderLanguage string
)
func init() {
configDefaults.LoadDefaults()
ConfigDefaults.Load()
baseTmpl = template.Must(template.ParseFS(includeFS, "includes/*.tpl"))
loadTemplates(Charger)
loadTemplates(Meter)
@ -40,7 +49,6 @@ func FromBytes(b []byte) (Template, error) {
tmpl := Template{
TemplateDefinition: definition,
ConfigDefaults: configDefaults,
}
err := tmpl.ResolvePresets()

View file

@ -16,8 +16,6 @@ import (
type Template struct {
TemplateDefinition
ConfigDefaults ConfigDefaults `json:"-"`
title string
titles []string
}
@ -31,7 +29,7 @@ func (t *Template) GuidedSetupEnabled() bool {
// UpdateParamWithDefaults adds default values to specific param name entries
func (t *Template) UpdateParamsWithDefaults() error {
for i, p := range t.Params {
if index, resultMapItem := t.ConfigDefaults.ParamByName(strings.ToLower(p.Name)); index > -1 {
if index, resultMapItem := ConfigDefaults.ParamByName(strings.ToLower(p.Name)); index > -1 {
t.Params[i].OverwriteProperties(resultMapItem)
}
}
@ -115,7 +113,7 @@ func (t *Template) ResolvePresets() error {
t.Params = []Param{}
for _, p := range currentParams {
if p.Preset != "" {
base, ok := t.ConfigDefaults.Presets[p.Preset]
base, ok := ConfigDefaults.Presets[p.Preset]
if !ok {
return fmt.Errorf("could not find preset definition: %s", p.Preset)
}
@ -142,7 +140,7 @@ func (t *Template) ResolveGroup() error {
return nil
}
_, ok := t.ConfigDefaults.DeviceGroups[t.Group]
_, ok := ConfigDefaults.DeviceGroups[t.Group]
if !ok {
return fmt.Errorf("could not find devicegroup definition: %s", t.Group)
}
@ -152,7 +150,7 @@ func (t *Template) ResolveGroup() error {
// return the language specific group title
func (t *Template) GroupTitle(lang string) string {
tl := t.ConfigDefaults.DeviceGroups[t.Group]
tl := ConfigDefaults.DeviceGroups[t.Group]
return tl.String(lang)
}
@ -277,13 +275,6 @@ func (t *Template) RenderResult(renderMode string, other map[string]interface{})
t.ModbusValues(renderMode, values)
// add the common templates
for _, v := range t.ConfigDefaults.Presets {
if !strings.Contains(t.Render, v.Render) {
t.Render += "\n" + v.Render
}
}
res := make(map[string]interface{})
// TODO this is an utterly horrible hack
@ -350,7 +341,10 @@ func (t *Template) RenderResult(renderMode string, other map[string]interface{})
},
}
tmpl, err := tmpl.Funcs(template.FuncMap(sprig.FuncMap())).Funcs(funcMap).Parse(t.Render)
tmpl, err := baseTmpl.Clone()
if err == nil {
tmpl, err = tmpl.Funcs(sprig.FuncMap()).Funcs(funcMap).Parse(t.Render)
}
if err != nil {
return nil, res, err
}

View file

@ -28,7 +28,7 @@ func (t *Template) ModbusParams(modbusType string, values map[string]interface{}
return
}
modbusParams := t.ConfigDefaults.Modbus.Types[values[ParamModbus].(string)].Params
modbusParams := ConfigDefaults.Modbus.Types[values[ParamModbus].(string)].Params
// add the modbus params at the beginning
t.Params = append(modbusParams, t.Params...)
@ -46,7 +46,7 @@ func (t *Template) ModbusValues(renderMode string, values map[string]interface{}
t.Render = fmt.Sprintf("%s\n%s", t.Render, modbusTmpl)
}
modbusConfig := t.ConfigDefaults.Modbus
modbusConfig := ConfigDefaults.Modbus
_, modbusParam := t.ParamByName(ParamModbus)
modbusInterfaces := []string{}