Repository: evcc-io/evcc
Pull request #6368 (2023-02-22 17:59:11)

Switch sockets: allow removing vehicle selection for integrated devices
Builds on https://github.com/evcc-io/evcc/pull/6316 to expose `icon` and `features` as part of the switch socket templates.
Also implements strict validation for the param types to prevent template errors.

TODO

- [x] make icon list a `choice`

/cc @DerAndereAndi 


Patch:
diff --git a/api/actionconfig.go b/api/actionconfig.go
index ee3865e4..7cc6d161 100644
--- a/api/actionconfig.go
+++ b/api/actionconfig.go
@@ -15,6 +15,7 @@ type ActionConfig struct {
 	MaxCurrent *float64    `mapstructure:"maxCurrent,omitempty"` // Maximum Current
 	MinSoc     *int        `mapstructure:"minSoc,omitempty"`     // Minimum Soc
 	TargetSoc  *int        `mapstructure:"targetSoc,omitempty"`  // Target Soc
+	Priority   *int        `mapstructure:"priority,omitempty"`   // Priority
 }
 
 // Merge merges all non-nil properties of the additional config into the base config.
diff --git a/assets/js/components/Vehicle.story.vue b/assets/js/components/Vehicle.story.vue
index 70a340fd..eccbe30d 100644
--- a/assets/js/components/Vehicle.story.vue
+++ b/assets/js/components/Vehicle.story.vue
@@ -7,7 +7,7 @@ const state = reactive({
 	enabled: false,
 	connected: true,
 	vehiclePresent: true,
-	vehicleSoc: 42,
+	vehicleSoc: 42.742,
 	vehicleRange: 231,
 	targetSoc: 90,
 	vehicleCapacity: 72,
diff --git a/assets/js/components/Vehicle.vue b/assets/js/components/Vehicle.vue
index e6b3d2b4..ba78b687 100644
--- a/assets/js/components/Vehicle.vue
+++ b/assets/js/components/Vehicle.vue
@@ -19,7 +19,7 @@
 				v-if="socBasedCharging"
 				class="flex-grow-1"
 				:label="$t('main.vehicle.vehicleSoc')"
-				:value="vehicleSoc ? `${vehicleSoc}%` : '--'"
+				:value="vehicleSoc ? `${Math.round(vehicleSoc)}%` : '--'"
 				:extraValue="range ? `${Math.round(range)} ${rangeUnit}` : null"
 				align="start"
 			/>
diff --git a/assets/js/components/VehicleStatus.vue b/assets/js/components/VehicleStatus.vue
index ed76cdcf..029c454b 100644
--- a/assets/js/components/VehicleStatus.vue
+++ b/assets/js/components/VehicleStatus.vue
@@ -26,7 +26,6 @@ export default {
 	computed: {
 		phaseTimerActive() {
 			return (
-				this.charging &&
 				this.phaseRemainingInterpolated > 0 &&
 				["scale1p", "scale3p"].includes(this.phaseAction)
 			);
diff --git a/charger/ocpp/cs.go b/charger/ocpp/cs.go
index b0a5ade7..d5674995 100644
--- a/charger/ocpp/cs.go
+++ b/charger/ocpp/cs.go
@@ -89,17 +89,17 @@ func (cs *CS) Debugf(fmt string, args ...interface{}) {
 }
 
 func (cs *CS) Info(args ...interface{}) {
-	cs.log.DEBUG.Println(args...)
+	cs.log.TRACE.Println(args...)
 }
 
 func (cs *CS) Infof(fmt string, args ...interface{}) {
-	cs.log.DEBUG.Printf(fmt, args...)
+	cs.log.TRACE.Printf(fmt, args...)
 }
 
 func (cs *CS) Error(args ...interface{}) {
-	cs.log.ERROR.Println(args...)
+	cs.log.TRACE.Println(args...)
 }
 
 func (cs *CS) Errorf(fmt string, args ...interface{}) {
-	cs.log.ERROR.Printf(fmt, args...)
+	cs.log.TRACE.Printf(fmt, args...)
 }
diff --git a/charger/ocpp/instance.go b/charger/ocpp/instance.go
index 27aa6d0b..a0ae7d51 100644
--- a/charger/ocpp/instance.go
+++ b/charger/ocpp/instance.go
@@ -5,6 +5,7 @@ import (
 
 	"github.com/evcc-io/evcc/util"
 	ocpp16 "github.com/lorenzodonini/ocpp-go/ocpp1.6"
+	"github.com/lorenzodonini/ocpp-go/ocppj"
 )
 
 var instance *CS
@@ -19,7 +20,7 @@ func Instance() *CS {
 			CentralSystem: cs,
 		}
 
-		// ocppj.SetLogger(instance)
+		ocppj.SetLogger(instance)
 
 		cs.SetCoreHandler(instance)
 		cs.SetNewChargePointHandler(instance.NewChargePoint)
diff --git a/cmd/configure/eebus.go b/cmd/configure/eebus.go
index 42831952..0552a018 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 2877245f..ca5933ae 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 ac41d91d..548346f3 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 dd16445a..672923d9 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 94b2c145..f32d6cba 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 7ca30b1a..cbf3a515 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 131fe95b..a9c6179a 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 66c1bff7..b84ea85f 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/cmd/helper.go b/cmd/helper.go
index 1cecc9ed..95f0f075 100644
--- a/cmd/helper.go
+++ b/cmd/helper.go
@@ -11,10 +11,8 @@ import (
 	"strings"
 
 	"github.com/evcc-io/evcc/cmd/shutdown"
-	"github.com/evcc-io/evcc/push"
 	"github.com/evcc-io/evcc/util"
 	"github.com/spf13/viper"
-	"golang.org/x/exp/slices"
 )
 
 // parseLogLevels parses --log area:level[,...] switch into levels per log area
@@ -34,33 +32,6 @@ func parseLogLevels() {
 	util.LogLevel(level, levels)
 }
 
-// pushErrorEvents forwards error events as push messages
-func pushErrorEvents(events chan<- push.Event, valueChan <-chan util.Param) {
-	cache := make(map[string]interface{})
-
-	for p := range valueChan {
-		if !slices.Contains([]string{"warn", "error", "fatal"}, p.Key) {
-			continue
-		}
-
-		// deduplicate
-		if v, ok := cache[p.Key]; ok && v == p.Val {
-			continue
-		}
-		cache[p.Key] = p.Val
-
-		// simplify for users
-		if p.Key == "fatal" {
-			p.Key = "error"
-		}
-
-		events <- push.Event{
-			Event:     p.Key,
-			Loadpoint: p.Loadpoint,
-		}
-	}
-}
-
 // unwrap converts a wrapped error into slice of strings
 func unwrap(err error) (res []string) {
 	for err != nil {
diff --git a/cmd/root.go b/cmd/root.go
index 191063d8..b2bb2f9c 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -37,7 +37,9 @@ var (
 	log     = util.NewLogger("main")
 	cfgFile string
 
-	ignoreMqtt = []string{"auth", "releaseNotes"} // excessive size may crash certain brokers
+	ignoreEmpty  = ""                               // ignore empty keys
+	ignoreErrors = []string{"warn", "error"}        // ignore errors
+	ignoreMqtt   = []string{"auth", "releaseNotes"} // excessive size may crash certain brokers
 )
 
 // rootCmd represents the base command when called without any subcommands
@@ -134,7 +136,7 @@ func runRoot(cmd *cobra.Command, args []string) {
 
 	// value cache
 	cache := util.NewCache()
-	go cache.Run(tee.Attach())
+	go cache.Run(pipe.NewDropper(ignoreErrors...).Pipe(tee.Attach()))
 
 	// create web server
 	socketHub := server.NewSocketHub()
@@ -151,24 +153,15 @@ func runRoot(cmd *cobra.Command, args []string) {
 	}
 
 	// publish to UI
-	go socketHub.Run(tee.Attach(), cache)
+	go socketHub.Run(pipe.NewDropper(ignoreEmpty).Pipe(tee.Attach()), cache)
 
 	// setup values channel
-	valueChan := make(chan util.Param, 1)
+	valueChan := make(chan util.Param)
 	go tee.Run(valueChan)
 
-	// setup events channel
-	eventChan := make(chan push.Event, 1)
-	go pushErrorEvents(eventChan, tee.Attach())
-
 	// capture log messages for UI
 	util.CaptureLogs(valueChan)
 
-	// setup messaging
-	if err == nil {
-		err = configureMessengers(conf.Messaging, eventChan, valueChan, cache)
-	}
-
 	// setup environment
 	if err == nil {
 		err = configureEnvironment(cmd, conf)
@@ -200,13 +193,13 @@ func runRoot(cmd *cobra.Command, args []string) {
 
 	// setup database
 	if err == nil && conf.Influx.URL != "" {
-		configureInflux(conf.Influx, site, tee.Attach())
+		configureInflux(conf.Influx, site, pipe.NewDropper(append(ignoreErrors, ignoreEmpty)...).Pipe(tee.Attach()))
 	}
 
 	// setup mqtt publisher
 	if err == nil && conf.Mqtt.Broker != "" {
 		publisher := server.NewMQTT(strings.Trim(conf.Mqtt.Topic, "/"))
-		go publisher.Run(site, pipe.NewDropper(ignoreMqtt...).Pipe(tee.Attach()))
+		go publisher.Run(site, pipe.NewDropper(append(ignoreMqtt, ignoreEmpty)...).Pipe(tee.Attach()))
 	}
 
 	// announce on mDNS
@@ -219,6 +212,12 @@ func runRoot(cmd *cobra.Command, args []string) {
 		err = configureHEMS(conf.HEMS, site, httpd)
 	}
 
+	// setup messaging
+	var pushChan chan push.Event
+	if err == nil {
+		pushChan, err = configureMessengers(conf.Messaging, valueChan, cache)
+	}
+
 	// run shutdown functions on stop
 	var once sync.Once
 	stopC := make(chan struct{})
@@ -254,7 +253,7 @@ func runRoot(cmd *cobra.Command, args []string) {
 
 		// set channels
 		site.DumpConfig()
-		site.Prepare(valueChan, eventChan)
+		site.Prepare(valueChan, pushChan)
 
 		// show and check version
 		valueChan <- util.Param{Key: "version", Val: server.FormattedVersion()}
diff --git a/cmd/setup.go b/cmd/setup.go
index e0b3030b..3764e091 100644
--- a/cmd/setup.go
+++ b/cmd/setup.go
@@ -203,26 +203,25 @@ func configureEEBus(conf map[string]interface{}) error {
 }
 
 // setup messaging
-func configureMessengers(conf messagingConfig, eventChan <-chan push.Event, valueChan chan util.Param, cache *util.Cache) error {
-	pushHub, err := push.NewHub(conf.Events, cache)
-
-	if pushHub != nil {
-		go pushHub.Run(eventChan, valueChan)
-	}
+func configureMessengers(conf messagingConfig, valueChan chan util.Param, cache *util.Cache) (chan push.Event, error) {
+	messageChan := make(chan push.Event, 1)
 
+	messageHub, err := push.NewHub(conf.Events, cache)
 	if err != nil {
-		return fmt.Errorf("failed configuring push services: %w", err)
+		return messageChan, fmt.Errorf("failed configuring push services: %w", err)
 	}
 
 	for _, service := range conf.Services {
 		impl, err := push.NewFromConfig(service.Type, service.Other)
 		if err != nil {
-			return fmt.Errorf("failed configuring push service %s: %w", service.Type, err)
+			return messageChan, fmt.Errorf("failed configuring push service %s: %w", service.Type, err)
 		}
-		pushHub.Add(impl)
+		messageHub.Add(impl)
 	}
 
-	return nil
+	go messageHub.Run(messageChan, valueChan)
+
+	return messageChan, nil
 }
 
 func configureTariffs(conf tariffConfig) (tariff.Tariffs, error) {
diff --git a/core/loadpoint.go b/core/loadpoint.go
index e5a255a9..943dc2bc 100644
--- a/core/loadpoint.go
+++ b/core/loadpoint.go
@@ -308,6 +308,7 @@ func (lp *Loadpoint) collectDefaults() {
 		*actionCfg.MaxCurrent = lp.GetMaxCurrent()
 		*actionCfg.MinSoc = lp.GetMinSoc()
 		*actionCfg.TargetSoc = lp.GetTargetSoc()
+		*actionCfg.Priority = lp.Priority()
 	} else {
 		lp.log.ERROR.Printf("error allocating action config: %v", err)
 	}
diff --git a/evcc.dist.yaml b/evcc.dist.yaml
index 8c553b6c..503ed998 100644
--- a/evcc.dist.yaml
+++ b/evcc.dist.yaml
@@ -147,7 +147,6 @@ loadpoints:
     guardDuration: 5m # switch charger contactor not more often than this (default 5m)
 
 # tariffs are the fixed or variable tariffs
-# cheap (tibber/awattar) can be used to define a tariff rate considered cheap enough for charging
 tariffs:
   currency: EUR # three letter ISO-4217 currency code (default EUR)
   grid:
@@ -163,13 +162,11 @@ tariffs:
 
     # # or variable via tibber
     # type: tibber
-    # cheap: 0.2 # EUR/kWh
     # token: "476c477d8a039529478ebd690d35ddd80e3308ffc49b59c65b142321aee963a4" # access token
     # homeid: "cc83e83e-8cbf-4595-9bf7-c3cf192f7d9c" # optional if multiple homes associated to account
 
     # # or variable via awattar
     # type: awattar
-    # cheap: 0.2 # EUR/kWh
     # region: de # optional, choose at for Austria
   feedin:
     # rate for feeding excess (pv) energy to the grid
@@ -231,10 +228,6 @@ messaging:
     guest: # vehicle could not be identified
       title: Unknown vehicle
       msg: Unknown vehicle, guest connected?
-    error: # errors (deduplicated)
-      title: "Error: {{ .error }}"
-    warn: # warnings (deduplicated)
-      title: "Warning: {{ .warn }}"
   services:
   # - type: pushover
   #   app: # app id
diff --git a/go.mod b/go.mod
index d24bc837..3f7e4435 100644
--- a/go.mod
+++ b/go.mod
@@ -58,8 +58,9 @@ require (
 	github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
 	github.com/koron/go-ssdp v0.0.3
 	github.com/korylprince/ipnetgen v1.0.1
+	github.com/kr/pretty v0.3.0
 	github.com/libp2p/zeroconf/v2 v2.2.0
-	github.com/lorenzodonini/ocpp-go v0.16.1-0.20220927200117-d4afed542168
+	github.com/lorenzodonini/ocpp-go v0.16.1-0.20230224180512-0195c3faf41a
 	github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40
 	github.com/mabunixda/wattpilot v1.1.1
 	github.com/manifoldco/promptui v0.9.0
@@ -144,6 +145,7 @@ require (
 	github.com/jmespath/go-jmespath v0.4.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/klauspost/compress v1.15.15 // indirect
+	github.com/kr/text v0.2.0 // indirect
 	github.com/leodido/go-urn v1.2.1 // indirect
 	github.com/magiconair/properties v1.8.7 // indirect
 	github.com/mattn/go-colorable v0.1.13 // indirect
diff --git a/go.sum b/go.sum
index 350021ca..0417f88c 100644
--- a/go.sum
+++ b/go.sum
@@ -741,8 +741,8 @@ github.com/libp2p/zeroconf/v2 v2.2.0 h1:Cup06Jv6u81HLhIj1KasuNM/RHHrJ8T7wOTS4+Tv
 github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs=
 github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
 github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
-github.com/lorenzodonini/ocpp-go v0.16.1-0.20220927200117-d4afed542168 h1:0ee2I1+6Yx1nysNRy++31IIxi6boUSOXB/IIGYqjyoM=
-github.com/lorenzodonini/ocpp-go v0.16.1-0.20220927200117-d4afed542168/go.mod h1:jVzgk5k3JVGltWMU/QGlU7chojlCd/bJYc4WYl8R2M4=
+github.com/lorenzodonini/ocpp-go v0.16.1-0.20230224180512-0195c3faf41a h1:4wipg1U/2zqmT1i1O4JZlRKPRZMTDLZjjlPr/l+k+4k=
+github.com/lorenzodonini/ocpp-go v0.16.1-0.20230224180512-0195c3faf41a/go.mod h1:jVzgk5k3JVGltWMU/QGlU7chojlCd/bJYc4WYl8R2M4=
 github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 h1:EnfXoSqDfSNJv0VBNqY/88RNnhSGYkrHaO0mmFGbVsc=
 github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40/go.mod h1:vy1vK6wD6j7xX6O6hXe621WabdtNkou2h7uRtTfRMyg=
 github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
diff --git a/i18n/en.toml b/i18n/en.toml
index 159053eb..2d333d5c 100644
--- a/i18n/en.toml
+++ b/i18n/en.toml
@@ -182,8 +182,8 @@ disconnected = "Disconnected."
 minCharge = "Minimum charging to {soc}%."
 pvDisable = "Not enough surplus. Pausing in {remaining}…"
 pvEnable = "Surplus available. Starting in {remaining}…"
-scale1p = "Reducing to 1-phase power in {remaining}…"
-scale3p = "Increasing to 3-phase power in {remaining}…"
+scale1p = "Reducing to 1-phase charging in {remaining}…"
+scale3p = "Increasing to 3-phase charging in {remaining}…"
 targetChargeActive = "Target charge active…"
 targetChargePlanned = "Target charging starts at {time}."
 targetChargeWaitForVehicle = "Target charge ready. Waiting for vehicle…"
diff --git a/packaging/scripts/postinstall.sh b/packaging/scripts/postinstall.sh
index 67c3d10b..e484d920 100644
--- a/packaging/scripts/postinstall.sh
+++ b/packaging/scripts/postinstall.sh
@@ -4,7 +4,7 @@ set -e
 USER_CHOICE_CONFIG="/etc/evcc-userchoices.sh"
 ETC_SERVICE="/etc/systemd/system/evcc.service"
 USR_LOCAL_BIN="/usr/local/bin/evcc"
-RESTART_FLAG_FILE=/var/lib/evcc/.restartOnUpgrade
+RESTART_FLAG_FILE="/tmp/.restartEvccOnUpgrade"
 
 # Usage: askUserKeepFile <file>
 # Return: 1 = keep, 0 = delete
@@ -12,7 +12,7 @@ askUserKeepFile() {
 	while true; do
 		echo "Shall '$1' be deleted? [Y/n]: "
 		read answer
-		case "$answer" in 
+		case "$answer" in
 			n*|N*)
 				echo "Ok. We will keep that file. Keep in mind that you may need to alter it if any changes are done upstream. Your answer is saved for the future."
 				return 1
@@ -45,7 +45,7 @@ if [ "$1" = "configure" ]; then
 		echo "This is probably due to a previous manual installation."
 		echo "You probably want to delete this file now. Your evcc configuration stays untouched!"
 		askUserKeepFile "$ETC_SERVICE" || KEEP_ETC_SERVICE=$?
-	fi	
+	fi
 	if [ -f "$USR_LOCAL_BIN" ] && [ "$KEEP_USR_LOCAL_BIN" -eq 0 ]; then
 		echo "An alternate evcc binary was detected under '$USR_LOCAL_BIN'."
 		echo "This is probably due to a previous manual installation."
@@ -53,7 +53,7 @@ if [ "$1" = "configure" ]; then
 		askUserKeepFile "$USR_LOCAL_BIN" || KEEP_USR_LOCAL_BIN=$?
 	fi
 	# Save the user decision
-	cat > "$USER_CHOICE_CONFIG" <<EOF 
+	cat > "$USER_CHOICE_CONFIG" <<EOF
 #!/bin/sh
 KEEP_ETC_SERVICE=$KEEP_ETC_SERVICE
 KEEP_USR_LOCAL_BIN=$KEEP_USR_LOCAL_BIN
diff --git a/packaging/scripts/preinstall.sh b/packaging/scripts/preinstall.sh
index 1da63b77..2a2fd67f 100644
--- a/packaging/scripts/preinstall.sh
+++ b/packaging/scripts/preinstall.sh
@@ -10,7 +10,7 @@ set -e
 EVCC_USER=evcc
 EVCC_GROUP=evcc
 EVCC_HOME="/var/lib/$EVCC_USER"
-RESTART_FLAG_FILE=$EVCC_HOME/.restartOnUpgrade
+RESTART_FLAG_FILE="/tmp/.restartEvccOnUpgrade"
 
 copyDbToUserDir() {
   CURRENT_USER=$(systemctl show -pUser evcc | cut -d= -f2)
@@ -21,9 +21,14 @@ copyDbToUserDir() {
   COPIED_FLAG="$CURRENT_HOME/.evcc/.copiedToEvccUser"
   if [ -f "$CURRENT_HOME/.evcc/evcc.db" ] && [ ! -f "$COPIED_FLAG" ]; then
     if [ -f "$EVCC_HOME/evcc.db" ]; then
-      echo "Not copying $CURRENT_HOME/.evcc/evcc.db to $EVCC_HOME/evcc.db, since there is already a database there"
-      echo "Either delete one of the databases or run 'touch $COPIED_FLAG' to keep both."
+      echo "--------------------------------------------------------------------------------"
+      echo "Not copying $CURRENT_HOME/.evcc/evcc.db to $EVCC_HOME/evcc.db, since there is"
+      echo "already a database there."
+      echo "Either delete one of the databases or run 'touch $COPIED_FLAG' to keep both,"
       echo "then restart installation."
+      echo "Hint: usually the larger one is the one to keep."
+      ls -la "$CURRENT_HOME/.evcc/evcc.db" "$EVCC_HOME/evcc.db"
+      echo "--------------------------------------------------------------------------------"
       exit 1
     else
       cp -Rp "$CURRENT_HOME"/.evcc/evcc.db "$EVCC_HOME"
@@ -31,15 +36,20 @@ copyDbToUserDir() {
     chown "$EVCC_USER:$EVCC_GROUP" "$EVCC_HOME/evcc.db"
     touch "$COPIED_FLAG"
     if [ -n "$(ls -A /etc/systemd/system/evcc.service.d 2>/dev/null)" ]; then
+        echo "--------------------------------------------------------------------------------"
 		echo "You have overrides defined in /etc/systemd/system/evcc.service.d."
-		echo "This update changes the evcc user to 'evcc' (from root) and the database file to '/var/lib/evcc/evcc.db"
+		echo "This update changes the evcc user to 'evcc' (from root) and the database file"
+		echo "to '/var/lib/evcc/evcc.db"
 		echo "Make sure that you neither override 'User' nor 'ExecStart'"
 		echo "Hint: you can delete all overrides with 'systemctl revert evcc'"
 		echo "As a precaution, evcc is not started even if it was previously started."
+        echo "--------------------------------------------------------------------------------"
 		rm -f "$RESTART_FLAG_FILE"
 	else
+        echo "--------------------------------------------------------------------------------"
 		echo "NOTE: evcc user has changed from $CURRENT_USER to $EVCC_USER, db has been copied to new"
 		echo "directory $EVCC_HOME/evcc.db, old db in $CURRENT_USER/.evcc has been retained."
+      	echo "--------------------------------------------------------------------------------"
     fi
   fi
   return 0
@@ -72,9 +82,14 @@ if [ "$1" = "install" ] || [ "$1" = "upgrade" ]; then
           	cp "$homedir/.evcc/evcc.db" "$EVCC_HOME" && touch "$homedir/.evcc/.copiedToEvccUser"
           fi
         else
+      	  echo "--------------------------------------------------------------------------------"
           echo "Warning: evcc's home directory is incorrect ($homedir)"
           echo "but can't be changed because another process ($process) is using it."
           echo "Stop offending process(es), then restart installation"
+          echo "Note that you should NOT use the evcc user as login user, since that will"
+          echo "inevitably lead to this error."
+          echo "in that case, please create a different user as login user."
+          echo "--------------------------------------------------------------------------------"
           exit 1
         fi
       fi
diff --git a/push/hub.go b/push/hub.go
index a1b84d9c..07c8697d 100644
--- a/push/hub.go
+++ b/push/hub.go
@@ -27,23 +27,23 @@ type Hub struct {
 	cache       *util.Cache
 }
 
-// NewHub creates push hub with definitions and receiver. The hub is always created, even on error.
+// NewHub creates push hub with definitions and receiver
 func NewHub(cc map[string]EventTemplateConfig, cache *util.Cache) (*Hub, error) {
-	h := &Hub{
-		definitions: cc,
-		cache:       cache,
-	}
-
 	// instantiate all event templates
 	for k, v := range cc {
 		if _, err := template.New("out").Funcs(template.FuncMap(sprig.FuncMap())).Parse(v.Title); err != nil {
-			return h, fmt.Errorf("invalid event title: %s (%w)", k, err)
+			return nil, fmt.Errorf("invalid event title: %s (%w)", k, err)
 		}
 		if _, err := template.New("out").Funcs(template.FuncMap(sprig.FuncMap())).Parse(v.Msg); err != nil {
-			return h, fmt.Errorf("invalid event message: %s (%w)", k, err)
+			return nil, fmt.Errorf("invalid event message: %s (%w)", k, err)
 		}
 	}
 
+	h := &Hub{
+		definitions: cc,
+		cache:       cache,
+	}
+
 	return h, nil
 }
 
@@ -72,7 +72,7 @@ func (h *Hub) apply(ev Event, tmpl string) (string, error) {
 }
 
 // Run is the Hub's main publishing loop
-func (h *Hub) Run(events <-chan Event, valueChan chan<- util.Param) {
+func (h *Hub) Run(events <-chan Event, valueChan chan util.Param) {
 	log := util.NewLogger("push")
 
 	for ev := range events {
@@ -103,7 +103,7 @@ func (h *Hub) Run(events <-chan Event, valueChan chan<- util.Param) {
 		}
 
 		for _, sender := range h.sender {
-			if strings.TrimSpace(title)+strings.TrimSpace(msg) != "" {
+			if strings.TrimSpace(msg) != "" {
 				go sender.Send(title, msg)
 			} else {
 				log.DEBUG.Printf("did not send empty message template for %s: %v", ev.Event, err)
diff --git a/server/socket.go b/server/socket.go
index 1c83dcb9..0c957757 100644
--- a/server/socket.go
+++ b/server/socket.go
@@ -6,10 +6,12 @@ import (
 	"math"
 	"net/http"
 	"strings"
+	"sync"
 	"time"
 
 	"github.com/evcc-io/evcc/util"
 	"github.com/gorilla/websocket"
+	"github.com/kr/pretty"
 )
 
 const (
@@ -68,6 +70,8 @@ func ServeWebsocket(hub *SocketHub, w http.ResponseWriter, r *http.Request) {
 // SocketHub maintains the set of active clients and broadcasts messages to the
 // clients.
 type SocketHub struct {
+	mu sync.RWMutex
+
 	// Registered clients.
 	clients map[*SocketClient]bool
 
@@ -92,11 +96,11 @@ func encode(v interface{}) (string, error) {
 	var s string
 	switch val := v.(type) {
 	case time.Time:
-		var b []byte
-		if !val.IsZero() {
-			b, _ = val.Round(time.Second).Local().MarshalText()
+		if val.IsZero() {
+			s = "null"
+		} else {
+			s = fmt.Sprintf(`"%s"`, val.Format(time.RFC3339))
 		}
-		s = fmt.Sprintf(`"%s"`, string(b))
 	case time.Duration:
 		// must be before stringer to convert to seconds instead of string
 		s = fmt.Sprintf("%d", int64(val.Seconds()))
@@ -109,6 +113,8 @@ func encode(v interface{}) (string, error) {
 	default:
 		if b, err := json.Marshal(v); err == nil {
 			s = string(b)
+		} else {
+			return "", err
 		}
 	}
 	return s, nil
@@ -120,6 +126,11 @@ func kv(p util.Param) string {
 		panic(err)
 	}
 
+	if p.Key == "" && val == "" {
+		log.ERROR.Printf("invalid key/val for %+v %# v, please report to https://github.com/evcc-io/evcc/issues/6439", p, pretty.Formatter(p.Val))
+		return "\"foo\":\"bar\""
+	}
+
 	var msg strings.Builder
 	msg.WriteString("\"")
 	if p.Loadpoint != nil {
@@ -133,7 +144,9 @@ func kv(p util.Param) string {
 }
 
 func (h *SocketHub) welcome(client *SocketClient, params []util.Param) {
+	h.mu.Lock()
 	h.clients[client] = true
+	h.mu.Unlock()
 
 	var msg strings.Builder
 	msg.WriteString("{")
@@ -153,6 +166,9 @@ func (h *SocketHub) welcome(client *SocketClient, params []util.Param) {
 }
 
 func (h *SocketHub) broadcast(p util.Param) {
+	h.mu.RLock()
+	defer h.mu.RUnlock()
+
 	if len(h.clients) > 0 {
 		msg := "{" + kv(p) + "}"
 
@@ -173,10 +189,12 @@ func (h *SocketHub) Run(in <-chan util.Param, cache *util.Cache) {
 		case client := <-h.register:
 			h.welcome(client, cache.All())
 		case client := <-h.unregister:
+			h.mu.Lock()
 			if _, ok := h.clients[client]; ok {
 				close(client.send)
 				delete(h.clients, client)
 			}
+			h.mu.Unlock()
 		case msg, ok := <-in:
 			if !ok {
 				return // break if channel closed
diff --git a/templates/definition/charger/fritzdect.yaml b/templates/definition/charger/fritzdect.yaml
index afdb9308..ec42a82f 100644
--- a/templates/definition/charger/fritzdect.yaml
+++ b/templates/definition/charger/fritzdect.yaml
@@ -14,17 +14,13 @@ 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 }}
   user: {{ .user }}
   password: {{ .password }}
-  ain: "{{ .ain }}" # switch actor identification number without blanks (see AIN number on switch sticker)
+  ain: {{ .ain }} # switch actor identification number without blanks (see AIN number on switch sticker)
   standbypower: {{ .standbypower }}
diff --git a/templates/definition/charger/homematic.yaml b/templates/definition/charger/homematic.yaml
index a21a8772..3b79b28f 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 955201ac..3a1db706 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 d8e56758..3074a8cf 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 033c2aec..91e74620 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 eb17fd83..61a70f81 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 cf07b0e5..7beac61f 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 05f55986..533dcd10 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
@@ -83,7 +83,7 @@ params:
       en: Username
     help:
       de: Benutzerkonto (bspw. E-Mail Adresse, User Id, etc.)
-      en: User-account (e.g. email address, user id, etc.)
+      en: User account (e.g. email address, user id, etc.)
   - name: password
     description:
       de: Passwort
@@ -168,7 +168,7 @@ params:
     type: duration
   - name: mode
     description:
-      de: Standard-Lademodus, wenn ein Fahrzeug angeschlossen ist
+      de: Standardlademodus, wenn ein Fahrzeug angeschlossen ist
       en: Default charging mode when a vehicle is connected
     help:
       de: Möglich sind Off, Now, MinPV und PV, oder leer wenn keiner definiert werden soll
@@ -179,13 +179,13 @@ params:
       de: Minimaler Ladestand (Soc) in %
       en: Minimum state of charge (Soc) in %
     help:
-      de: Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht
-      en: Charge immediately with maximum power up to the defined state of charge, if the charge mode is not set to 'OFF'
+      de: Ladung mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand unabhängig PV-Erzeugung, wenn der Lademodus nicht auf 'Aus' steht
+      en: Immediate charging with maximum power up to the defined state of charge independently from solar production if the charge mode is not set to 'OFF'
     example: 25
     type: number
   - name: targetsoc
     description:
-      de: Ziel-Ladestand (Soc) in %
+      de: Zielladestand (Soc) in %
       en: Target state of charge (Soc) in %
     help:
       de: Bis zu welchem Ladestand (Soc) soll das Fahrzeug geladen werden
@@ -218,6 +218,14 @@ params:
       de: "Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox"
       en: "Mostly this can be added later, see: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox"
     type: stringlist
+  - name: priority
+    description:
+      de: Priorität
+      en: Priority
+    help:
+      de: Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie
+      en: Priority of the loadpoint or vehicle in relation to other loadpoints or vehicles for allocating pv energy
+    type: number
   - name: standbypower
     description:
       de: Standby-Leistung in W
@@ -240,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, 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 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 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:
@@ -321,9 +346,11 @@ presets:
       - name: identifiers
         advanced: true
         type: stringlist
+      - name: priority
+        advanced: true
     render: |
       {{define "vehicle-identify"}}
-      {{- if or (ne .mode "") (ne .minSoc "") (ne .targetSoc "") (ne .minCurrent "") (ne .maxCurrent "") }}
+      {{- if or (ne .mode "") (ne .minSoc "") (ne .targetSoc "") (ne .minCurrent "") (ne .maxCurrent "") (ne .priority "") }}
       onIdentify:
       {{- if (ne .mode "") }}
         mode: {{ .mode }}
@@ -340,6 +367,9 @@ presets:
       {{- if (ne .maxCurrent "") }}
         maxCurrent: {{ .maxCurrent }}
       {{- end }}
+      {{- if (ne .priority "") }}
+      - priority: {{ .priority }}
+      {{- end }}
       {{- end }}
       {{- if ne (len .identifiers) 0 }}
       identifiers:
@@ -376,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/e3dc.yaml b/templates/definition/meter/e3dc.yaml
index 8aaabdbe..fbb6df19 100644
--- a/templates/definition/meter/e3dc.yaml
+++ b/templates/definition/meter/e3dc.yaml
@@ -37,6 +37,7 @@ render: |
         type: holding
         decode: int32s
         address: 40075 # Leistung zusätzlicher Einspeiser in Watt
+      scale: -1 # reverse sign
   {{- end}}
   {{- if eq .usage "battery" }}
   power:
diff --git a/templates/definition/meter/fritzdect.yaml b/templates/definition/meter/fritzdect.yaml
index 5d1760ad..730d721b 100644
--- a/templates/definition/meter/fritzdect.yaml
+++ b/templates/definition/meter/fritzdect.yaml
@@ -16,14 +16,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.
 render: |
   type: fritzdect
   uri: {{ .uri }}
   user: {{ .user }}
   password: {{ .password }}
-  ain: "{{ .ain }}" # switch actor identification number without blanks (see AIN number on switch sticker)
+  ain: {{ .ain }} # switch actor identification number without blanks (see AIN number on switch sticker)
diff --git a/templates/definition/meter/homematic.yaml b/templates/definition/meter/homematic.yaml
index edaf1b1e..b023eb7b 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 297d126f..b47be8bb 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 da07b9f1..df80550c 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 fdba6103..4e527dd0 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 3a8c1d34..fc46f084 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 1834573b..7d8b1530 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 91f46329..9a3d73ac 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 e3976e1c..50a96d44 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 eefc8a59..08ee147f 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 2b73c85b..cc35560f 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 43ef994b..7bdd6357 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 85bae5a5..d6f51f97 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 a0c294bc..2b9f28d7 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 c668b374..5710e6ce 100644
--- a/templates/docs/vehicle/aiways_0.yaml
+++ b/templates/docs/vehicle/aiways_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/audi_0.yaml b/templates/docs/vehicle/audi_0.yaml
index e5281a26..b8c2895b 100644
--- a/templates/docs/vehicle/audi_0.yaml
+++ b/templates/docs/vehicle/audi_0.yaml
@@ -19,11 +19,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/bmw_0.yaml b/templates/docs/vehicle/bmw_0.yaml
index 1f27701d..beba575f 100644
--- a/templates/docs/vehicle/bmw_0.yaml
+++ b/templates/docs/vehicle/bmw_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/carwings_0.yaml b/templates/docs/vehicle/carwings_0.yaml
index 469b962a..bca47518 100644
--- a/templates/docs/vehicle/carwings_0.yaml
+++ b/templates/docs/vehicle/carwings_0.yaml
@@ -19,11 +19,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/citroen_0.yaml b/templates/docs/vehicle/citroen_0.yaml
index ac95b6ca..04787eef 100644
--- a/templates/docs/vehicle/citroen_0.yaml
+++ b/templates/docs/vehicle/citroen_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/cupra_0.yaml b/templates/docs/vehicle/cupra_0.yaml
index a7af606d..dc7d990b 100644
--- a/templates/docs/vehicle/cupra_0.yaml
+++ b/templates/docs/vehicle/cupra_0.yaml
@@ -19,11 +19,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/dacia_0.yaml b/templates/docs/vehicle/dacia_0.yaml
index d73d7a2f..3b192633 100644
--- a/templates/docs/vehicle/dacia_0.yaml
+++ b/templates/docs/vehicle/dacia_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/ds_0.yaml b/templates/docs/vehicle/ds_0.yaml
index 1334b81e..6cf84ce4 100644
--- a/templates/docs/vehicle/ds_0.yaml
+++ b/templates/docs/vehicle/ds_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/enyaq_0.yaml b/templates/docs/vehicle/enyaq_0.yaml
index d8b6e441..7ab36766 100644
--- a/templates/docs/vehicle/enyaq_0.yaml
+++ b/templates/docs/vehicle/enyaq_0.yaml
@@ -19,11 +19,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/etron_0.yaml b/templates/docs/vehicle/etron_0.yaml
index a8b6a871..a81d4835 100644
--- a/templates/docs/vehicle/etron_0.yaml
+++ b/templates/docs/vehicle/etron_0.yaml
@@ -19,11 +19,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/evnotify_0.yaml b/templates/docs/vehicle/evnotify_0.yaml
index 5f54ca08..df1fb0ec 100644
--- a/templates/docs/vehicle/evnotify_0.yaml
+++ b/templates/docs/vehicle/evnotify_0.yaml
@@ -17,10 +17,11 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/fiat_0.yaml b/templates/docs/vehicle/fiat_0.yaml
index 66c4d095..151b96a5 100644
--- a/templates/docs/vehicle/fiat_0.yaml
+++ b/templates/docs/vehicle/fiat_0.yaml
@@ -19,12 +19,13 @@ 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
-      minSoc: 25 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/ford_0.yaml b/templates/docs/vehicle/ford_0.yaml
index f869cc1a..fd990e75 100644
--- a/templates/docs/vehicle/ford_0.yaml
+++ b/templates/docs/vehicle/ford_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/hyundai_0.yaml b/templates/docs/vehicle/hyundai_0.yaml
index babbbb0c..f0af1cca 100644
--- a/templates/docs/vehicle/hyundai_0.yaml
+++ b/templates/docs/vehicle/hyundai_0.yaml
@@ -20,12 +20,13 @@ 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
-      minSoc: 25 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/id_0.yaml b/templates/docs/vehicle/id_0.yaml
index 488f0898..be7be44a 100644
--- a/templates/docs/vehicle/id_0.yaml
+++ b/templates/docs/vehicle/id_0.yaml
@@ -21,11 +21,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/jaguar-landrover_0.yaml b/templates/docs/vehicle/jaguar-landrover_0.yaml
index 311b2f22..7745d2be 100644
--- a/templates/docs/vehicle/jaguar-landrover_0.yaml
+++ b/templates/docs/vehicle/jaguar-landrover_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/jaguar-landrover_1.yaml b/templates/docs/vehicle/jaguar-landrover_1.yaml
index eacd161c..9ca62185 100644
--- a/templates/docs/vehicle/jaguar-landrover_1.yaml
+++ b/templates/docs/vehicle/jaguar-landrover_1.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/kia_0.yaml b/templates/docs/vehicle/kia_0.yaml
index 573cd3a0..f899f876 100644
--- a/templates/docs/vehicle/kia_0.yaml
+++ b/templates/docs/vehicle/kia_0.yaml
@@ -20,12 +20,13 @@ 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
-      minSoc: 25 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/mini_0.yaml b/templates/docs/vehicle/mini_0.yaml
index ee88e9f3..0efd319b 100644
--- a/templates/docs/vehicle/mini_0.yaml
+++ b/templates/docs/vehicle/mini_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/nissan_0.yaml b/templates/docs/vehicle/nissan_0.yaml
index f62e2dd0..9dc55928 100644
--- a/templates/docs/vehicle/nissan_0.yaml
+++ b/templates/docs/vehicle/nissan_0.yaml
@@ -19,11 +19,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/niu-e-scooter_0.yaml b/templates/docs/vehicle/niu-e-scooter_0.yaml
index 5b2c0a83..6fb2e38b 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,10 +20,11 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/offline_0.yaml b/templates/docs/vehicle/offline_0.yaml
index d429bbe6..307d3be5 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 608e6fb1..d6345788 100644
--- a/templates/docs/vehicle/opel_0.yaml
+++ b/templates/docs/vehicle/opel_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/ovms_0.yaml b/templates/docs/vehicle/ovms_0.yaml
index fefeca50..36465e19 100644
--- a/templates/docs/vehicle/ovms_0.yaml
+++ b/templates/docs/vehicle/ovms_0.yaml
@@ -21,10 +21,11 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/peugeot_0.yaml b/templates/docs/vehicle/peugeot_0.yaml
index 168f9c26..9ae0aaa7 100644
--- a/templates/docs/vehicle/peugeot_0.yaml
+++ b/templates/docs/vehicle/peugeot_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/porsche_0.yaml b/templates/docs/vehicle/porsche_0.yaml
index 30abadf8..243bfcbf 100644
--- a/templates/docs/vehicle/porsche_0.yaml
+++ b/templates/docs/vehicle/porsche_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/renault_0.yaml b/templates/docs/vehicle/renault_0.yaml
index 89d38f73..d8a49d58 100644
--- a/templates/docs/vehicle/renault_0.yaml
+++ b/templates/docs/vehicle/renault_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/seat_0.yaml b/templates/docs/vehicle/seat_0.yaml
index 125ed06e..ede8903d 100644
--- a/templates/docs/vehicle/seat_0.yaml
+++ b/templates/docs/vehicle/seat_0.yaml
@@ -19,11 +19,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/silence_0.yaml b/templates/docs/vehicle/silence_0.yaml
index ef7ccc66..bab85242 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 7eda0b93..a9c23b61 100644
--- a/templates/docs/vehicle/skoda_0.yaml
+++ b/templates/docs/vehicle/skoda_0.yaml
@@ -19,11 +19,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/smart_0.yaml b/templates/docs/vehicle/smart_0.yaml
index a8bc4fe0..8c44fce5 100644
--- a/templates/docs/vehicle/smart_0.yaml
+++ b/templates/docs/vehicle/smart_0.yaml
@@ -19,11 +19,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/tesla_0.yaml b/templates/docs/vehicle/tesla_0.yaml
index a252a13f..b27c3c26 100644
--- a/templates/docs/vehicle/tesla_0.yaml
+++ b/templates/docs/vehicle/tesla_0.yaml
@@ -26,10 +26,11 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/tronity_0.yaml b/templates/docs/vehicle/tronity_0.yaml
index eba84f74..e680837e 100644
--- a/templates/docs/vehicle/tronity_0.yaml
+++ b/templates/docs/vehicle/tronity_0.yaml
@@ -20,10 +20,11 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/volvo-connected_0.yaml b/templates/docs/vehicle/volvo-connected_0.yaml
index d63e94e2..00290c16 100644
--- a/templates/docs/vehicle/volvo-connected_0.yaml
+++ b/templates/docs/vehicle/volvo-connected_0.yaml
@@ -19,12 +19,13 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
       vccapikey: # Volvo developer portal VCC API Key, siehe https://github.com/evcc-io/evcc/discussions/3677#discussioncomment-4106300
diff --git a/templates/docs/vehicle/volvo_0.yaml b/templates/docs/vehicle/volvo_0.yaml
index 35c1add5..7aebff6b 100644
--- a/templates/docs/vehicle/volvo_0.yaml
+++ b/templates/docs/vehicle/volvo_0.yaml
@@ -18,11 +18,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/templates/docs/vehicle/vw_0.yaml b/templates/docs/vehicle/vw_0.yaml
index 69fd162f..151222e5 100644
--- a/templates/docs/vehicle/vw_0.yaml
+++ b/templates/docs/vehicle/vw_0.yaml
@@ -21,11 +21,12 @@ 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 # Lade sofort mit maximaler Geschwindigkeit bis zu dem angegeben Ladestand, wenn der Lademodus nicht auf 'Aus' steht # 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
       minCurrent: 6 # Definiert die minimale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       maxCurrent: 16 # Definiert die maximale Stromstärke pro angeschlossener Phase mit welcher das Fahrzeug geladen werden soll # Optional
       identifiers: # Kann meist erst später eingetragen werden, siehe: https://docs.evcc.io/docs/guides/vehicles/#erkennung-des-fahrzeugs-an-der-wallbox # Optional
+      priority: # Priorität des Ladepunktes oder Fahrzeugs in Relation zu anderen Ladepunkten oder Fahrzeugen für die Zuweisung von PV-Energie # Optional
diff --git a/util/log.go b/util/log.go
index a17802d2..979f27ec 100644
--- a/util/log.go
+++ b/util/log.go
@@ -146,12 +146,12 @@ func (w *uiWriter) Write(p []byte) (n int, err error) {
 
 // CaptureLogs appends uiWriter to relevant log levels for
 // loggers created before uiChan is initialized
-func CaptureLogs(valueChan chan<- Param) {
+func CaptureLogs(c chan<- Param) {
 	if uiChan != nil {
-		panic("log capturing already initialized")
+		return
 	}
 
-	uiChan = valueChan
+	uiChan = c
 
 	for _, l := range loggers {
 		captureLogger(l)
diff --git a/util/pipe/limiter.go b/util/pipe/limiter.go
index cc5d2a44..8b8772cd 100644
--- a/util/pipe/limiter.go
+++ b/util/pipe/limiter.go
@@ -5,6 +5,7 @@ import (
 
 	"github.com/benbjohnson/clock"
 	"github.com/evcc-io/evcc/util"
+	"golang.org/x/exp/slices"
 )
 
 // Piper is the interface that data flow plugins must implement
@@ -113,17 +114,11 @@ func NewDropper(filter ...string) Piper {
 
 func (l *Dropper) pipe(in <-chan util.Param, out chan<- util.Param) {
 	for p := range in {
-		var remove bool
-		for _, filtered := range l.filter {
-			if p.Key == filtered {
-				remove = true
-				break
-			}
+		if slices.Contains(l.filter, p.Key) {
+			continue
 		}
 
-		if !remove {
-			out <- p
-		}
+		out <- p
 	}
 }
 
diff --git a/util/templates/init.go b/util/templates/init.go
index 544a55b3..57623b3c 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 00000000..cc07ce71
--- /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 00000000..5c91a6ea
--- /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 15d11ba1..e47b62c4 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 4ac37698..050fd277 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 330e63c4..18556e3c 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{}
 	}
 
diff --git a/util/templates/utils.go b/util/templates/utils.go
index 01929383..67119d31 100644
--- a/util/templates/utils.go
+++ b/util/templates/utils.go
@@ -12,6 +12,7 @@ func quote(value string) string {
 	return fmt.Sprintf("'%s'", quoted)
 }
 
+// yamlQuote quotes strings for yaml if they would otherwise by modified by the unmarshaler
 func yamlQuote(value string) string {
 	input := fmt.Sprintf("key: %s", value)
 


Test patch:
diff --git a/server/socket_test.go b/server/socket_test.go
index f6abef3f..ffe7368f 100644
--- a/server/socket_test.go
+++ b/server/socket_test.go
@@ -2,14 +2,18 @@ package server
 
 import (
 	"math"
-	"reflect"
 	"testing"
 	"time"
+
+	"github.com/stretchr/testify/assert"
 )
 
 func TestEncode(t *testing.T) {
+	now := time.Now()
+
 	tc := []struct {
-		in, out interface{}
+		in  interface{}
+		out string
 	}{
 		{int64(1), "1"},
 		{math.NaN(), "null"},
@@ -17,19 +21,13 @@ func TestEncode(t *testing.T) {
 		{"1.2345", "\"1.2345\""},
 		{time.Hour, "3600"},
 		{"minpv", "\"minpv\""},
+		{time.Time{}, "null"},
+		{now, "\"" + now.Format(time.RFC3339) + "\""},
 	}
 
 	for _, tc := range tc {
-		t.Logf("%+v", tc)
 		out, err := encode(tc.in)
-		if err != nil {
-			t.Error(err)
-		}
-
-		if out != tc.out {
-			t.Errorf("expected %v (string), got %v (%s)",
-				tc.out, out, reflect.TypeOf(out).Kind(),
-			)
-		}
+		assert.NoError(t, err)
+		assert.Equal(t, tc.out, out)
 	}
 }
diff --git a/util/templates/utils_test.go b/util/templates/utils_test.go
index c46689dc..1a543aba 100644
--- a/util/templates/utils_test.go
+++ b/util/templates/utils_test.go
@@ -4,11 +4,12 @@ import (
 	"fmt"
 	"testing"
 
+	"github.com/stretchr/testify/assert"
 	"gopkg.in/yaml.v3"
 )
 
 func TestYamlDecode(t *testing.T) {
-	for _, value := range []string{`value`, `!value`, `@value`, `"value"`, `"va"lue"`, `va'lue`, `@va'lue`, `0815`, `4711`, `#pwd`, ``} {
+	for _, value := range []string{`value`, `!value`, `@value`, `"value"`, `"va"lue"`, `va'lue`, `@va'lue`, `0815`, `"0815"`, `4711`, `#pwd`, ``} {
 		t.Run(value, func(t *testing.T) {
 			quoted := yamlQuote(value)
 			input := fmt.Sprintf("key: %s", quoted)
@@ -17,13 +18,9 @@ func TestYamlDecode(t *testing.T) {
 				Value string `yaml:"key"`
 			}
 
-			if err := yaml.Unmarshal([]byte(input), &res); err != nil {
-				t.Fatalf("expected %s (quoted: %s), got error %v", value, quoted, err)
-			}
-
-			if value != res.Value {
-				t.Fatalf("expected %s (quoted: %s), got %s", value, quoted, res.Value)
-			}
+			err := yaml.Unmarshal([]byte(input), &res)
+			assert.NoError(t, err)
+			assert.Equal(t, value, res.Value)
 		})
 	}
 }