From f75d17e10c6d1e120c52f4398c28e7d419d69766 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 24 Feb 2023 15:56:31 -0600 Subject: [PATCH] Avoid fetching all stats metadata when there are no entities Fetch all the data at once since it is not dependant --- src/data/energy.ts | 146 ++++++++++++++++++++++++++------------------- 1 file changed, 86 insertions(+), 60 deletions(-) diff --git a/src/data/energy.ts b/src/data/energy.ts index 1584d385c5..b0f2c0736f 100644 --- a/src/data/energy.ts +++ b/src/data/energy.ts @@ -405,34 +405,35 @@ const getEnergyData = async ( volume: lengthUnit === "km" ? "L" : "gal", }; - const stats = { - ...(energyStatIds.length - ? await fetchStatistics( - hass!, - startMinHour, - end, - energyStatIds, - period, - energyUnits, - ["sum"] - ) - : {}), - ...(waterStatIds.length - ? await fetchStatistics( - hass!, - startMinHour, - end, - waterStatIds, - period, - waterUnits, - ["sum"] - ) - : {}), - }; + const _energyStats = energyStatIds.length + ? fetchStatistics( + hass!, + startMinHour, + end, + energyStatIds, + period, + energyUnits, + ["sum"] + ) + : Promise.resolve({}); + const _waterStats = waterStatIds.length + ? await fetchStatistics( + hass!, + startMinHour, + end, + waterStatIds, + period, + waterUnits, + ["sum"] + ) + : Promise.resolve({}); let statsCompare; let startCompare; let endCompare; + let _energyStatsCompare = Promise.resolve({}); + let _waterStatsCompare = Promise.resolve({}); + if (compare) { if (dayDifference > 27 && dayDifference < 32) { // When comparing a month, we want to start at the begining of the month @@ -443,38 +444,38 @@ const getEnergyData = async ( const compareStartMinHour = addHours(startCompare, -1); endCompare = addMilliseconds(start, -1); - - statsCompare = { - ...(energyStatIds.length - ? await fetchStatistics( - hass!, - compareStartMinHour, - endCompare, - energyStatIds, - period, - energyUnits, - ["sum"] - ) - : {}), - ...(waterStatIds.length - ? await fetchStatistics( - hass!, - compareStartMinHour, - endCompare, - waterStatIds, - period, - waterUnits, - ["sum"] - ) - : {}), - }; + if (energyStatIds.length) { + _energyStatsCompare = fetchStatistics( + hass!, + compareStartMinHour, + endCompare, + energyStatIds, + period, + energyUnits, + ["sum"] + ); + } + if (waterStatIds.length) { + _waterStatsCompare = fetchStatistics( + hass!, + compareStartMinHour, + endCompare, + waterStatIds, + period, + waterUnits, + ["sum"] + ); + } } - let fossilEnergyConsumption: FossilEnergyConsumption | undefined; - let fossilEnergyConsumptionCompare: FossilEnergyConsumption | undefined; - + let _fossilEnergyConsumption: + | Promise + | Promise = Promise.resolve(undefined); + let _fossilEnergyConsumptionCompare: + | Promise + | Promise = Promise.resolve(undefined); if (co2SignalEntity !== undefined) { - fossilEnergyConsumption = await getFossilEnergyConsumption( + _fossilEnergyConsumption = getFossilEnergyConsumption( hass!, start, consumptionStatIDs, @@ -483,7 +484,7 @@ const getEnergyData = async ( dayDifference > 35 ? "month" : dayDifference > 2 ? "day" : "hour" ); if (compare) { - fossilEnergyConsumptionCompare = await getFossilEnergyConsumption( + _fossilEnergyConsumptionCompare = getFossilEnergyConsumption( hass!, startCompare, consumptionStatIDs, @@ -494,6 +495,37 @@ const getEnergyData = async ( } } + const statsMetadata: Record = {}; + const _getStatisticMetadata: Promise = allStatIDs.length + ? getStatisticMetadata(hass, allStatIDs) + : Promise.resolve([]); + const [ + energyStats, + waterStats, + energyStatsCompare, + waterStatsCompare, + statsMetadataArray, + fossilEnergyConsumption, + fossilEnergyConsumptionCompare, + ] = await Promise.all([ + _energyStats, + _waterStats, + _energyStatsCompare, + _waterStatsCompare, + _getStatisticMetadata, + _fossilEnergyConsumption, + _fossilEnergyConsumptionCompare, + ]); + const stats = { ...energyStats, ...waterStats }; + if (compare) { + statsCompare = { ...energyStatsCompare, ...waterStatsCompare }; + } + if (allStatIDs.length) { + statsMetadataArray.forEach((x) => { + statsMetadata[x.statistic_id] = x; + }); + } + Object.values(stats).forEach((stat) => { // if the start of the first value is after the requested period, we have the first data point, and should add a zero point if (stat.length && new Date(stat[0].start) > startMinHour) { @@ -507,12 +539,6 @@ const getEnergyData = async ( } }); - const statsMetadataArray = await getStatisticMetadata(hass, allStatIDs); - const statsMetadata: Record = {}; - statsMetadataArray.forEach((x) => { - statsMetadata[x.statistic_id] = x; - }); - const data: EnergyData = { start, end,