Battery: move grid discharge setting to battery page (#32256)

Co-authored-by: Michael Geers <michael@geers.tv>
This commit is contained in:
andig 2026-07-29 11:13:29 +02:00 • committed by GitHub
parent 0a98d57cec
commit 20ce660d7a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 27 additions and 82 deletions

View file

@ -86,6 +86,19 @@
{{ $t("battery.config.discharge") }}
</label>
</div>
<div v-if="experimental" class="form-check form-switch mt-2">
<input
id="batteryExpGridDischarge"
:checked="batteryGridDischarge"
class="form-check-input"
type="checkbox"
role="switch"
@change="changeGridDischarge"
/>
<label class="form-check-label" for="batteryExpGridDischarge">
{{ $t("battery.config.gridDischarge") }} 🧪
</label>
</div>
</template>
</Card>
</template>
@ -112,7 +125,9 @@ export default defineComponent({
prioritySoc: { type: Number, default: 0 },
bufferStartSoc: { type: Number, default: 0 },
batteryDischargeControl: Boolean,
batteryGridDischarge: Boolean,
battery: { type: Object as PropType<Battery> },
experimental: Boolean,
},
data() {
return {
@ -244,6 +259,15 @@ export default defineComponent({
console.error(err);
}
},
async changeGridDischarge(e: Event) {
const target = e.target as HTMLInputElement;
try {
await api.post(`batterygriddischarge/${target.checked}`);
} catch (err) {
target.checked = this.batteryGridDischarge; // revert to stay in sync with state
console.error(err);
}
},
getBufferStartName(value: number) {
const key = value === 0 ? "never" : value === 100 ? "full" : "above";
return this.$t(`battery.config.bufferStart.${key}`, { soc: this.fmtSoc(value) });

View file

@ -20,7 +20,9 @@
:priority-soc="state.prioritySoc"
:buffer-start-soc="state.bufferStartSoc"
:battery-discharge-control="state.batteryDischargeControl"
:battery-grid-discharge="state.batteryGridDischarge"
:battery="state.battery"
:experimental="state.experimental"
/>
<Card

View file

@ -1,60 +0,0 @@
<template>
<GenericModal
id="batteryModal"
:title="`${$t('config.battery.title')} 🧪`"
config-modal-name="battery"
data-testid="battery-modal"
>
<p>{{ $t("config.battery.description") }}</p>
<ErrorMessage :error="error" />
<div class="form-check form-switch my-3">
<input
id="batteryGridDischarge"
:checked="gridDischarge"
class="form-check-input"
type="checkbox"
role="switch"
@change="change"
/>
<div class="form-check-label">
<label for="batteryGridDischarge">
{{ $t("config.battery.gridDischarge") }}
</label>
</div>
</div>
</GenericModal>
</template>
<script lang="ts">
import { defineComponent } from "vue";
import GenericModal from "../Helper/GenericModal.vue";
import ErrorMessage from "../Helper/ErrorMessage.vue";
import api from "@/api";
import type { AxiosError } from "axios";
export default defineComponent({
name: "BatteryModal",
components: { GenericModal, ErrorMessage },
props: {
gridDischarge: Boolean,
},
data() {
return {
error: null as string | null,
};
},
methods: {
async change(e: Event) {
const target = e.target as HTMLInputElement;
try {
this.error = null;
await api.post(`batterygriddischarge/${target.checked}`);
} catch (err) {
target.checked = this.gridDischarge; // revert on failure to stay in sync with state
const axiosErr = err as AxiosError<{ error: string }>;
this.error = axiosErr.response?.data?.error || axiosErr.message;
}
},
},
});
</script>

View file

@ -29,14 +29,6 @@
@edit="openModal('experimental')"
/>
<GeneralConfigEntry
v-if="experimental && batteryControllable"
test-id="generalconfig-battery"
:label="$t('config.battery.title')"
:text="$t(`config.general.${batteryGridDischarge ? 'on' : 'off'}`)"
@edit="openModal('battery')"
/>
<GeneralConfigEntry
test-id="generalconfig-sponsoring"
:label="$t('config.sponsor.title')"
@ -103,12 +95,6 @@ export default {
telemetryEnabled() {
return store.state?.telemetry === true;
},
batteryControllable() {
return (store.state?.battery?.devices ?? []).some((b) => b.controllable);
},
batteryGridDischarge() {
return store.state?.batteryGridDischarge === true;
},
networkStatus() {
return `${store.state?.network?.port ?? ""}`;
},

View file

@ -481,7 +481,6 @@
<OptimizerModal :is-sponsor="isSponsor" />
<McpModal />
<ExperimentalModal :experimental="experimental" />
<BatteryModal :grid-discharge="batteryGridDischarge" />
<RemoteModal :remote="remote" :is-sponsor="isSponsor" :site-title="siteTitle" />
<TitleModal @changed="loadDirty" />
<ModbusProxyModal :is-sponsor="isSponsor" @changed="loadDirty" />
@ -560,7 +559,6 @@ import TariffCard from "../components/Config/TariffCard.vue";
import TariffModal from "../components/Config/TariffModal.vue";
import TelemetryModal from "../components/Config/TelemetryModal.vue";
import ExperimentalModal from "../components/Config/ExperimentalModal.vue";
import BatteryModal from "../components/Config/BatteryModal.vue";
import TitleModal from "../components/Config/TitleModal.vue";
import Header from "../components/Top/Header.vue";
import VehicleIcon from "../components/VehicleIcon";
@ -650,7 +648,6 @@ export default defineComponent({
TariffModal,
TelemetryModal,
ExperimentalModal,
BatteryModal,
TitleModal,
TopHeader: Header,
VehicleIcon,
@ -925,9 +922,6 @@ export default defineComponent({
experimental() {
return store.state?.experimental;
},
batteryGridDischarge() {
return store.state?.batteryGridDischarge === true;
},
eebus() {
return store.state?.eebus;
},

View file

@ -42,6 +42,7 @@
},
"bufferTitle": "Battery as charging buffer",
"discharge": "Prevent home battery discharge in fast mode and during planned charging.",
"gridDischarge": "Allow home battery to discharge to the grid.",
"priority": "Home battery has priority while it is below {soc}. Then the charging points receive the surplus.",
"priorityNone": "Solar surplus goes straight to the charging points. Set a value above {soc} to prioritize the home battery.",
"priorityTitle": "Where does the surplus go first?"
@ -119,8 +120,6 @@
"titleEdit": "Edit Self-Regulating Consumer"
},
"battery": {
"description": "Experimental battery controls. These features are still being tested and may change or be removed in future versions.",
"gridDischarge": "Allow battery to discharge to the grid",
"title": "Battery",
"titleAdd": "Add Battery",
"titleEdit": "Edit Battery"