Battery: move grid discharge setting to battery page (#32256)
Co-authored-by: Michael Geers <michael@geers.tv>
This commit is contained in:
parent
0a98d57cec
commit
20ce660d7a
6 changed files with 27 additions and 82 deletions
|
|
@ -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) });
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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 ?? ""}`;
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue