Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
3fc7d3b
custom vehicle and charge point colors
benderl Jun 11, 2025
bc0fe5a
custom component colors
benderl Jun 11, 2025
8b2cb56
update config step 1
benderl Jun 11, 2025
f56fe06
fix upgrade config
benderl Jun 12, 2025
898d411
fix component setup
benderl Jun 12, 2025
2ccd008
extend setdata for new vehicle topic
benderl Jun 12, 2025
3134f8a
use bootstrap primary color for charge points
benderl Jul 14, 2025
301e54e
update logfiles
LKuemmel Jul 31, 2025
ffa64bb
rename color constants
benderl Aug 4, 2025
fdb7f9f
upgrade method
benderl Oct 20, 2025
18f88ff
update dynsec roles
benderl Mar 5, 2026
b316663
update dynsec role acls for vehicle color
benderl Mar 10, 2026
6d3e784
Apply suggestions from code review
benderl Mar 26, 2026
78fc2e0
fix missing color references
benderl Mar 27, 2026
6856517
Update packages/helpermodules/update_config.py
benderl Mar 27, 2026
08b9fb7
formatting
benderl Mar 27, 2026
dde8231
add logging in ComponentSetup
benderl Mar 30, 2026
e042ba6
Koala user defined custom colors (#3361)
Brett-S-OWB May 19, 2026
7e90439
fix typescript errors, formatting
benderl May 19, 2026
e6b7410
update dependencies
benderl May 19, 2026
d2a6d3e
Koala new design custom colors (#3500)
Brett-S-OWB Jun 10, 2026
3036376
Koala design custom colors settings build (#3512)
Brett-S-OWB Jun 10, 2026
406e24e
New design Koala build (#3518)
Brett-S-OWB Jun 11, 2026
c6e518e
remove user defined battery color
Brett-S-OWB Jun 16, 2026
738f1ca
Always use Standard colors for PV, EVU, no user defined colors
Brett-S-OWB Jun 16, 2026
e006287
Charge points revert back to standard color when no user defined color
Brett-S-OWB Jun 16, 2026
ec0f2c7
update charge point default color
Brett-S-OWB Jun 16, 2026
a4daf09
Update global CSS colors - new design
Brett-S-OWB Jun 16, 2026
40b4368
Update home icon color - remove q-diagram-color where not required
Brett-S-OWB Jun 16, 2026
7b38edc
Make power and charge mode text same color as icons
Brett-S-OWB Jun 17, 2026
73675e6
Energy flow chart - responsive column spacing
Brett-S-OWB Jun 17, 2026
806f1cf
Energy flow chart - Set font - Roboto
Brett-S-OWB Jun 17, 2026
3d0b605
Energy flow chart - Change clip path for label animation
Brett-S-OWB Jun 17, 2026
e22b322
Daily totals - update secondary counter color
Brett-S-OWB Jun 17, 2026
ae49da1
DailyTotals - Secondary counter custom color
Brett-S-OWB Jun 18, 2026
f341fdc
reinstate custom colors for all components
Brett-S-OWB Jun 23, 2026
9fe0f33
Standard color displayed in charts
Brett-S-OWB Jun 23, 2026
b691ba4
remove redundant store function
Brett-S-OWB Jun 23, 2026
1ee0ed5
daily totals add dropdown for multiple pv systems
Brett-S-OWB Jun 23, 2026
a3aa791
use lighter blue primary color in dark theme
Brett-S-OWB Jun 23, 2026
79c8683
centralize logic for secondary components configured
Brett-S-OWB Jun 23, 2026
db48d6c
formatting
Brett-S-OWB Jun 23, 2026
7fa44f1
centralize settings UI colors
Brett-S-OWB Jun 23, 2026
bb00807
Merge branch 'feature-custom-colors' into koala-new-design-custom-colors
benderl Jun 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -165,18 +165,17 @@ const dailyExportedEnergy = computed(() => {
);
});

const batteryColor = computed(() => mqttStore.batteryColor(props.batteryId));
const batteryColor = computed(
() => mqttStore.batteryColor(props.batteryId) || 'var(--q-battery-stroke)',
);
</script>

<style scoped lang="scss">
.battery-card {
width: 22em;
border: none;
border-radius: 15px;
}

.battery-card.has-custom-color {
border-left: 4px solid v-bind(batteryColor);
border-radius: 15px;
}

.q-card__section {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
class="charge-point-card"
:class="{
'full-height': props.fullHeight,
'has-custom-color': chargePointColor,
}"
>
<q-card-section class="row no-wrap">
Expand Down Expand Up @@ -318,19 +317,18 @@ const refreshSoc = () => {
});
};

const chargePointColor = computed(() =>
mqttStore.chargePointColor(props.chargePointId),
const chargePointColor = computed(
() =>
mqttStore.chargePointColor(props.chargePointId) ||
'var(--q-charge-point-stroke)',
);
</script>
<style lang="scss" scoped>
.charge-point-card {
width: 22em;
border: none;
border-radius: 15px;
}

.charge-point-card.has-custom-color {
border-left: 4px solid v-bind(chargePointColor);
border-radius: 15px;
}

.q-card__section {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
class="vehicle-card"
:class="{
'full-height': props.fullHeight,
'has-custom-color': vehicleColor,
}"
>
<q-card-section class="row no-wrap">
Expand Down Expand Up @@ -109,19 +108,16 @@ const refreshSoc = () => {
};

const vehicleColor = computed(() => {
return mqttStore.vehicleColor(props.vehicleId);
return mqttStore.vehicleColor(props.vehicleId) || 'var(--q-vehicle-stroke)';
});
</script>

<style lang="scss" scoped>
.vehicle-card {
width: 22em;
border: none;
border-radius: 15px;
}

.vehicle-card.has-custom-color {
border-left: 4px solid v-bind(vehicleColor);
border-radius: 15px;
}

.q-card__section {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,19 @@
v-model="expanded.grid"
class="grid card"
:header-class="
secondaryCountersConfigured ? 'cursor-pointer' : 'no-pointer'
secondaryComponentsConfigured('counter')
? 'cursor-pointer'
: 'no-pointer'
"
>
<template #header>
<DailyTotalsRow
:item="gridData"
:rowHeight="rowHeight"
:rowExpanded="expanded.grid"
:secondaryComponentsConfigured="secondaryCountersConfigured"
:secondaryComponentsConfigured="
secondaryComponentsConfigured('counter')
"
:componentNameVisible="componentNameVisible"
:currentPowerVisible="currentPowerVisible"
:socValueVisible="socValueVisible"
Expand Down Expand Up @@ -55,11 +59,9 @@
v-model="expanded[item.id]"
:class="[item.id, 'card']"
:header-class="
item.id === 'chargepoint' && individualChargePointData.length > 1
secondaryComponentsConfigured(item.id)
? 'cursor-pointer'
: item.id === 'battery' && individualBatteryData.length > 1
? 'cursor-pointer'
: 'no-pointer'
: 'no-pointer'
"
>
<template #header>
Expand All @@ -68,11 +70,7 @@
:rowHeight="rowHeight"
:rowExpanded="expanded[item.id]"
:secondaryComponentsConfigured="
item.id === 'chargepoint'
? individualChargePointData.length > 1
: item.id === 'battery'
? individualBatteryData.length > 1
: false
secondaryComponentsConfigured(item.id)
"
:componentNameVisible="componentNameVisible"
:currentPowerVisible="currentPowerVisible"
Expand Down Expand Up @@ -171,6 +169,28 @@
</DailyTotalsRow>
</div>
</div>
<div v-if="item.id === 'pv'">
<div
v-for="pvData in individualPvData"
:key="pvData.id"
class="sub-row"
>
<DailyTotalsRow
:item="pvData"
:rowHeight="rowHeight"
:componentNameVisible="componentNameVisible"
:currentPowerVisible="currentPowerVisible"
:socValueVisible="socValueVisible"
>
<template #right-label>
<div>Ertrag:</div>
</template>
<template #right-value>
<div>{{ pvData.today?.exported }}</div>
</template>
</DailyTotalsRow>
</div>
</div>
</q-expansion-item>
</div>
</div>
Expand All @@ -195,7 +215,9 @@ const $q = useQuasar();
const mqttStore = useMqttStore();
const gridPower = computed(() => mqttStore.counterPower('value'));
const showGrid = computed(
() => gridPower.value !== undefined || secondaryCountersConfigured.value,
() =>
gridPower.value !== undefined ||
secondaryComponentsConfigured.value('counter'),
);
const expanded = ref<Record<string, boolean>>({
grid: false,
Expand All @@ -219,9 +241,22 @@ const chargePointSumPowerAvailable = computed(
const chargePointConfigured = computed(
() => mqttStore.chargePointIds.length > 0,
);
const secondaryCountersConfigured = computed(
() => secondaryCounterData.value.length > 0,
);
const secondaryComponentsConfigured = computed(() => {
return (componentType: string): boolean => {
switch (componentType) {
case 'counter':
return secondaryCounterData.value.length > 0;
case 'chargepoint':
return individualChargePointData.value.length > 1;
case 'battery':
return individualBatteryData.value.length > 1;
case 'pv':
return individualPvData.value.length > 1;
default:
return false;
}
};
});

const gridID = computed(() => mqttStore.gridId);

Expand All @@ -243,10 +278,7 @@ const gridData = computed((): DailyTotalsItem => {
imported: mqttStore.counterDailyImported('textValue') as string,
exported: mqttStore.counterDailyExported('textValue') as string,
},
color:
gridID.value !== undefined
? mqttStore.gridComponentColor(gridID.value) || undefined
: undefined,
color: 'var(--q-grid-stroke)',
};
}
return data;
Expand All @@ -268,7 +300,9 @@ const secondaryCounterData = computed((): DailyTotalsItem[] => {
imported: mqttStore.counterDailyImported('textValue', id) as string,
exported: mqttStore.counterDailyExported('textValue', id) as string,
},
color: mqttStore.gridComponentColor(id) || undefined,
color:
mqttStore.gridComponentColor(id) ||
'var(--q-secondary-counter-stroke)',
});
}
});
Expand Down Expand Up @@ -297,7 +331,7 @@ const individualChargePointData = computed((): DailyTotalsItem[] => {
id,
) as string,
},
color: mqttStore.chargePointColor(id) || undefined,
color: mqttStore.chargePointColor(id) || 'var(--q-charge-point-stroke)',
});
}
});
Expand All @@ -322,13 +356,39 @@ const individualBatteryData = computed((): DailyTotalsItem[] => {
imported: mqttStore.batteryDailyImported(id, 'textValue') as string,
exported: mqttStore.batteryDailyExported(id, 'textValue') as string,
},
color: mqttStore.batteryColor(id) || undefined,
color: mqttStore.batteryColor(id) || 'var(--q-battery-stroke)',
});
}
});
return batteries;
});

