From 431b606230ade64d795a0de24348815aa88cd423 Mon Sep 17 00:00:00 2001 From: Michael Geers Date: Fri, 15 May 2026 17:25:28 +0200 Subject: [PATCH] History UI: visualization and export (#29846) --- .gitignore | 1 + assets/js/colors.ts | 29 +- assets/js/components/BottomTabs/MoreMenu.vue | 2 +- assets/js/components/History/EnergyChart.vue | 170 ----- assets/js/components/History/GroupChart.vue | 661 ++++++++++++++++++ assets/js/components/History/PowerChart.vue | 182 ----- assets/js/components/History/groups.ts | 16 + .../js/components/Sessions/DateNavigator.vue | 192 ++++- .../js/components/Sessions/PeriodHeader.vue | 73 ++ assets/js/components/Sessions/types.ts | 1 + assets/js/mixins/formatter.ts | 24 + assets/js/router.ts | 10 +- assets/js/store.ts | 19 +- assets/js/types/evcc.ts | 4 + assets/js/views/History.vue | 612 ++++++++++++++-- assets/js/views/Issue.vue | 3 + assets/js/views/Sessions.vue | 103 +-- core/keys/loadpoint.go | 1 + core/metrics/collector.go | 2 +- core/metrics/db_history.go | 158 ++++- core/metrics/db_history_test.go | 134 ++++ core/site.go | 10 +- core/types/types.go | 2 + i18n/de.json | 25 + i18n/en.json | 25 + server/http_history_handler.go | 31 + server/mqtt_test.go | 14 +- util/csv/writer.go | 25 +- vite.config.ts | 22 +- 29 files changed, 1997 insertions(+), 554 deletions(-) delete mode 100644 assets/js/components/History/EnergyChart.vue create mode 100644 assets/js/components/History/GroupChart.vue delete mode 100644 assets/js/components/History/PowerChart.vue create mode 100644 assets/js/components/History/groups.ts create mode 100644 assets/js/components/Sessions/PeriodHeader.vue create mode 100644 core/metrics/db_history_test.go diff --git a/.gitignore b/.gitignore index 43c4eff00..31c1e5d15 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ __debug_bin* *.db *.gz *.py +testdata/**/* *.log *.json !i18n/*.json diff --git a/assets/js/colors.ts b/assets/js/colors.ts index a98765010..da57e444b 100644 --- a/assets/js/colors.ts +++ b/assets/js/colors.ts @@ -37,18 +37,23 @@ const colors: { light: null, selfPalette: ["#0FDE41FF", "#FFBD2FFF", "#FD6158FF", "#03C1EFFF", "#0F662DFF", "#FF922EFF"], palette: [ - "#03C1EFFF", - "#FD6158FF", - "#31AB4AFF", - "#41517AFF", - "#FF922EFF", - "#0F662DFF", - "#0470D4FF", - "#FFBD2FFF", - "#77C93EFF", - "#4E1D10FF", - "#0AAFBFFF", - "#813504FF", + // Dynamic palette (vehicles, loadpoints, …): optimized for neighbor contrast, avoids overlap with system colors (solar, battery, grid, …). + "#06B6D4FF", // Cyan + "#2B7FFFFF", // Blue + "#6366F1FF", // Indigo + "#A855F7FF", // Violet + "#D946EFFF", // Magenta + "#EC4899FF", // Pink + "#FB7185FF", // Coral + "#475569FF", // Slate + "#1E40AFFF", // Royal + "#6D28D9FF", // Purple + "#BE185DFF", // Crimson + "#D2691EFF", // Sienna + "#67E8F9FF", // Glacier + "#C084FCFF", // Lilac + "#FFD580FF", // Sand + "#94A3B8FF", // Steel ], }); diff --git a/assets/js/components/BottomTabs/MoreMenu.vue b/assets/js/components/BottomTabs/MoreMenu.vue index 07e1925ba..480b48fe9 100644 --- a/assets/js/components/BottomTabs/MoreMenu.vue +++ b/assets/js/components/BottomTabs/MoreMenu.vue @@ -70,7 +70,7 @@ Optimize 🧪 - History 🧪 + {{ $t("main.history.title") }} 🧪 diff --git a/assets/js/components/History/EnergyChart.vue b/assets/js/components/History/EnergyChart.vue deleted file mode 100644 index 60bebe8c7..000000000 --- a/assets/js/components/History/EnergyChart.vue +++ /dev/null @@ -1,170 +0,0 @@ - - - diff --git a/assets/js/components/History/GroupChart.vue b/assets/js/components/History/GroupChart.vue new file mode 100644 index 000000000..3d4e46980 --- /dev/null +++ b/assets/js/components/History/GroupChart.vue @@ -0,0 +1,661 @@ + + + + + diff --git a/assets/js/components/History/PowerChart.vue b/assets/js/components/History/PowerChart.vue deleted file mode 100644 index 0767ccf35..000000000 --- a/assets/js/components/History/PowerChart.vue +++ /dev/null @@ -1,182 +0,0 @@ - - - diff --git a/assets/js/components/History/groups.ts b/assets/js/components/History/groups.ts new file mode 100644 index 000000000..8f1715fd8 --- /dev/null +++ b/assets/js/components/History/groups.ts @@ -0,0 +1,16 @@ +export const GROUP_ORDER = ["pv", "battery", "grid", "loadpoint", "meter"] as const; + +const GROUP_COLOR_VAR: Record = { + pv: "--evcc-dark-green", + forecast: "--evcc-dark-yellow", + loadpoint: "--evcc-dark-green", + grid: "--evcc-grid", + battery: "--evcc-darker-green", + meter: "--evcc-price", +}; + +export function groupColor(group: string): string { + const v = GROUP_COLOR_VAR[group]; + if (!v) return ""; + return window.getComputedStyle(document.documentElement).getPropertyValue(v).trim() || ""; +} diff --git a/assets/js/components/Sessions/DateNavigator.vue b/assets/js/components/Sessions/DateNavigator.vue index e4b691ce1..256d21f81 100644 --- a/assets/js/components/Sessions/DateNavigator.vue +++ b/assets/js/components/Sessions/DateNavigator.vue @@ -1,8 +1,46 @@