diff --git a/assets/js/components/BatterySettingsModal.vue b/assets/js/components/BatterySettingsModal.vue
index ccfd5b66b..c4dd172da 100644
--- a/assets/js/components/BatterySettingsModal.vue
+++ b/assets/js/components/BatterySettingsModal.vue
@@ -162,31 +162,19 @@
- {{
- $t(
- `batterySettings.bufferStart.${bufferStartOption}`
- )
- }}
+ {{ bufferStartOption.name }}
@@ -311,6 +299,25 @@ export default {
if (!this.selectedBufferStartSoc) return 0;
return 100 - this.selectedBufferStartSoc;
},
+ bufferStartOptions() {
+ const options = [];
+ for (let i = 100; i >= this.bufferSoc; i -= 5) {
+ options.push({
+ value: i,
+ name: this.$t(`batterySettings.bufferStart.${i === 100 ? "full" : "above"}`, {
+ soc: this.fmtSoc(i),
+ }),
+ });
+ }
+ options.push({
+ value: 0,
+ name: this.$t("batterySettings.bufferStart.never"),
+ });
+ return options;
+ },
+ bufferStartOption() {
+ return this.bufferStartOptions.find((option) => this.bufferStartSoc >= option.value);
+ },
topHeight() {
return 100 - (this.bufferSoc || 100);
},
@@ -320,13 +327,6 @@ export default {
bottomHeight() {
return this.prioritySoc;
},
- bufferStartOption() {
- if (!this.selectedBufferStartSoc) return "never";
- if (this.selectedBufferStartSoc >= this.bufferStartOptionToSoc("full")) return "full";
- if (this.selectedBufferStartSoc >= this.bufferStartOptionToSoc("medium"))
- return "medium";
- return "low";
- },
batteryDetails() {
if (!Array.isArray(this.battery)) {
return;
@@ -382,52 +382,35 @@ export default {
this.isModalVisible = false;
},
changeBufferStart($event) {
- this.setBufferStart($event.target.value);
+ this.setBufferStartSoc(parseInt($event.target.value, 10));
},
changePrioritySoc($event) {
- const value = parseInt($event.target.value, 10);
- if (value > this.bufferSoc) {
- const startOption = this.bufferStartOption;
- this.saveBufferSoc(value);
- this.setBufferStart(startOption);
+ const soc = parseInt($event.target.value, 10);
+ if (soc > this.bufferSoc) {
+ this.saveBufferSoc(soc);
+ if (soc > this.bufferStartSoc && this.bufferStartSoc > 0) {
+ this.setBufferStartSoc(soc);
+ }
} else {
- this.savePrioritySoc(value);
- }
- },
- bufferStartOptionToSoc(option) {
- const bufferSoc = this.selectedBufferSoc;
- const bufferHeight = 100 - bufferSoc;
- switch (option) {
- case "low":
- return bufferSoc + bufferHeight * 0.2;
- case "medium":
- return bufferSoc + bufferHeight * 0.5;
- case "full":
- return bufferSoc + bufferHeight * 0.8;
- case "never":
- return 0;
+ this.savePrioritySoc(soc);
}
},
toggleBufferStart() {
- const next = {
- never: "low",
- low: "medium",
- medium: "full",
- full: "never",
- };
- const nextOption = next[this.bufferStartOption];
- if (nextOption) {
- this.setBufferStart(nextOption);
+ const options = this.bufferStartOptions.map((option) => option.value);
+ const index = options.findIndex((value) => this.bufferStartSoc >= value);
+ const nextIndex = index === 0 ? options.length - 1 : index - 1;
+ this.setBufferStartSoc(options[nextIndex]);
+ },
+ async setBufferStartSoc(soc) {
+ this.selectedBufferStartSoc = soc;
+ await this.saveBufferStartSoc(this.selectedBufferStartSoc);
+ },
+ async changeBufferSoc($event) {
+ const soc = parseInt($event.target.value, 10);
+ if (soc > this.bufferStartSoc && this.bufferStartSoc > 0) {
+ await this.setBufferStartSoc(soc);
}
- },
- setBufferStart(option) {
- this.selectedBufferStartSoc = this.bufferStartOptionToSoc(option);
- this.saveBufferStartSoc(this.selectedBufferStartSoc);
- },
- changeBufferSoc($event) {
- const startOption = this.bufferStartOption;
- this.saveBufferSoc(parseInt($event.target.value, 10));
- this.setBufferStart(startOption);
+ await this.saveBufferSoc(soc);
},
async savePrioritySoc(soc) {
this.selectedPrioritySoc = soc;
diff --git a/core/site_api.go b/core/site_api.go
index b098e1e1e..8f1d7b955 100644
--- a/core/site_api.go
+++ b/core/site_api.go
@@ -218,7 +218,7 @@ func (site *Site) SetBufferStartSoc(soc float64) error {
return ErrBatteryNotConfigured
}
- if soc != 0 && soc <= site.bufferSoc {
+ if soc != 0 && soc < site.bufferSoc {
return errors.New("buffer start soc must be larger than buffer soc")
}
diff --git a/i18n/de.toml b/i18n/de.toml
index b5e5f69f7..a900242b0 100644
--- a/i18n/de.toml
+++ b/i18n/de.toml
@@ -16,9 +16,8 @@ legendTopSubline = "ohne Unterbrechungen"
modalTitle = "Batterieeinstellungen"
[batterySettings.bufferStart]
-full = "wenn fast voll"
-low = "wenn etwas voll"
-medium = "wenn halbvoll"
+above = "wenn über {soc}"
+full = "wenn auf {soc}"
never = "nur mit genug PV-Überschuss"
[config]
diff --git a/i18n/en.toml b/i18n/en.toml
index f48addfe7..96008f8f2 100644
--- a/i18n/en.toml
+++ b/i18n/en.toml
@@ -16,9 +16,8 @@ legendTopSubline = "without interruptions"
modalTitle = "Battery Settings"
[batterySettings.bufferStart]
-full = "when nearly full"
-low = "when somewhat full"
-medium = "when half full"
+above = "when above {soc}"
+full = "when at {soc}"
never = "only with enough surplus"
[config]