Various template improvements (#2119)
- Remove unused port param in senec-home template - Support for multiple predefined param sets, also adds identifier params to Tesla, Tronity, OVMS, ... - Properly handle optional number/float checks - Add Dacia vehicle template
This commit is contained in:
parent
87182add66
commit
bfb61c4965
37 changed files with 165 additions and 94 deletions
|
|
@ -171,6 +171,9 @@ func (c *CmdConfigure) askValue(q question) string {
|
|||
}
|
||||
|
||||
if q.valueType == templates.ParamValueTypeFloat {
|
||||
if value == "" && !q.required {
|
||||
return nil
|
||||
}
|
||||
_, err := strconv.ParseFloat(value, 64)
|
||||
if err != nil {
|
||||
return errors.New(c.localizedString("ValueError_Float", nil))
|
||||
|
|
@ -178,6 +181,10 @@ func (c *CmdConfigure) askValue(q question) string {
|
|||
}
|
||||
|
||||
if q.valueType == templates.ParamValueTypeNumber {
|
||||
if value == "" && !q.required {
|
||||
return nil
|
||||
}
|
||||
|
||||
intValue, err := strconv.ParseInt(value, 10, 64)
|
||||
if err != nil {
|
||||
return errors.New(c.localizedString("ValueError_Number", nil))
|
||||
|
|
|
|||
|
|
@ -76,18 +76,14 @@ Example Use Case: With SMA Home Manager, there can be a SMA Energy Meter used fo
|
|||
|
||||
`loglevel` defindes the name that can be used in the `levels` configuration for adjusting the log level of individual devices/components/...
|
||||
|
||||
## `paramsbase`
|
||||
|
||||
`paramsbase` allows to use a predefined set of params, so they don't need to be redefined in each template. The `example` and `default` values for each predefined value can be overwritten.
|
||||
|
||||
**Possible values**:
|
||||
|
||||
- `vehicle`: Provides a set of params that are used in most vehicles
|
||||
|
||||
## `params`
|
||||
|
||||
`params` describes the set of parameters the user needs to provide a value for.
|
||||
|
||||
## `base`
|
||||
|
||||
`base` reference value of a predefined params set defined in `parambaselist.yaml`, so these params don't need to be redefined in each template. The `example` and `default` values for each predefined value can be overwritten.
|
||||
|
||||
### `name`
|
||||
|
||||
`name` expects a name for the parameter, which will be used in the `render` section to reference the param and provide the user entered value.
|
||||
|
|
|
|||
|
|
@ -8,8 +8,6 @@ params:
|
|||
- name: host
|
||||
required: true
|
||||
example: 192.0.2.2
|
||||
- name: port
|
||||
default: 8080
|
||||
render: |
|
||||
type: custom
|
||||
power:
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
vehicle:
|
||||
vehiclebase:
|
||||
params:
|
||||
- name: title
|
||||
- name: user
|
||||
|
|
@ -12,21 +12,8 @@ vehicle:
|
|||
default: '50'
|
||||
- name: cache
|
||||
advanced: true
|
||||
- name: mode
|
||||
advanced: true
|
||||
- name: minSoC
|
||||
advanced: true
|
||||
- name: targetSoC
|
||||
advanced: true
|
||||
- name: minCurrent
|
||||
advanced: true
|
||||
- name: maxCurrent
|
||||
advanced: true
|
||||
- name: identifiers
|
||||
advanced: true
|
||||
valueType: stringlist
|
||||
render: |
|
||||
{{define "vehicle-common"}}
|
||||
{{define "vehicle-base"}}
|
||||
{{- if ne .title "" }}
|
||||
title: {{ .title }}
|
||||
{{- end }}
|
||||
|
|
@ -41,6 +28,24 @@ vehicle:
|
|||
{{- if ne .cache "" }}
|
||||
cache: {{ .cache }}
|
||||
{{- end }}
|
||||
{{end}}
|
||||
vehicleidentify:
|
||||
params:
|
||||
- name: mode
|
||||
advanced: true
|
||||
- name: minSoC
|
||||
advanced: true
|
||||
- name: targetSoC
|
||||
advanced: true
|
||||
- name: minCurrent
|
||||
advanced: true
|
||||
- name: maxCurrent
|
||||
advanced: true
|
||||
- name: identifiers
|
||||
advanced: true
|
||||
valueType: stringlist
|
||||
render: |
|
||||
{{define "vehicle-identify"}}
|
||||
{{- if or (ne .mode "") (ne .minSoC "") (ne .targetSoC "") (ne .minCurrent "") (ne .maxCurrent "") }}
|
||||
onIdentify:
|
||||
{{- if (ne .mode "") }}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
template: audi
|
||||
description: Audi
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: vin
|
||||
example: WAUZZZ...
|
||||
- name: capacity
|
||||
default: 60
|
||||
render: |
|
||||
type: audi
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
template: bmw
|
||||
description: BMW
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: vin
|
||||
example: WBMW...
|
||||
- name: capacity
|
||||
default: 65
|
||||
render: |
|
||||
type: bmw
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
template: carwings
|
||||
description: Nissan Leaf (pre 2019)
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 50
|
||||
render: |
|
||||
type: carwings
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
template: citroen
|
||||
description: Citroen
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 50
|
||||
render: |
|
||||
type: citroen
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
11
templates/definition/vehicle/dacia.yaml
Normal file
11
templates/definition/vehicle/dacia.yaml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
template: dacia
|
||||
description: Dacia
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 27,4
|
||||
render: |
|
||||
type: renault
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
@ -1,9 +1,11 @@
|
|||
template: ds
|
||||
description: DS
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 50
|
||||
render: |
|
||||
type: ds
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ params:
|
|||
- name: capacity
|
||||
default: 64
|
||||
valuetype: float
|
||||
- base: vehicleidentify
|
||||
render: |
|
||||
type: custom
|
||||
{{- if ne .title "" }}
|
||||
|
|
|
|||
|
|
@ -1,16 +1,18 @@
|
|||
template: fiat
|
||||
description: Fiat
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- name: pin
|
||||
mask: true
|
||||
- base: vehiclebase
|
||||
- name: vin
|
||||
example: ZFAE...
|
||||
- name: capacity
|
||||
default: 42
|
||||
- name: pin
|
||||
mask: true
|
||||
- base: vehicleidentify
|
||||
render: |
|
||||
type: fiat
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{- if ne .pin "" }}
|
||||
pin: {{ .pin }} #mandatory to deep refresh SoC
|
||||
{{- end }}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
template: ford
|
||||
description: Ford
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: vin
|
||||
example: WF0FXX...
|
||||
- name: capacity
|
||||
default: 10
|
||||
render: |
|
||||
type: ford
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
template: hyundai
|
||||
description: Hyundai
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 64
|
||||
render: |
|
||||
type: hyundai
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
template: kia
|
||||
description: Kia
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 64
|
||||
render: |
|
||||
type: kia
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
template: mini
|
||||
description: Mini
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: vin
|
||||
example: WBMW...
|
||||
- name: capacity
|
||||
default: 32
|
||||
render: |
|
||||
type: mini
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
template: nissan
|
||||
description: Nissan
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 60
|
||||
render: |
|
||||
type: nissan
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ params:
|
|||
mask: true
|
||||
- name: serial
|
||||
required: true
|
||||
- base: vehicleidentify
|
||||
render: |
|
||||
type: niu
|
||||
{{- if ne .title "" }}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
template: opel
|
||||
description: Opel
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: vin
|
||||
example: WP0...
|
||||
- name: capacity
|
||||
default: 50
|
||||
render: |
|
||||
type: opel
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ params:
|
|||
required: true
|
||||
- name: capacity
|
||||
default: 12
|
||||
- base: vehicleidentify
|
||||
render: |
|
||||
type: ovms
|
||||
{{- if ne .title "" }}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
template: peugeot
|
||||
description: Peugeot
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 50
|
||||
render: |
|
||||
type: peugeot
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
template: porsche
|
||||
description: Porsche
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 83.4
|
||||
render: |
|
||||
type: porsche
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
template: renault
|
||||
description: Renault
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: vin
|
||||
example: WREN...
|
||||
- name: capacity
|
||||
default: 60
|
||||
render: |
|
||||
type: renault
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
template: seat
|
||||
description: Seat (Cupra, Mii)
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 10
|
||||
render: |
|
||||
type: seat
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
template: skoda
|
||||
description: Skoda (Citigo)
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 10
|
||||
render: |
|
||||
type: skoda
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
template: enyaq
|
||||
description: Skoda (Enyaq)
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 50
|
||||
render: |
|
||||
type: enyaq
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ params:
|
|||
example: W...
|
||||
- name: capacity
|
||||
default: 90
|
||||
- base: vehicleidentify
|
||||
render: |
|
||||
type: tesla
|
||||
{{- if ne .title "" }}
|
||||
|
|
@ -28,3 +29,4 @@ render: |
|
|||
{{- if ne .vin "" }}
|
||||
vin: {{ .vin }}
|
||||
{{- end }}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ params:
|
|||
example: W...
|
||||
- name: capacity
|
||||
default: 10
|
||||
- base: vehicleidentify
|
||||
render: |
|
||||
type: tronity
|
||||
{{- if ne .title "" }}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
template: volvo
|
||||
description: Volvo
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: capacity
|
||||
default: 50
|
||||
render: |
|
||||
type: volvo
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
template: vw
|
||||
description: Volkswagen (We Connect)
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: vin
|
||||
example: WVWZZZ...
|
||||
- name: capacity
|
||||
default: 10
|
||||
render: |
|
||||
type: vw
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
template: id
|
||||
description: Volkswagen (We Connect ID)
|
||||
paramsbase: vehicle
|
||||
params:
|
||||
- base: vehiclebase
|
||||
- base: vehicleidentify
|
||||
- name: vin
|
||||
example: WVWZZZ...
|
||||
- name: capacity
|
||||
default: 50
|
||||
render: |
|
||||
type: id
|
||||
{{include "vehicle-common" .}}
|
||||
{{include "vehicle-base" .}}
|
||||
{{include "vehicle-identify" .}}
|
||||
|
|
|
|||
|
|
@ -2,5 +2,4 @@ type: template
|
|||
template: senec-home
|
||||
description: SENEC.Home
|
||||
usage: battery
|
||||
host: 192.0.2.2
|
||||
port: 8080
|
||||
host: 192.0.2.2
|
||||
|
|
@ -2,5 +2,4 @@ type: template
|
|||
template: senec-home
|
||||
description: SENEC.Home
|
||||
usage: grid
|
||||
host: 192.0.2.2
|
||||
port: 8080
|
||||
host: 192.0.2.2
|
||||
|
|
@ -2,5 +2,4 @@ type: template
|
|||
template: senec-home
|
||||
description: SENEC.Home
|
||||
usage: pv
|
||||
host: 192.0.2.2
|
||||
port: 8080
|
||||
host: 192.0.2.2
|
||||
7
templates/docs/vehicle/dacia.yaml
Normal file
7
templates/docs/vehicle/dacia.yaml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
type: template
|
||||
template: dacia
|
||||
description: Dacia
|
||||
user:
|
||||
password:
|
||||
vin: W...
|
||||
capacity: 27,4
|
||||
|
|
@ -41,7 +41,9 @@ func loadTemplates(class string) {
|
|||
if err = yaml.Unmarshal(b, &tmpl); err != nil {
|
||||
return fmt.Errorf("reading template '%s' failed: %w", filepath, err)
|
||||
}
|
||||
tmpl.ResolveParamBase()
|
||||
if err = tmpl.ResolveParamBases(); err != nil {
|
||||
return err
|
||||
}
|
||||
if err = tmpl.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -118,7 +118,8 @@ type LinkedTemplate struct {
|
|||
|
||||
// Param is a proxy template parameter
|
||||
type Param struct {
|
||||
Name string
|
||||
Base string // Reference a predefined se of params
|
||||
Name string // Param name which is used for assigning defaults properties and referencing in render
|
||||
Required bool // cli if the user has to provide a non empty value
|
||||
Mask bool // cli if the value should be masked, e.g. for passwords
|
||||
Advanced bool // cli if the user does not need to be asked. Requires a "Default" to be defined.
|
||||
|
|
@ -150,8 +151,7 @@ type Template struct {
|
|||
Description string // user friendly description of the device this template describes
|
||||
Requirements Requirements
|
||||
GuidedSetup GuidedSetup
|
||||
Generic bool // if this describes a generic device type rather than a product
|
||||
ParamsBase string // references a base param set to inherit from
|
||||
Generic bool // if this describes a generic device type rather than a product
|
||||
Params []Param
|
||||
Render string // rendering template
|
||||
}
|
||||
|
|
@ -178,30 +178,28 @@ func (t *Template) Validate() error {
|
|||
}
|
||||
|
||||
// add the referenced base Params and overwrite existing ones
|
||||
func (t *Template) ResolveParamBase() {
|
||||
if t.ParamsBase == "" {
|
||||
return
|
||||
}
|
||||
|
||||
func (t *Template) ResolveParamBases() error {
|
||||
if paramBaseList == nil {
|
||||
err := yaml.Unmarshal([]byte(definition.ParamBaseListDefinition), ¶mBaseList)
|
||||
if err != nil {
|
||||
fmt.Printf("Error: failed to parse paramBasesDefinition: %v\n", err)
|
||||
return
|
||||
return fmt.Errorf("Error: failed to parse paramBasesDefinition: %v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
base, ok := paramBaseList[t.ParamsBase]
|
||||
if !ok {
|
||||
fmt.Printf("Error: Could not find parambase definition: %s\n", t.ParamsBase)
|
||||
return
|
||||
}
|
||||
|
||||
currentParams := make([]Param, len(t.Params))
|
||||
copy(currentParams, t.Params)
|
||||
t.Params = make([]Param, len(base.Params))
|
||||
copy(t.Params, base.Params)
|
||||
t.Params = []Param{}
|
||||
for _, p := range currentParams {
|
||||
if p.Base != "" {
|
||||
base, ok := paramBaseList[p.Base]
|
||||
if !ok {
|
||||
return fmt.Errorf("Error: Could not find parambase definition: %s\n", p.Base)
|
||||
}
|
||||
|
||||
t.Params = append(t.Params, base.Params...)
|
||||
continue
|
||||
}
|
||||
|
||||
if i, item := t.paramWithName(p.Name); item != nil {
|
||||
// we only allow overwriting a few fields
|
||||
if p.Default != "" {
|
||||
|
|
@ -214,6 +212,8 @@ func (t *Template) ResolveParamBase() {
|
|||
t.Params = append(t.Params, p)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Defaults returns a map of default values for the template
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue