From 738117b2e526bea22c166a38e7ba58135aa9979c Mon Sep 17 00:00:00 2001 From: Brett-S-OWB Date: Wed, 8 Jul 2026 11:46:55 +0200 Subject: [PATCH 01/15] Add consumer to energy flow chart --- .../{public => src/assets}/icons/icon_Data.md | 0 .../source/src/assets/icons/owbConsumer.svg | 1 + .../energyFlowChart/EnergyFlowChart.vue | 31 +++++++++++++++++++ .../koala/source/src/stores/mqtt-store.ts | 29 +++++++++++++++++ 4 files changed, 61 insertions(+) rename packages/modules/web_themes/koala/source/{public => src/assets}/icons/icon_Data.md (100%) create mode 100644 packages/modules/web_themes/koala/source/src/assets/icons/owbConsumer.svg diff --git a/packages/modules/web_themes/koala/source/public/icons/icon_Data.md b/packages/modules/web_themes/koala/source/src/assets/icons/icon_Data.md similarity index 100% rename from packages/modules/web_themes/koala/source/public/icons/icon_Data.md rename to packages/modules/web_themes/koala/source/src/assets/icons/icon_Data.md diff --git a/packages/modules/web_themes/koala/source/src/assets/icons/owbConsumer.svg b/packages/modules/web_themes/koala/source/src/assets/icons/owbConsumer.svg new file mode 100644 index 0000000000..ee05b02183 --- /dev/null +++ b/packages/modules/web_themes/koala/source/src/assets/icons/owbConsumer.svg @@ -0,0 +1 @@ + diff --git a/packages/modules/web_themes/koala/source/src/components/charts/energyFlowChart/EnergyFlowChart.vue b/packages/modules/web_themes/koala/source/src/components/charts/energyFlowChart/EnergyFlowChart.vue index 6de4de2614..65d897d514 100644 --- a/packages/modules/web_themes/koala/source/src/components/charts/energyFlowChart/EnergyFlowChart.vue +++ b/packages/modules/web_themes/koala/source/src/components/charts/energyFlowChart/EnergyFlowChart.vue @@ -10,6 +10,7 @@ import PvIcon from 'src/assets/icons/owbPV.svg?component'; import HouseIcon from 'src/assets/icons/owbHouse.svg?component'; import VehicleIcon from 'src/assets/icons/owbVehicle.svg?component'; import ChargePointIcon from 'src/assets/icons/owbChargePoint_2.svg?component'; +import ConsumerIcon from 'src/assets/icons/owbConsumer.svg?component'; const mqttStore = useMqttStore(); const $q = useQuasar(); @@ -97,6 +98,13 @@ const showHomePower = computed(() => { const homeConsumption = computed(() => Number(homePower.value.value) > 0); const homeProduction = computed(() => Number(homePower.value.value) < 0); +const consumerPower = computed( + () => mqttStore.consumerSumPower('object') as ValueObject, +); +const showConsumerPower = computed( + () => mqttStore.consumerIds.length > 0, +); + const pvPower = computed(() => mqttStore.pvPowerTotal('object') as ValueObject); const pvProduction = computed(() => { const value = Number(pvPower.value.value); @@ -282,6 +290,7 @@ const maxSystemPower = computed(() => { const powerValues = [ Math.abs(Number(gridPower.value.value)), Math.abs(Number(homePower.value.value)), + Math.abs(Number(consumerPower.value.value)), Math.abs(Number(pvPower.value.value)), Math.abs(Number(batteryPower.value.value)), Math.abs(Number(chargePoint1Power.value.value)), @@ -314,6 +323,7 @@ const animationDurations = computed(() => { return { grid: calcDuration(Number(gridPower.value.value), maxPower), home: calcDuration(Number(homePower.value.value), maxPower), + consumer: calcDuration(Number(consumerPower.value.value), maxPower), pv: calcDuration(Number(pvPower.value.value), maxPower), battery: calcDuration(Number(batteryPower.value.value), maxPower), chargePoint1: calcDuration(Number(chargePoint1Power.value.value), maxPower), @@ -371,6 +381,22 @@ const svgComponents = computed((): FlowComponent[] => { }); } + if (showConsumerPower.value) { + components.push({ + id: 'consumer', + class: { + base: 'consumer', + valueLabelColor: 'var(--q-consumer)', + animatedReverse: Number(consumerPower.value.value) > 0, + }, + position: { row: 0, column: 1 }, + label: ['Verbraucher', absoluteValueObject(consumerPower.value).textValue], + powerValue: Number(consumerPower.value.value), + iconComponent: ConsumerIcon, + iconColor: 'var(--q-consumer)', + }); + } + if (mqttStore.pvConfigured) { components.push({ id: 'pv', @@ -949,6 +975,11 @@ path.animatedReverse.home { animation-duration: v-bind('animationDurations.home'); } +path.animatedReverse.consumer { + color: var(--q-consumer); + animation-duration: v-bind('animationDurations.consumer'); +} + path.animated.pv, path.animatedReverse.pv { color: var(--q-pv-stroke); 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 3ae3500c44..0007627932 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 @@ -3779,6 +3779,34 @@ export const useMqttStore = defineStore('mqtt', () => { }; }); + /** + * Get the summed power of all consumers. + * @param returnType type of return value, 'textValue', 'value', 'scaledValue', 'scaledUnit' or 'object' + * @returns string | number | ValueObject + */ + const consumerSumPower = computed(() => { + return (returnType: string = 'textValue') => { + const power = consumerIds.value.reduce((sum, id) => { + return ( + sum + + ((getValue.value( + `openWB/consumer/${id}/get/power`, + undefined, + 0, + ) as number) || 0) + ); + }, 0); + const valueObject = getValueObject.value(power); + if (Object.hasOwn(valueObject, returnType)) { + return valueObject[returnType as keyof ValueObject]; + } + if (returnType == 'object') { + return valueObject; + } + console.error('returnType not found!', returnType, power); + }; + }); + /** * Get the running time (on_time, in seconds) of a consumer since it last * started. Resets when the device stops drawing current. @@ -4521,6 +4549,7 @@ export const useMqttStore = defineStore('mqtt', () => { consumerIds, consumerName, consumerPower, + consumerSumPower, consumerOnTime, consumerStateStr, consumerFaultState, From 47c5b2811fc94b50a0013d37b13679cf1c33e471 Mon Sep 17 00:00:00 2001 From: Brett-S-OWB Date: Wed, 8 Jul 2026 15:38:53 +0200 Subject: [PATCH 02/15] use new backend topic for consumer power sum --- .../koala/source/src/stores/mqtt-store.ts | 13 +++---------- 1 file changed, 3 insertions(+), 10 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 0007627932..3a8f3ff37a 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 @@ -3786,16 +3786,9 @@ export const useMqttStore = defineStore('mqtt', () => { */ const consumerSumPower = computed(() => { return (returnType: string = 'textValue') => { - const power = consumerIds.value.reduce((sum, id) => { - return ( - sum + - ((getValue.value( - `openWB/consumer/${id}/get/power`, - undefined, - 0, - ) as number) || 0) - ); - }, 0); + const power = getValue.value('openWB/consumer/get/power') as + | number + | undefined; const valueObject = getValueObject.value(power); if (Object.hasOwn(valueObject, returnType)) { return valueObject[returnType as keyof ValueObject]; From 18e14349193498240ff93e240211d7cc3678e121 Mon Sep 17 00:00:00 2001 From: Brett-S-OWB Date: Thu, 9 Jul 2026 09:03:14 +0200 Subject: [PATCH 03/15] Add consumer row to daily totals chart --- .../charts/dailyTotals/DailyTotals.vue | 75 ++++++++++++++++++- .../charts/dailyTotals/DailyTotalsRow.vue | 5 ++ .../koala/source/src/stores/mqtt-store.ts | 30 ++++++++ 3 files changed, 106 insertions(+), 4 deletions(-) diff --git a/packages/modules/web_themes/koala/source/src/components/charts/dailyTotals/DailyTotals.vue b/packages/modules/web_themes/koala/source/src/components/charts/dailyTotals/DailyTotals.vue index a460ff999f..ed99e729f3 100644 --- a/packages/modules/web_themes/koala/source/src/components/charts/dailyTotals/DailyTotals.vue +++ b/packages/modules/web_themes/koala/source/src/components/charts/dailyTotals/DailyTotals.vue @@ -89,16 +89,20 @@ -