Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 104 additions & 40 deletions src/views/ConsumerConfig.vue
Original file line number Diff line number Diff line change
Expand Up @@ -310,40 +310,55 @@
<hr />
<openwb-base-heading> Betriebsmodus umstellen </openwb-base-heading>
<openwb-base-button-group-input
title="Umstellen"
title="Betriebsmodus automatisch umstellen"
:buttons="[
{ buttonValue: 'never', text: 'Nie', class: 'btn-outline-secondary' },
{ buttonValue: 'midnight', text: 'Mitternacht', class: 'btn-outline-info' },
{ buttonValue: 'time', text: 'Zeitpunkt', class: 'btn-outline-info' },
{ buttonValue: false, text: 'Nein', class: 'btn-outline-danger' },
{ buttonValue: true, text: 'Ja', class: 'btn-outline-success' },
]"
:model-value="installedConsumer.consumerUsage.reset_chargemode?.mode ?? 'never'"
@update:model-value="updateUsage(installedConsumer.id, $event, 'reset_chargemode.mode')"
:model-value="isResetModeEnabled(installedConsumer)"
@update:model-value="setResetEnabled(installedConsumer, $event)"
>
<template #help>
<template v-if="installedConsumer.consumerUsage.reset_chargemode?.mode === 'midnight'">
Stellt den Betriebsmodus automatisch auf einen anderen Modus um: "Mitternacht" täglich um 0:00 Uhr
</template>
<template v-else-if="installedConsumer.consumerUsage.reset_chargemode?.mode === 'time'">
Stellt den Betriebsmodus automatisch auf einen anderen Modus um, einmalig zum angegebenen Zeitpunkt.
</template>
<template v-else> Stellt den Betriebsmodus nicht automatisch um. </template>
Schaltet den Verbraucher automatisch zum eingestellten Termin in den Zielmodus um.
</template>
</openwb-base-button-group-input>
<template v-if="(installedConsumer.consumerUsage.reset_chargemode?.mode ?? 'never') !== 'never'">
<openwb-base-text-input
v-if="installedConsumer.consumerUsage.reset_chargemode?.mode === 'time'"
title="Datum"
subtype="date"
:model-value="resetDateParts(installedConsumer).date"
@update:model-value="setResetDate(installedConsumer, $event)"
/>
<template v-if="isResetModeEnabled(installedConsumer)">
<openwb-base-text-input
v-if="installedConsumer.consumerUsage.reset_chargemode?.mode === 'time'"
title="Uhrzeit"
subtype="time"
:model-value="resetDateParts(installedConsumer).time"
:model-value="getResetTime(installedConsumer)"
@update:model-value="setResetTime(installedConsumer, $event)"
/>
<openwb-base-button-group-input
title="Wiederholung"
:buttons="[
{ buttonValue: 'once', text: 'Einmalig', class: 'btn-outline-info' },
{ buttonValue: 'daily', text: 'Täglich', class: 'btn-outline-info' },
{ buttonValue: 'weekly', text: 'Wöchentlich', class: 'btn-outline-info' },
]"
:model-value="currentResetMode(installedConsumer)"
@update:model-value="setResetMode(installedConsumer, $event)"
/>
<openwb-base-text-input
v-if="currentResetMode(installedConsumer) === 'once'"
title="Datum"
subtype="date"
:model-value="getResetOnceDate(installedConsumer)"
@update:model-value="setResetOnceDate(installedConsumer, $event)"
/>
<div v-if="currentResetMode(installedConsumer) === 'weekly'">
<openwb-base-button-group-input
v-for="(day, dayIndex) in weekdays"
:key="dayIndex"
:title="day"
:buttons="[
{ buttonValue: false, text: 'Aus', class: 'btn-outline-danger' },
{ buttonValue: true, text: 'An', class: 'btn-outline-success' },
]"
:model-value="getResetWeeklyDay(installedConsumer, dayIndex)"
@update:model-value="setResetWeeklyDay(installedConsumer, dayIndex, $event)"
/>
</div>
<openwb-base-button-group-input
title="Zielmodus"
:buttons="[
Expand Down Expand Up @@ -371,7 +386,7 @@
>
<template #help>
Die Anlauferkennung ist in den Betriebsmodi PV, Eco und Ziel aktiv und wird bei Ablauf eines
Zielplans, um Mitternacht sowie beim Ändern des Betriebsmodus zurückgesetzt.<br />
Zielplans, beim Tageswechsel sowie beim Ändern des Betriebsmodus zurückgesetzt.<br />
Das Gerät wird eingeschaltet, um seine Startsequenz (z. B. Befüllen, Türverriegelung) abzuwarten.
Sobald der Strom den eingestellten Minimalstrom übersteigt, wird das Gerät als aktiv erkannt, das
Gerät abgeschaltet und es übernimmt der gewählte Betriebsmodus. So kann z. B. eine Waschmaschine
Expand Down Expand Up @@ -969,28 +984,77 @@ export default {
});
});
},
// reset_chargemode.time is stored as an absolute epoch (seconds). Split it into
// the date/time strings the inputs expect, defaulting to "now" when unset.
resetDateParts(consumer) {
const epoch = consumer.consumerUsage?.reset_chargemode?.time;
const date = epoch ? new Date(epoch * 1000) : new Date();
todayDateString() {
const date = new Date();
const pad = (dateTimePart) => String(dateTimePart).padStart(2, "0");
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
},
defaultResetTime() {
return "00:00";
},
isResetModeEnabled(consumer) {
return consumer.consumerUsage?.reset_chargemode?.active;
},
currentResetMode(consumer) {
const selected = consumer.consumerUsage?.reset_chargemode?.frequency?.selected;
return selected === "once" || selected === "daily" || selected === "weekly" ? selected : "daily";
},
setResetEnabled(consumer, active) {
this.updateUsage(consumer.id, active, "reset_chargemode.active");
if (!active) return;

this.updateUsage(consumer.id, true, "reset_chargemode.active");
const mode = this.currentResetMode(consumer);
this.setResetMode(consumer, mode);
this.setResetTime(consumer, this.getResetTime(consumer));
},
defaultWeekly() {
return [false, false, false, false, false, false, false];
},
normalizedResetFrequency(consumer) {
const frequency = consumer.consumerUsage?.reset_chargemode?.frequency;
const selected = this.currentResetMode(consumer);
return {
date: `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`,
time: `${pad(date.getHours())}:${pad(date.getMinutes())}`,
selected,
once: frequency?.once ?? this.todayDateString(),
weekly:
Array.isArray(frequency?.weekly) && frequency.weekly.length === 7 ? frequency.weekly : this.defaultWeekly(),
};
},
setResetDate(consumer, dateString) {
this.writeResetTime(consumer.id, dateString, this.resetDateParts(consumer).time);
getResetTime(consumer) {
const time = consumer.consumerUsage?.reset_chargemode?.time;
return typeof time === "string" && time ? time : this.defaultResetTime();
},
setResetTime(consumer, time) {
if (!time) return;
this.updateUsage(consumer.id, time, "reset_chargemode.time");
},
setResetMode(consumer, mode) {
if (mode !== "once" && mode !== "daily" && mode !== "weekly") return;
const frequency = this.normalizedResetFrequency(consumer);
frequency.selected = mode;
if (mode === "weekly" && !frequency.weekly.some((enabled) => enabled)) {
const weekdayIndex = (new Date().getDay() + 6) % 7;
frequency.weekly[weekdayIndex] = true;
}
this.updateUsage(consumer.id, frequency, "reset_chargemode.frequency");
},
getResetOnceDate(consumer) {
return this.normalizedResetFrequency(consumer).once;
},
setResetOnceDate(consumer, dateString) {
if (!dateString) return;
const frequency = this.normalizedResetFrequency(consumer);
frequency.once = dateString;
this.updateUsage(consumer.id, frequency, "reset_chargemode.frequency");
},
setResetTime(consumer, timeString) {
this.writeResetTime(consumer.id, this.resetDateParts(consumer).date, timeString);
getResetWeeklyDay(consumer, dayIndex) {
return this.normalizedResetFrequency(consumer).weekly[dayIndex];
},
writeResetTime(consumerId, dateString, timeString) {
if (!dateString || !timeString) return;
const epoch = Math.floor(new Date(`${dateString}T${timeString}`).getTime() / 1000);
if (Number.isNaN(epoch)) return;
this.updateUsage(consumerId, epoch, "reset_chargemode.time");
setResetWeeklyDay(consumer, dayIndex, value) {
const frequency = this.normalizedResetFrequency(consumer);
frequency.weekly[dayIndex] = value;
this.updateUsage(consumer.id, frequency, "reset_chargemode.frequency");
},
commandAfterSavingConsumerUsage(command, data, hideSaveModal = false) {
this.commandQueue.push({ command, data });
Expand Down
Loading