Add compare data to individual devices graph (#12829)

This commit is contained in:
Bram Kragten 2022-05-31 15:36:04 +02:00 committed by GitHub
parent 881f6b0531
commit 6842c479d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 91 additions and 21 deletions

View File

@ -43,8 +43,6 @@ export class HuiEnergyDevicesGraphCard
@state() private _config?: EnergyDevicesGraphCardConfig; @state() private _config?: EnergyDevicesGraphCardConfig;
@state() private _data?: Statistics;
@state() private _chartData: ChartData = { datasets: [] }; @state() private _chartData: ChartData = { datasets: [] };
@query("ha-chart-base") private _chart?: HaChartBase; @query("ha-chart-base") private _chart?: HaChartBase;
@ -162,19 +160,24 @@ export class HuiEnergyDevicesGraphCard
energyData.start energyData.start
); );
this._data = await fetchStatistics( const devices = energyData.prefs.device_consumption.map(
this.hass,
addHours(energyData.start, -1),
energyData.end,
energyData.prefs.device_consumption.map(
(device) => device.stat_consumption (device) => device.stat_consumption
),
dayDifference > 35 ? "month" : dayDifference > 2 ? "day" : "hour"
); );
const period =
dayDifference > 35 ? "month" : dayDifference > 2 ? "day" : "hour";
const startMinHour = addHours(energyData.start, -1); const startMinHour = addHours(energyData.start, -1);
Object.values(this._data).forEach((stat) => { const data = await fetchStatistics(
this.hass,
startMinHour,
energyData.end,
devices,
period
);
Object.values(data).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 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) { if (stat.length && new Date(stat[0].start) > startMinHour) {
stat.unshift({ stat.unshift({
@ -187,9 +190,41 @@ export class HuiEnergyDevicesGraphCard
} }
}); });
const data: Array<ChartDataset<"bar", ParsedDataType<"bar">>["data"]> = []; let compareData: Statistics | undefined;
if (energyData.startCompare && energyData.endCompare) {
const startCompareMinHour = addHours(energyData.startCompare, -1);
compareData = await fetchStatistics(
this.hass,
startCompareMinHour,
energyData.endCompare,
devices,
period
);
Object.values(compareData).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) {
stat.unshift({
...stat[0],
start: startCompareMinHour.toISOString(),
end: startCompareMinHour.toISOString(),
sum: 0,
state: 0,
});
}
});
}
const chartData: Array<ChartDataset<"bar", ParsedDataType<"bar">>["data"]> =
[];
const chartDataCompare: Array<
ChartDataset<"bar", ParsedDataType<"bar">>["data"]
> = [];
const borderColor: string[] = []; const borderColor: string[] = [];
const borderColorCompare: string[] = [];
const backgroundColor: string[] = []; const backgroundColor: string[] = [];
const backgroundColorCompare: string[] = [];
const datasets: ChartDataset<"bar", ParsedDataType<"bar">[]>[] = [ const datasets: ChartDataset<"bar", ParsedDataType<"bar">[]>[] = [
{ {
@ -198,35 +233,69 @@ export class HuiEnergyDevicesGraphCard
), ),
borderColor, borderColor,
backgroundColor, backgroundColor,
data, data: chartData,
barThickness: 20, barThickness: compareData ? 10 : 20,
}, },
]; ];
if (compareData) {
datasets.push({
label: this.hass.localize(
"ui.panel.lovelace.cards.energy.energy_devices_graph.previous_energy_usage"
),
borderColor: borderColorCompare,
backgroundColor: backgroundColorCompare,
data: chartDataCompare,
barThickness: 10,
});
}
energyData.prefs.device_consumption.forEach((device, idx) => { energyData.prefs.device_consumption.forEach((device, idx) => {
const value = const value =
device.stat_consumption in this._data! device.stat_consumption in data
? calculateStatisticSumGrowth(this._data![device.stat_consumption]) || ? calculateStatisticSumGrowth(data[device.stat_consumption]) || 0
0
: 0; : 0;
data.push({ chartData.push({
// @ts-expect-error // @ts-expect-error
y: device.stat_consumption, y: device.stat_consumption,
x: value, x: value,
idx, idx,
}); });
if (compareData) {
const compareValue =
device.stat_consumption in compareData
? calculateStatisticSumGrowth(
compareData[device.stat_consumption]
) || 0
: 0;
chartDataCompare.push({
// @ts-expect-error
y: device.stat_consumption,
x: compareValue,
idx,
});
}
}); });
data.sort((a, b) => b.x - a.x); chartData.sort((a, b) => b.x - a.x);
data.forEach((d: any) => { chartData.forEach((d: any) => {
const color = getColorByIndex(d.idx); const color = getColorByIndex(d.idx);
borderColor.push(color); borderColor.push(color);
backgroundColor.push(color + "7F"); backgroundColor.push(color + "7F");
}); });
chartDataCompare.forEach((d: any) => {
const color = getColorByIndex(d.idx);
borderColorCompare.push(color + "7F");
backgroundColorCompare.push(color + "32");
});
this._chartData = { this._chartData = {
datasets, datasets,
}; };

View File

@ -3405,7 +3405,8 @@
"go_to_energy_dashboard": "Go to the energy dashboard" "go_to_energy_dashboard": "Go to the energy dashboard"
}, },
"energy_devices_graph": { "energy_devices_graph": {
"energy_usage": "Energy usage" "energy_usage": "Energy usage",
"previous_energy_usage": "Previous energy usage"
}, },
"carbon_consumed_gauge": { "carbon_consumed_gauge": {
"card_indicates_energy_used": "This card indicates how much of the energy consumed by your home was generated using non-fossil fuels like solar, wind and nuclear. The higher, the better!", "card_indicates_energy_used": "This card indicates how much of the energy consumed by your home was generated using non-fossil fuels like solar, wind and nuclear. The higher, the better!",