Vehicle: deprecate default charge mode in config (#31893)

This commit is contained in:
Michael Geers 2026-07-18 10:40:10 +02:00 • committed by GitHub
parent 70ad1751de
commit 199365288a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 56 additions and 4 deletions

View file

@ -99,7 +99,7 @@ export default defineComponent({
computed: { computed: {
modeOptions(): SelectOption<string>[] { modeOptions(): SelectOption<string>[] {
return [ return [
{ value: "", name: "---" }, { value: "", name: this.$t("config.loadpoint.defaultModeKeep") },
...[OFF, PV, MINPV, NOW].map((mode) => ({ ...[OFF, PV, MINPV, NOW].map((mode) => ({
value: mode, value: mode,
name: this.$t(`main.mode.${mode}`), name: this.$t(`main.mode.${mode}`),

View file

@ -500,6 +500,10 @@ func configureVehicles(static []config.Named, names ...string) error {
return fmt.Errorf("cannot create vehicle '%s': %w", cc.Name, err) return fmt.Errorf("cannot create vehicle '%s': %w", cc.Name, err)
} }
if _, ok := instance.OnIdentified().GetMode(); ok {
log.WARN.Printf("vehicle '%s': default charge 'mode' is deprecated, please configure via UI (charging plan > arrival)", cc.Name)
}
mu.Lock() mu.Lock()
defer mu.Unlock() defer mu.Unlock()
devs1 = append(devs1, config.NewStaticDevice(cc, instance)) devs1 = append(devs1, config.NewStaticDevice(cc, instance))
@ -525,6 +529,16 @@ func configureVehicles(static []config.Named, names ...string) error {
return nil return nil
} }
// migrate deprecated mode property to vehicle mode setting
if mode, ok := cc.Other["mode"].(string); ok && mode != "" {
key := fmt.Sprintf("vehicle.%s.%s", cc.Name, keys.Mode)
if _, err := settings.String(key); err != nil {
if _, err := api.ChargeModeString(mode); err == nil {
settings.SetString(key, mode)
}
}
}
instance, err := vehicleInstance(cc) instance, err := vehicleInstance(cc)
if err != nil { if err != nil {
return fmt.Errorf("cannot create vehicle '%s': %w", cc.Name, err) return fmt.Errorf("cannot create vehicle '%s': %w", cc.Name, err)

View file

@ -439,6 +439,7 @@
"heating": "Wird beim Systemstart gesetzt." "heating": "Wird beim Systemstart gesetzt."
}, },
"defaultModeHelpKeep": "Zuletzt ausgewählter Modus wird beibehalten.", "defaultModeHelpKeep": "Zuletzt ausgewählter Modus wird beibehalten.",
"defaultModeKeep": "beibehalten",
"defaultModeLabel": "Standard-Modus", "defaultModeLabel": "Standard-Modus",
"delete": "Löschen", "delete": "Löschen",
"electricalSubtitle": "Im Zweifelsfall Elektriker fragen.", "electricalSubtitle": "Im Zweifelsfall Elektriker fragen.",

View file

@ -439,6 +439,7 @@
"heating": "Is set when on system start." "heating": "Is set when on system start."
}, },
"defaultModeHelpKeep": "Keeps the last selected mode.", "defaultModeHelpKeep": "Keeps the last selected mode.",
"defaultModeKeep": "keep as is",
"defaultModeLabel": "Default mode", "defaultModeLabel": "Default mode",
"delete": "Delete", "delete": "Delete",
"electricalSubtitle": "When in doubt, ask your electrician.", "electricalSubtitle": "When in doubt, ask your electrician.",

View file

@ -145,7 +145,7 @@ test.describe("vehicles", async () => {
await expect(vehicleModal.getByLabel("Battery capacity")).toBeVisible(); await expect(vehicleModal.getByLabel("Battery capacity")).toBeVisible();
await page.getByRole("button", { name: "Show advanced settings" }).click(); await page.getByRole("button", { name: "Show advanced settings" }).click();
await expect(vehicleModal.getByLabel("Default charging mode")).toBeVisible(); await expect(vehicleModal.getByLabel("Default charging mode")).not.toBeVisible(); // deprecated
await expect(vehicleModal.getByLabel("Maximum number of phases")).toBeVisible(); await expect(vehicleModal.getByLabel("Maximum number of phases")).toBeVisible();
await expect(vehicleModal.getByLabel("Minimum current")).toBeVisible(); await expect(vehicleModal.getByLabel("Minimum current")).toBeVisible();
await expect(vehicleModal.getByLabel("Maximum current")).toBeVisible(); await expect(vehicleModal.getByLabel("Maximum current")).toBeVisible();
@ -154,7 +154,7 @@ test.describe("vehicles", async () => {
await expect(vehicleModal.getByLabel("RFID identification")).toBeVisible(); await expect(vehicleModal.getByLabel("RFID identification")).toBeVisible();
await page.getByRole("button", { name: "Hide advanced settings" }).click(); await page.getByRole("button", { name: "Hide advanced settings" }).click();
await expect(vehicleModal.getByLabel("Default charging mode")).not.toBeVisible(); await expect(vehicleModal.getByLabel("Maximum number of phases")).not.toBeVisible();
// polestar template // polestar template
await vehicleModal.getByLabel("Manufacturer").selectOption("Polestar"); await vehicleModal.getByLabel("Manufacturer").selectOption("Polestar");
@ -165,7 +165,27 @@ test.describe("vehicles", async () => {
await page.getByRole("button", { name: "Show advanced settings" }).click(); await page.getByRole("button", { name: "Show advanced settings" }).click();
await expect(vehicleModal.getByLabel("Cache optional")).toBeVisible(); await expect(vehicleModal.getByLabel("Cache optional")).toBeVisible();
await expect(vehicleModal.getByLabel("Default charging mode")).toBeVisible(); await expect(vehicleModal.getByLabel("Default charging mode")).not.toBeVisible(); // deprecated
});
test("migrate deprecated mode property to default mode setting", async ({ page }) => {
await start("config-one-lp.evcc.yaml", "vehicle-mode-migrate.sql");
await page.goto("/");
const lp = page.getByTestId("loadpoint").first();
await lp.getByTestId("change-vehicle").locator("select").selectOption("Grey Car");
// migrated mode is applied on vehicle selection
await expect(lp.getByTestId("mode").getByRole("button", { name: "Fast" })).toHaveClass(
/active/
);
await lp.getByTestId("charging-plan").getByRole("button", { name: "none" }).click();
const modal = page.getByTestId("charging-plan-modal");
await expectModalVisible(modal);
await modal.getByRole("link", { name: "Arrival" }).click();
await expect(modal.getByRole("combobox", { name: "Default mode" })).toHaveValue("now");
}); });
test("save and restore rfid identifiers", async ({ page }) => { test("save and restore rfid identifiers", async ({ page }) => {

View file

@ -0,0 +1,15 @@
BEGIN;
CREATE TABLE `configs` (
`id` integer PRIMARY KEY AUTOINCREMENT
, `class` integer
, `type` text
, `title` text
, `icon` text
, `product` text
, `value` text
);
INSERT INTO configs(class, type, value) VALUES(3, 'template', '{"template":"offline","title":"Grey Car","mode":"now"}');
COMMIT;

View file

@ -130,6 +130,7 @@ params:
example: 10s example: 10s
type: duration type: duration
- name: mode - name: mode
deprecated: true
description: description:
de: Standardlademodus de: Standardlademodus
en: Default charging mode en: Default charging mode