From 06a68d8c40c9d08820d0948adcc2c55a14621740 Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 26 Feb 2023 13:40:15 +0100 Subject: [PATCH] Switch sockets: allow removing vehicle selection for integrated devices (#6368) --- cmd/configure/eebus.go | 4 +- cmd/configure/flow.go | 8 +- cmd/configure/helper.go | 64 ++++------- cmd/configure/localization/de.toml | 1 + cmd/configure/localization/en.toml | 1 + cmd/configure/main.go | 82 +++++++------- cmd/configure/survey.go | 81 +++++++++----- cmd/configure/texts.go | 16 +-- templates/definition/charger/fritzdect.yaml | 6 +- templates/definition/charger/homematic.yaml | 5 +- templates/definition/charger/ocpp.yaml | 2 +- templates/definition/charger/shelly.yaml | 5 +- templates/definition/charger/tapo.yaml | 1 + templates/definition/charger/tasmota.yaml | 5 +- templates/definition/charger/tplink.yaml | 1 + templates/definition/defaults.yaml | 78 +++++++++----- templates/definition/meter/fritzdect.yaml | 5 - templates/definition/meter/homematic.yaml | 2 +- templates/docs/charger/eebus_0.yaml | 2 +- templates/docs/charger/elliconnect_0.yaml | 2 +- templates/docs/charger/ellipro_0.yaml | 2 +- templates/docs/charger/fritzdect_0.yaml | 12 ++- templates/docs/charger/homematic_0.yaml | 2 + templates/docs/charger/pmcc_0.yaml | 2 +- templates/docs/charger/pmcp_0.yaml | 2 +- templates/docs/charger/shelly_0.yaml | 10 ++ templates/docs/charger/tapo_0.yaml | 9 ++ templates/docs/charger/tasmota_0.yaml | 12 ++- templates/docs/charger/tplink_0.yaml | 7 ++ templates/docs/meter/fritzdect_0.yaml | 4 +- templates/docs/vehicle/aiways_0.yaml | 2 +- templates/docs/vehicle/audi_0.yaml | 2 +- templates/docs/vehicle/bmw_0.yaml | 2 +- templates/docs/vehicle/carwings_0.yaml | 2 +- templates/docs/vehicle/citroen_0.yaml | 2 +- templates/docs/vehicle/cupra_0.yaml | 2 +- templates/docs/vehicle/dacia_0.yaml | 2 +- templates/docs/vehicle/ds_0.yaml | 2 +- templates/docs/vehicle/enyaq_0.yaml | 2 +- templates/docs/vehicle/etron_0.yaml | 2 +- templates/docs/vehicle/evnotify_0.yaml | 2 +- templates/docs/vehicle/fiat_0.yaml | 2 +- templates/docs/vehicle/ford_0.yaml | 2 +- templates/docs/vehicle/hyundai_0.yaml | 2 +- templates/docs/vehicle/id_0.yaml | 2 +- .../docs/vehicle/jaguar-landrover_0.yaml | 2 +- .../docs/vehicle/jaguar-landrover_1.yaml | 2 +- templates/docs/vehicle/kia_0.yaml | 2 +- templates/docs/vehicle/mini_0.yaml | 2 +- templates/docs/vehicle/nissan_0.yaml | 2 +- templates/docs/vehicle/niu-e-scooter_0.yaml | 4 +- templates/docs/vehicle/offline_0.yaml | 2 +- templates/docs/vehicle/opel_0.yaml | 2 +- templates/docs/vehicle/ovms_0.yaml | 2 +- templates/docs/vehicle/peugeot_0.yaml | 2 +- templates/docs/vehicle/porsche_0.yaml | 2 +- templates/docs/vehicle/renault_0.yaml | 2 +- templates/docs/vehicle/seat_0.yaml | 2 +- templates/docs/vehicle/silence_0.yaml | 2 +- templates/docs/vehicle/skoda_0.yaml | 2 +- templates/docs/vehicle/smart_0.yaml | 2 +- templates/docs/vehicle/tesla_0.yaml | 2 +- templates/docs/vehicle/tronity_0.yaml | 2 +- templates/docs/vehicle/volvo-connected_0.yaml | 2 +- templates/docs/vehicle/volvo_0.yaml | 2 +- templates/docs/vehicle/vw_0.yaml | 2 +- util/templates/init.go | 7 -- util/templates/paramtype.go | 23 ++++ util/templates/paramtype_enumer.go | 102 ++++++++++++++++++ util/templates/template.go | 12 +-- util/templates/template_documentation.go | 2 +- util/templates/types.go | 16 +-- 72 files changed, 427 insertions(+), 242 deletions(-) create mode 100644 util/templates/paramtype.go create mode 100644 util/templates/paramtype_enumer.go diff --git a/cmd/configure/eebus.go b/cmd/configure/eebus.go index 428319529..0552a018a 100644 --- a/cmd/configure/eebus.go +++ b/cmd/configure/eebus.go @@ -24,12 +24,12 @@ func (c *CmdConfigure) eebusCertificate() (map[string]interface{}, error) { cert, err := eebus.CreateCertificate() if err != nil { - return eebusConfig, fmt.Errorf("%s", c.localizedString("Error_EEBUS_Certificate_Create", nil)) + return eebusConfig, fmt.Errorf("%s", c.localizedString("Error_EEBUS_Certificate_Create")) } pubKey, privKey, err := eebus.GetX509KeyPair(cert) if err != nil { - return eebusConfig, fmt.Errorf("%s", c.localizedString("Error_EEBUS_Certificate_Use", nil)) + return eebusConfig, fmt.Errorf("%s", c.localizedString("Error_EEBUS_Certificate_Use")) } eebusConfig = map[string]interface{}{ diff --git a/cmd/configure/flow.go b/cmd/configure/flow.go index 2877245f1..ca5933ae2 100644 --- a/cmd/configure/flow.go +++ b/cmd/configure/flow.go @@ -88,7 +88,7 @@ func (c *CmdConfigure) configureDeviceGuidedSetup() { } fmt.Println() - fmt.Println(templateItem.Title() + " " + c.localizedString("Device_Added", nil)) + fmt.Println(templateItem.Title() + " " + c.localizedString("Device_Added")) c.configureLinkedTypes(templateItem) } @@ -169,7 +169,7 @@ func (c *CmdConfigure) configureLinkedTemplate(templateItem templates.Template, c.processDeviceCapabilities(templateItem.Capabilities) fmt.Println() - fmt.Println(templateItem.Title() + " " + c.localizedString("Device_Added", nil)) + fmt.Println(templateItem.Title() + " " + c.localizedString("Device_Added")) return true } break @@ -180,7 +180,7 @@ func (c *CmdConfigure) configureLinkedTemplate(templateItem templates.Template, // configureDeviceCategory lets the user select and configure a device from a specific category func (c *CmdConfigure) configureDeviceCategory(deviceCategory DeviceCategory) (device, []string, error) { fmt.Println() - fmt.Printf("- %s %s\n", c.localizedString("Device_Configure", nil), DeviceCategories[deviceCategory].title) + fmt.Printf("- %s %s\n", c.localizedString("Device_Configure"), DeviceCategories[deviceCategory].title) device := device{ Name: DeviceCategories[deviceCategory].defaultName, @@ -227,7 +227,7 @@ func (c *CmdConfigure) configureDeviceCategory(deviceCategory DeviceCategory) (d } fmt.Println() - fmt.Println(deviceDescription + deviceTitle + " " + c.localizedString("Device_Added", nil)) + fmt.Println(deviceDescription + deviceTitle + " " + c.localizedString("Device_Added")) return device, capabilities, nil } diff --git a/cmd/configure/helper.go b/cmd/configure/helper.go index ac41d91d9..548346f3d 100644 --- a/cmd/configure/helper.go +++ b/cmd/configure/helper.go @@ -19,7 +19,7 @@ import ( func (c *CmdConfigure) processDeviceSelection(deviceCategory DeviceCategory) (templates.Template, error) { templateItem := c.selectItem(deviceCategory) - if templateItem.Title() == c.localizedString("ItemNotPresent", nil) { + if templateItem.Title() == c.localizedString("ItemNotPresent") { return templateItem, c.errItemNotPresent } @@ -123,10 +123,10 @@ func (c *CmdConfigure) processDeviceRequirements(templateItem templates.Template if len(requirementDescription) > 0 { fmt.Println() fmt.Println("-------------------------------------------------") - fmt.Println(c.localizedString("Requirements_Title", nil)) + fmt.Println(c.localizedString("Requirements_Title")) fmt.Println(requirementDescription) if len(templateItem.Requirements.URI) > 0 { - fmt.Println(" " + c.localizedString("Requirements_More", nil) + " " + templateItem.Requirements.URI) + fmt.Println(" " + c.localizedString("Requirements_More") + " " + templateItem.Requirements.URI) } fmt.Println("-------------------------------------------------") } @@ -163,7 +163,7 @@ func (c *CmdConfigure) processDeviceRequirements(templateItem templates.Template fmt.Println() eebusConfig, err := c.eebusCertificate() if err != nil { - return fmt.Errorf("%s: %s", c.localizedString("Requirements_EEBUS_Cert_Error", nil), err) + return fmt.Errorf("%s: %s", c.localizedString("Requirements_EEBUS_Cert_Error"), err) } if err := c.configureEEBus(eebusConfig); err != nil { @@ -181,7 +181,7 @@ func (c *CmdConfigure) processDeviceRequirements(templateItem templates.Template } fmt.Println() - fmt.Println(c.localizedString("Requirements_EEBUS_Pairing", nil)) + fmt.Println(c.localizedString("Requirements_EEBUS_Pairing")) fmt.Scanln() } @@ -194,10 +194,10 @@ func (c *CmdConfigure) processParamRequirements(param templates.Param) error { if len(requirementDescription) > 0 { fmt.Println() fmt.Println("-------------------------------------------------") - fmt.Println(c.localizedString("Requirements_Title", nil)) + fmt.Println(c.localizedString("Requirements_Title")) fmt.Println(requirementDescription) if len(param.Requirements.URI) > 0 { - fmt.Println(" " + c.localizedString("Requirements_More", nil) + " " + param.Requirements.URI) + fmt.Println(" " + c.localizedString("Requirements_More") + " " + param.Requirements.URI) } fmt.Println("-------------------------------------------------") } @@ -217,23 +217,23 @@ func (c *CmdConfigure) askSponsortoken(required, feature bool) error { if required { fmt.Println() if feature { - fmt.Println(c.localizedString("Requirements_Sponsorship_Feature_Title", nil)) + fmt.Println(c.localizedString("Requirements_Sponsorship_Feature_Title")) } else { - fmt.Println(c.localizedString("Requirements_Sponsorship_Title", nil)) + fmt.Println(c.localizedString("Requirements_Sponsorship_Title")) } } else { fmt.Println() - fmt.Println(c.localizedString("Requirements_Sponsorship_Optional_Title", nil)) + fmt.Println(c.localizedString("Requirements_Sponsorship_Optional_Title")) } fmt.Println() - if !c.askYesNo(c.localizedString("Requirements_Sponsorship_Token", nil)) { + if !c.askYesNo(c.localizedString("Requirements_Sponsorship_Token")) { fmt.Println() fmt.Println("--------------------------------------------") return c.errItemNotPresent } sponsortoken := c.askValue(question{ - label: c.localizedString("Requirements_Sponsorship_Token_Input", nil), + label: c.localizedString("Requirements_Sponsorship_Token_Input"), mask: true, required: true, }) @@ -267,29 +267,11 @@ func (c *CmdConfigure) configureMQTT(templateItem templates.Template) (map[strin _, paramPort := templateItem.ConfigDefaults.ParamByName("port") _, paramUser := templateItem.ConfigDefaults.ParamByName("user") _, paramPassword := templateItem.ConfigDefaults.ParamByName("password") - host := c.askValue(question{ - label: paramHost.Description.String(c.lang), - mask: false, - required: true, - }) - port := c.askValue(question{ - label: paramPort.Description.String(c.lang), - mask: false, - required: true, - }) - - user := c.askValue(question{ - label: paramUser.Description.String(c.lang), - mask: false, - required: false, - }) - - password := c.askValue(question{ - label: paramPassword.Description.String(c.lang), - mask: true, - required: false, - }) + host := c.askParam(paramHost) + port := c.askParam(paramPort) + user := c.askParam(paramUser) + password := c.askParam(paramPassword) fmt.Println() fmt.Println("--------------------------------------------") @@ -309,7 +291,7 @@ func (c *CmdConfigure) configureMQTT(templateItem templates.Template) (map[strin } fmt.Println() - question := c.localizedString("TestingMQTTFailed", nil) + question := c.localizedString("TestingMQTTFailed") if !c.askYesNo(question) { return nil, fmt.Errorf("failed configuring mqtt: %w", err) } @@ -392,7 +374,7 @@ func (c *CmdConfigure) paramChoiceValues(params []templates.Param, name string) // Returns a map with param name and values func (c *CmdConfigure) processConfig(templateItem *templates.Template, deviceCategory DeviceCategory) map[string]interface{} { fmt.Println() - fmt.Println(c.localizedString("Config_Title", nil)) + fmt.Println(c.localizedString("Config_Title")) fmt.Println() c.processModbusConfig(templateItem, deviceCategory) @@ -431,7 +413,7 @@ func (c *CmdConfigure) processParams(templateItem *templates.Template, deviceCat } switch param.Type { - case templates.ParamTypeStringList: + case templates.TypeStringList: values := c.processListInputConfig(param) var nonEmptyValues []string for _, value := range values { @@ -466,7 +448,7 @@ func (c *CmdConfigure) processListInputConfig(param templates.Param) []string { break } - if !c.askYesNo(" " + c.localizedString("Config_AddAnotherValue", nil)) { + if !c.askYesNo(" " + c.localizedString("Config_AddAnotherValue")) { break } } @@ -484,7 +466,7 @@ func (c *CmdConfigure) processInputConfig(param templates.Param) string { help := param.Help.ShortString(c.lang) if slices.Contains(param.Requirements.EVCC, templates.RequirementSponsorship) { - help = fmt.Sprintf("%s\n\n%s", help, c.localizedString("Requirements_Sponsorship_Feature_Title", nil)) + help = fmt.Sprintf("%s\n\n%s", help, c.localizedString("Requirements_Sponsorship_Feature_Title")) } value := c.askValue(question{ @@ -498,7 +480,7 @@ func (c *CmdConfigure) processInputConfig(param templates.Param) string { required: param.IsRequired(), }) - if param.Type == templates.ParamTypeBool && value == "true" { + if param.Type == templates.TypeBool && value == "true" { if err := c.processParamRequirements(param); err != nil { return "false" } @@ -539,7 +521,7 @@ func (c *CmdConfigure) processModbusConfig(templateItem *templates.Template, dev // ask for modbus interface type var index int if len(choices) > 1 { - index, _ = c.askChoice(c.localizedString("Config_ModbusInterface", nil), choices) + index, _ = c.askChoice(c.localizedString("Config_ModbusInterface"), choices) } values := make(map[string]interface{}) diff --git a/cmd/configure/localization/de.toml b/cmd/configure/localization/de.toml index dd16445a1..672923d98 100644 --- a/cmd/configure/localization/de.toml +++ b/cmd/configure/localization/de.toml @@ -71,6 +71,7 @@ Config_Yes = "Ja" Config_No = "Nein" Cancel = "Die Konfiguration wurde abgebrochen.\n\nFalls diese geführte Konfiguration für dich noch nicht funktioniert, versuche es doch mal mit der manuellen Konfiguration. Details findest du auf der folgenden Webseite: https://docs.evcc.io/docs/\n" InputError = "Bei der Eingabe ist ein Fehler aufgetreten:" +Value_Choice = "Auswahl:" Value_Help = "Hilfe:" Value_Required = "erforderlich" Value_Optional = "optional" diff --git a/cmd/configure/localization/en.toml b/cmd/configure/localization/en.toml index 94b2c1458..f32d6cbaa 100644 --- a/cmd/configure/localization/en.toml +++ b/cmd/configure/localization/en.toml @@ -71,6 +71,7 @@ Config_Yes = "Yes" Config_No = "No" Cancel = "The configuration was cancelled.\n\nIf this guided configuration process doesn't work for you yet, please try the manual configuration. You can find more details about that on our website: https://docs.evcc.io/docs/\n" InputError = "An input error occurred:" +Value_Choice = "Chose:" Value_Help = "Help:" Value_Required = "required" Value_Optional = "optional" diff --git a/cmd/configure/main.go b/cmd/configure/main.go index 7ca30b1a6..cbf3a5158 100644 --- a/cmd/configure/main.go +++ b/cmd/configure/main.go @@ -71,14 +71,14 @@ func (c *CmdConfigure) Run(log *util.Logger, flagLang string, advancedMode, expa c.setDefaultTexts() fmt.Println() - fmt.Println(c.localizedString("Intro", nil)) + fmt.Println(c.localizedString("Intro")) if !c.advancedMode { // ask the user for his knowledge, so advanced mode can also be turned on this way fmt.Println() - flowIndex, _ := c.askChoice(c.localizedString("Flow_Mode", nil), []string{ - c.localizedString("Flow_Mode_Standard", nil), - c.localizedString("Flow_Mode_Advanced", nil), + flowIndex, _ := c.askChoice(c.localizedString("Flow_Mode"), []string{ + c.localizedString("Flow_Mode_Standard"), + c.localizedString("Flow_Mode_Advanced"), }) if flowIndex == 1 { c.advancedMode = true @@ -102,9 +102,9 @@ func (c *CmdConfigure) Run(log *util.Logger, flagLang string, advancedMode, expa } fmt.Println() - flowIndex, _ := c.askChoice(c.localizedString("Flow_Type", nil), []string{ - c.localizedString("Flow_Type_NewConfiguration", nil), - c.localizedString("Flow_Type_SingleDevice", nil), + flowIndex, _ := c.askChoice(c.localizedString("Flow_Type"), []string{ + c.localizedString("Flow_Type_NewConfiguration"), + c.localizedString("Flow_Type_SingleDevice"), }) switch flowIndex { case 0: @@ -117,9 +117,9 @@ func (c *CmdConfigure) Run(log *util.Logger, flagLang string, advancedMode, expa // configureSingleDevice implements the flow for getting a single device configuration func (c *CmdConfigure) flowSingleDevice(category DeviceCategory) { fmt.Println() - fmt.Println(c.localizedString("Flow_SingleDevice_Setup", nil)) + fmt.Println(c.localizedString("Flow_SingleDevice_Setup")) fmt.Println() - fmt.Println(c.localizedString("Flow_SingleDevice_Select", nil)) + fmt.Println(c.localizedString("Flow_SingleDevice_Select")) // only consider the device categories that are marked for this flow categoryChoices := []string{ @@ -133,7 +133,7 @@ func (c *CmdConfigure) flowSingleDevice(category DeviceCategory) { if category == "" { fmt.Println() - _, categoryTitle := c.askChoice(c.localizedString("Flow_SingleDevice_Select", nil), categoryChoices) + _, categoryTitle := c.askChoice(c.localizedString("Flow_SingleDevice_Select"), categoryChoices) for item, data := range DeviceCategories { if data.title == categoryTitle { @@ -160,9 +160,9 @@ func (c *CmdConfigure) flowSingleDevice(category DeviceCategory) { // configureNewConfigFile implements the flow for creating a new configuration file func (c *CmdConfigure) flowNewConfigFile() { fmt.Println() - fmt.Println(c.localizedString("Flow_NewConfiguration_Setup", nil)) + fmt.Println(c.localizedString("Flow_NewConfiguration_Setup")) fmt.Println() - fmt.Println(c.localizedString("Flow_NewConfiguration_Select", localizeMap{"ItemNotPresent": c.localizedString("ItemNotPresent", nil)})) + fmt.Println(c.localizedString("Flow_NewConfiguration_Select", localizeMap{"ItemNotPresent": c.localizedString("ItemNotPresent")})) c.configureDeviceGuidedSetup() _ = c.configureDevices(DeviceCategoryGridMeter, true, false) @@ -207,7 +207,7 @@ func (c *CmdConfigure) flowNewConfigFile() { } filename = c.askValue(question{ - label: c.localizedString("File_NewFilename", nil), + label: c.localizedString("File_NewFilename"), exampleValue: "evcc_neu.yaml", required: true, }) @@ -276,10 +276,10 @@ func (c *CmdConfigure) configureSMAHems() { } fmt.Println() - fmt.Println(c.localizedString("Flow_SMAHems_Setup", nil)) + fmt.Println(c.localizedString("Flow_SMAHems_Setup")) fmt.Println() - if !c.askYesNo(c.localizedString("Flow_SMAHems_Add", nil)) { + if !c.askYesNo(c.localizedString("Flow_SMAHems_Add")) { return } @@ -290,13 +290,13 @@ func (c *CmdConfigure) configureSMAHems() { // configureLoadpoints asks loadpoint specific questions func (c *CmdConfigure) configureLoadpoints() { fmt.Println() - fmt.Println(c.localizedString("Loadpoint_Setup", nil)) + fmt.Println(c.localizedString("Loadpoint_Setup")) for { loadpointTitle := c.askValue(question{ - label: c.localizedString("Loadpoint_Title", nil), - defaultValue: c.localizedString("Loadpoint_DefaultTitle", nil), + label: c.localizedString("Loadpoint_Title"), + defaultValue: c.localizedString("Loadpoint_DefaultTitle"), required: true, }) loadpoint := loadpoint{ @@ -314,7 +314,7 @@ func (c *CmdConfigure) configureLoadpoints() { loadpoint.Charger = charger.Name if !chargerHasMeter { - if c.askYesNo(c.localizedString("Loadpoint_WallboxWOMeter", nil)) { + if c.askYesNo(c.localizedString("Loadpoint_WallboxWOMeter")) { chargeMeter, _, err := c.configureDeviceCategory(DeviceCategoryChargeMeter) if err == nil { loadpoint.ChargeMeter = chargeMeter.Name @@ -326,7 +326,7 @@ func (c *CmdConfigure) configureLoadpoints() { vehicles := c.configuration.DevicesOfClass(templates.Vehicle) if len(vehicles) > 0 { fmt.Println() - if c.askYesNo(c.localizedString("Loadpoint_VehicleDisableAutoDetection", nil)) { + if c.askYesNo(c.localizedString("Loadpoint_VehicleDisableAutoDetection")) { if len(vehicles) == 1 { loadpoint.Vehicle = vehicles[0].Name } else { @@ -337,7 +337,7 @@ func (c *CmdConfigure) configureLoadpoints() { vehicleTitles = append(vehicleTitles, vehicle.Title) } - vehicleIndex, _ := c.askChoice(c.localizedString("Loadpoint_VehicleSelection", nil), vehicleTitles) + vehicleIndex, _ := c.askChoice(c.localizedString("Loadpoint_VehicleSelection"), vehicleTitles) loadpoint.Vehicle = vehicles[vehicleIndex].Name } } @@ -351,16 +351,16 @@ func (c *CmdConfigure) configureLoadpoints() { if c.advancedMode { fmt.Println() minAmperage := c.askValue(question{ - label: c.localizedString("Loadpoint_WallboxMinAmperage", nil), - valueType: templates.ParamTypeNumber, + label: c.localizedString("Loadpoint_WallboxMinAmperage"), + valueType: templates.TypeNumber, minNumberValue: int64(minValue), maxNumberValue: 32, required: true, }) loadpoint.MinCurrent, _ = strconv.Atoi(minAmperage) maxAmperage := c.askValue(question{ - label: c.localizedString("Loadpoint_WallboxMaxAmperage", nil), - valueType: templates.ParamTypeNumber, + label: c.localizedString("Loadpoint_WallboxMaxAmperage"), + valueType: templates.TypeNumber, minNumberValue: 6, maxNumberValue: 32, required: true, @@ -370,18 +370,18 @@ func (c *CmdConfigure) configureLoadpoints() { if !chargerHasMeter { phaseChoices := []string{"1", "2", "3"} fmt.Println() - phaseIndex, _ := c.askChoice(c.localizedString("Loadpoint_WallboxPhases", nil), phaseChoices) + phaseIndex, _ := c.askChoice(c.localizedString("Loadpoint_WallboxPhases"), phaseChoices) loadpoint.Phases = phaseIndex + 1 } } else { powerChoices := []string{ - c.localizedString("Loadpoint_WallboxPower36kW", nil), - c.localizedString("Loadpoint_WallboxPower11kW", nil), - c.localizedString("Loadpoint_WallboxPower22kW", nil), - c.localizedString("Loadpoint_WallboxPowerOther", nil), + c.localizedString("Loadpoint_WallboxPower36kW"), + c.localizedString("Loadpoint_WallboxPower11kW"), + c.localizedString("Loadpoint_WallboxPower22kW"), + c.localizedString("Loadpoint_WallboxPowerOther"), } fmt.Println() - powerIndex, _ := c.askChoice(c.localizedString("Loadpoint_WallboxMaxPower", nil), powerChoices) + powerIndex, _ := c.askChoice(c.localizedString("Loadpoint_WallboxMaxPower"), powerChoices) loadpoint.MinCurrent = minValue switch powerIndex { case 0: @@ -401,8 +401,8 @@ func (c *CmdConfigure) configureLoadpoints() { } case 3: amperage := c.askValue(question{ - label: c.localizedString("Loadpoint_WallboxMaxAmperage", nil), - valueType: templates.ParamTypeNumber, + label: c.localizedString("Loadpoint_WallboxMaxAmperage"), + valueType: templates.TypeNumber, minNumberValue: int64(minValue), maxNumberValue: 32, required: true, @@ -412,24 +412,24 @@ func (c *CmdConfigure) configureLoadpoints() { if !chargerHasMeter { phaseChoices := []string{"1", "2", "3"} fmt.Println() - phaseIndex, _ := c.askChoice(c.localizedString("Loadpoint_WallboxPhases", nil), phaseChoices) + phaseIndex, _ := c.askChoice(c.localizedString("Loadpoint_WallboxPhases"), phaseChoices) loadpoint.Phases = phaseIndex + 1 } } } fmt.Println() - loadpoint.Mode = c.askValue(question{valueType: templates.ParamTypeChargeModes, excludeNone: true}) + loadpoint.Mode = c.askValue(question{valueType: templates.TypeChargeModes, excludeNone: true}) fmt.Println() loadpoint.ResetOnDisconnect = c.askValue(question{ - label: c.localizedString("Loadpoint_ResetOnDisconnect", nil), - valueType: templates.ParamTypeBool, + label: c.localizedString("Loadpoint_ResetOnDisconnect"), + valueType: templates.TypeBool, }) c.configuration.AddLoadpoint(loadpoint) fmt.Println() - if !c.askYesNo(c.localizedString("Loadpoint_AddAnother", nil)) { + if !c.askYesNo(c.localizedString("Loadpoint_AddAnother")) { break } } @@ -438,11 +438,11 @@ func (c *CmdConfigure) configureLoadpoints() { // configureSite asks site specific questions func (c *CmdConfigure) configureSite() { fmt.Println() - fmt.Println(c.localizedString("Site_Setup", nil)) + fmt.Println(c.localizedString("Site_Setup")) siteTitle := c.askValue(question{ - label: c.localizedString("Site_Title", nil), - defaultValue: c.localizedString("Site_DefaultTitle", nil), + label: c.localizedString("Site_Title"), + defaultValue: c.localizedString("Site_DefaultTitle"), required: true, }) c.configuration.config.Site.Title = siteTitle diff --git a/cmd/configure/survey.go b/cmd/configure/survey.go index 131fe95b9..a9c6179af 100644 --- a/cmd/configure/survey.go +++ b/cmd/configure/survey.go @@ -5,6 +5,7 @@ import ( "fmt" "os" "strconv" + "strings" "time" "github.com/AlecAivazis/survey/v2" @@ -24,10 +25,10 @@ func (c *CmdConfigure) surveyAskOne(p survey.Prompt, response interface{}, opts if err != nil { if err == terminal.InterruptErr { - fmt.Println(c.localizedString("Cancel", nil)) + fmt.Println(c.localizedString("Cancel")) os.Exit(0) } - fmt.Printf("%s %s\n", c.localizedString("InputError", nil), err) + fmt.Printf("%s %s\n", c.localizedString("InputError"), err) } return err @@ -36,7 +37,7 @@ func (c *CmdConfigure) surveyAskOne(p survey.Prompt, response interface{}, opts // askConfigFailureNextStep asks the user if he/she wants to select another device because the current does not work, or continue func (c *CmdConfigure) askConfigFailureNextStep() bool { fmt.Println() - return c.askYesNo(c.localizedString("TestingDevice_RepeatStep", nil)) + return c.askYesNo(c.localizedString("TestingDevice_RepeatStep")) } // select item from list @@ -55,7 +56,7 @@ func (c *CmdConfigure) askSelection(message string, items []string) (string, int // selectItem selects item from list func (c *CmdConfigure) selectItem(deviceCategory DeviceCategory) templates.Template { var emptyItem templates.Template - emptyItem.SetTitle(c.localizedString("ItemNotPresent", nil)) + emptyItem.SetTitle(c.localizedString("ItemNotPresent")) elements := c.fetchElements(deviceCategory) elements = append(elements, emptyItem) @@ -67,7 +68,7 @@ func (c *CmdConfigure) selectItem(deviceCategory DeviceCategory) templates.Templ } } - text := fmt.Sprintf("%s %s %s:", c.localizedString("Choose", nil), DeviceCategories[deviceCategory].article, DeviceCategories[deviceCategory].title) + text := fmt.Sprintf("%s %s %s:", c.localizedString("Choose"), DeviceCategories[deviceCategory].article, DeviceCategories[deviceCategory].title) _, selected, err := c.askSelection(text, items) if err != nil { c.log.FATAL.Fatal(err) @@ -105,7 +106,7 @@ type question struct { defaultValue, exampleValue string invalidValues []string validValues []string - valueType string + valueType templates.ParamType minNumberValue, maxNumberValue int64 mask, required bool excludeNone bool @@ -113,21 +114,39 @@ type question struct { // askBoolValue asks for a boolean value selection for a given question func (c *CmdConfigure) askBoolValue(label string) string { - choices := []string{c.localizedString("Config_No", nil), c.localizedString("Config_Yes", nil)} + choices := []string{c.localizedString("Config_No"), c.localizedString("Config_Yes")} values := []string{"false", "true"} index, _ := c.askChoice(label, choices) return values[index] } +func (c *CmdConfigure) askParam(p templates.Param) string { + var mask, required bool + if p.Mask != nil { + mask = *p.Mask + } + if p.Required != nil { + required = *p.Required + } + + return c.askValue(question{ + label: p.Description.String(c.lang), + valueType: p.Type, + validValues: p.Choice, // TODO proper choice handling + mask: mask, + required: required, + }) +} + // askValue asks for value input for a given question (template param) func (c *CmdConfigure) askValue(q question) string { - if q.valueType == templates.ParamTypeBool { + if q.valueType == templates.TypeBool { label := q.label if q.help != "" { helpDescription := stripmd.Strip(q.help) fmt.Println("-------------------------------------------------") - fmt.Println(c.localizedString("Value_Help", nil)) + fmt.Println(c.localizedString("Value_Help")) fmt.Println(helpDescription) fmt.Println("-------------------------------------------------") } @@ -135,51 +154,57 @@ func (c *CmdConfigure) askValue(q question) string { return c.askBoolValue(label) } - if q.valueType == templates.ParamTypeChargeModes { + if q.valueType == templates.TypeChoice { + label := strings.TrimSpace(strings.Join([]string{q.label, c.localizedString("Value_Choice")}, " ")) + idx, _ := c.askChoice(label, q.validValues) + return q.validValues[idx] + } + + if q.valueType == templates.TypeChargeModes { chargingModes := []string{string(api.ModeOff), string(api.ModeNow), string(api.ModeMinPV), string(api.ModePV)} chargeModes := []string{ - c.localizedString("ChargeModeOff", nil), - c.localizedString("ChargeModeNow", nil), - c.localizedString("ChargeModeMinPV", nil), - c.localizedString("ChargeModePV", nil), + c.localizedString("ChargeModeOff"), + c.localizedString("ChargeModeNow"), + c.localizedString("ChargeModeMinPV"), + c.localizedString("ChargeModePV"), } if !q.excludeNone { chargingModes = append(chargingModes, "") - chargeModes = append(chargeModes, c.localizedString("ChargeModeNone", nil)) + chargeModes = append(chargeModes, c.localizedString("ChargeModeNone")) } - modeChoice, _ := c.askChoice(c.localizedString("ChargeMode_Question", nil), chargeModes) + modeChoice, _ := c.askChoice(c.localizedString("ChargeMode_Question"), chargeModes) return chargingModes[modeChoice] } validate := func(val interface{}) error { value := val.(string) if q.invalidValues != nil && slices.Contains(q.invalidValues, value) { - return errors.New(c.localizedString("ValueError_Used", nil)) + return errors.New(c.localizedString("ValueError_Used")) } if q.validValues != nil && !slices.Contains(q.validValues, value) { - return errors.New(c.localizedString("ValueError_Invalid", nil)) + return errors.New(c.localizedString("ValueError_Invalid")) } if q.required && len(value) == 0 { - return errors.New(c.localizedString("ValueError_Empty", nil)) + return errors.New(c.localizedString("ValueError_Empty")) } if !q.required && len(value) == 0 { return nil } - if q.valueType == templates.ParamTypeFloat { + if q.valueType == templates.TypeFloat { _, err := strconv.ParseFloat(value, 64) if err != nil { - return errors.New(c.localizedString("ValueError_Float", nil)) + return errors.New(c.localizedString("ValueError_Float")) } } - if q.valueType == templates.ParamTypeNumber { + if q.valueType == templates.TypeNumber { intValue, err := strconv.ParseInt(value, 10, 64) if err != nil { - return errors.New(c.localizedString("ValueError_Number", nil)) + return errors.New(c.localizedString("ValueError_Number")) } if q.minNumberValue != 0 && intValue < q.minNumberValue { return errors.New(c.localizedString("ValueError_NumberLowerThanMin", localizeMap{"Min": q.minNumberValue})) @@ -189,10 +214,10 @@ func (c *CmdConfigure) askValue(q question) string { } } - if q.valueType == templates.ParamTypeDuration { + if q.valueType == templates.TypeDuration { _, err := time.ParseDuration(value) if err != nil { - return errors.New(c.localizedString("ValueError_Duration", nil)) + return errors.New(c.localizedString("ValueError_Duration")) } } @@ -201,12 +226,12 @@ func (c *CmdConfigure) askValue(q question) string { help := q.help if q.required { - help += " (" + c.localizedString("Value_Required", nil) + ")" + help += " (" + c.localizedString("Value_Required") + ")" } else { - help += " (" + c.localizedString("Value_Optional", nil) + ")" + help += " (" + c.localizedString("Value_Optional") + ")" } if q.exampleValue != "" { - help += fmt.Sprintf(" ("+c.localizedString("Value_Sample", nil)+": %s)", q.exampleValue) + help += fmt.Sprintf(" ("+c.localizedString("Value_Sample")+": %s)", q.exampleValue) } var prompt survey.Prompt diff --git a/cmd/configure/texts.go b/cmd/configure/texts.go index 66c1bff7d..b84ea85fa 100644 --- a/cmd/configure/texts.go +++ b/cmd/configure/texts.go @@ -8,8 +8,8 @@ import ( // setDefaultTexts sets default language specific texts func (c *CmdConfigure) setDefaultTexts() { - c.errItemNotPresent = errors.New(c.localizedString("Error_ItemNotPresent", nil)) - c.errDeviceNotValid = errors.New(c.localizedString("Error_DeviceNotValid", nil)) + c.errItemNotPresent = errors.New(c.localizedString("Error_ItemNotPresent")) + c.errDeviceNotValid = errors.New(c.localizedString("Error_DeviceNotValid")) c.updateDeviceCategoryTexts(DeviceCategoryCharger, "Category_ChargerTitle", "Category_ChargerArticle", "Category_ChargerAdditional") c.updateDeviceCategoryTexts(DeviceCategoryGuidedSetup, "Category_SystemTitle", "Category_SystemArticle", "Category_SystemAdditional") @@ -23,14 +23,18 @@ func (c *CmdConfigure) setDefaultTexts() { // updateDeviceCategoryTexts updates the texts for a device category func (c *CmdConfigure) updateDeviceCategoryTexts(category DeviceCategory, title, article, additional string) { data := DeviceCategories[category] - data.title = c.localizedString(title, nil) - data.article = c.localizedString(article, nil) - data.additional = c.localizedString(additional, nil) + data.title = c.localizedString(title) + data.article = c.localizedString(article) + data.additional = c.localizedString(additional) DeviceCategories[category] = data } // localizedString is a helper for getting a localized string -func (c *CmdConfigure) localizedString(key string, templateData localizeMap) string { +func (c *CmdConfigure) localizedString(key string, data ...localizeMap) string { + var templateData localizeMap + if len(data) == 1 { + templateData = data[0] + } return c.localizer.MustLocalize(&i18n.LocalizeConfig{ MessageID: key, TemplateData: templateData, diff --git a/templates/definition/charger/fritzdect.yaml b/templates/definition/charger/fritzdect.yaml index d39fd418c..ec42a82f0 100644 --- a/templates/definition/charger/fritzdect.yaml +++ b/templates/definition/charger/fritzdect.yaml @@ -14,13 +14,9 @@ params: mask: true - name: ain required: true - mask: true - example: "307788992233" - help: - en: The AIN is printed on the type label on the back of the device. Embed it in double quotes in case of leading zeroes. - de: Die AIN ist auf dem Typenschild auf der Geräterückseite aufgedruckt. Bei führenden Nullen bitte in doppelte Hochkommata setzen. - name: standbypower default: 15 + - preset: switchsocket render: | type: fritzdect uri: {{ .uri }} diff --git a/templates/definition/charger/homematic.yaml b/templates/definition/charger/homematic.yaml index a21a87727..3b79b28f7 100644 --- a/templates/definition/charger/homematic.yaml +++ b/templates/definition/charger/homematic.yaml @@ -28,7 +28,7 @@ params: mask: true - name: meterchannel default: 6 - type: int + type: number required: true advanced: true description: @@ -39,7 +39,7 @@ params: de: Kanalnummer des Messwertkanals, wie im CCU Webfrontend angezeigt. - name: switchchannel default: 3 - type: int + type: number required: true advanced: true description: @@ -48,6 +48,7 @@ params: help: en: Homematic switch actor channel number like shown in the CCU web user interface. de: Kanalnummer der schaltbaren Steckdose, wie im CCU Webfrontend angezeigt. + - preset: switchsocket render: | type: homematic uri: {{ .host }}:{{ .port }} diff --git a/templates/definition/charger/ocpp.yaml b/templates/definition/charger/ocpp.yaml index 955201ac3..3a1db7062 100644 --- a/templates/definition/charger/ocpp.yaml +++ b/templates/definition/charger/ocpp.yaml @@ -44,7 +44,7 @@ params: example: EVB-P12354 - name: connector default: 1 - type: int + type: number advanced: true help: en: Connector number, usually 1 for first connector. diff --git a/templates/definition/charger/shelly.yaml b/templates/definition/charger/shelly.yaml index d8e567587..3074a8cf5 100644 --- a/templates/definition/charger/shelly.yaml +++ b/templates/definition/charger/shelly.yaml @@ -11,10 +11,11 @@ params: default: 0 - name: standbypower default: 15 + - preset: switchsocket render: | type: shelly uri: http://{{ .host }} {{ if ne .user "" }}user: {{ .user }}{{ end }} - {{ if ne .password "" }}password: {{ .password }}{{ end }} - channel: {{ .channel }} # shelly device relay channel + {{ if ne .password "" }}password: {{ .password }}{{ end }} + channel: {{ .channel }} # shelly device relay channel standbypower: {{ .standbypower }} diff --git a/templates/definition/charger/tapo.yaml b/templates/definition/charger/tapo.yaml index 033c2aecb..91e74620f 100644 --- a/templates/definition/charger/tapo.yaml +++ b/templates/definition/charger/tapo.yaml @@ -13,6 +13,7 @@ params: mask: true - name: standbypower default: 15 + - preset: switchsocket render: | type: tapo uri: http://{{ .host }} diff --git a/templates/definition/charger/tasmota.yaml b/templates/definition/charger/tasmota.yaml index eb17fd834..61a70f81f 100644 --- a/templates/definition/charger/tasmota.yaml +++ b/templates/definition/charger/tasmota.yaml @@ -17,13 +17,14 @@ params: default: 1 required: true description: - de: Nummer des Schalt-Kanals + de: Nummer des Schaltkanals en: Device relay channel number help: - de: Nummer des Schalt-Kanals (1-8), bei Geräten mit mehr als einem Schalter + de: Nummer des Schaltkanals (1-8), bei Geräten mit mehr als einem Schalter en: Device relay channel number (allowed range 1-8) - name: standbypower default: 15 + - preset: switchsocket render: | type: tasmota uri: http://{{ .host }} diff --git a/templates/definition/charger/tplink.yaml b/templates/definition/charger/tplink.yaml index cf07b0e51..7beac61fa 100644 --- a/templates/definition/charger/tplink.yaml +++ b/templates/definition/charger/tplink.yaml @@ -8,6 +8,7 @@ params: - name: host - name: standbypower default: 15 + - preset: switchsocket render: | type: tplink uri: {{ .host }} diff --git a/templates/definition/defaults.yaml b/templates/definition/defaults.yaml index 1411e1384..533dcd104 100644 --- a/templates/definition/defaults.yaml +++ b/templates/definition/defaults.yaml @@ -13,11 +13,11 @@ params: type: number - name: modbusdevice description: - de: Geräteadresse - en: Device address + de: Gerätename + en: Device name help: - de: USB-RS485 Adapter Adresse - en: USB-RS485 Adapter address + de: USB-RS485 Gerätename + en: USB-RS485 device name example: /dev/ttyUSB0 - name: modbusbaudrate description: @@ -33,7 +33,7 @@ params: de: ComSet en: ComSet help: - de: Kommunikationsparameter für den Adapter + de: Kommunikationsparameter des Adapters en: Communication parameter for the adapter default: 8N1 - name: host @@ -248,29 +248,46 @@ params: de: Icon en: Icon help: - de: "Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater" - en: "Visible in UI. Possible values: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater" + de: "Icon in der Benutzeroberfläche" + en: "Icon as shown in user interface" + type: choice validvalues: - [ - "bike", - "bus", - "car", - "heater", - "heatercooler", - "heatpump", - "moped", - "motorcycle", - "plug", - "scooter", - "tractor", - "van", - "waterheater", - ] + - bike + - bus + - car + - heater + - heatercooler + - heatpump + - moped + - motorcycle + - plug + - scooter + - tractor + - van + - waterheater - name: ski required: true + description: + en: Subject Key Identifier (SKI) + de: Identifikationsschlüssel (SKI) help: - en: The SKI of the wallbox, can usually be found on the web interface of the wallbox - de: Die SKI der Wallbox, ist üblicherweise im Web Interface der Wallbox zu finden + en: The SKI of the wallbox, usually found on the web interface of the wallbox + de: Die SKI der Wallbox, üblicherweise im Web Interface der Wallbox zu finden + - name: uri + description: + generic: URI + help: + en: HTTP(S) address + de: HTTP(S) Adresse + - name: ain + mask: true + example: "307788992233" + description: + en: Actor Identification Number (AIN) + de: Aktoridentifikationsnummer (AIN) + help: + en: The AIN is printed on the type label on the back of the device. Embed it in double quotes in case of leading zeroes. + de: Die AIN ist auf dem Typenschild auf der Geräterückseite aufgedruckt. Bei führenden Nullen bitte in doppelte Hochkommata setzen. presets: vehiclebase: @@ -389,6 +406,19 @@ presets: ski: {{ .ski }} {{ if ne .ip "" }}ip: {{ .ip }}{{ end }} {{end}} + switchsocket: + params: + - name: integrateddevice + type: bool + advanced: true + description: + de: Integriertes Gerät (keine Fahrzeugverbindung) + 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: diff --git a/templates/definition/meter/fritzdect.yaml b/templates/definition/meter/fritzdect.yaml index 3d8c8e980..730d721b2 100644 --- a/templates/definition/meter/fritzdect.yaml +++ b/templates/definition/meter/fritzdect.yaml @@ -16,11 +16,6 @@ params: mask: true - name: ain required: true - mask: true - example: "307788992233" - help: - en: The AIN is printed on the type label on the back of the device. Embed it in double quotes in case of leading zeroes. - de: Die AIN ist auf dem Typenschild auf der Geräterückseite aufgedruckt. Bei führenden Nullen bitte in doppelte Hochkommata setzen. render: | type: fritzdect uri: {{ .uri }} diff --git a/templates/definition/meter/homematic.yaml b/templates/definition/meter/homematic.yaml index edaf1b1ee..b023eb7bb 100644 --- a/templates/definition/meter/homematic.yaml +++ b/templates/definition/meter/homematic.yaml @@ -23,7 +23,7 @@ params: mask: true - name: meterchannel default: 6 - type: int + type: number required: true advanced: true description: diff --git a/templates/docs/charger/eebus_0.yaml b/templates/docs/charger/eebus_0.yaml index 297d126fa..b47be8bb4 100644 --- a/templates/docs/charger/eebus_0.yaml +++ b/templates/docs/charger/eebus_0.yaml @@ -7,5 +7,5 @@ render: - default: | type: template template: eebus - ski: # Die SKI der Wallbox, ist üblicherweise im Web Interface der Wallbox zu finden + ski: # Die SKI der Wallbox, üblicherweise im Web Interface der Wallbox zu finden ip: 192.0.2.2 # IP-Adresse # Optional diff --git a/templates/docs/charger/elliconnect_0.yaml b/templates/docs/charger/elliconnect_0.yaml index da07b9f1f..df80550c8 100644 --- a/templates/docs/charger/elliconnect_0.yaml +++ b/templates/docs/charger/elliconnect_0.yaml @@ -14,5 +14,5 @@ render: - default: | type: template template: elliconnect - ski: # Die SKI der Wallbox, ist üblicherweise im Web Interface der Wallbox zu finden + ski: # Die SKI der Wallbox, üblicherweise im Web Interface der Wallbox zu finden ip: 192.0.2.2 # IP-Adresse diff --git a/templates/docs/charger/ellipro_0.yaml b/templates/docs/charger/ellipro_0.yaml index fdba61039..4e527dd0e 100644 --- a/templates/docs/charger/ellipro_0.yaml +++ b/templates/docs/charger/ellipro_0.yaml @@ -14,5 +14,5 @@ render: - default: | type: template template: ellipro - ski: # Die SKI der Wallbox, ist üblicherweise im Web Interface der Wallbox zu finden + ski: # Die SKI der Wallbox, üblicherweise im Web Interface der Wallbox zu finden ip: 192.0.2.2 # IP-Adresse diff --git a/templates/docs/charger/fritzdect_0.yaml b/templates/docs/charger/fritzdect_0.yaml index 3a8c1d34b..fc46f084f 100644 --- a/templates/docs/charger/fritzdect_0.yaml +++ b/templates/docs/charger/fritzdect_0.yaml @@ -6,8 +6,18 @@ render: - default: | type: template template: fritzdect - uri: https://fritz.box # Optional + uri: https://fritz.box # HTTP(S) Adresse # Optional user: # Benutzerkonto (bspw. E-Mail Adresse, User Id, etc.) password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) ain: 307788992233 # Die AIN ist auf dem Typenschild auf der Geräterückseite aufgedruckt. Bei führenden Nullen bitte in doppelte Hochkommata setzen. standbypower: 15 # Leistung oberhalb des angegebenen Wertes wird als Ladeleistung gewertet # Optional + advanced: | + type: template + template: fritzdect + uri: https://fritz.box # HTTP(S) Adresse # Optional + user: # Benutzerkonto (bspw. E-Mail Adresse, User Id, etc.) + password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) + ain: 307788992233 # Die AIN ist auf dem Typenschild auf der Geräterückseite aufgedruckt. Bei führenden Nullen bitte in doppelte Hochkommata setzen. + standbypower: 15 # Leistung oberhalb des angegebenen Wertes wird als Ladeleistung gewertet # Optional + integrateddevice: # Optional + icon: # Icon in der Benutzeroberfläche # Optional diff --git a/templates/docs/charger/homematic_0.yaml b/templates/docs/charger/homematic_0.yaml index 1834573b5..7d8b1530b 100644 --- a/templates/docs/charger/homematic_0.yaml +++ b/templates/docs/charger/homematic_0.yaml @@ -22,3 +22,5 @@ render: password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) # Optional meterchannel: 6 # Kanalnummer des Messwertkanals, wie im CCU Webfrontend angezeigt. switchchannel: 3 # Kanalnummer der schaltbaren Steckdose, wie im CCU Webfrontend angezeigt. + integrateddevice: # Optional + icon: # Icon in der Benutzeroberfläche # Optional diff --git a/templates/docs/charger/pmcc_0.yaml b/templates/docs/charger/pmcc_0.yaml index 91f463298..9a3d73ac4 100644 --- a/templates/docs/charger/pmcc_0.yaml +++ b/templates/docs/charger/pmcc_0.yaml @@ -7,5 +7,5 @@ render: - default: | type: template template: pmcc - ski: # Die SKI der Wallbox, ist üblicherweise im Web Interface der Wallbox zu finden + ski: # Die SKI der Wallbox, üblicherweise im Web Interface der Wallbox zu finden ip: 192.0.2.2 # IP-Adresse # Optional diff --git a/templates/docs/charger/pmcp_0.yaml b/templates/docs/charger/pmcp_0.yaml index e3976e1ca..50a96d44c 100644 --- a/templates/docs/charger/pmcp_0.yaml +++ b/templates/docs/charger/pmcp_0.yaml @@ -6,5 +6,5 @@ render: - default: | type: template template: pmcp - ski: # Die SKI der Wallbox, ist üblicherweise im Web Interface der Wallbox zu finden + ski: # Die SKI der Wallbox, üblicherweise im Web Interface der Wallbox zu finden ip: 192.0.2.2 # IP-Adresse # Optional diff --git a/templates/docs/charger/shelly_0.yaml b/templates/docs/charger/shelly_0.yaml index eefc8a59c..08ee147fb 100644 --- a/templates/docs/charger/shelly_0.yaml +++ b/templates/docs/charger/shelly_0.yaml @@ -10,3 +10,13 @@ render: password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) # Optional channel: 0 # Optional standbypower: 15 # Leistung oberhalb des angegebenen Wertes wird als Ladeleistung gewertet # Optional + advanced: | + type: template + template: shelly + host: 192.0.2.2 # IP-Adresse oder Hostname + user: # Benutzerkonto (bspw. E-Mail Adresse, User Id, etc.) # Optional + password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) # Optional + channel: 0 # Optional + standbypower: 15 # Leistung oberhalb des angegebenen Wertes wird als Ladeleistung gewertet # Optional + integrateddevice: # Optional + icon: # Icon in der Benutzeroberfläche # Optional diff --git a/templates/docs/charger/tapo_0.yaml b/templates/docs/charger/tapo_0.yaml index 2b73c85b0..cc35560ff 100644 --- a/templates/docs/charger/tapo_0.yaml +++ b/templates/docs/charger/tapo_0.yaml @@ -10,3 +10,12 @@ render: user: # Benutzerkonto (bspw. E-Mail Adresse, User Id, etc.) password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) standbypower: 15 # Leistung oberhalb des angegebenen Wertes wird als Ladeleistung gewertet # Optional + advanced: | + type: template + template: tapo + host: 192.0.2.2 # IP-Adresse oder Hostname + user: # Benutzerkonto (bspw. E-Mail Adresse, User Id, etc.) + password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) + standbypower: 15 # Leistung oberhalb des angegebenen Wertes wird als Ladeleistung gewertet # Optional + integrateddevice: # Optional + icon: # Icon in der Benutzeroberfläche # Optional diff --git a/templates/docs/charger/tasmota_0.yaml b/templates/docs/charger/tasmota_0.yaml index 43ef994bd..7bdd6357a 100644 --- a/templates/docs/charger/tasmota_0.yaml +++ b/templates/docs/charger/tasmota_0.yaml @@ -8,5 +8,15 @@ render: host: 192.0.2.2 # IP-Adresse oder Hostname user: # Standard-User ist admin # Optional password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) # Optional - channel: 1 # Nummer des Schalt-Kanals (1-8), bei Geräten mit mehr als einem Schalter + channel: 1 # Nummer des Schaltkanals (1-8), bei Geräten mit mehr als einem Schalter standbypower: 15 # Leistung oberhalb des angegebenen Wertes wird als Ladeleistung gewertet # Optional + advanced: | + type: template + template: tasmota + host: 192.0.2.2 # IP-Adresse oder Hostname + user: # Standard-User ist admin # Optional + password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) # Optional + channel: 1 # Nummer des Schaltkanals (1-8), bei Geräten mit mehr als einem Schalter + standbypower: 15 # Leistung oberhalb des angegebenen Wertes wird als Ladeleistung gewertet # Optional + integrateddevice: # Optional + icon: # Icon in der Benutzeroberfläche # Optional diff --git a/templates/docs/charger/tplink_0.yaml b/templates/docs/charger/tplink_0.yaml index 85bae5a55..d6f51f976 100644 --- a/templates/docs/charger/tplink_0.yaml +++ b/templates/docs/charger/tplink_0.yaml @@ -8,3 +8,10 @@ render: template: tplink host: 192.0.2.2 # IP-Adresse oder Hostname standbypower: 15 # Leistung oberhalb des angegebenen Wertes wird als Ladeleistung gewertet # Optional + advanced: | + type: template + template: tplink + host: 192.0.2.2 # IP-Adresse oder Hostname + standbypower: 15 # Leistung oberhalb des angegebenen Wertes wird als Ladeleistung gewertet # Optional + integrateddevice: # Optional + icon: # Icon in der Benutzeroberfläche # Optional diff --git a/templates/docs/meter/fritzdect_0.yaml b/templates/docs/meter/fritzdect_0.yaml index a0c294bca..2b9f28d74 100644 --- a/templates/docs/meter/fritzdect_0.yaml +++ b/templates/docs/meter/fritzdect_0.yaml @@ -8,7 +8,7 @@ render: type: template template: fritzdect usage: pv - uri: https://fritz.box # Optional + uri: https://fritz.box # HTTP(S) Adresse # Optional user: # Benutzerkonto (bspw. E-Mail Adresse, User Id, etc.) password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) ain: 307788992233 # Die AIN ist auf dem Typenschild auf der Geräterückseite aufgedruckt. Bei führenden Nullen bitte in doppelte Hochkommata setzen. @@ -17,7 +17,7 @@ render: type: template template: fritzdect usage: charge - uri: https://fritz.box # Optional + uri: https://fritz.box # HTTP(S) Adresse # Optional user: # Benutzerkonto (bspw. E-Mail Adresse, User Id, etc.) password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) ain: 307788992233 # Die AIN ist auf dem Typenschild auf der Geräterückseite aufgedruckt. Bei führenden Nullen bitte in doppelte Hochkommata setzen. diff --git a/templates/docs/vehicle/aiways_0.yaml b/templates/docs/vehicle/aiways_0.yaml index 3d705e3c7..5710e6ced 100644 --- a/templates/docs/vehicle/aiways_0.yaml +++ b/templates/docs/vehicle/aiways_0.yaml @@ -18,7 +18,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/audi_0.yaml b/templates/docs/vehicle/audi_0.yaml index e2729c936..b8c2895b8 100644 --- a/templates/docs/vehicle/audi_0.yaml +++ b/templates/docs/vehicle/audi_0.yaml @@ -19,7 +19,7 @@ render: vin: WAUZZZ... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/bmw_0.yaml b/templates/docs/vehicle/bmw_0.yaml index 68f5a5f82..beba575fb 100644 --- a/templates/docs/vehicle/bmw_0.yaml +++ b/templates/docs/vehicle/bmw_0.yaml @@ -18,7 +18,7 @@ render: vin: WBMW... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/carwings_0.yaml b/templates/docs/vehicle/carwings_0.yaml index b4067cc42..bca475186 100644 --- a/templates/docs/vehicle/carwings_0.yaml +++ b/templates/docs/vehicle/carwings_0.yaml @@ -19,7 +19,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/citroen_0.yaml b/templates/docs/vehicle/citroen_0.yaml index b7d8328bd..04787eef4 100644 --- a/templates/docs/vehicle/citroen_0.yaml +++ b/templates/docs/vehicle/citroen_0.yaml @@ -18,7 +18,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/cupra_0.yaml b/templates/docs/vehicle/cupra_0.yaml index 77c552792..dc7d990ba 100644 --- a/templates/docs/vehicle/cupra_0.yaml +++ b/templates/docs/vehicle/cupra_0.yaml @@ -19,7 +19,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/dacia_0.yaml b/templates/docs/vehicle/dacia_0.yaml index c88232f8d..3b192633f 100644 --- a/templates/docs/vehicle/dacia_0.yaml +++ b/templates/docs/vehicle/dacia_0.yaml @@ -18,7 +18,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 27.4 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/ds_0.yaml b/templates/docs/vehicle/ds_0.yaml index 2b354837d..6cf84ce42 100644 --- a/templates/docs/vehicle/ds_0.yaml +++ b/templates/docs/vehicle/ds_0.yaml @@ -18,7 +18,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/enyaq_0.yaml b/templates/docs/vehicle/enyaq_0.yaml index b0fac98d8..7ab367660 100644 --- a/templates/docs/vehicle/enyaq_0.yaml +++ b/templates/docs/vehicle/enyaq_0.yaml @@ -19,7 +19,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/etron_0.yaml b/templates/docs/vehicle/etron_0.yaml index a229e05a8..a81d4835c 100644 --- a/templates/docs/vehicle/etron_0.yaml +++ b/templates/docs/vehicle/etron_0.yaml @@ -19,7 +19,7 @@ render: vin: WAUZZZ... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/evnotify_0.yaml b/templates/docs/vehicle/evnotify_0.yaml index 25aadb669..df1fb0eca 100644 --- a/templates/docs/vehicle/evnotify_0.yaml +++ b/templates/docs/vehicle/evnotify_0.yaml @@ -17,7 +17,7 @@ render: token: capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional targetSoc: 80 # Bis zu welchem Ladestand (Soc) soll das Fahrzeug geladen werden # Optional diff --git a/templates/docs/vehicle/fiat_0.yaml b/templates/docs/vehicle/fiat_0.yaml index 15dc8af64..151b96a5e 100644 --- a/templates/docs/vehicle/fiat_0.yaml +++ b/templates/docs/vehicle/fiat_0.yaml @@ -19,7 +19,7 @@ render: vin: ZFAE... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional pin: # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional diff --git a/templates/docs/vehicle/ford_0.yaml b/templates/docs/vehicle/ford_0.yaml index 1d370e641..fd990e756 100644 --- a/templates/docs/vehicle/ford_0.yaml +++ b/templates/docs/vehicle/ford_0.yaml @@ -18,7 +18,7 @@ render: vin: WF0FXX... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/hyundai_0.yaml b/templates/docs/vehicle/hyundai_0.yaml index 0fb7f63f6..f0af1ccad 100644 --- a/templates/docs/vehicle/hyundai_0.yaml +++ b/templates/docs/vehicle/hyundai_0.yaml @@ -20,7 +20,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional language: en # 'de' für Deutsch und 'en' für Englisch # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional diff --git a/templates/docs/vehicle/id_0.yaml b/templates/docs/vehicle/id_0.yaml index 751c11c33..be7be44aa 100644 --- a/templates/docs/vehicle/id_0.yaml +++ b/templates/docs/vehicle/id_0.yaml @@ -21,7 +21,7 @@ render: vin: WVWZZZ... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/jaguar-landrover_0.yaml b/templates/docs/vehicle/jaguar-landrover_0.yaml index d9af1379c..7745d2be3 100644 --- a/templates/docs/vehicle/jaguar-landrover_0.yaml +++ b/templates/docs/vehicle/jaguar-landrover_0.yaml @@ -18,7 +18,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/jaguar-landrover_1.yaml b/templates/docs/vehicle/jaguar-landrover_1.yaml index 625ef27e0..9ca621856 100644 --- a/templates/docs/vehicle/jaguar-landrover_1.yaml +++ b/templates/docs/vehicle/jaguar-landrover_1.yaml @@ -18,7 +18,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/kia_0.yaml b/templates/docs/vehicle/kia_0.yaml index 41fceb07b..f899f8764 100644 --- a/templates/docs/vehicle/kia_0.yaml +++ b/templates/docs/vehicle/kia_0.yaml @@ -20,7 +20,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional language: en # 'de' für Deutsch und 'en' für Englisch # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional diff --git a/templates/docs/vehicle/mini_0.yaml b/templates/docs/vehicle/mini_0.yaml index 6b5ef1157..0efd319b8 100644 --- a/templates/docs/vehicle/mini_0.yaml +++ b/templates/docs/vehicle/mini_0.yaml @@ -18,7 +18,7 @@ render: vin: WBMW... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/nissan_0.yaml b/templates/docs/vehicle/nissan_0.yaml index 4347044f8..9dc559284 100644 --- a/templates/docs/vehicle/nissan_0.yaml +++ b/templates/docs/vehicle/nissan_0.yaml @@ -19,7 +19,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/niu-e-scooter_0.yaml b/templates/docs/vehicle/niu-e-scooter_0.yaml index 2a56f0f4b..6fb2e38b4 100644 --- a/templates/docs/vehicle/niu-e-scooter_0.yaml +++ b/templates/docs/vehicle/niu-e-scooter_0.yaml @@ -11,7 +11,7 @@ render: password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) serial: capacity: 4 # Akkukapazität in kWh # Optional - icon: scooter # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: scooter # Icon in der Benutzeroberfläche # Optional advanced: | type: template template: niu-e-scooter @@ -20,7 +20,7 @@ render: password: # Passwort des Benutzerkontos (bei führenden Nullen bitte in einfache Hochkommata setzen) serial: capacity: 4 # Akkukapazität in kWh # Optional - icon: scooter # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: scooter # Icon in der Benutzeroberfläche # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional targetSoc: 80 # Bis zu welchem Ladestand (Soc) soll das Fahrzeug geladen werden # Optional diff --git a/templates/docs/vehicle/offline_0.yaml b/templates/docs/vehicle/offline_0.yaml index d429bbe65..307d3be51 100644 --- a/templates/docs/vehicle/offline_0.yaml +++ b/templates/docs/vehicle/offline_0.yaml @@ -11,7 +11,7 @@ render: type: template template: offline title: # Wird in der Benutzeroberfläche angezeigt # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional diff --git a/templates/docs/vehicle/opel_0.yaml b/templates/docs/vehicle/opel_0.yaml index ce5b1ff82..d63457886 100644 --- a/templates/docs/vehicle/opel_0.yaml +++ b/templates/docs/vehicle/opel_0.yaml @@ -18,7 +18,7 @@ render: vin: WP0... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/ovms_0.yaml b/templates/docs/vehicle/ovms_0.yaml index 6456a947b..36465e198 100644 --- a/templates/docs/vehicle/ovms_0.yaml +++ b/templates/docs/vehicle/ovms_0.yaml @@ -21,7 +21,7 @@ render: vehicleid: capacity: 12 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional targetSoc: 80 # Bis zu welchem Ladestand (Soc) soll das Fahrzeug geladen werden # Optional diff --git a/templates/docs/vehicle/peugeot_0.yaml b/templates/docs/vehicle/peugeot_0.yaml index 1c0a3b408..9ae0aaa71 100644 --- a/templates/docs/vehicle/peugeot_0.yaml +++ b/templates/docs/vehicle/peugeot_0.yaml @@ -18,7 +18,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/porsche_0.yaml b/templates/docs/vehicle/porsche_0.yaml index 05e937479..243bfcbfd 100644 --- a/templates/docs/vehicle/porsche_0.yaml +++ b/templates/docs/vehicle/porsche_0.yaml @@ -18,7 +18,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/renault_0.yaml b/templates/docs/vehicle/renault_0.yaml index 2614c2cc4..d8a49d583 100644 --- a/templates/docs/vehicle/renault_0.yaml +++ b/templates/docs/vehicle/renault_0.yaml @@ -18,7 +18,7 @@ render: vin: WREN... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/seat_0.yaml b/templates/docs/vehicle/seat_0.yaml index 2b57a5bed..ede8903dc 100644 --- a/templates/docs/vehicle/seat_0.yaml +++ b/templates/docs/vehicle/seat_0.yaml @@ -19,7 +19,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/silence_0.yaml b/templates/docs/vehicle/silence_0.yaml index ef7ccc66a..bab852429 100644 --- a/templates/docs/vehicle/silence_0.yaml +++ b/templates/docs/vehicle/silence_0.yaml @@ -20,5 +20,5 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: scooter # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: scooter # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional diff --git a/templates/docs/vehicle/skoda_0.yaml b/templates/docs/vehicle/skoda_0.yaml index 1372534de..a9c23b619 100644 --- a/templates/docs/vehicle/skoda_0.yaml +++ b/templates/docs/vehicle/skoda_0.yaml @@ -19,7 +19,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/smart_0.yaml b/templates/docs/vehicle/smart_0.yaml index 4849ed5c2..8c44fce53 100644 --- a/templates/docs/vehicle/smart_0.yaml +++ b/templates/docs/vehicle/smart_0.yaml @@ -19,7 +19,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 17.6 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/tesla_0.yaml b/templates/docs/vehicle/tesla_0.yaml index e6f132688..b27c3c26e 100644 --- a/templates/docs/vehicle/tesla_0.yaml +++ b/templates/docs/vehicle/tesla_0.yaml @@ -26,7 +26,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional targetSoc: 80 # Bis zu welchem Ladestand (Soc) soll das Fahrzeug geladen werden # Optional diff --git a/templates/docs/vehicle/tronity_0.yaml b/templates/docs/vehicle/tronity_0.yaml index 375d3aca4..e680837e8 100644 --- a/templates/docs/vehicle/tronity_0.yaml +++ b/templates/docs/vehicle/tronity_0.yaml @@ -20,7 +20,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 10 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional targetSoc: 80 # Bis zu welchem Ladestand (Soc) soll das Fahrzeug geladen werden # Optional diff --git a/templates/docs/vehicle/volvo-connected_0.yaml b/templates/docs/vehicle/volvo-connected_0.yaml index 6ced5dfda..00290c168 100644 --- a/templates/docs/vehicle/volvo-connected_0.yaml +++ b/templates/docs/vehicle/volvo-connected_0.yaml @@ -19,7 +19,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/volvo_0.yaml b/templates/docs/vehicle/volvo_0.yaml index d03f39386..7aebff6ba 100644 --- a/templates/docs/vehicle/volvo_0.yaml +++ b/templates/docs/vehicle/volvo_0.yaml @@ -18,7 +18,7 @@ render: vin: W... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/templates/docs/vehicle/vw_0.yaml b/templates/docs/vehicle/vw_0.yaml index a48056fe2..151222e5e 100644 --- a/templates/docs/vehicle/vw_0.yaml +++ b/templates/docs/vehicle/vw_0.yaml @@ -21,7 +21,7 @@ render: vin: WVWZZZ... # Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind # Optional capacity: 50 # Akkukapazität in kWh # Optional phases: 3 # Die maximale Anzahl der Phasen welche genutzt werden können # Optional - icon: car # Darstellung in der UI. Mögliche Werte: bike, bus, car, heater, heatercooler, heatpump, moped, motorcycle, plug, scooter, tractor, van, waterheater # Optional + icon: car # Icon in der Benutzeroberfläche # Optional cache: 15m # Zeitintervall nach dem Daten erneut vom Fahrzeug abgefragt werden # Optional mode: # Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll # Optional minSoc: 25 # Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht # Optional diff --git a/util/templates/init.go b/util/templates/init.go index 544a55b35..57623b3c8 100644 --- a/util/templates/init.go +++ b/util/templates/init.go @@ -54,13 +54,6 @@ func FromBytes(b []byte) (Template, error) { err = tmpl.Validate() } - // set default value type - for _, p := range tmpl.Params { - if p.Type == "" { - p.Type = ParamTypeString - } - } - return tmpl, err } diff --git a/util/templates/paramtype.go b/util/templates/paramtype.go new file mode 100644 index 000000000..cc07ce718 --- /dev/null +++ b/util/templates/paramtype.go @@ -0,0 +1,23 @@ +package templates + +type ParamType int + +func (c *ParamType) UnmarshalText(text []byte) error { + typ, err := ParamTypeString(string(text)) + if err == nil { + *c = typ + } + return err +} + +//go:generate enumer -type ParamType -trimprefix Type +const ( + TypeString ParamType = iota // default type string + TypeBool + TypeChoice + TypeChargeModes + TypeDuration + TypeFloat + TypeNumber + TypeStringList +) diff --git a/util/templates/paramtype_enumer.go b/util/templates/paramtype_enumer.go new file mode 100644 index 000000000..5c91a6ea4 --- /dev/null +++ b/util/templates/paramtype_enumer.go @@ -0,0 +1,102 @@ +// Code generated by "enumer -type ParamType -trimprefix Type"; DO NOT EDIT. + +package templates + +import ( + "fmt" + "strings" +) + +const _ParamTypeName = "StringBoolChoiceChargeModesDurationFloatNumberStringList" + +var _ParamTypeIndex = [...]uint8{0, 6, 10, 16, 27, 35, 40, 46, 56} + +const _ParamTypeLowerName = "stringboolchoicechargemodesdurationfloatnumberstringlist" + +func (i ParamType) String() string { + if i < 0 || i >= ParamType(len(_ParamTypeIndex)-1) { + return fmt.Sprintf("ParamType(%d)", i) + } + return _ParamTypeName[_ParamTypeIndex[i]:_ParamTypeIndex[i+1]] +} + +// An "invalid array index" compiler error signifies that the constant values have changed. +// Re-run the stringer command to generate them again. +func _ParamTypeNoOp() { + var x [1]struct{} + _ = x[TypeString-(0)] + _ = x[TypeBool-(1)] + _ = x[TypeChoice-(2)] + _ = x[TypeChargeModes-(3)] + _ = x[TypeDuration-(4)] + _ = x[TypeFloat-(5)] + _ = x[TypeNumber-(6)] + _ = x[TypeStringList-(7)] +} + +var _ParamTypeValues = []ParamType{TypeString, TypeBool, TypeChoice, TypeChargeModes, TypeDuration, TypeFloat, TypeNumber, TypeStringList} + +var _ParamTypeNameToValueMap = map[string]ParamType{ + _ParamTypeName[0:6]: TypeString, + _ParamTypeLowerName[0:6]: TypeString, + _ParamTypeName[6:10]: TypeBool, + _ParamTypeLowerName[6:10]: TypeBool, + _ParamTypeName[10:16]: TypeChoice, + _ParamTypeLowerName[10:16]: TypeChoice, + _ParamTypeName[16:27]: TypeChargeModes, + _ParamTypeLowerName[16:27]: TypeChargeModes, + _ParamTypeName[27:35]: TypeDuration, + _ParamTypeLowerName[27:35]: TypeDuration, + _ParamTypeName[35:40]: TypeFloat, + _ParamTypeLowerName[35:40]: TypeFloat, + _ParamTypeName[40:46]: TypeNumber, + _ParamTypeLowerName[40:46]: TypeNumber, + _ParamTypeName[46:56]: TypeStringList, + _ParamTypeLowerName[46:56]: TypeStringList, +} + +var _ParamTypeNames = []string{ + _ParamTypeName[0:6], + _ParamTypeName[6:10], + _ParamTypeName[10:16], + _ParamTypeName[16:27], + _ParamTypeName[27:35], + _ParamTypeName[35:40], + _ParamTypeName[40:46], + _ParamTypeName[46:56], +} + +// ParamTypeString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func ParamTypeString(s string) (ParamType, error) { + if val, ok := _ParamTypeNameToValueMap[s]; ok { + return val, nil + } + + if val, ok := _ParamTypeNameToValueMap[strings.ToLower(s)]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to ParamType values", s) +} + +// ParamTypeValues returns all values of the enum +func ParamTypeValues() []ParamType { + return _ParamTypeValues +} + +// ParamTypeStrings returns a slice of all String values of the enum +func ParamTypeStrings() []string { + strs := make([]string, len(_ParamTypeNames)) + copy(strs, _ParamTypeNames) + return strs +} + +// IsAParamType returns "true" if the value is listed in the enum definition. "false" otherwise +func (i ParamType) IsAParamType() bool { + for _, v := range _ParamTypeValues { + if i == v { + return true + } + } + return false +} diff --git a/util/templates/template.go b/util/templates/template.go index 15d11ba17..e47b62c43 100644 --- a/util/templates/template.go +++ b/util/templates/template.go @@ -31,10 +31,6 @@ 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 p.Type == "" || (p.Type != "" && !slices.Contains(ValidParamTypes, p.Type)) { - t.Params[i].Type = ParamTypeString - } - if index, resultMapItem := t.ConfigDefaults.ParamByName(strings.ToLower(p.Name)); index > -1 { t.Params[i].OverwriteProperties(resultMapItem) } @@ -72,10 +68,6 @@ func (t *Template) Validate() error { } } } - - if p.Type != "" && !slices.Contains(ValidParamTypes, p.Type) { - return fmt.Errorf("invalid value type '%s' in template %s", p.Type, t.Template) - } } return nil @@ -231,7 +223,7 @@ func (t *Template) RenderProxyWithValues(values map[string]interface{}, lang str } switch p.Type { - case ParamTypeStringList: + case TypeStringList: for _, e := range v.([]string) { t.Params[index].Values = append(p.Values, yamlQuote(e)) } @@ -251,7 +243,7 @@ func (t *Template) RenderProxyWithValues(values map[string]interface{}, lang str for _, param := range t.Params { if !param.IsRequired() { switch param.Type { - case ParamTypeStringList: + case TypeStringList: if len(param.Values) == 0 { continue } diff --git a/util/templates/template_documentation.go b/util/templates/template_documentation.go index 4ac37698b..050fd277f 100644 --- a/util/templates/template_documentation.go +++ b/util/templates/template_documentation.go @@ -25,7 +25,7 @@ func (t *Template) RenderDocumentation(product Product, values map[string]interf } switch p.Type { - case ParamTypeStringList: + case TypeStringList: for _, e := range v.([]string) { t.Params[index].Values = append(p.Values, yamlQuote(e)) } diff --git a/util/templates/types.go b/util/templates/types.go index 330e63c40..18556e3c8 100644 --- a/util/templates/types.go +++ b/util/templates/types.go @@ -40,18 +40,6 @@ const ( TemplateRenderModeInstance = "instance" ) -const ( - ParamTypeString = "string" - ParamTypeNumber = "number" - ParamTypeFloat = "float" - ParamTypeBool = "bool" - ParamTypeStringList = "stringlist" - ParamTypeChargeModes = "chargemodes" - ParamTypeDuration = "duration" -) - -var ValidParamTypes = []string{ParamTypeString, ParamTypeNumber, ParamTypeFloat, ParamTypeBool, ParamTypeStringList, ParamTypeChargeModes, ParamTypeDuration} - var ( ValidModbusChoices = []string{ModbusChoiceRS485, ModbusChoiceTCPIP} ValidUsageChoices = []string{UsageChoiceGrid, UsageChoicePV, UsageChoiceBattery, UsageChoiceCharge} @@ -197,7 +185,7 @@ type Param struct { Value string `json:"-"` // user provided value via cli configuration Values []string `json:",omitempty"` // user provided list of values e.g. for Type "stringlist" Usages []string `json:",omitempty"` // restrict param to these usage types, e.g. "battery" for home battery capacity - Type string // string representation of the value type, "string" is default + Type ParamType // string representation of the value type, "string" is default ValidValues []string `json:",omitempty"` // list of valid values the user can provide Choice []string `json:",omitempty"` // defines a set of choices, e.g. "grid", "pv", "battery", "charge" for "usage" AllInOne *bool `json:"-"` // defines if the defined usages can all be present in a single device @@ -213,7 +201,7 @@ type Param struct { // return a default value or example value depending on the renderMode func (p *Param) DefaultValue(renderMode string) interface{} { // return empty list to allow iterating over in template - if p.Type == ParamTypeStringList { + if p.Type == TypeStringList { return []string{} }