const individualPvData = computed((): DailyTotalsItem[] => {
const pvSystems: DailyTotalsItem[] = [];

mqttStore.pvIds.forEach((id) => {
const name = mqttStore.componentName(id);
if (name !== undefined) {
pvSystems.push({
id: `pv-${id}`,
title: name,
level: 'secondary',
icon: 'pv',
power: mqttStore.pvPowerIndividual(id, 'textValue') as string,
powerValue: mqttStore.pvPowerIndividual(id, 'value') as number,
today: {
exported: mqttStore.pvDailyExportedIndividual(
id,
'textValue',
) as string,
},
color: mqttStore.pvColor(id) || 'var(--q-pv-stroke)',
});
}
});
return pvSystems;
});

const componentData = computed((): DailyTotalsItem[] => {
const components: DailyTotalsItem[] = [];

Expand All @@ -348,10 +408,8 @@ const componentData = computed((): DailyTotalsItem[] => {
imported: mqttStore.batteryDailyImportedTotal('textValue') as string,
exported: mqttStore.batteryDailyExportedTotal('textValue') as string,
},
color: 'var(--q-battery-stroke)',
};
if (mqttStore.batteryIds.length === 1) {
item.color = mqttStore.batteryColor(mqttStore.batteryIds[0]) || undefined;
}
components.push(item);
}

Expand All @@ -361,10 +419,10 @@ const componentData = computed((): DailyTotalsItem[] => {
title: 'PV',
level: 'primary',
icon: 'pv',
power: mqttStore.getPvPower('textValue') as string,
powerValue: mqttStore.getPvPower('value') as number,
power: mqttStore.pvPowerTotal('textValue') as string,
powerValue: mqttStore.pvPowerTotal('value') as number,
today: { exported: mqttStore.pvDailyExported('textValue') as string },
color: mqttStore.pvAggregateColor || 'var(--q-diagram-icon)',
color: 'var(--q-pv-stroke)',
});
}

