diff --git a/cmd/configure/survey.go b/cmd/configure/survey.go index fb39649be..a4ced4ccb 100644 --- a/cmd/configure/survey.go +++ b/cmd/configure/survey.go @@ -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)) diff --git a/templates/README.md b/templates/README.md index 7b7a9aa1f..4f3f73401 100644 --- a/templates/README.md +++ b/templates/README.md @@ -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. diff --git a/templates/definition/meter/senec-home.yaml b/templates/definition/meter/senec-home.yaml index b6d356aef..b54c4deeb 100644 --- a/templates/definition/meter/senec-home.yaml +++ b/templates/definition/meter/senec-home.yaml @@ -8,8 +8,6 @@ params: - name: host required: true example: 192.0.2.2 -- name: port - default: 8080 render: | type: custom power: diff --git a/templates/definition/parambaselist.yaml b/templates/definition/parambaselist.yaml index 45d6aa0f6..95011d9a3 100644 --- a/templates/definition/parambaselist.yaml +++ b/templates/definition/parambaselist.yaml @@ -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 "") }} diff --git a/templates/definition/vehicle/audi.yaml b/templates/definition/vehicle/audi.yaml index 3853d27fa..863ce987b 100644 --- a/templates/definition/vehicle/audi.yaml +++ b/templates/definition/vehicle/audi.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/bmw.yaml b/templates/definition/vehicle/bmw.yaml index d269abf25..dbdaa9435 100644 --- a/templates/definition/vehicle/bmw.yaml +++ b/templates/definition/vehicle/bmw.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/carwings.yaml b/templates/definition/vehicle/carwings.yaml index 364b5d884..4333e2f60 100644 --- a/templates/definition/vehicle/carwings.yaml +++ b/templates/definition/vehicle/carwings.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/citroen.yaml b/templates/definition/vehicle/citroen.yaml index c2de10842..deb2b78e1 100644 --- a/templates/definition/vehicle/citroen.yaml +++ b/templates/definition/vehicle/citroen.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/dacia.yaml b/templates/definition/vehicle/dacia.yaml new file mode 100644 index 000000000..ffed34909 --- /dev/null +++ b/templates/definition/vehicle/dacia.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/ds.yaml b/templates/definition/vehicle/ds.yaml index 30896b7b7..7c1ff91b7 100644 --- a/templates/definition/vehicle/ds.yaml +++ b/templates/definition/vehicle/ds.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/evnotify.yaml b/templates/definition/vehicle/evnotify.yaml index 228e10d6b..f2101d60c 100644 --- a/templates/definition/vehicle/evnotify.yaml +++ b/templates/definition/vehicle/evnotify.yaml @@ -9,6 +9,7 @@ params: - name: capacity default: 64 valuetype: float +- base: vehicleidentify render: | type: custom {{- if ne .title "" }} diff --git a/templates/definition/vehicle/fiat.yaml b/templates/definition/vehicle/fiat.yaml index 57ff40195..937c2de57 100644 --- a/templates/definition/vehicle/fiat.yaml +++ b/templates/definition/vehicle/fiat.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/ford.yaml b/templates/definition/vehicle/ford.yaml index b4893f2aa..a85f07898 100644 --- a/templates/definition/vehicle/ford.yaml +++ b/templates/definition/vehicle/ford.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/hyundai.yaml b/templates/definition/vehicle/hyundai.yaml index 418fc41a5..1b7485475 100644 --- a/templates/definition/vehicle/hyundai.yaml +++ b/templates/definition/vehicle/hyundai.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/kia.yaml b/templates/definition/vehicle/kia.yaml index 72d4d5925..437c404f3 100644 --- a/templates/definition/vehicle/kia.yaml +++ b/templates/definition/vehicle/kia.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/mini.yaml b/templates/definition/vehicle/mini.yaml index 51d69055e..1a92ae454 100644 --- a/templates/definition/vehicle/mini.yaml +++ b/templates/definition/vehicle/mini.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/nissan.yaml b/templates/definition/vehicle/nissan.yaml index 9d88d8c7a..303535532 100644 --- a/templates/definition/vehicle/nissan.yaml +++ b/templates/definition/vehicle/nissan.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/niu-e-scooter.yaml b/templates/definition/vehicle/niu-e-scooter.yaml index e5d31e55c..c2bbf8595 100644 --- a/templates/definition/vehicle/niu-e-scooter.yaml +++ b/templates/definition/vehicle/niu-e-scooter.yaml @@ -9,6 +9,7 @@ params: mask: true - name: serial required: true +- base: vehicleidentify render: | type: niu {{- if ne .title "" }} diff --git a/templates/definition/vehicle/opel.yaml b/templates/definition/vehicle/opel.yaml index 8deb392b8..fa809f84f 100644 --- a/templates/definition/vehicle/opel.yaml +++ b/templates/definition/vehicle/opel.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/ovms.yaml b/templates/definition/vehicle/ovms.yaml index cb10bc36d..463e7661e 100644 --- a/templates/definition/vehicle/ovms.yaml +++ b/templates/definition/vehicle/ovms.yaml @@ -11,6 +11,7 @@ params: required: true - name: capacity default: 12 +- base: vehicleidentify render: | type: ovms {{- if ne .title "" }} diff --git a/templates/definition/vehicle/peugeot.yaml b/templates/definition/vehicle/peugeot.yaml index 06e3fd01b..2a9eef928 100644 --- a/templates/definition/vehicle/peugeot.yaml +++ b/templates/definition/vehicle/peugeot.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/porsche.yaml b/templates/definition/vehicle/porsche.yaml index 52b43957b..a9afa229a 100644 --- a/templates/definition/vehicle/porsche.yaml +++ b/templates/definition/vehicle/porsche.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/renault.yaml b/templates/definition/vehicle/renault.yaml index f76df27cf..e6dab8de3 100644 --- a/templates/definition/vehicle/renault.yaml +++ b/templates/definition/vehicle/renault.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/seat.yaml b/templates/definition/vehicle/seat.yaml index aa62d826f..8c727fb78 100644 --- a/templates/definition/vehicle/seat.yaml +++ b/templates/definition/vehicle/seat.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/skoda.yaml b/templates/definition/vehicle/skoda.yaml index 901db02eb..69386ba41 100644 --- a/templates/definition/vehicle/skoda.yaml +++ b/templates/definition/vehicle/skoda.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/skodaenyaq.yaml b/templates/definition/vehicle/skodaenyaq.yaml index ed547bf33..e9eef716c 100644 --- a/templates/definition/vehicle/skodaenyaq.yaml +++ b/templates/definition/vehicle/skodaenyaq.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/tesla.yaml b/templates/definition/vehicle/tesla.yaml index b77b03756..229b223d5 100644 --- a/templates/definition/vehicle/tesla.yaml +++ b/templates/definition/vehicle/tesla.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/tronity.yaml b/templates/definition/vehicle/tronity.yaml index aa4b84612..9a1ba905e 100644 --- a/templates/definition/vehicle/tronity.yaml +++ b/templates/definition/vehicle/tronity.yaml @@ -16,6 +16,7 @@ params: example: W... - name: capacity default: 10 +- base: vehicleidentify render: | type: tronity {{- if ne .title "" }} diff --git a/templates/definition/vehicle/volvo.yaml b/templates/definition/vehicle/volvo.yaml index b76bad993..380250cd4 100644 --- a/templates/definition/vehicle/volvo.yaml +++ b/templates/definition/vehicle/volvo.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/vw.yaml b/templates/definition/vehicle/vw.yaml index d10093351..e4099df77 100644 --- a/templates/definition/vehicle/vw.yaml +++ b/templates/definition/vehicle/vw.yaml @@ -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" .}} diff --git a/templates/definition/vehicle/vwid.yaml b/templates/definition/vehicle/vwid.yaml index 84ac0f35e..c7c14c4e0 100644 --- a/templates/definition/vehicle/vwid.yaml +++ b/templates/definition/vehicle/vwid.yaml @@ -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" .}} diff --git a/templates/docs/meter/senec-home-battery.yaml b/templates/docs/meter/senec-home-battery.yaml index 051ef2e26..64d74e264 100644 --- a/templates/docs/meter/senec-home-battery.yaml +++ b/templates/docs/meter/senec-home-battery.yaml @@ -2,5 +2,4 @@ type: template template: senec-home description: SENEC.Home usage: battery -host: 192.0.2.2 -port: 8080 \ No newline at end of file +host: 192.0.2.2 \ No newline at end of file diff --git a/templates/docs/meter/senec-home-grid.yaml b/templates/docs/meter/senec-home-grid.yaml index efc8f2065..e548032ce 100644 --- a/templates/docs/meter/senec-home-grid.yaml +++ b/templates/docs/meter/senec-home-grid.yaml @@ -2,5 +2,4 @@ type: template template: senec-home description: SENEC.Home usage: grid -host: 192.0.2.2 -port: 8080 \ No newline at end of file +host: 192.0.2.2 \ No newline at end of file diff --git a/templates/docs/meter/senec-home-pv.yaml b/templates/docs/meter/senec-home-pv.yaml index a8829bcac..df87a6f8f 100644 --- a/templates/docs/meter/senec-home-pv.yaml +++ b/templates/docs/meter/senec-home-pv.yaml @@ -2,5 +2,4 @@ type: template template: senec-home description: SENEC.Home usage: pv -host: 192.0.2.2 -port: 8080 \ No newline at end of file +host: 192.0.2.2 \ No newline at end of file diff --git a/templates/docs/vehicle/dacia.yaml b/templates/docs/vehicle/dacia.yaml new file mode 100644 index 000000000..bb4b6ec2e --- /dev/null +++ b/templates/docs/vehicle/dacia.yaml @@ -0,0 +1,7 @@ +type: template +template: dacia +description: Dacia +user: +password: +vin: W... +capacity: 27,4 \ No newline at end of file diff --git a/util/templates/init.go b/util/templates/init.go index b55ea14b2..5a921d575 100644 --- a/util/templates/init.go +++ b/util/templates/init.go @@ -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 } diff --git a/util/templates/template.go b/util/templates/template.go index fe5cbd07b..2fddc6b80 100644 --- a/util/templates/template.go +++ b/util/templates/template.go @@ -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