From c25bf050869225740104aea83fd673c0744fdce0 Mon Sep 17 00:00:00 2001 From: andig Date: Thu, 11 Dec 2025 09:48:39 +0100 Subject: [PATCH] HEMS: published detailed config including max power (#25869) --- assets/js/components/Config/GeneralConfig.vue | 3 +- assets/js/components/Config/SponsorModal.vue | 4 +- .../js/components/Config/TelemetryModal.vue | 7 +- assets/js/components/Savings/Savings.vue | 5 +- .../js/components/Savings/Sponsor.stories.ts | 14 ++-- assets/js/components/Savings/Sponsor.vue | 11 ++-- .../Savings/SponsorTokenExpires.stories.ts | 6 +- .../Savings/SponsorTokenExpires.vue | 49 ++++++++++---- .../js/components/Top/Navigation.stories.ts | 8 ++- assets/js/components/Top/Navigation.vue | 6 +- assets/js/types/evcc.ts | 26 ++++++-- assets/js/views/Config.vue | 14 ++-- cmd/root.go | 31 +++++++-- cmd/setup.go | 35 ++++++---- core/site.go | 19 ++++-- core/site/api.go | 7 ++ hems/config.go | 8 +-- hems/eebus/eebus.go | 4 ++ hems/hems/api.go | 21 ++++++ hems/relay/relay.go | 4 ++ i18n/bg.json | 6 +- i18n/ca.json | 6 +- i18n/cs.json | 6 +- i18n/da.json | 6 +- i18n/de.json | 6 +- i18n/el.json | 6 +- i18n/en.json | 6 +- i18n/es.json | 6 +- i18n/fi.json | 6 +- i18n/fr.json | 6 +- i18n/hr.json | 6 +- i18n/hu.json | 6 +- i18n/it.json | 6 +- i18n/lb.json | 6 +- i18n/lt.json | 6 +- i18n/nl.json | 6 +- i18n/no.json | 6 +- i18n/pl.json | 6 +- i18n/pt.json | 6 +- i18n/ro.json | 6 +- i18n/sl.json | 6 +- i18n/sv.json | 6 +- i18n/ta.json | 6 +- i18n/tr.json | 6 +- i18n/uk.json | 6 +- i18n/zh-Hans.json | 6 +- server/http.go | 12 ++-- server/http_config_site_other_handler.go | 64 ++++++++++++------- server/http_global_settings_handler.go | 9 ++- util/sponsor/auth.go | 18 ++---- 50 files changed, 364 insertions(+), 177 deletions(-) create mode 100644 hems/hems/api.go diff --git a/assets/js/components/Config/GeneralConfig.vue b/assets/js/components/Config/GeneralConfig.vue index a34628789..c15f45bc2 100644 --- a/assets/js/components/Config/GeneralConfig.vue +++ b/assets/js/components/Config/GeneralConfig.vue @@ -105,7 +105,8 @@ export default { }, sponsorStatus() { const sponsor = store.state?.sponsor || {}; - const { name, expiresSoon } = sponsor; + const name = sponsor.status.name; + const expiresSoon = sponsor.status.expiresSoon; let textClass = ""; let badgeClass = ""; let title = name; diff --git a/assets/js/components/Config/SponsorModal.vue b/assets/js/components/Config/SponsorModal.vue index 3190658f7..bcbd57151 100644 --- a/assets/js/components/Config/SponsorModal.vue +++ b/assets/js/components/Config/SponsorModal.vue @@ -110,13 +110,13 @@ export default { return store?.state?.sponsor; }, token() { - return this.sponsor?.token; + return this.sponsor?.status.token; }, fromYaml() { return this.sponsor?.fromYaml; }, name() { - return this.sponsor?.name || ""; + return this.sponsor?.status.name || ""; }, showTokenForm() { return this.editMode || !this.token; diff --git a/assets/js/components/Config/TelemetryModal.vue b/assets/js/components/Config/TelemetryModal.vue index 7989e7c0e..7b20ed390 100644 --- a/assets/js/components/Config/TelemetryModal.vue +++ b/assets/js/components/Config/TelemetryModal.vue @@ -6,7 +6,7 @@ data-testid="telemetry-modal" >

{{ $t("config.telemetry.description") }}

- + @@ -23,5 +23,10 @@ export default defineComponent({ sponsor: { type: Object as PropType }, telemetry: { type: Boolean }, }, + computed: { + sponsorActive(): boolean { + return !!this.sponsor?.status.name; + }, + }, }); diff --git a/assets/js/components/Savings/Savings.vue b/assets/js/components/Savings/Savings.vue index bc5c91023..284a21a45 100644 --- a/assets/js/components/Savings/Savings.vue +++ b/assets/js/components/Savings/Savings.vue @@ -191,7 +191,7 @@
@@ -241,6 +241,9 @@ export default defineComponent({ }; }, computed: { + sponsorActive(): boolean { + return !!this.sponsor?.status.name; + }, tariffLink() { return `${docsPrefix()}/docs/reference/configuration/tariffs`; }, diff --git a/assets/js/components/Savings/Sponsor.stories.ts b/assets/js/components/Savings/Sponsor.stories.ts index 344b84f7f..1183f6eee 100644 --- a/assets/js/components/Savings/Sponsor.stories.ts +++ b/assets/js/components/Savings/Sponsor.stories.ts @@ -46,23 +46,25 @@ NoSponsor.args = {}; export const Trial = Template.bind({}); Trial.args = { - name: "trial", + status: { name: "trial" }, }; export const IndividualSponsor = Template.bind({}); IndividualSponsor.args = { - name: "naltatis", + status: { name: "naltatis" }, }; export const VictronDevice = Template.bind({}); VictronDevice.args = { - name: "victron", + status: { name: "victron" }, }; // Add an extra story showing the expiring state export const ExpiringSponsor = Template.bind({}); ExpiringSponsor.args = { - name: "naltatis", - expiresSoon: true, - expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(), // 7 days from now + status: { + name: "naltatis", + expiresSoon: true, + expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(), // 7 days from now + }, }; diff --git a/assets/js/components/Savings/Sponsor.vue b/assets/js/components/Savings/Sponsor.vue index 3b15a4599..9d69c3c3f 100644 --- a/assets/js/components/Savings/Sponsor.vue +++ b/assets/js/components/Savings/Sponsor.vue @@ -67,7 +67,8 @@ import "@h2d2/shopicons/es/regular/heart"; import "@h2d2/shopicons/es/regular/stars"; import "@h2d2/shopicons/es/regular/clock"; import { docsPrefix } from "@/i18n"; -import { defineComponent } from "vue"; +import { defineComponent, type PropType } from "vue"; +import type { SponsorStatus } from "@/types/evcc"; export const TRIAL = "trial"; export const VICTRON_DEVICE = "victron"; @@ -75,13 +76,13 @@ export const VICTRON_DEVICE = "victron"; export default defineComponent({ name: "Sponsor", props: { - name: String, - expiresAt: String, - expiresSoon: Boolean, + status: Object as PropType, fromYaml: Boolean, - token: String, }, computed: { + name() { + return this.status?.name; + }, isTrial() { return this.name === TRIAL; }, diff --git a/assets/js/components/Savings/SponsorTokenExpires.stories.ts b/assets/js/components/Savings/SponsorTokenExpires.stories.ts index 6457ccd7d..0f0124645 100644 --- a/assets/js/components/Savings/SponsorTokenExpires.stories.ts +++ b/assets/js/components/Savings/SponsorTokenExpires.stories.ts @@ -26,8 +26,10 @@ const Template: StoryFn = (args) => ({ // Create stories for each variant export const SomeDay = Template.bind({}); SomeDay.args = { - expiresSoon: true, - expiresAt: new Date(Date.now() + 22 * 20 * 60 * 1000).toISOString(), + status: { + expiresSoon: true, + expiresAt: new Date(Date.now() + 22 * 20 * 60 * 1000).toISOString(), + }, }; export const Empty = Template.bind({}); diff --git a/assets/js/components/Savings/SponsorTokenExpires.vue b/assets/js/components/Savings/SponsorTokenExpires.vue index ea72d6cf6..59884fc50 100644 --- a/assets/js/components/Savings/SponsorTokenExpires.vue +++ b/assets/js/components/Savings/SponsorTokenExpires.vue @@ -1,15 +1,28 @@