Expand All @@ -377,6 +435,7 @@ const componentData = computed((): DailyTotalsItem[] => {
power: mqttStore.homePower('textValue') as string,
powerValue: mqttStore.homePower('value') as number,
today: { imported: mqttStore.homeDailyYield('textValue') as string },
color: 'var(--q-home-stroke)',
});
}

Expand All @@ -386,6 +445,11 @@ const componentData = computed((): DailyTotalsItem[] => {
title: mqttStore.chargePointIds.length > 1 ? 'Ladepunkte' : 'Ladepunkt',
level: 'primary',
icon: 'chargepoint',
color:
mqttStore.chargePointIds.length === 1
? mqttStore.chargePointColor(mqttStore.chargePointIds[0]) ||
'var(--q-charge-point-stroke)'
: 'var(--q-charge-point-stroke)',
};
if (chargePointSumPowerAvailable.value) {
item = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ const arrowDirection = (id: string) => {
value = mqttStore.batteryTotalPower('value') as number;
break;
case 'pv':
value = mqttStore.getPvPower('value') as number;
value = mqttStore.pvPowerTotal('value') as number;
break;
case 'house':
value = mqttStore.homePower('value') as number;
Expand Down Expand Up @@ -181,7 +181,6 @@ const iconMap = {
.base-icon {
width: 1.75rem;
height: 1.75rem;
color: var(--q-diagram-icon);
}
.col-title {
flex: 0 0 5.5rem;
Expand Down
Loading
Loading