diff --git a/packages/modules/web_themes/colors/source/src/assets/css/style.css b/packages/modules/web_themes/colors/source/src/assets/css/style.css index dd40123f55..5b975bbda9 100644 --- a/packages/modules/web_themes/colors/source/src/assets/css/style.css +++ b/packages/modules/web_themes/colors/source/src/assets/css/style.css @@ -125,9 +125,7 @@ html { .largeTextSize { font-size: var(--font-large); } -.buttonTextSize { - font-size: var(--font-large); -} + h3 { font-size: var(--font-large); color: var(--color-title); @@ -193,7 +191,7 @@ body>.container-fluid { /* --color-counters: #cab2d6; */ /* --color-counters: #a00dd8; */ --color-counters: chocolate; - + --color-eco: #f16913; --color-ctr1: chocolate; --color-ctr2: peru; --color-ctr3: sienna; diff --git a/packages/modules/web_themes/colors/source/src/assets/js/helpers.ts b/packages/modules/web_themes/colors/source/src/assets/js/helpers.ts index e9009121aa..0c4703ca7f 100755 --- a/packages/modules/web_themes/colors/source/src/assets/js/helpers.ts +++ b/packages/modules/web_themes/colors/source/src/assets/js/helpers.ts @@ -4,6 +4,8 @@ * Copyright (c) 2022 Claus Hagen */ +import { etData } from '@/components/priceChart/model' + export function formatWatt(watt: number, decimalPlaces = 1) { let wattResult: number if (watt >= 1000 && decimalPlaces < 4) { @@ -80,10 +82,20 @@ export function formatTime(seconds: number) { return minutes + ' min' } } -export function formatCurrentTime(d: Date) { - return d.toLocaleTimeString(['de-DE'], { hour: '2-digit', minute: '2-digit' }) +export function formatCurrentTime(d: Date, includeDay = false) { + if (includeDay) { + return d.toLocaleTimeString(['de-DE'], { + weekday: 'short', + hour: '2-digit', + minute: '2-digit', + }) + } else { + return d.toLocaleTimeString(['de-DE'], { + hour: '2-digit', + minute: '2-digit', + }) + } } - export function formatDate(d: Date, mode: string = 'day') { switch (mode) { case 'day': @@ -95,7 +107,6 @@ export function formatDate(d: Date, mode: string = 'day') { return `${d.getFullYear()}` } } - export function formatMonth(month: number, year: number) { const months = [ 'Jan', @@ -122,6 +133,10 @@ export function formatTemp(t: number) { : '-' } +export function formatPrice(price: number) { + return `${price.toFixed(2)} ${etData.unit}` +} + export function fgColor(colorname: string) { const root = document.documentElement const style = getComputedStyle(root) diff --git a/packages/modules/web_themes/colors/source/src/assets/js/model.ts b/packages/modules/web_themes/colors/source/src/assets/js/model.ts index 36b472d5b1..cf66e86010 100644 --- a/packages/modules/web_themes/colors/source/src/assets/js/model.ts +++ b/packages/modules/web_themes/colors/source/src/assets/js/model.ts @@ -32,6 +32,7 @@ export const masterData: { [key: string]: ItemProps } = reactive({ counters: { name: 'Zähler', color: 'var(--color-counters)', icon: '\uf0eb' }, batIn: { name: '> Bat', color: 'var(--color-battery)', icon: '\uf061\uf5df' }, house: { name: 'Haus', color: 'var(--color-house)', icon: '\uf015' }, + price: { name: 'Strompreis', color: 'crimson', icon: '\uf0d6' }, }) export const colormap: Map = new Map([ [ diff --git a/packages/modules/web_themes/colors/source/src/assets/js/processMessages.ts b/packages/modules/web_themes/colors/source/src/assets/js/processMessages.ts index c14ac19202..929fdfa60a 100755 --- a/packages/modules/web_themes/colors/source/src/assets/js/processMessages.ts +++ b/packages/modules/web_themes/colors/source/src/assets/js/processMessages.ts @@ -39,6 +39,7 @@ const topicsToSubscribe = [ 'openWB/chargepoint/#', 'openWB/vehicle/#', 'openWB/general/chargemode_config/pv_charging/#', + 'openWB/general/web_theme', 'openWB/optional/ep/#', 'openWB/system/#', 'openWB/LegacySmartHome/#', @@ -77,6 +78,8 @@ function processMqttMessage(topic: string, payload: Buffer) { topic.match(/^openwb\/general\/chargemode_config\/pv_charging\//i) ) { processPvConfigMessages(topic, message) + } else if (topic.match(/^openwb\/general\/web_theme/i)) { + processThemeConfigMessages(topic, message) } else if (topic.match(/^openwb\/graph\//i)) { processLiveGraphMessages(topic, message) } else if (topic.match(/^openwb\/log\/daily\//i)) { @@ -200,7 +203,21 @@ function processPvConfigMessages(topic: string, message: string) { } } } - +function processThemeConfigMessages(topic: string, message: string) { + const themeConfig = JSON.parse(message).configuration + globalConfig.setShowRelativeArcs(themeConfig.showRelativeArcs) + globalConfig.setDisplayMode(themeConfig.displayMode) + globalConfig.setLiveGraphDuration(themeConfig.liveGraphDuration) + globalConfig.setShowGrid(themeConfig.showGrid) + globalConfig.setSmartHomeColors(themeConfig.smartHomeColors) + globalConfig.setDecimalPlaces(themeConfig.decimalPlaces) + globalConfig.setShowCounters(themeConfig.showCounters) + globalConfig.setShowVehicles(themeConfig.showVehicles) + globalConfig.setShowStandardVehicle(themeConfig.showStandardVehicle) + globalConfig.setShowPrices(themeConfig.showPrices) + globalConfig.setShowInverters(themeConfig.showInverters) + globalConfig.setAlternativeEnergy(themeConfig.alternativeEnergy) +} function processEvuMessages(topic: string, message: string) { const elements = topic.split('/') switch (elements[4]) { @@ -249,23 +266,6 @@ function processSystemMessages(topic: string, message: string) { } batteries.value.get(config.id)!.name = config.name } - - /* if ( - (config.type == 'counter' || config.type == 'consumption_counter') && - counters[config.id] - ) { - counters[config.id].name = config.name - } else if (config.type == 'inverter' ) { - if (!pvSystems.value.has(config.id)) { - pvSystems.value.set(config.id, new PvSystem(config.id)) - } - pvSystems.value.get(config.id)!.name = config.name - } else if (config.type == 'bat') { - if (!batteries.value.has(config.id)) { - addBattery(config.id) - } - batteries.value.get(config.id)!.name = config.name - } */ } } diff --git a/packages/modules/web_themes/colors/source/src/assets/js/themeConfig.ts b/packages/modules/web_themes/colors/source/src/assets/js/themeConfig.ts index 216780c22b..9ff7089a3a 100644 --- a/packages/modules/web_themes/colors/source/src/assets/js/themeConfig.ts +++ b/packages/modules/web_themes/colors/source/src/assets/js/themeConfig.ts @@ -9,10 +9,6 @@ import { select } from 'd3' import { ChargeMode, type ChargeModeInfo } from './types' import { addShDevice, shDevices } from '@/components/smartHome/model' import { registry } from './model' -import { - sourceGraphIsNotInitialized, - usageGraphIsNotInitialized, -} from '@/components/powerGraph/model' import { updateServer } from './sendMessages' import { counters } from '@/components/counterList/model' export class Config { @@ -21,6 +17,7 @@ export class Config { private _graphPreference = 'today' private _usageStackOrder = 0 private _displayMode = 'dark' + private _liveGraphDuration = 7200 private _showGrid = false private _smartHomeColors = 'normal' private _decimalPlaces = 1 @@ -56,10 +53,11 @@ export class Config { get showRelativeArcs() { return this._showRelativeArcs } - set showRelativeArcs(setting: boolean) { + /* set showRelativeArcs(setting: boolean) { this._showRelativeArcs = setting savePrefs() } + */ setShowRelativeArcs(setting: boolean) { this._showRelativeArcs = setting } @@ -86,41 +84,48 @@ export class Config { get displayMode() { return this._displayMode } - set displayMode(mode: string) { + /* set displayMode(mode: string) { this._displayMode = mode switchTheme(mode) - } + } */ setDisplayMode(mode: string) { this._displayMode = mode + switchTheme(mode) + } + get liveGraphDuration() { + return this._liveGraphDuration + } + setLiveGraphDuration(t: number) { + this._liveGraphDuration = t } get showGrid() { return this._showGrid } - set showGrid(setting: boolean) { + /* set showGrid(setting: boolean) { this._showGrid = setting savePrefs() - } + } */ setShowGrid(setting: boolean) { this._showGrid = setting } get decimalPlaces() { return this._decimalPlaces } - set decimalPlaces(setting: number) { + /* set decimalPlaces(setting: number) { this._decimalPlaces = setting savePrefs() - } + } */ setDecimalPlaces(setting: number) { this._decimalPlaces = setting } get smartHomeColors() { return this._smartHomeColors } - set smartHomeColors(setting: string) { + /* set smartHomeColors(setting: string) { this._smartHomeColors = setting switchSmarthomeColors(setting) savePrefs() - } + } */ setSmartHomeColors(setting: string) { this._smartHomeColors = setting switchSmarthomeColors(setting) @@ -238,64 +243,64 @@ export class Config { get showCounters() { return this._showCounters } - set showCounters(show: boolean) { + /* set showCounters(show: boolean) { this._showCounters = show savePrefs() - } + } */ setShowCounters(show: boolean) { this._showCounters = show } get showVehicles() { return this._showVehicles } - set showVehicles(show: boolean) { + /* set showVehicles(show: boolean) { this._showVehicles = show savePrefs() - } + } */ setShowVehicles(show: boolean) { this._showVehicles = show } get showStandardVehicle() { return this._showStandardVehicle } - set showStandardVehicle(show: boolean) { - this._showStandardVehicle = show - savePrefs() - } + //set showStandardVehicle(show: boolean) { + //this._showStandardVehicle = show + //savePrefs() + //} setShowStandardVehicle(show: boolean) { this._showStandardVehicle = show } get showPrices() { return this._showPrices } - set showPrices(show: boolean) { + /* set showPrices(show: boolean) { this._showPrices = show savePrefs() - } + } */ setShowPrices(show: boolean) { this._showPrices = show } get showInverters() { return this._showInverters } - set showInverters(show: boolean) { + /* set showInverters(show: boolean) { this._showInverters = show sourceGraphIsNotInitialized() usageGraphIsNotInitialized() savePrefs() - } + } */ setShowInverters(show: boolean) { this._showInverters = show } get alternativeEnergy() { return this._alternativeEnergy } - set alternativeEnergy(show: boolean) { + /* set alternativeEnergy(show: boolean) { this._alternativeEnergy = show sourceGraphIsNotInitialized() usageGraphIsNotInitialized() savePrefs() - } + } */ setAlternativeEnergy(show: boolean) { this._alternativeEnergy = show } @@ -385,7 +390,7 @@ export const chargemodes: { [key: string]: ChargeModeInfo } = { eco_charging: { mode: ChargeMode.eco_charging, name: 'Eco', - color: 'var(--color-devices)', + color: 'var(--color-eco)', icon: 'fa-coins', }, stop: { @@ -432,15 +437,15 @@ export function switchTheme(mode: string) { doc.classed('theme-blue', mode == 'blue') savePrefs() } -export function toggleGrid() { +/* export function toggleGrid() { globalConfig.showGrid = !globalConfig.showGrid savePrefs() -} -export function toggleFixArcs() { +} */ +/* export function toggleFixArcs() { // globalConfig.etPrice = globalConfig.etPrice + 10 globalConfig.showRelativeArcs = !globalConfig.showRelativeArcs savePrefs() -} +} */ export function resetArcs() { globalConfig.maxPower = registry.getPower('evuIn') + @@ -448,14 +453,14 @@ export function resetArcs() { registry.getPower('batOut') savePrefs() } -export function switchDecimalPlaces() { +/* export function switchDecimalPlaces() { if (globalConfig.decimalPlaces < 4) { globalConfig.decimalPlaces = globalConfig.decimalPlaces + 1 } else { globalConfig.decimalPlaces = 0 } savePrefs() -} +} */ export function switchSmarthomeColors(setting: string) { const doc = select('html') doc.classed('shcolors-normal', setting == 'normal') @@ -478,6 +483,7 @@ export const infotext: { [key: string]: string } = { 'Laden bei dynamischem Stromtarif, wenn eingestellter Maximalpreis unterboten wird.', pvpriority: 'Ladepriorität bei PV-Produktion. Bevorzung von Fahzeugen, Speicher, oder Fahrzeugen bis zum eingestellten Mindest-Ladestand. Die Einstellung ist für alle Ladepunkte gleich.', + chargeTemplate: 'Ladeprofil für dieses Fahrzeug.', } interface Preferences { hideSH?: string[] @@ -520,12 +526,12 @@ function writeCookie() { .filter((ctr) => ctr.showInGraph) .map((ctr) => ctr.id.toString()) prefs.showLG = globalConfig.graphPreference == 'live' - prefs.displayM = globalConfig.displayMode + //prefs.displayM = globalConfig.displayMode prefs.stackO = globalConfig.usageStackOrder - prefs.showGr = globalConfig.showGrid - prefs.decimalP = globalConfig.decimalPlaces - prefs.smartHomeC = globalConfig.smartHomeColors - prefs.relPM = globalConfig.showRelativeArcs + //prefs.showGr = globalConfig.showGrid + //prefs.decimalP = globalConfig.decimalPlaces + //prefs.smartHomeC = globalConfig.smartHomeColors + //prefs.relPM = globalConfig.showRelativeArcs prefs.maxPow = globalConfig.maxPower prefs.showQA = globalConfig.showQuickAccess prefs.simpleCP = globalConfig.simpleCpList @@ -535,12 +541,12 @@ function writeCookie() { prefs.fluidD = globalConfig.fluidDisplay prefs.clock = globalConfig.showClock prefs.showButtonBar = globalConfig.showButtonBar - prefs.showCounters = globalConfig.showCounters - prefs.showVehicles = globalConfig.showVehicles - prefs.showStandardV = globalConfig.showStandardVehicle - prefs.showPrices = globalConfig.showPrices - prefs.showInv = globalConfig.showInverters - prefs.altEngy = globalConfig.alternativeEnergy + //prefs.showCounters = globalConfig.showCounters + //prefs.showVehicles = globalConfig.showVehicles + //prefs.showStandardV = globalConfig.showStandardVehicle + //prefs.showPrices = globalConfig.showPrices + //prefs.showInv = globalConfig.showInverters + //prefs.altEngy = globalConfig.alternativeEnergy prefs.lowerP = globalConfig.lowerPriceBound prefs.upperP = globalConfig.upperPriceBound prefs.sslPrefs = globalConfig.sslPrefs @@ -561,12 +567,12 @@ function readCookie() { ) if (myCookie.length > 0) { const prefs = JSON.parse(myCookie[0].split('=')[1]) as Preferences - if (prefs.decimalP !== undefined) { + /* if (prefs.decimalP !== undefined) { globalConfig.setDecimalPlaces(+prefs.decimalP) - } - if (prefs.smartHomeC !== undefined) { + } */ + /* if (prefs.smartHomeC !== undefined) { globalConfig.setSmartHomeColors(prefs.smartHomeC) - } + } */ if (prefs.hideSH !== undefined) { prefs.hideSH.forEach((i) => { if (shDevices.get(i) == undefined) { @@ -575,27 +581,27 @@ function readCookie() { shDevices.get(i)!.setShowInGraph(false) }) } - if (prefs.showCtr !== undefined) { + /* if (prefs.showCtr !== undefined) { globalConfig.countersToShow = prefs.showCtr.map((i) => +i) - } + } */ if (prefs.showLG !== undefined) { globalConfig.setGraphPreference(prefs.showLG ? 'live' : 'today') } if (prefs.maxPow !== undefined) { globalConfig.setMaxPower(+prefs.maxPow) } - if (prefs.relPM !== undefined) { + /* if (prefs.relPM !== undefined) { globalConfig.setShowRelativeArcs(prefs.relPM) - } - if (prefs.displayM !== undefined) { + } */ + /* if (prefs.displayM !== undefined) { globalConfig.setDisplayMode(prefs.displayM) - } + } */ if (prefs.stackO !== undefined) { globalConfig.setUsageStackOrder(prefs.stackO) } - if (prefs.showGr !== undefined) { + /* if (prefs.showGr !== undefined) { globalConfig.setShowGrid(prefs.showGr) - } + } */ if (prefs.showQA !== undefined) { globalConfig.setShowQuickAccess(prefs.showQA) } @@ -620,24 +626,24 @@ function readCookie() { if (prefs.showButtonBar !== undefined) { globalConfig.setShowButtonBar(prefs.showButtonBar) } - if (prefs.showCounters !== undefined) { + /* if (prefs.showCounters !== undefined) { globalConfig.setShowCounters(prefs.showCounters) - } - if (prefs.showVehicles !== undefined) { + } */ + /* if (prefs.showVehicles !== undefined) { globalConfig.setShowVehicles(prefs.showVehicles) - } - if (prefs.showStandardV !== undefined) { - globalConfig.setShowStandardVehicle(prefs.showStandardV) - } - if (prefs.showPrices !== undefined) { + } */ + //if (prefs.showStandardV !== undefined) { + // globalConfig.setShowStandardVehicle(prefs.showStandardV) + //} + /* if (prefs.showPrices !== undefined) { globalConfig.setShowPrices(prefs.showPrices) - } - if (prefs.showInv !== undefined) { + } */ + /* if (prefs.showInv !== undefined) { globalConfig.setShowInverters(prefs.showInv) - } - if (prefs.altEngy !== undefined) { + } */ + /* if (prefs.altEngy !== undefined) { globalConfig.setAlternativeEnergy(prefs.altEngy) - } + } */ if (prefs.lowerP !== undefined) { globalConfig.setLowerPriceBound(prefs.lowerP) } diff --git a/packages/modules/web_themes/colors/source/src/components/buttonBar/BBSelect.vue b/packages/modules/web_themes/colors/source/src/components/buttonBar/BBSelect.vue index 59b3c3d648..6d70e54058 100755 --- a/packages/modules/web_themes/colors/source/src/components/buttonBar/BBSelect.vue +++ b/packages/modules/web_themes/colors/source/src/components/buttonBar/BBSelect.vue @@ -122,7 +122,7 @@ const buttons = [ name: 'Zielladen', color: 'var(--color-battery)', }, - { mode: 'eco_charging', name: 'Eco', color: 'var(--color-devices)' }, + { mode: 'eco_charging', name: 'Eco', color: 'var(--color-eco)' }, { mode: 'stop', name: 'Stop', color: 'var(--color-axis)' }, ] const cp = computed(() => { @@ -150,4 +150,8 @@ function setBatteryPriority(mode: string) { } - + diff --git a/packages/modules/web_themes/colors/source/src/components/chargePointList/CPChargePoint.vue b/packages/modules/web_themes/colors/source/src/components/chargePointList/CPChargePoint.vue index 3c572cbd9c..c03f0cb499 100644 --- a/packages/modules/web_themes/colors/source/src/components/chargePointList/CPChargePoint.vue +++ b/packages/modules/web_themes/colors/source/src/components/chargePointList/CPChargePoint.vue @@ -19,11 +19,7 @@ @@ -149,6 +145,9 @@ const cpNameStyle = computed(() => { }) // methods +function toggleConfigMode() { + configmode.value = !configmode.value +} diff --git a/packages/modules/web_themes/colors/source/src/components/energyMeter/EnergyMeter.vue b/packages/modules/web_themes/colors/source/src/components/energyMeter/EnergyMeter.vue index c033dab1e3..bcb740dade 100755 --- a/packages/modules/web_themes/colors/source/src/components/energyMeter/EnergyMeter.vue +++ b/packages/modules/web_themes/colors/source/src/components/energyMeter/EnergyMeter.vue @@ -21,7 +21,7 @@ class="ms-1 p-0 pt-1" @click="zoomGraph" > - + @@ -168,10 +168,16 @@ function zoomGraph() { globalConfig.zoomedWidget = 2 globalConfig.zoomGraph = !globalConfig.zoomGraph } +function zoomIcon() { + return globalConfig.zoomGraph ? 'fa-minimize' : 'fa-maximize' +} diff --git a/packages/modules/web_themes/colors/source/src/components/powerGraph/PgSelector.vue b/packages/modules/web_themes/colors/source/src/components/powerGraph/PgSelector.vue index 7d4f7b7d8e..77f0522f1c 100755 --- a/packages/modules/web_themes/colors/source/src/components/powerGraph/PgSelector.vue +++ b/packages/modules/web_themes/colors/source/src/components/powerGraph/PgSelector.vue @@ -100,11 +100,11 @@ import { dayGraph, graphData, initGraph, - liveGraph, setGraphDate, yearGraph, } from './model' import { monthGraph } from './model' +import { globalConfig } from '@/assets/js/themeConfig' const props = defineProps<{ widgetid: string @@ -129,7 +129,9 @@ const displayDate = computed(() => { console.warn('Graph Data empty.') return '???' } */ - return props.ignoreLive ? 'heute' : `${liveGraph.duration} min` + return props.ignoreLive + ? 'heute' + : `${Math.floor(globalConfig.liveGraphDuration / 60)} min` case 'today': return 'heute' case 'day': diff --git a/packages/modules/web_themes/colors/source/src/components/powerGraph/PgSoc.vue b/packages/modules/web_themes/colors/source/src/components/powerGraph/PgSoc.vue index 5e441821da..9796b5277c 100755 --- a/packages/modules/web_themes/colors/source/src/components/powerGraph/PgSoc.vue +++ b/packages/modules/web_themes/colors/source/src/components/powerGraph/PgSoc.vue @@ -16,7 +16,7 @@ :d="myline" :stroke="cpColor" stroke-width="1" - :style="{ strokeDasharray: '3,3' }" + :style="{ strokeDasharray: '3,1' }" fill="none" /> + diff --git a/packages/modules/web_themes/colors/source/src/components/powerGraph/model.ts b/packages/modules/web_themes/colors/source/src/components/powerGraph/model.ts index 86ffc3e994..62e24a2a09 100755 --- a/packages/modules/web_themes/colors/source/src/components/powerGraph/model.ts +++ b/packages/modules/web_themes/colors/source/src/components/powerGraph/model.ts @@ -50,6 +50,12 @@ export interface RawDayGraphDataItem { cp: object ev: object sh: object + prices: { + grid: number + pv: number + bat: number + cp: number + } } export class GraphData { @@ -97,9 +103,15 @@ export function setInitializeUsageGraph(val: boolean) { animateUsageGraph = val } export function setGraphData(d: GraphDataItem[]) { - graphData.data = d - graphData.waitForData = false - // graphData.graphMode = graphData.graphMode + if (graphData.graphMode == 'live' && d.length > 0) { + const windowStart = + new Date().getTime() - globalConfig.liveGraphDuration * 1000 + graphData.data = d.filter((e) => e.date > windowStart) + graphData.waitForData = false + } else { + graphData.data = d + graphData.waitForData = false + } } // LIVE GRAPH export const liveGraph = reactive({ diff --git a/packages/modules/web_themes/colors/source/src/components/powerGraph/processDayGraphData.ts b/packages/modules/web_themes/colors/source/src/components/powerGraph/processDayGraphData.ts index 312f5977b0..989f3f2b51 100755 --- a/packages/modules/web_themes/colors/source/src/components/powerGraph/processDayGraphData.ts +++ b/packages/modules/web_themes/colors/source/src/components/powerGraph/processDayGraphData.ts @@ -160,6 +160,10 @@ function transformRow(currentRow: RawDayGraphDataItem): GraphDataItem { currentItem.evuIn + currentItem.batOut) } + // Prices + if (currentRow.prices.grid > 0) { + currentItem.price = currentRow.prices.grid * 100000 + } }) // Counters diff --git a/packages/modules/web_themes/colors/source/src/components/powerMeter/PowerMeter.vue b/packages/modules/web_themes/colors/source/src/components/powerMeter/PowerMeter.vue index 2c1fcb1ff1..928fba9339 100755 --- a/packages/modules/web_themes/colors/source/src/components/powerMeter/PowerMeter.vue +++ b/packages/modules/web_themes/colors/source/src/components/powerMeter/PowerMeter.vue @@ -1,6 +1,6 @@ + + diff --git a/packages/modules/web_themes/colors/source/src/components/shared/ModalComponent.vue b/packages/modules/web_themes/colors/source/src/components/shared/ModalComponent.vue index 0861da3655..9c615fce70 100755 --- a/packages/modules/web_themes/colors/source/src/components/shared/ModalComponent.vue +++ b/packages/modules/web_themes/colors/source/src/components/shared/ModalComponent.vue @@ -1,7 +1,7 @@