Battery (experimental): restore priority/buffer soc constraint (#31900)

This commit is contained in:
Michael Geers 2026-07-18 11:50:43 +02:00 • committed by GitHub
parent e239af5d25
commit 362620ba07
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 35 additions and 5 deletions

View file

@ -102,8 +102,7 @@ import InlineSocSelect from "./InlineSocSelect.vue";
// Battery usage controls for the experimental page. The logic is intentionally duplicated
// from the classic BatteryUsageSettings.vue (slated for removal) so the two can diverge
// during the transition. Difference here: priority and buffer SoC are independent, there is
// no priority < buffer constraint.
// during the transition.
export default defineComponent({
name: "BatteryConfigCard",
components: { Card, InlineSocSelect },
@ -135,14 +134,21 @@ export default defineComponent({
priorityOptions() {
const options = [];
for (let i = 100; i >= 0; i -= 5) {
options.push({ value: i, name: this.fmtSoc(i) });
const disabled =
i > this.selectedBufferSoc &&
!(this.selectedBufferSoc == this.selectedPrioritySoc);
options.push({ value: i, name: this.fmtSoc(i), disabled });
}
return options;
},
bufferOptions() {
const options = [];
for (let i = 100; i >= 5; i -= 5) {
options.push({ value: i, name: this.fmtSoc(i) });
options.push({
value: i,
name: this.fmtSoc(i),
disabled: i < this.selectedPrioritySoc,
});
}
return options;
},
@ -180,7 +186,15 @@ export default defineComponent({
},
methods: {
changePrioritySoc($event: Event) {
this.savePrioritySoc(parseInt(($event.target as HTMLInputElement).value, 10));
const soc = parseInt(($event.target as HTMLInputElement).value, 10);
if (soc > (this.bufferSoc || 100)) {
this.saveBufferSoc(soc);
if (soc > this.bufferStartSoc && this.bufferStartSoc > 0) {
this.setBufferStartSoc(soc);
}
} else {
this.savePrioritySoc(soc);
}
},
changeBufferStart($event: Event) {
this.setBufferStartSoc(parseInt(($event.target as HTMLInputElement).value, 10));

View file

@ -73,6 +73,22 @@ test.describe("experimental battery page", async () => {
await prioritySoc.selectOption("30");
await expect(prioritySoc).toHaveValue("30");
// values crossing the other threshold are not selectable (prioritySoc 30, bufferSoc 80)
await expect(prioritySoc.getByRole("option", { name: "85%", exact: true })).toHaveAttribute(
"disabled",
""
);
await expect(bufferSoc.getByRole("option", { name: "25%", exact: true })).toHaveAttribute(
"disabled",
""
);
// equal values unlock higher priorities; selecting one raises the buffer instead
await prioritySoc.selectOption("80");
await prioritySoc.selectOption("85");
await expect(bufferSoc).toHaveValue("85");
await expect(prioritySoc).toHaveValue("80");
// discharge control is offered for the controllable battery and toggles on
const discharge = page.getByRole("switch", { name: /Prevent home battery/ });
await expect(discharge).not.toBeChecked();