From 0744b68336cbe251a818c9bb07ceb738a8b4fa0e Mon Sep 17 00:00:00 2001 From: Michael Geers Date: Wed, 3 Sep 2025 08:25:31 +0200 Subject: [PATCH] =?UTF-8?q?HEMS/=C2=A714a:=20visualize=20limit=20state=20(?= =?UTF-8?q?#23361)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/js/components/Config/DeviceTags.vue | 3 + assets/js/components/Config/HemsModal.vue | 4 +- .../components/Config/defaultYaml/hems.yaml | 15 +++ .../js/components/Energyflow/Energyflow.vue | 13 +- assets/js/components/HemsWarning.vue | 25 ++++ assets/js/components/Site/Site.vue | 5 + assets/js/views/Config.vue | 37 ++++-- core/circuit/circuit.go | 7 +- hems/eebus/eebus.go | 25 ++-- hems/relay/relay.go | 24 ++-- hems/shared/helper.go | 30 +++++ i18n/de.json | 14 ++- i18n/en.json | 14 ++- tests/fast.evcc.yaml | 1 + tests/hems.spec.ts | 115 ++++++++++++++++++ tests/simulator.evcc.yaml | 13 ++ tests/simulator/api.ts | 1 + tests/simulator/src/Simulator.vue | 18 +++ tests/vehicle-error.spec.ts | 2 +- 19 files changed, 319 insertions(+), 47 deletions(-) create mode 100644 assets/js/components/HemsWarning.vue create mode 100644 hems/shared/helper.go create mode 100755 tests/fast.evcc.yaml create mode 100644 tests/hems.spec.ts diff --git a/assets/js/components/Config/DeviceTags.vue b/assets/js/components/Config/DeviceTags.vue index 82e25c83c..36fa3354a 100644 --- a/assets/js/components/Config/DeviceTags.vue +++ b/assets/js/components/Config/DeviceTags.vue @@ -55,6 +55,7 @@ export default { switch (name) { case "power": case "solarForecast": + case "hemsActiveLimit": return this.fmtW(value); case "energy": case "capacity": @@ -94,6 +95,8 @@ export default { return value ? this.$t("config.deviceValue.yes") : this.$t("config.deviceValue.no"); + case "hemsType": + return this.$t(`config.deviceValueHemsType.${value}`); } return value; }, diff --git a/assets/js/components/Config/HemsModal.vue b/assets/js/components/Config/HemsModal.vue index b61598b1a..d5f4b26cc 100644 --- a/assets/js/components/Config/HemsModal.vue +++ b/assets/js/components/Config/HemsModal.vue @@ -3,11 +3,11 @@ id="hemsModal" :title="$t('config.hems.title')" :description="$t('config.hems.description')" - docs="/docs/reference/configuration/hems" + docs="/docs/features/14a-enwg-steuve" :defaultYaml="defaultYaml" endpoint="/config/hems" removeKey="hems" - size="md" + data-testid="hems-modal" @changed="$emit('changed')" /> diff --git a/assets/js/components/Config/defaultYaml/hems.yaml b/assets/js/components/Config/defaultYaml/hems.yaml index cf42b3229..7eebf62c4 100644 --- a/assets/js/components/Config/defaultYaml/hems.yaml +++ b/assets/js/components/Config/defaultYaml/hems.yaml @@ -1,3 +1,18 @@ +## external control via binary in put + +#type: relay +#maxPower: 4200 # limit loadpoints to 4.2 kW total +#limit: # limit signal, plugin +# source: mqtt +# topic: hems/limit/status # 0/false = normal, 1/true = limit active + +## external control via EEBus protocol + +#type: eebus # general EEBus setup (cert gen) required +#ski: "1234-5678-90AB-CDEF" # SKI of control box (grid operator) + +## SMA Sunny Home Manager 2.0, will change soon https://github.com/evcc-io/evcc/pull/23190 + #type: sma #allowcontrol: false #vendorid: AAAAAAAA diff --git a/assets/js/components/Energyflow/Energyflow.vue b/assets/js/components/Energyflow/Energyflow.vue index 3e1cdcf4f..8293fba73 100644 --- a/assets/js/components/Energyflow/Energyflow.vue +++ b/assets/js/components/Energyflow/Energyflow.vue @@ -173,12 +173,7 @@ data-testid="energyflow-entry-home" /> +
+ {{ $t("main.hemsWarning.title") }} + {{ $t("main.hemsWarning.description", { limit: fmtW(lpcLimit, POWER_UNIT.KW) }) }} +
+ + + diff --git a/assets/js/components/Site/Site.vue b/assets/js/components/Site/Site.vue index 9e7c5291a..1b409e693 100644 --- a/assets/js/components/Site/Site.vue +++ b/assets/js/components/Site/Site.vue @@ -19,6 +19,7 @@ +
@@ -77,6 +78,7 @@ import "@h2d2/shopicons/es/regular/arrowup"; import Navigation from "../Top/Navigation.vue"; import Notifications from "../Top/Notifications.vue"; import Energyflow from "../Energyflow/Energyflow.vue"; +import HemsWarning from "../HemsWarning.vue"; import Loadpoints from "../Loadpoints/Loadpoints.vue"; import Footer from "../Footer/Footer.vue"; import formatter from "@/mixins/formatter"; @@ -90,6 +92,7 @@ import type { Forecast, LoadpointCompact, Notification, + Circuit, SMART_COST_TYPE, Sponsor, FatalError, @@ -103,6 +106,7 @@ export default defineComponent({ Loadpoints, Energyflow, Footer, + HemsWarning, Notifications, TopNavigation: Navigation, WelcomeIcons, @@ -156,6 +160,7 @@ export default defineComponent({ smartFeedInPriorityAvailable: Boolean, fatal: { type: Array as PropType, default: () => [] }, forecast: Object as PropType, + circuits: Object as PropType>, telemetry: Boolean, evopt: { type: Object as PropType }, }, diff --git a/assets/js/views/Config.vue b/assets/js/views/Config.vue index ff3bcfae8..db736cf4e 100644 --- a/assets/js/views/Config.vue +++ b/assets/js/views/Config.vue @@ -265,11 +265,11 @@