diff --git a/.goreleaser.yml b/.goreleaser.yml index a11b64a9e..21aad38b4 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -76,13 +76,16 @@ changelog: groups: - title: "Breaking Changes 🚨" regexp: '\(BC\)' - order: 1 + order: 10 - title: "Bug Fixes 🐞" regexp: '^fix:|\bfix\b' - order: 3 + order: 30 - title: "New Features 💫" regexp: '^feat:|\bfeature\b' - order: 2 + order: 20 + - title: "Experimental Features 🧪" + regexp: '^experimental:|\bexperimental\b' + order: 25 nfpms: - id: default diff --git a/AGENTS.md b/AGENTS.md index e1f4bae89..8fa24ebe8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -186,7 +186,7 @@ This file provides guidance to AI coding agents when working with code in this r ### Essential Commands -- Must build before testing: `make ui build` +- Must build before testing executing playwright `make ui build` since it uses the binary. For manual testing assets are build and reloaded automatically (vite dev). - Run tests: `npm run playwright` or `npx playwright test` - Debug: `npx playwright test --debug` - Specific test: `npx playwright test tests/config-loadpoint.spec.ts` diff --git a/assets/js/components/Optimize/BatteryConfigurationTable.vue b/assets/js/components/Optimize/BatteryConfigurationTable.vue new file mode 100644 index 000000000..52a9dab59 --- /dev/null +++ b/assets/js/components/Optimize/BatteryConfigurationTable.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/assets/js/components/Optimize/ChargeChart.vue b/assets/js/components/Optimize/ChargeChart.vue new file mode 100644 index 000000000..4542a8ff7 --- /dev/null +++ b/assets/js/components/Optimize/ChargeChart.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/assets/js/components/Optimize/PriceChart.vue b/assets/js/components/Optimize/PriceChart.vue new file mode 100644 index 000000000..3ff110eb2 --- /dev/null +++ b/assets/js/components/Optimize/PriceChart.vue @@ -0,0 +1,231 @@ + + + + + diff --git a/assets/js/components/Optimize/SocChart.vue b/assets/js/components/Optimize/SocChart.vue new file mode 100644 index 000000000..bcd10747a --- /dev/null +++ b/assets/js/components/Optimize/SocChart.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/assets/js/components/Optimize/TimeSeriesDataTable.vue b/assets/js/components/Optimize/TimeSeriesDataTable.vue new file mode 100644 index 000000000..a69007428 --- /dev/null +++ b/assets/js/components/Optimize/TimeSeriesDataTable.vue @@ -0,0 +1,294 @@ + + + + + diff --git a/assets/js/components/Sessions/CostHistoryChart.vue b/assets/js/components/Sessions/CostHistoryChart.vue index 9d032e3b7..6022e00f4 100644 --- a/assets/js/components/Sessions/CostHistoryChart.vue +++ b/assets/js/components/Sessions/CostHistoryChart.vue @@ -196,6 +196,7 @@ export default defineComponent({ legends() { return this.chartData.datasets.map((dataset) => { let value = null; + let type: "area" | "line" = "area"; // line chart handling if ((dataset as any).type === "line") { @@ -210,6 +211,7 @@ export default defineComponent({ : this.fmtGrams(value, false); }; value = `${format(min, false)} – ${format(max, true)}`; + type = "line"; } else { const total = dataset.data.reduce((acc, curr) => acc + curr, 0); value = @@ -221,6 +223,7 @@ export default defineComponent({ label: dataset.label || "", color: dataset.backgroundColor, value, + type, }; }); }, diff --git a/assets/js/components/Sessions/LegendList.vue b/assets/js/components/Sessions/LegendList.vue index 14cbb41e0..6008f2c8c 100644 --- a/assets/js/components/Sessions/LegendList.vue +++ b/assets/js/components/Sessions/LegendList.vue @@ -14,7 +14,11 @@
{{ legend.label }}
@@ -56,8 +63,18 @@ export default defineComponent({ width: 1rem; height: 1rem; flex-shrink: 0; +} + +.legend-color--area { border-radius: 50%; } + +.legend-color--line { + height: 2px; + border-radius: 1px; + align-self: center; +} + .legend-label { flex-shrink: 0; flex-grow: 0; diff --git a/assets/js/components/Sessions/types.ts b/assets/js/components/Sessions/types.ts index c503157f0..072c9759c 100644 --- a/assets/js/components/Sessions/types.ts +++ b/assets/js/components/Sessions/types.ts @@ -20,6 +20,7 @@ export interface Legend { label: string; color: any; value: string | string[]; + type?: "area" | "line"; } export interface Column { diff --git a/assets/js/components/Site/Site.vue b/assets/js/components/Site/Site.vue index 96c863c84..9e7c5291a 100644 --- a/assets/js/components/Site/Site.vue +++ b/assets/js/components/Site/Site.vue @@ -93,6 +93,7 @@ import type { SMART_COST_TYPE, Sponsor, FatalError, + EvOpt, } from "@/types/evcc"; import type { Grid } from "./types"; @@ -156,6 +157,7 @@ export default defineComponent({ fatal: { type: Array as PropType, default: () => [] }, forecast: Object as PropType, telemetry: Boolean, + evopt: { type: Object as PropType }, }, computed: { batteryConfigured() { diff --git a/assets/js/components/Top/Navigation.vue b/assets/js/components/Top/Navigation.vue index dd63c9442..c528834ac 100644 --- a/assets/js/components/Top/Navigation.vue +++ b/assets/js/components/Top/Navigation.vue @@ -73,6 +73,12 @@ {{ $t("log.title") }} + +
  • + + Optimize 🧪 + +