Skip to content
48 changes: 46 additions & 2 deletions src/data/energy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,36 @@ export const getReferencedStatisticIds = (
return statIDs;
};

export const getReferencedStatisticIdsPower = (
prefs: EnergyPreferences
): string[] => {
const statIDs: (string | undefined)[] = [];

for (const source of prefs.energy_sources) {
if (source.type === "gas" || source.type === "water") {
continue;
}

if (source.type === "solar") {
statIDs.push(source.stat_power);
continue;
}

if (source.type === "battery") {
statIDs.push(source.stat_power);
continue;
}

// grid source
for (const flowFrom of source.flow_from) {
statIDs.push(flowFrom.stat_power);
}
}
statIDs.push(...prefs.device_consumption.map((d) => d.stat_power));

return statIDs.filter(Boolean) as string[];
};

export const enum CompareMode {
NONE = "",
PREVIOUS = "previous",
Expand Down Expand Up @@ -403,9 +433,10 @@ const getEnergyData = async (
"gas",
"device",
]);
const powerStatIds = getReferencedStatisticIdsPower(prefs);
const waterStatIds = getReferencedStatisticIds(prefs, info, ["water"]);

const allStatIDs = [...energyStatIds, ...waterStatIds];
const allStatIDs = [...energyStatIds, ...waterStatIds, ...powerStatIds];

const dayDifference = differenceInDays(end || new Date(), start);
const period =
Expand All @@ -416,6 +447,8 @@ const getEnergyData = async (
: dayDifference > 2
? "day"
: "hour";
const finePeriod =
dayDifference > 64 ? "day" : dayDifference > 8 ? "hour" : "5minute";

const statsMetadata: Record<string, StatisticsMetaData> = {};
const statsMetadataArray = allStatIDs.length
Expand All @@ -437,6 +470,9 @@ const getEnergyData = async (
? (gasUnit as (typeof VOLUME_UNITS)[number])
: undefined,
};
const powerUnits: StatisticsUnitConfiguration = {
power: "kW",
};
const waterUnit = getEnergyWaterUnit(hass, prefs, statsMetadata);
const waterUnits: StatisticsUnitConfiguration = {
volume: waterUnit,
Expand All @@ -447,6 +483,12 @@ const getEnergyData = async (
"change",
])
: {};
const _powerStats: Statistics | Promise<Statistics> = powerStatIds.length
? fetchStatistics(hass!, start, end, powerStatIds, finePeriod, powerUnits, [
"mean",
])
: {};

const _waterStats: Statistics | Promise<Statistics> = waterStatIds.length
? fetchStatistics(hass!, start, end, waterStatIds, period, waterUnits, [
"change",
Expand Down Expand Up @@ -553,20 +595,22 @@ const getEnergyData = async (

const [
energyStats,
powerStats,
waterStats,
energyStatsCompare,
waterStatsCompare,
fossilEnergyConsumption,
fossilEnergyConsumptionCompare,
] = await Promise.all([
_energyStats,
_powerStats,
_waterStats,
_energyStatsCompare,
_waterStatsCompare,
_fossilEnergyConsumption,
_fossilEnergyConsumptionCompare,
]);
const stats = { ...energyStats, ...waterStats };
const stats = { ...energyStats, ...waterStats, ...powerStats };
if (compare) {
statsCompare = { ...energyStatsCompare, ...waterStatsCompare };
}
Expand Down
39 changes: 34 additions & 5 deletions src/panels/lovelace/cards/energy/common/energy-chart-options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
import type {
BarSeriesOption,
CallbackDataParams,
LineSeriesOption,
TopLevelFormatterParams,
} from "echarts/types/dist/shared";
import type { FrontendLocaleData } from "../../../../../data/translation";
Expand Down Expand Up @@ -169,11 +170,10 @@ function formatTooltip(
compare
? `${(showCompareYear ? formatDateShort : formatDateVeryShort)(date, locale, config)}: `
: ""
}${formatTime(date, locale, config)} – ${formatTime(
addHours(date, 1),
locale,
config
)}`;
}${formatTime(date, locale, config)}`;
if (params[0].componentSubType === "bar") {
period += ` – ${formatTime(addHours(date, 1), locale, config)}`;
}
}
const title = `<h4 style="text-align: center; margin: 0;">${period}</h4>`;

Expand Down Expand Up @@ -280,6 +280,35 @@ export function fillDataGapsAndRoundCaps(datasets: BarSeriesOption[]) {
});
}

export function fillLineGaps(datasets: LineSeriesOption[]) {
const buckets = Array.from(
new Set(
datasets
.map((dataset) =>
dataset.data!.map((datapoint) => Number(datapoint![0]))
)
.flat()
)
).sort((a, b) => a - b);
buckets.forEach((bucket, index) => {
for (let i = datasets.length - 1; i >= 0; i--) {
const dataPoint = datasets[i].data![index];
const item: any =
dataPoint && typeof dataPoint === "object" && "value" in dataPoint
? dataPoint
: { value: dataPoint };
const x = item.value?.[0];
if (x === undefined) {
continue;
}
if (Number(x) !== bucket) {
datasets[i].data?.splice(index, 0, [bucket, 0]);
}
}
});
return datasets;
}

export function getCompareTransform(start: Date, compareStart?: Date) {
if (!compareStart) {
return (ts: Date) => ts;
Expand Down
Loading