From c42a2a2b0b44f0af3fd602f90e5c14e5313dc95c Mon Sep 17 00:00:00 2001 From: BrettS Date: Thu, 30 Oct 2025 15:31:22 +0100 Subject: [PATCH 01/17] Add scheduled details component --- .../ChargePointScheduledPlanDetails.vue | 312 ++++++++++++++++++ .../ChargePointScheduledSettings.vue | 26 +- .../koala/source/src/stores/mqtt-store.ts | 11 + 3 files changed, 348 insertions(+), 1 deletion(-) create mode 100644 packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue new file mode 100644 index 0000000000..0effa55233 --- /dev/null +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue @@ -0,0 +1,312 @@ + + + + + diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue index 78a604b9ef..68a8938dde 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue @@ -2,6 +2,22 @@
Termine Zielladen:
+ + +
import { useMqttStore } from 'src/stores/mqtt-store'; import ChargePointScheduledPlanButton from './ChargePointScheduledPlanButton.vue'; -import { computed } from 'vue'; +import ChargePointScheduledPlanHeader from './ChargePointScheduledPlanHeader.vue'; +import ChargePointScheduledPlanDetails from './ChargePointScheduledPlanDetails.vue'; +import { computed, ref } from 'vue'; const props = defineProps<{ chargePointId: number; }>(); +const currentPlanVisible = ref(false); + const mqttStore = useMqttStore(); const plans = computed(() => mqttStore.vehicleScheduledChargingPlans(props.chargePointId), ); + +function addScheduledChargingPlan() { + mqttStore.addScheduledChargingPlanForChargePoint(props.chargePointId); + } diff --git a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts index 2659be64c4..520902b5fe 100644 --- a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts +++ b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts @@ -2171,6 +2171,16 @@ export const useMqttStore = defineStore('mqtt', () => { }; }); + function addScheduledChargingPlanForChargePoint(chargePointId: number) { + const templateId = chargePointConnectedVehicleChargeTemplate(chargePointId).value?.id; + if (templateId !== undefined) { + sendSystemCommand('addChargeTemplateSchedulePlan', { template: templateId }); + } else { + console.warn('Kein Template für ChargePoint gefunden:', chargePointId); + } +} + + /** * Get time charging plan/s data identified by the charge point id * @param chargePointId charge point id @@ -2910,6 +2920,7 @@ export const useMqttStore = defineStore('mqtt', () => { chargePointConnectedVehicleSoc, vehicleActivePlan, vehicleChargeTarget, + addScheduledChargingPlanForChargePoint, vehicleScheduledChargingPlans, vehicleScheduledChargingPlanActive, vehicleScheduledChargingPlanEtActive, From 5d479d01a2f987b77602f5d33113df7aa63d9389 Mon Sep 17 00:00:00 2001 From: BrettS Date: Thu, 30 Oct 2025 18:05:10 +0100 Subject: [PATCH 02/17] Add / remove scheduled charging plan - details as dialog --- .../ChargePointScheduledPlanButton.vue | 2 +- .../ChargePointScheduledPlanDetails.vue | 33 ++++++++++ .../ChargePointScheduledSettings.vue | 64 +++++++++++++------ .../koala/source/src/stores/mqtt-store.ts | 10 +++ 4 files changed, 87 insertions(+), 22 deletions(-) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanButton.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanButton.vue index 935b8171c4..80b23b51b8 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanButton.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanButton.vue @@ -4,7 +4,7 @@ align="center" class="cursor-pointer" :color="planActive.value ? 'positive' : 'negative'" - @click="planActive.value = !planActive.value" + @click="$emit('edit', plan)" >
{{ plan.name }}
diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue index 0effa55233..680675b80f 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue @@ -1,5 +1,15 @@ @@ -298,6 +319,18 @@ const planNumPhasesPv = computed(() => props.plan.id, ), ); + +const removeScheduledChargingPlan = (planId) => { + mqttStore.removeScheduledChargingPlanForChargePoint( + props.chargePointId, + planId, + ); + //charge mode set back to instant_charging in backend when a plan is removed + //set timeout workaround + setTimeout(() => { + mqttStore.chargePointConnectedVehicleChargeMode(props.chargePointId).value = 'scheduled_charging'; + }, 200); +}; diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingSettings.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingSettings.vue index e4f34e0558..8ab62db91b 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingSettings.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingSettings.vue @@ -3,12 +3,23 @@ class="row items-center q-ma-none q-pa-none no-wrap items-center justify-between" >
Zeitladen
+
-
+
Termine Zeitladen:
+
+ +
+ + + +
diff --git a/packages/modules/web_themes/koala/source/src/stores/mqtt-store-model.ts b/packages/modules/web_themes/koala/source/src/stores/mqtt-store-model.ts index 6fc5ef8958..38b2c50e1d 100644 --- a/packages/modules/web_themes/koala/source/src/stores/mqtt-store-model.ts +++ b/packages/modules/web_themes/koala/source/src/stores/mqtt-store-model.ts @@ -135,6 +135,7 @@ export interface ScheduledChargingPlan { name: string; active: boolean; bidi_charging_enabled: boolean; + bidi_power: number; et_active: boolean; current: number; dc_current: number; diff --git a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts index 7b18fb3775..7a5be24e24 100644 --- a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts +++ b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts @@ -1659,6 +1659,88 @@ export const useMqttStore = defineStore('mqtt', () => { }); }; + /** + * Get or set the plan name for time charging plan identified by the time charging plan id + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns string | undefined + */ + const vehicleTimeChargingPlanName = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.name; + }, + set(newValue: string) { + updateTimeChargingPlanSubtopic(chargePointId, planId, 'name', newValue); + }, + }); + }; + + /** + * Add a new time charging plan for a charge point + * @param chargePointId charge point id + * @returns void + */ + const addTimeChargingPlanForChargePoint = (chargePointId: number) => { + const templateId = + chargePointConnectedVehicleChargeTemplate(chargePointId).value?.id; + if (templateId !== undefined) { + sendSystemCommand('addChargeTemplateTimeChargingPlan', { + template: templateId, chargepoint: chargePointId, + changed_in_theme: true, + }); + } + }; + + /** + * Remove a time charging plan for a charge point + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns void + */ + const removeTimeChargingPlanForChargePoint = ( + chargePointId: number, + planId: number, + ) => { + sendSystemCommand('removeChargeTemplateTimeChargingPlan', { + template: + chargePointConnectedVehicleChargeTemplate(chargePointId).value?.id, + plan: planId, chargepoint: chargePointId, + changed_in_theme: true, + }); + }; + + /** + * Helper function to update a subtopic of a time charging plan + * @param chargePointId charge point id + * @param planId time charging plan id + * @param propertyPath path to the property to update + * @param newValue new value to set + * @returns void + */ + const updateTimeChargingPlanSubtopic = ( + chargePointId: number, + planId: number, + propertyPath: string, + newValue: T, + ): void => { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const planIndex = plans.findIndex((plan) => plan.id === planId); + if (planIndex === -1) return; + const objectPath = `time_charging.plans.${planIndex}.${propertyPath}`; + updateTopic( + `openWB/chargepoint/${chargePointId}/set/charge_template`, + newValue, + objectPath, + true, + ); + }; + /** * Get or set the active state of the time charging plan identified by the time charge plan id * @param chargePointId charge point id @@ -1676,15 +1758,308 @@ export const useMqttStore = defineStore('mqtt', () => { return plan?.active; }, set(newValue: boolean) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'active', + newValue, + ); + }, + }); + }; + + /** + * Get or set the start time for a time charging plan + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns string | undefined + */ + const vehicleTimeChargingPlanStartTime = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const planIndex = plans.findIndex((plan) => plan.id === planId); - if (planIndex === -1) return; - const objectPath = `time_charging.plans.${planIndex}.active`; - updateTopic( - `openWB/chargepoint/${chargePointId}/set/charge_template`, + const plan = plans.find((p) => p.id === planId); + return plan?.time?.[0]; + }, + set(newValue: string) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'time.0', + newValue, + ); + }, + }); + }; + + /** + * Get or set the start time for a time charging plan + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns string | undefined + */ + const vehicleTimeChargingPlanEndTime = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.time?.[1]; + }, + set(newValue: string) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'time.1', + newValue, + ); + }, + }); + }; + + /** + * Get or set the current for time charging plan identified by the time charging plan id + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns number | undefined + */ + const vehicleTimeChargingPlanCurrent = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.current; + }, + set(newValue: number) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'current', + newValue, + ); + }, + }); + }; + + /** + * Get or set the limit selected mode for time charging plan identified by the time charging plan id + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns string | undefined + */ + const vehicleTimeChargingPlanLimitSelected = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.limit?.selected; + }, + set(newValue: string) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'limit.selected', + newValue, + ); + }, + }); + }; + + /** + * Get or set the SoC limit for time charging plan identified by the time charging plan id + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns number | undefined + */ + const vehicleTimeChargingPlanSocLimit = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.limit?.soc; + }, + set(newValue: number) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'limit.soc', + newValue, + ); + }, + }); + }; + + /** + * Get or set the energy amount limit for time charging plan identified by the time charging plan id + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns number | undefined + */ + const vehicleTimeChargingPlanEnergyAmount = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.limit?.amount; + }, + set(newValue: number) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'limit.amount', + newValue, + ); + }, + }); + }; + + /** + * Get or set the frequency mode for time charging plan identified by the time charging plan id + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns string | undefined + */ + const vehicleTimeChargingPlanFrequencySelected = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.frequency?.selected; + }, + set(newValue: string) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'frequency.selected', + newValue, + ); + }, + }); + }; + + /** + * Get or set the "Gültig ab" date for time charging plan (once) + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns string | undefined + */ + const vehicleTimeChargingPlanOnceDateStart = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.frequency?.once?.[0]; + }, + set(newValue: string) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'frequency.once.0', + newValue, + ); + }, + }); + }; + + /** + * Get or set the "Gültig bis" date for time charging plan (once) + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns string | undefined + */ + const vehicleTimeChargingPlanOnceDateEnd = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.frequency?.once?.[1]; + }, + set(newValue: string) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'frequency.once.1', + newValue, + ); + }, + }); + }; + + /** + * Get or set the number of phases for time charging plan + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns number | undefined + */ + const vehicleTimeChargingPlanPhases = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.phases_to_use; + }, + set(newValue: number) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'phases_to_use', + newValue, + ); + }, + }); + }; + + /** + * Get or set the weekly days array for time charging plan identified by the time charging plan id + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns boolean[] | undefined + */ + const vehicleTimeChargingPlanWeeklyDays = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.frequency?.weekly ?? Array(7).fill(false); + }, + set(newValue: boolean[]) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'frequency.weekly', newValue, - objectPath, - true, ); }, }); @@ -2172,23 +2547,36 @@ export const useMqttStore = defineStore('mqtt', () => { }); function addScheduledChargingPlanForChargePoint(chargePointId: number) { - const templateId = chargePointConnectedVehicleChargeTemplate(chargePointId).value?.id; - if (templateId !== undefined) { - sendSystemCommand('addChargeTemplateSchedulePlan', { template: templateId }); - } else { - console.warn('Kein Template für ChargePoint gefunden:', chargePointId); - } -} - - function removeScheduledChargingPlanForChargePoint(chargePointId: number, planId: number) { - const templateId = chargePointConnectedVehicleChargeTemplate(chargePointId).value?.id; - if (templateId !== undefined) { - sendSystemCommand('removeChargeTemplateSchedulePlan', { template: templateId, plan: planId }); - } else { - console.warn('Kein Template für ChargePoint gefunden:', chargePointId); + const templateId = + chargePointConnectedVehicleChargeTemplate(chargePointId).value?.id; + if (templateId !== undefined) { + sendSystemCommand('addChargeTemplateSchedulePlan', { + template: templateId, + chargePoint: chargePointId, + changed_in_theme: true, + }); + } else { + console.warn('Kein Template für ChargePoint gefunden:', chargePointId); + } } -} + function removeScheduledChargingPlanForChargePoint( + chargePointId: number, + planId: number, + ) { + const templateId = + chargePointConnectedVehicleChargeTemplate(chargePointId).value?.id; + if (templateId !== undefined) { + sendSystemCommand('removeChargeTemplateSchedulePlan', { + template: templateId, + plan: planId, + chargePoint: chargePointId, + changed_in_theme: true, + }); + } else { + console.warn('Kein Template für ChargePoint gefunden:', chargePointId); + } + } /** * Get time charging plan/s data identified by the charge point id @@ -2688,6 +3076,93 @@ export const useMqttStore = defineStore('mqtt', () => { }); }; + /** + * Get or set the bidirectional charging enabled state for a scheduled charging plan + * @param chargePointId charge point id + * @param planId scheduled charging plan id + * @returns boolean | undefined + */ + const vehicleScheduledChargingPlanBidiEnabled = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleScheduledChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.bidi_charging_enabled; + }, + set(newValue: boolean) { + updateScheduledChargingPlanSubtopic( + chargePointId, + planId, + 'bidi_charging_enabled', + newValue, + ); + }, + }); + }; + + /** + * Get or set the bidirectional charging enabled state for a scheduled charging plan + * @param chargePointId charge point id + * @param planId scheduled charging plan id + * @returns boolean | undefined + */ + const vehicleScheduledChargingPlanBidiPower = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleScheduledChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + const power = plan?.bidi_power; + const valueObject = getValueObject.value(power, 'W', '', true); + return valueObject.scaledValue; + }, + set(newValue: number) { + const watts = Math.round(newValue * 1000); + updateScheduledChargingPlanSubtopic( + chargePointId, + planId, + 'bidi_power', + watts, + ); + }, + }); + }; + + /** + * Get or set the DC charging power for a scheduled charging plan (plan.dc_current) + * @param chargePointId charge point id + * @param planId scheduled charging plan id + * @returns number | undefined (in kW) + */ + const vehicleScheduledChargingPlanDcPower = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleScheduledChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + const dcCurrent = plan?.dc_current; + const valueObject = getValueObject.value(dcCurrent, 'W', '', true); + return valueObject.scaledValue; + }, + set(newValue: number) { + const watts = Math.round(newValue * 1000); + updateScheduledChargingPlanSubtopic( + chargePointId, + planId, + 'dc_current', + watts, + ); + }, + }); + }; + /////////////////////////////// Grid Data ///////////////////////////////////// /** @@ -2946,8 +3421,25 @@ export const useMqttStore = defineStore('mqtt', () => { vehicleScheduledChargingPlanSocScheduled, vehicleScheduledChargingPlanPhases, vehicleScheduledChargingPlanPhasesPv, + vehicleScheduledChargingPlanBidiEnabled, + vehicleScheduledChargingPlanBidiPower, + vehicleScheduledChargingPlanDcPower, vehicleTimeChargingPlans, + vehicleTimeChargingPlanName, + addTimeChargingPlanForChargePoint, + removeTimeChargingPlanForChargePoint, vehicleTimeChargingPlanActive, + vehicleTimeChargingPlanStartTime, + vehicleTimeChargingPlanEndTime, + vehicleTimeChargingPlanCurrent, + vehicleTimeChargingPlanLimitSelected, + vehicleTimeChargingPlanSocLimit, + vehicleTimeChargingPlanEnergyAmount, + vehicleTimeChargingPlanFrequencySelected, + vehicleTimeChargingPlanOnceDateStart, + vehicleTimeChargingPlanOnceDateEnd, + vehicleTimeChargingPlanPhases, + vehicleTimeChargingPlanWeeklyDays, chargePointConnectedVehicleSocType, chargePointConnectedVehicleSocManual, // Battery data From 0c6a50b753e3686f39acc1f898b8d4c0dc93d109 Mon Sep 17 00:00:00 2001 From: BrettS Date: Fri, 31 Oct 2025 13:45:50 +0100 Subject: [PATCH 04/17] Backend command --- packages/helpermodules/command.py | 69 +++++++++++-------- .../ChargePointScheduledPlanDetails.vue | 7 +- .../ChargePointScheduledSettings.vue | 10 +-- .../ChargePointTimeChargingPlanDetails.vue | 8 +-- .../koala/source/src/stores/mqtt-store.ts | 16 +++-- 5 files changed, 64 insertions(+), 46 deletions(-) diff --git a/packages/helpermodules/command.py b/packages/helpermodules/command.py index 2d1b79d96c..ba43da1506 100644 --- a/packages/helpermodules/command.py +++ b/packages/helpermodules/command.py @@ -16,7 +16,7 @@ from control.chargepoint import chargepoint from control.chargepoint.chargepoint_template import get_chargepoint_template_default -from control.ev.charge_template import get_new_charge_template +from control.ev.charge_template import ChargeTemplate, get_new_charge_template from control.ev.ev_template import EvTemplateData from helpermodules import pub from helpermodules.abstract_plans import AutolockPlan, ScheduledChargingPlan, TimeChargingPlan @@ -488,13 +488,36 @@ def removeChargeTemplate(self, connection_id: str, payload: dict) -> None: pub_user_message(payload, connection_id, "Lade-Profil mit ID 0 darf nicht gelöscht werden.", MessageType.ERROR) + def _get_charge_template_by_source(self, payload: dict) -> ChargeTemplate: + """ gibt das ChargeTemplate-Objekt zurück, je nachdem ob es sich um das persistente Ladeprofil oder das + Ladeprofil des Ladepunkts handelt. + """ + if payload["data"]["changed_in_theme"]: + charge_template = data.data.cp_data[f"cp{payload['data']['chargepoint']}"].data.set.charge_template + else: + charge_template = data.data.ev_charge_template_data[f'ct{payload["data"]["template"]}'] + return charge_template + + def _pub_charge_template_to_source(self, payload: dict, charge_template: ChargeTemplate) -> None: + """ veröffentlicht das ChargeTemplate-Objekt, je nachdem ob es sich um das persistente Ladeprofil oder das + Ladeprofil des Ladepunkts handelt. + """ + if payload["data"]["changed_in_theme"]: + Pub().pub( + f'openWB/set/chargepoint/{payload["data"]["chargepoint"]}/set/charge_template', + dataclass_utils.asdict(charge_template.data)) + else: + Pub().pub( + f'openWB/set/vehicle/template/charge_template/{payload["data"]["template"]}', + dataclass_utils.asdict(charge_template.data)) + def addChargeTemplateSchedulePlan(self, connection_id: str, payload: dict) -> None: """ sendet das Topic, zu dem ein neuer Zielladen-Plan erstellt werden soll. """ + charge_template = self._get_charge_template_by_source(payload) # check if "payload" contains "data.copy" if "data" in payload and "copy" in payload["data"]: - for plan in data.data.ev_charge_template_data[ - f'ct{payload["data"]["template"]}'].data.chargemode.scheduled_charging.plans: + for plan in charge_template.data.chargemode.scheduled_charging.plans: if plan.id == payload["data"]["copy"]: new_charge_template_schedule_plan = copy.deepcopy(plan) break @@ -503,12 +526,8 @@ def addChargeTemplateSchedulePlan(self, connection_id: str, payload: dict) -> No new_charge_template_schedule_plan = ScheduledChargingPlan() new_id = self.max_id_charge_template_scheduled_plan + 1 new_charge_template_schedule_plan.id = new_id - data.data.ev_charge_template_data[ - f'ct{payload["data"]["template"]}'].data.chargemode.scheduled_charging.plans.append( - new_charge_template_schedule_plan) - Pub().pub( - f'openWB/set/vehicle/template/charge_template/{payload["data"]["template"]}', - dataclass_utils.asdict(data.data.ev_charge_template_data[f'ct{payload["data"]["template"]}'].data)) + charge_template.data.chargemode.scheduled_charging.plans.append(new_charge_template_schedule_plan) + self._pub_charge_template_to_source(payload, charge_template) self.max_id_charge_template_scheduled_plan = new_id Pub().pub( "openWB/set/command/max_id/charge_template_scheduled_plan", new_id) @@ -521,21 +540,17 @@ def addChargeTemplateSchedulePlan(self, connection_id: str, payload: dict) -> No def removeChargeTemplateSchedulePlan(self, connection_id: str, payload: dict) -> None: """ löscht einen Zielladen-Plan. """ + charge_template = self._get_charge_template_by_source(payload) if self.max_id_charge_template_scheduled_plan < payload["data"]["plan"]: log.error( payload, connection_id, f'Die ID \'{payload["data"]["plan"]}\' ist größer als die maximal vergebene ' f'ID \'{self.max_id_charge_template_scheduled_plan}\'.', MessageType.ERROR) - for plan in data.data.ev_charge_template_data[ - f'ct{payload["data"]["template"]}'].data.chargemode.scheduled_charging.plans: + for plan in charge_template.data.chargemode.scheduled_charging.plans: if plan.id == payload["data"]["plan"]: - data.data.ev_charge_template_data[ - f'ct{payload["data"]["template"]}'].data.chargemode.scheduled_charging.plans.remove( - plan) + charge_template.data.chargemode.scheduled_charging.plans.remove(plan) break - Pub().pub( - f'openWB/vehicle/template/charge_template/{payload["data"]["template"]}', - dataclass_utils.asdict(data.data.ev_charge_template_data[f'ct{payload["data"]["template"]}'].data)) + self._pub_charge_template_to_source(payload, charge_template) pub_user_message( payload, connection_id, f'Zielladen-Plan mit ID \'{payload["data"]["plan"]}\' von Profil ' @@ -545,9 +560,10 @@ def removeChargeTemplateSchedulePlan(self, connection_id: str, payload: dict) -> def addChargeTemplateTimeChargingPlan(self, connection_id: str, payload: dict) -> None: """ sendet das Topic, zu dem ein neuer Zeitladen-Plan erstellt werden soll. """ + charge_template = self._get_charge_template_by_source(payload) # check if "payload" contains "data.copy" if "data" in payload and "copy" in payload["data"]: - for plan in data.data.ev_charge_template_data[f'ct{payload["data"]["template"]}'].data.time_charging.plans: + for plan in charge_template.data.time_charging.plans: if plan.id == payload["data"]["copy"]: new_time_charging_plan = copy.deepcopy(plan) break @@ -556,11 +572,8 @@ def addChargeTemplateTimeChargingPlan(self, connection_id: str, payload: dict) - new_time_charging_plan = TimeChargingPlan() new_id = self.max_id_charge_template_time_charging_plan + 1 new_time_charging_plan.id = new_id - data.data.ev_charge_template_data[f'ct{payload["data"]["template"]}'].data.time_charging.plans.append( - new_time_charging_plan) - Pub().pub( - f'openWB/set/vehicle/template/charge_template/{payload["data"]["template"]}', - dataclass_utils.asdict(data.data.ev_charge_template_data[f'ct{payload["data"]["template"]}'].data)) + charge_template.data.time_charging.plans.append(new_time_charging_plan) + self._pub_charge_template_to_source(payload, charge_template) self.max_id_charge_template_time_charging_plan = new_id Pub().pub( "openWB/set/command/max_id/charge_template_time_charging_plan", new_id) @@ -572,17 +585,15 @@ def addChargeTemplateTimeChargingPlan(self, connection_id: str, payload: dict) - def removeChargeTemplateTimeChargingPlan(self, connection_id: str, payload: dict) -> None: """ löscht einen Zeitladen-Plan. """ + charge_template = self._get_charge_template_by_source(payload) if self.max_id_charge_template_time_charging_plan < payload["data"]["plan"]: log.error(payload, connection_id, "Die ID ist größer als die maximal vergebene ID.", MessageType.ERROR) - for plan in data.data.ev_charge_template_data[f'ct{payload["data"]["template"]}'].data.time_charging.plans: + for plan in charge_template.data.time_charging.plans: if plan.id == payload["data"]["plan"]: - data.data.ev_charge_template_data[f'ct{payload["data"]["template"]}'].data.time_charging.plans.remove( - plan) + charge_template.data.time_charging.plans.remove(plan) break - Pub().pub( - f'openWB/vehicle/template/charge_template/{payload["data"]["template"]}', - dataclass_utils.asdict(data.data.ev_charge_template_data[f'ct{payload["data"]["template"]}'].data)) + self._pub_charge_template_to_source(payload, charge_template) pub_user_message( payload, connection_id, f'Zeitladen-Plan mit ID \'{payload["data"]["plan"]}\' zu Profil ' diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue index bd6251de86..8a2a39ca7e 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue @@ -373,9 +373,10 @@ const removeScheduledChargingPlan = (planId) => { ); //charge mode set back to instant_charging in backend when a plan is removed //set timeout workaround - setTimeout(() => { - mqttStore.chargePointConnectedVehicleChargeMode(props.chargePointId).value = 'scheduled_charging'; - }, 200); + + // setTimeout(() => { + // mqttStore.chargePointConnectedVehicleChargeMode(props.chargePointId).value = 'scheduled_charging'; + // }, 200); }; diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue index 347aec8087..04a59f1d8f 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue @@ -72,10 +72,12 @@ const addScheduledChargingPlan = () => { mqttStore.addScheduledChargingPlanForChargePoint(props.chargePointId); //charge mode set back to instant_charging in backend when a new plan is added //settimeout workaround - setTimeout(() => { - mqttStore.chargePointConnectedVehicleChargeMode(props.chargePointId).value = - 'scheduled_charging'; - }, 200); + + + // setTimeout(() => { + // mqttStore.chargePointConnectedVehicleChargeMode(props.chargePointId).value = + // 'scheduled_charging'; + // }, 200); }; const openPlanDialog = (plan) => { diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue index 3d9a08834d..d60b72a87e 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue @@ -273,10 +273,10 @@ const planNumPhases = computed(() => const removeTimeChargingPlan = (planId: number) => { mqttStore.removeTimeChargingPlanForChargePoint(props.chargePointId, planId); - setTimeout(() => { - mqttStore.chargePointConnectedVehicleChargeMode(props.chargePointId).value = - 'time_charging'; - }, 200); + // setTimeout(() => { + // mqttStore.chargePointConnectedVehicleChargeMode(props.chargePointId).value = + // 'time_charging'; + // }, 200); }; diff --git a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts index 7a5be24e24..5891c66caa 100644 --- a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts +++ b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts @@ -1691,7 +1691,8 @@ export const useMqttStore = defineStore('mqtt', () => { chargePointConnectedVehicleChargeTemplate(chargePointId).value?.id; if (templateId !== undefined) { sendSystemCommand('addChargeTemplateTimeChargingPlan', { - template: templateId, chargepoint: chargePointId, + template: templateId, + chargepoint: chargePointId, changed_in_theme: true, }); } @@ -1707,10 +1708,12 @@ export const useMqttStore = defineStore('mqtt', () => { chargePointId: number, planId: number, ) => { + const templateId = + chargePointConnectedVehicleChargeTemplate(chargePointId).value?.id; sendSystemCommand('removeChargeTemplateTimeChargingPlan', { - template: - chargePointConnectedVehicleChargeTemplate(chargePointId).value?.id, - plan: planId, chargepoint: chargePointId, + template: templateId, + plan: planId, + chargepoint: chargePointId, changed_in_theme: true, }); }; @@ -2552,7 +2555,7 @@ export const useMqttStore = defineStore('mqtt', () => { if (templateId !== undefined) { sendSystemCommand('addChargeTemplateSchedulePlan', { template: templateId, - chargePoint: chargePointId, + chargepoint: chargePointId, changed_in_theme: true, }); } else { @@ -2567,10 +2570,11 @@ export const useMqttStore = defineStore('mqtt', () => { const templateId = chargePointConnectedVehicleChargeTemplate(chargePointId).value?.id; if (templateId !== undefined) { + //debugger; sendSystemCommand('removeChargeTemplateSchedulePlan', { template: templateId, plan: planId, - chargePoint: chargePointId, + chargepoint: chargePointId, changed_in_theme: true, }); } else { From 89c6bf7960fa8b436c1f167141078f5fa110909d Mon Sep 17 00:00:00 2001 From: BrettS Date: Fri, 31 Oct 2025 16:34:11 +0100 Subject: [PATCH 05/17] Add DC charging inputs --- .../ChargePointScheduledPlanDetails.vue | 5 ++++ .../ChargePointTimeChargingPlanDetails.vue | 20 +++++++++++++ .../koala/source/src/stores/mqtt-store.ts | 28 +++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue index 8a2a39ca7e..277a588d09 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue @@ -39,6 +39,7 @@ v-model="planCurrent.value" /> ), ); +const planDcChargingEnabled = computed(() => + mqttStore.dcChargingEnabled +); + const planDcPower = computed(() => mqttStore.vehicleScheduledChargingPlanDcPower( props.chargePointId, diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue index d60b72a87e..51058386bb 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue @@ -45,6 +45,12 @@ unit="A" v-model="planCurrent.value" /> +
Begrenzung
@@ -267,10 +273,24 @@ const selectedWeekDays = computed({ ).value = newValue; }, }); + const planNumPhases = computed(() => mqttStore.vehicleTimeChargingPlanPhases(props.chargePointId, props.plan.id), ); +const planDcChargingEnabled = computed(() => + mqttStore.dcChargingEnabled +); + +const planDcCurrent = computed(() => + mqttStore.vehicleTimeChargingPlanDcCurrent( + props.chargePointId, + props.plan.id, + ), +); + +// v-if="planDcChargingEnabled" + const removeTimeChargingPlan = (planId: number) => { mqttStore.removeTimeChargingPlanForChargePoint(props.chargePointId, planId); // setTimeout(() => { diff --git a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts index 5891c66caa..c6d0bb6dcb 100644 --- a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts +++ b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts @@ -2068,6 +2068,33 @@ export const useMqttStore = defineStore('mqtt', () => { }); }; + /** + * Get or set the weekly days array for time charging plan identified by the time charging plan id + * @param chargePointId charge point id + * @param planId time charging plan id + * @returns boolean[] | undefined + */ + const vehicleTimeChargingPlanDcCurrent = ( + chargePointId: number, + planId: number, + ) => { + return computed({ + get() { + const plans = vehicleTimeChargingPlans.value(chargePointId); + const plan = plans.find((p) => p.id === planId); + return plan?.dc_current; + }, + set(newValue: boolean[]) { + updateTimeChargingPlanSubtopic( + chargePointId, + planId, + 'dc_current', + newValue, + ); + }, + }); + }; + /** * Get the charge point connected vehicle config identified by the charge point id * @param chargePointId charge point id @@ -3444,6 +3471,7 @@ export const useMqttStore = defineStore('mqtt', () => { vehicleTimeChargingPlanOnceDateEnd, vehicleTimeChargingPlanPhases, vehicleTimeChargingPlanWeeklyDays, + vehicleTimeChargingPlanDcCurrent, chargePointConnectedVehicleSocType, chargePointConnectedVehicleSocManual, // Battery data From b4da8f3ecab22c2116940ed6c30cfb82718143a4 Mon Sep 17 00:00:00 2001 From: BrettS Date: Sat, 1 Nov 2025 17:25:24 +0100 Subject: [PATCH 06/17] Display bidi settings in scheduled plan based on vehicle profile bidi enabled --- .../ChargePointScheduledPlanDetails.vue | 55 ++++++++++--------- .../ChargePointTimeChargingPlanDetails.vue | 10 +--- .../koala/source/src/stores/mqtt-store.ts | 16 ++++++ 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue index 277a588d09..241838cd6d 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue @@ -86,25 +86,32 @@ class="col" /> -
-
Bidirektionales Überschussladen
+
+
+ Bidirektionales Überschussladen +
-
- - - - -
Wiederholungen
@@ -127,7 +134,6 @@ label="Wöchentlich" /> -
-
+
), ); -const planDcChargingEnabled = computed(() => - mqttStore.dcChargingEnabled +const chargePointConnectedVehicleBidiEnabled = computed( + () => + mqttStore.chargePointConnectedVehicleBidiEnabled(props.chargePointId).value, ); +const planDcChargingEnabled = computed(() => mqttStore.dcChargingEnabled); + const planDcPower = computed(() => - mqttStore.vehicleScheduledChargingPlanDcPower( - props.chargePointId, - props.plan.id, - ), - ); + mqttStore.vehicleScheduledChargingPlanDcPower( + props.chargePointId, + props.plan.id, + ), +); const removeScheduledChargingPlan = (planId) => { mqttStore.removeScheduledChargingPlanForChargePoint( props.chargePointId, planId, ); - //charge mode set back to instant_charging in backend when a plan is removed - //set timeout workaround - - // setTimeout(() => { - // mqttStore.chargePointConnectedVehicleChargeMode(props.chargePointId).value = 'scheduled_charging'; - // }, 200); }; diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue index 51058386bb..85670050ef 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue @@ -278,9 +278,7 @@ const planNumPhases = computed(() => mqttStore.vehicleTimeChargingPlanPhases(props.chargePointId, props.plan.id), ); -const planDcChargingEnabled = computed(() => - mqttStore.dcChargingEnabled -); +const planDcChargingEnabled = computed(() => mqttStore.dcChargingEnabled); const planDcCurrent = computed(() => mqttStore.vehicleTimeChargingPlanDcCurrent( @@ -289,14 +287,8 @@ const planDcCurrent = computed(() => ), ); -// v-if="planDcChargingEnabled" - const removeTimeChargingPlan = (planId: number) => { mqttStore.removeTimeChargingPlanForChargePoint(props.chargePointId, planId); - // setTimeout(() => { - // mqttStore.chargePointConnectedVehicleChargeMode(props.chargePointId).value = - // 'time_charging'; - // }, 200); }; diff --git a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts index c6d0bb6dcb..cfb915cbe2 100644 --- a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts +++ b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts @@ -1659,6 +1659,21 @@ export const useMqttStore = defineStore('mqtt', () => { }); }; + /** * Get the charge point connected vehicle bidi enabled state from vehicle template identified by the charge point id + * @param chargePointId charge point id + * @returns boolean + */ + const chargePointConnectedVehicleBidiEnabled = (chargePointId: number) => { + return computed(() => { + const connectedVehicleEvTemplateId = + chargePointConnectedVehicleConfig(chargePointId).value.ev_template; + return getValue.value( + `openWB/vehicle/template/ev_template/${connectedVehicleEvTemplateId}`, + 'bidi', + ) as boolean; + }); + }; + /** * Get or set the plan name for time charging plan identified by the time charging plan id * @param chargePointId charge point id @@ -3423,6 +3438,7 @@ export const useMqttStore = defineStore('mqtt', () => { chargePointConnectedVehiclePriority, chargePointConnectedVehicleTimeCharging, chargePointConnectedVehicleChargeTemplate, + chargePointConnectedVehicleBidiEnabled, // vehicle data vehicleList, chargePointConnectedVehicleConfig, From a56808e1d0d982933d68f0522f9a24c7897ec976 Mon Sep 17 00:00:00 2001 From: BrettS Date: Sat, 1 Nov 2025 18:12:52 +0100 Subject: [PATCH 07/17] Fix DC power values for scheduled and time planes --- .../ChargePointTimeChargingPlanDetails.vue | 9 +++----- .../koala/source/src/stores/mqtt-store.ts | 23 +++++++++++-------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue index 85670050ef..8cf8483164 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue @@ -47,7 +47,7 @@ /> @@ -280,11 +280,8 @@ const planNumPhases = computed(() => const planDcChargingEnabled = computed(() => mqttStore.dcChargingEnabled); -const planDcCurrent = computed(() => - mqttStore.vehicleTimeChargingPlanDcCurrent( - props.chargePointId, - props.plan.id, - ), +const planDcPower = computed(() => + mqttStore.vehicleTimeChargingPlanDcPower(props.chargePointId, props.plan.id), ); const removeTimeChargingPlan = (planId: number) => { diff --git a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts index cfb915cbe2..3f347ab343 100644 --- a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts +++ b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts @@ -2089,7 +2089,7 @@ export const useMqttStore = defineStore('mqtt', () => { * @param planId time charging plan id * @returns boolean[] | undefined */ - const vehicleTimeChargingPlanDcCurrent = ( + const vehicleTimeChargingPlanDcPower = ( chargePointId: number, planId: number, ) => { @@ -2097,14 +2097,18 @@ export const useMqttStore = defineStore('mqtt', () => { get() { const plans = vehicleTimeChargingPlans.value(chargePointId); const plan = plans.find((p) => p.id === planId); - return plan?.dc_current; + const current = plan?.dc_current; + const power = convertDcCurrentToPower(current); + const valueObject = getValueObject.value(power, 'W', '', true); + return valueObject.scaledValue; }, - set(newValue: boolean[]) { + set(newValue) { + const current = convertPowerToDcCurrent(newValue); updateTimeChargingPlanSubtopic( chargePointId, planId, 'dc_current', - newValue, + current, ); }, }); @@ -3193,17 +3197,18 @@ export const useMqttStore = defineStore('mqtt', () => { get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); const plan = plans.find((p) => p.id === planId); - const dcCurrent = plan?.dc_current; - const valueObject = getValueObject.value(dcCurrent, 'W', '', true); + const current = plan?.dc_current; + const power = convertDcCurrentToPower(current); + const valueObject = getValueObject.value(power, 'W', '', true); return valueObject.scaledValue; }, set(newValue: number) { - const watts = Math.round(newValue * 1000); + const current = convertPowerToDcCurrent(newValue); updateScheduledChargingPlanSubtopic( chargePointId, planId, 'dc_current', - watts, + current, ); }, }); @@ -3487,7 +3492,7 @@ export const useMqttStore = defineStore('mqtt', () => { vehicleTimeChargingPlanOnceDateEnd, vehicleTimeChargingPlanPhases, vehicleTimeChargingPlanWeeklyDays, - vehicleTimeChargingPlanDcCurrent, + vehicleTimeChargingPlanDcPower, chargePointConnectedVehicleSocType, chargePointConnectedVehicleSocManual, // Battery data From 12b174adb3a44c86612b808956707123726ca2eb Mon Sep 17 00:00:00 2001 From: BrettS Date: Sat, 1 Nov 2025 19:21:15 +0100 Subject: [PATCH 08/17] Close plan dialog upon plan deletion --- .../ChargePointScheduledPlanDetails.vue | 4 ++- .../ChargePointScheduledSettings.vue | 9 +----- .../ChargePointTimeChargingPlanDetails.vue | 6 ++-- .../ChargePointTimeChargingSettings.vue | 28 +++++++++---------- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue index 241838cd6d..e90022379a 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue @@ -203,7 +203,7 @@ Plan löschen @@ -225,6 +225,7 @@ const props = defineProps<{ plan: ScheduledChargingPlan; }>(); +const emit = defineEmits(['close']); const mqttStore = useMqttStore(); const $q = useQuasar(); @@ -383,6 +384,7 @@ const removeScheduledChargingPlan = (planId) => { props.chargePointId, planId, ); + emit('close'); }; diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue index 04a59f1d8f..06fe99d012 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue @@ -40,6 +40,7 @@ v-if="selectedPlan" :charge-point-id="props.chargePointId" :plan="selectedPlan" + @close="currentPlanDetailsVisible = false" />
@@ -70,14 +71,6 @@ const plans = computed(() => const addScheduledChargingPlan = () => { mqttStore.addScheduledChargingPlanForChargePoint(props.chargePointId); - //charge mode set back to instant_charging in backend when a new plan is added - //settimeout workaround - - - // setTimeout(() => { - // mqttStore.chargePointConnectedVehicleChargeMode(props.chargePointId).value = - // 'scheduled_charging'; - // }, 200); }; const openPlanDialog = (plan) => { diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue index 8cf8483164..f277dbe700 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue @@ -167,7 +167,7 @@ Plan löschen @@ -178,7 +178,6 @@ diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingSettings.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingSettings.vue index 8ab62db91b..2d700b373c 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingSettings.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingSettings.vue @@ -8,18 +8,21 @@
-
+
Termine Zeitladen:
- -
+ +
@@ -83,14 +87,10 @@ const timeChargingEnabled = mqttStore.chargePointConnectedVehicleTimeCharging( const addScheduledChargingPlan = () => { mqttStore.addTimeChargingPlanForChargePoint(props.chargePointId); - // setTimeout(() => { - // mqttStore.chargePointConnectedVehicleChargeMode(props.chargePointId).value = 'time_charging'; - // }, 200); }; const openPlanDialog = (plan) => { selectedPlan.value = plan; currentPlanDetailsVisible.value = true; }; - From 1a334f5b643479ebd6199f217770ccf96c13bd81 Mon Sep 17 00:00:00 2001 From: BrettS Date: Mon, 3 Nov 2025 08:31:15 +0100 Subject: [PATCH 09/17] Plan energy amount watts to kilowatts --- .../koala/source/src/stores/mqtt-store.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts index 3f347ab343..020f7ccfef 100644 --- a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts +++ b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts @@ -1935,14 +1935,20 @@ export const useMqttStore = defineStore('mqtt', () => { get() { const plans = vehicleTimeChargingPlans.value(chargePointId); const plan = plans.find((p) => p.id === planId); - return plan?.limit?.amount; + const amount = plan?.limit?.amount; + if (amount === undefined) { + return; + } + const valueObject = getValueObject.value(amount, 'Wh', '', true); + return valueObject.scaledValue; }, set(newValue: number) { + const amountKiloWattHours = newValue * 1000; updateTimeChargingPlanSubtopic( chargePointId, planId, 'limit.amount', - newValue, + amountKiloWattHours, ); }, }); @@ -2875,11 +2881,12 @@ export const useMqttStore = defineStore('mqtt', () => { return valueObject.scaledValue; }, set(newValue: number) { + const amountKiloWattHours = newValue * 1000; updateScheduledChargingPlanSubtopic( chargePointId, planId, 'limit.amount', - newValue, + amountKiloWattHours, ); }, }); From 44cb69043805317f967254620e49210663c87bff Mon Sep 17 00:00:00 2001 From: BrettS Date: Mon, 3 Nov 2025 10:20:54 +0100 Subject: [PATCH 10/17] Formatting fixes --- .../ChargePointScheduledPlanButton.vue | 2 +- .../ChargePointScheduledSettings.vue | 3 +- .../ChargePointTimeChargingPlanButton.vue | 2 +- .../ChargePointTimeChargingSettings.vue | 2 +- .../koala/source/src/stores/mqtt-store.ts | 77 +++++++++---------- 5 files changed, 42 insertions(+), 44 deletions(-) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanButton.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanButton.vue index 80b23b51b8..25341a1365 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanButton.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanButton.vue @@ -4,7 +4,7 @@ align="center" class="cursor-pointer" :color="planActive.value ? 'positive' : 'negative'" - @click="$emit('edit', plan)" + @click="$emit('editPlan', plan)" >
{{ plan.name }}
diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue index 06fe99d012..c47833073e 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue @@ -28,7 +28,7 @@ class="full-width" :charge-point-id="props.chargePointId" :plan="plan" - @edit="openPlanDialog(plan)" + @edit-plan="openPlanDialog(plan)" />
import { useMqttStore } from 'src/stores/mqtt-store'; import ChargePointScheduledPlanButton from './ChargePointScheduledPlanButton.vue'; -//import ChargePointScheduledPlanHeader from './ChargePointScheduledPlanHeader.vue'; import ChargePointScheduledPlanDetails from './ChargePointScheduledPlanDetails.vue'; import { computed, ref } from 'vue'; import { Screen } from 'quasar'; diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanButton.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanButton.vue index 20abf0ea7c..3ace7ee5bb 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanButton.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanButton.vue @@ -4,7 +4,7 @@ align="center" class="cursor-pointer" :color="planActive.value ? 'positive' : 'negative'" - @click="$emit('edit', plan)" + @click="$emit('editPlan', plan)" >
{{ plan.name }}
diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingSettings.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingSettings.vue index 2d700b373c..742c3fcb53 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingSettings.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingSettings.vue @@ -39,7 +39,7 @@ class="full-width" :charge-point-id="props.chargePointId" :plan="plan" - @edit="openPlanDialog(plan)" + @edit-plan="openPlanDialog(plan)" />
diff --git a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts index 020f7ccfef..7f5048bef5 100644 --- a/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts +++ b/packages/modules/web_themes/koala/source/src/stores/mqtt-store.ts @@ -1675,7 +1675,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the plan name for time charging plan identified by the time charging plan id + * Get or set the plan name for the time charging plan identified by the time charging plan id * @param chargePointId charge point id * @param planId time charging plan id * @returns string | undefined @@ -1687,7 +1687,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); return plan?.name; }, set(newValue: string) { @@ -1787,7 +1787,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the start time for a time charging plan + * Get or set the start time for the time charging plan identified by the time charge plan id * @param chargePointId charge point id * @param planId time charging plan id * @returns string | undefined @@ -1799,7 +1799,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); return plan?.time?.[0]; }, set(newValue: string) { @@ -1814,7 +1814,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the start time for a time charging plan + * Get or set the start time for the time charging plan identified by the time charge plan id * @param chargePointId charge point id * @param planId time charging plan id * @returns string | undefined @@ -1826,7 +1826,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); return plan?.time?.[1]; }, set(newValue: string) { @@ -1841,7 +1841,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the current for time charging plan identified by the time charging plan id + * Get or set the current for the time charging plan identified by the time charging plan id * @param chargePointId charge point id * @param planId time charging plan id * @returns number | undefined @@ -1853,7 +1853,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); return plan?.current; }, set(newValue: number) { @@ -1868,7 +1868,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the limit selected mode for time charging plan identified by the time charging plan id + * Get or set the limit selected mode for the time charging plan identified by the time charging plan id * @param chargePointId charge point id * @param planId time charging plan id * @returns string | undefined @@ -1880,7 +1880,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); return plan?.limit?.selected; }, set(newValue: string) { @@ -1895,7 +1895,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the SoC limit for time charging plan identified by the time charging plan id + * Get or set the SoC limit for the time charging plan identified by the time charging plan id * @param chargePointId charge point id * @param planId time charging plan id * @returns number | undefined @@ -1907,7 +1907,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); return plan?.limit?.soc; }, set(newValue: number) { @@ -1922,7 +1922,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the energy amount limit for time charging plan identified by the time charging plan id + * Get or set the energy amount limit for the time charging plan identified by the time charging plan id * @param chargePointId charge point id * @param planId time charging plan id * @returns number | undefined @@ -1934,7 +1934,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); const amount = plan?.limit?.amount; if (amount === undefined) { return; @@ -1955,7 +1955,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the frequency mode for time charging plan identified by the time charging plan id + * Get or set the frequency mode for the time charging plan identified by the time charging plan id * @param chargePointId charge point id * @param planId time charging plan id * @returns string | undefined @@ -1967,7 +1967,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); return plan?.frequency?.selected; }, set(newValue: string) { @@ -1982,7 +1982,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the "Gültig ab" date for time charging plan (once) + * Get or set the "valid from" date for the time charging plan identified by the time charging plan id (once) * @param chargePointId charge point id * @param planId time charging plan id * @returns string | undefined @@ -1994,7 +1994,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); return plan?.frequency?.once?.[0]; }, set(newValue: string) { @@ -2009,7 +2009,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the "Gültig bis" date for time charging plan (once) + * Get or set the "valid to" date for the time charging plan identified by the time charging plan id (once) * @param chargePointId charge point id * @param planId time charging plan id * @returns string | undefined @@ -2021,7 +2021,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); return plan?.frequency?.once?.[1]; }, set(newValue: string) { @@ -2036,7 +2036,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the number of phases for time charging plan + * Get or set the number of phases for the time charging plan identified by the time charging plan id * @param chargePointId charge point id * @param planId time charging plan id * @returns number | undefined @@ -2048,7 +2048,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); return plan?.phases_to_use; }, set(newValue: number) { @@ -2063,7 +2063,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the weekly days array for time charging plan identified by the time charging plan id + * Get or set the weekly days array for the time charging plan identified by the time charging plan id * @param chargePointId charge point id * @param planId time charging plan id * @returns boolean[] | undefined @@ -2075,7 +2075,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); return plan?.frequency?.weekly ?? Array(7).fill(false); }, set(newValue: boolean[]) { @@ -2090,7 +2090,7 @@ export const useMqttStore = defineStore('mqtt', () => { }; /** - * Get or set the weekly days array for time charging plan identified by the time charging plan id + * Get or set the DC charging power for the time charging plan identified by the time charging plan id * @param chargePointId charge point id * @param planId time charging plan id * @returns boolean[] | undefined @@ -2102,7 +2102,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleTimeChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plane) => plane.id === planId); const current = plan?.dc_current; const power = convertDcCurrentToPower(current); const valueObject = getValueObject.value(power, 'W', '', true); @@ -2622,7 +2622,6 @@ export const useMqttStore = defineStore('mqtt', () => { const templateId = chargePointConnectedVehicleChargeTemplate(chargePointId).value?.id; if (templateId !== undefined) { - //debugger; sendSystemCommand('removeChargeTemplateSchedulePlan', { template: templateId, plan: planId, @@ -2905,7 +2904,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plan) => plan.id === planId); return plan?.name; }, set(newValue: string) { @@ -2932,7 +2931,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plan) => plan.id === planId); return plan?.time; }, set(newValue: string) { @@ -2959,7 +2958,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plan) => plan.id === planId); return plan?.frequency.selected; }, set(newValue: 'once' | 'daily' | 'weekly') { @@ -2986,7 +2985,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plan) => plan.id === planId); return plan?.frequency.once; }, set(newValue: string) { @@ -3013,7 +3012,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plan) => plan.id === planId); return plan?.frequency.weekly; }, set(newValue: boolean[]) { @@ -3040,7 +3039,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plan) => plan.id === planId); return plan?.limit.soc_limit; }, set(newValue: number) { @@ -3067,7 +3066,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plan) => plan.id === planId); return plan?.limit.soc_scheduled; }, set(newValue: number) { @@ -3093,7 +3092,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plan) => plan.id === planId); return plan?.phases_to_use; }, set(newValue: number) { @@ -3119,7 +3118,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plan) => plan.id === planId); return plan?.phases_to_use_pv; }, set(newValue: number) { @@ -3146,7 +3145,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plan) => plan.id === planId); return plan?.bidi_charging_enabled; }, set(newValue: boolean) { @@ -3173,7 +3172,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plan) => plan.id === planId); const power = plan?.bidi_power; const valueObject = getValueObject.value(power, 'W', '', true); return valueObject.scaledValue; @@ -3203,7 +3202,7 @@ export const useMqttStore = defineStore('mqtt', () => { return computed({ get() { const plans = vehicleScheduledChargingPlans.value(chargePointId); - const plan = plans.find((p) => p.id === planId); + const plan = plans.find((plan) => plan.id === planId); const current = plan?.dc_current; const power = convertDcCurrentToPower(current); const valueObject = getValueObject.value(power, 'W', '', true); From fb7c270ba3ab48b8e1b5e586ba62255990029483 Mon Sep 17 00:00:00 2001 From: BrettS Date: Mon, 3 Nov 2025 10:40:39 +0100 Subject: [PATCH 11/17] Charging current title AC or DC --- .../source/src/components/ChargePointScheduledPlanDetails.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue index e90022379a..fbf0272a0d 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue @@ -32,7 +32,7 @@
Date: Mon, 3 Nov 2025 11:40:12 +0100 Subject: [PATCH 12/17] Formatting fix --- .../src/components/ChargePointTimeChargingPlanDetails.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue index f277dbe700..40d1ea5c0e 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue @@ -27,7 +27,7 @@ v-model="planStartTime.value" type="time" label="Ladebeginn" - class="col" + class="col q-mr-md" /> Date: Mon, 3 Nov 2025 11:55:00 +0100 Subject: [PATCH 13/17] Change add plan button outlined to filled --- .../koala/source/src/components/ChargePointScheduledSettings.vue | 1 - .../source/src/components/ChargePointTimeChargingSettings.vue | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue index c47833073e..972dbac27b 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledSettings.vue @@ -5,7 +5,6 @@
Date: Mon, 3 Nov 2025 11:57:52 +0100 Subject: [PATCH 14/17] Formatting Delete plan button --- .../source/src/components/ChargePointScheduledPlanDetails.vue | 2 +- .../src/components/ChargePointTimeChargingPlanDetails.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue index fbf0272a0d..7d06ba2625 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue @@ -199,7 +199,7 @@ />
-
+
-
+
Date: Mon, 3 Nov 2025 13:27:50 +0100 Subject: [PATCH 15/17] Add kW label to DC power input field --- .../src/components/ChargePointScheduledPlanDetails.vue | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue index 7d06ba2625..bc0e31067a 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue @@ -41,9 +41,13 @@ + > + + Date: Mon, 3 Nov 2025 13:32:16 +0100 Subject: [PATCH 16/17] Format input fields --- .../source/src/components/ChargePointScheduledPlanDetails.vue | 4 ++-- .../src/components/ChargePointTimeChargingPlanDetails.vue | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue index bc0e31067a..6d987e7544 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue @@ -31,7 +31,7 @@ />
-
+
Anzahl Phasen bei PV-Überschuss
diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue index 566af31e90..c5268a8312 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointTimeChargingPlanDetails.vue @@ -95,7 +95,7 @@ />
-
Wiederholungen
+
Wiederholungen
Date: Mon, 3 Nov 2025 13:50:13 +0100 Subject: [PATCH 17/17] Format input toggles --- .../src/components/ChargePointScheduledPlanDetails.vue | 6 +++--- .../src/components/ChargePointTimeChargingPlanDetails.vue | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue index 6d987e7544..f8f308fdc8 100644 --- a/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue +++ b/packages/modules/web_themes/koala/source/src/components/ChargePointScheduledPlanDetails.vue @@ -14,7 +14,7 @@
-
+
Aktiv
Bidirektionales Überschussladen @@ -165,7 +165,7 @@
-
+
Strompreisbasiert laden
-
+
Aktiv