mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-12 03:46:34 +00:00
Render energy-water in the display unit of the sources (#26141)
Render energy-water in the display unit of the source
This commit is contained in:
parent
0714677a8a
commit
ad7b8b66f2
@ -26,7 +26,12 @@ import type {
|
|||||||
StatisticsMetaData,
|
StatisticsMetaData,
|
||||||
StatisticsUnitConfiguration,
|
StatisticsUnitConfiguration,
|
||||||
} from "./recorder";
|
} from "./recorder";
|
||||||
import { fetchStatistics, getStatisticMetadata } from "./recorder";
|
import {
|
||||||
|
fetchStatistics,
|
||||||
|
getDisplayUnit,
|
||||||
|
getStatisticMetadata,
|
||||||
|
VOLUME_UNITS,
|
||||||
|
} from "./recorder";
|
||||||
import { calcDateRange } from "../common/datetime/calc_date_range";
|
import { calcDateRange } from "../common/datetime/calc_date_range";
|
||||||
import type { DateRange } from "../common/datetime/calc_date_range";
|
import type { DateRange } from "../common/datetime/calc_date_range";
|
||||||
import { formatNumber } from "../common/number/format_number";
|
import { formatNumber } from "../common/number/format_number";
|
||||||
@ -275,6 +280,7 @@ export interface EnergyData {
|
|||||||
co2SignalEntity?: string;
|
co2SignalEntity?: string;
|
||||||
fossilEnergyConsumption?: FossilEnergyConsumption;
|
fossilEnergyConsumption?: FossilEnergyConsumption;
|
||||||
fossilEnergyConsumptionCompare?: FossilEnergyConsumption;
|
fossilEnergyConsumptionCompare?: FossilEnergyConsumption;
|
||||||
|
waterUnit: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getReferencedStatisticIds = (
|
export const getReferencedStatisticIds = (
|
||||||
@ -398,12 +404,25 @@ const getEnergyData = async (
|
|||||||
: "hour";
|
: "hour";
|
||||||
|
|
||||||
const lengthUnit = hass.config.unit_system.length || "";
|
const lengthUnit = hass.config.unit_system.length || "";
|
||||||
|
|
||||||
|
const statsMetadata: Record<string, StatisticsMetaData> = {};
|
||||||
|
const statsMetadataArray = allStatIDs.length
|
||||||
|
? await getStatisticMetadata(hass, allStatIDs)
|
||||||
|
: [];
|
||||||
|
|
||||||
|
if (allStatIDs.length) {
|
||||||
|
statsMetadataArray.forEach((x) => {
|
||||||
|
statsMetadata[x.statistic_id] = x;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const energyUnits: StatisticsUnitConfiguration = {
|
const energyUnits: StatisticsUnitConfiguration = {
|
||||||
energy: "kWh",
|
energy: "kWh",
|
||||||
volume: lengthUnit === "km" ? "m³" : "ft³",
|
volume: lengthUnit === "km" ? "m³" : "ft³",
|
||||||
};
|
};
|
||||||
|
const waterUnit = getEnergyWaterUnit(hass, prefs, statsMetadata);
|
||||||
const waterUnits: StatisticsUnitConfiguration = {
|
const waterUnits: StatisticsUnitConfiguration = {
|
||||||
volume: lengthUnit === "km" ? "L" : "gal",
|
volume: waterUnit,
|
||||||
};
|
};
|
||||||
|
|
||||||
const _energyStats: Statistics | Promise<Statistics> = energyStatIds.length
|
const _energyStats: Statistics | Promise<Statistics> = energyStatIds.length
|
||||||
@ -511,18 +530,11 @@ const getEnergyData = async (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const statsMetadata: Record<string, StatisticsMetaData> = {};
|
|
||||||
const _getStatisticMetadata:
|
|
||||||
| Promise<StatisticsMetaData[]>
|
|
||||||
| StatisticsMetaData[] = allStatIDs.length
|
|
||||||
? getStatisticMetadata(hass, allStatIDs)
|
|
||||||
: [];
|
|
||||||
const [
|
const [
|
||||||
energyStats,
|
energyStats,
|
||||||
waterStats,
|
waterStats,
|
||||||
energyStatsCompare,
|
energyStatsCompare,
|
||||||
waterStatsCompare,
|
waterStatsCompare,
|
||||||
statsMetadataArray,
|
|
||||||
fossilEnergyConsumption,
|
fossilEnergyConsumption,
|
||||||
fossilEnergyConsumptionCompare,
|
fossilEnergyConsumptionCompare,
|
||||||
] = await Promise.all([
|
] = await Promise.all([
|
||||||
@ -530,7 +542,6 @@ const getEnergyData = async (
|
|||||||
_waterStats,
|
_waterStats,
|
||||||
_energyStatsCompare,
|
_energyStatsCompare,
|
||||||
_waterStatsCompare,
|
_waterStatsCompare,
|
||||||
_getStatisticMetadata,
|
|
||||||
_fossilEnergyConsumption,
|
_fossilEnergyConsumption,
|
||||||
_fossilEnergyConsumptionCompare,
|
_fossilEnergyConsumptionCompare,
|
||||||
]);
|
]);
|
||||||
@ -538,11 +549,6 @@ const getEnergyData = async (
|
|||||||
if (compare) {
|
if (compare) {
|
||||||
statsCompare = { ...energyStatsCompare, ...waterStatsCompare };
|
statsCompare = { ...energyStatsCompare, ...waterStatsCompare };
|
||||||
}
|
}
|
||||||
if (allStatIDs.length) {
|
|
||||||
statsMetadataArray.forEach((x) => {
|
|
||||||
statsMetadata[x.statistic_id] = x;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const data: EnergyData = {
|
const data: EnergyData = {
|
||||||
start,
|
start,
|
||||||
@ -557,6 +563,7 @@ const getEnergyData = async (
|
|||||||
co2SignalEntity,
|
co2SignalEntity,
|
||||||
fossilEnergyConsumption,
|
fossilEnergyConsumption,
|
||||||
fossilEnergyConsumptionCompare,
|
fossilEnergyConsumptionCompare,
|
||||||
|
waterUnit,
|
||||||
};
|
};
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
@ -778,8 +785,32 @@ export const getEnergyGasUnit = (
|
|||||||
return hass.config.unit_system.length === "km" ? "m³" : "ft³";
|
return hass.config.unit_system.length === "km" ? "m³" : "ft³";
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getEnergyWaterUnit = (hass: HomeAssistant): string =>
|
const getEnergyWaterUnit = (
|
||||||
hass.config.unit_system.length === "km" ? "L" : "gal";
|
hass: HomeAssistant,
|
||||||
|
prefs: EnergyPreferences,
|
||||||
|
statisticsMetaData: Record<string, StatisticsMetaData>
|
||||||
|
): (typeof VOLUME_UNITS)[number] => {
|
||||||
|
const units = prefs.energy_sources
|
||||||
|
.filter((s) => s.type === "water")
|
||||||
|
.map((s) =>
|
||||||
|
getDisplayUnit(
|
||||||
|
hass,
|
||||||
|
s.stat_energy_from,
|
||||||
|
statisticsMetaData[s.stat_energy_from]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
if (units.length) {
|
||||||
|
const first = units[0];
|
||||||
|
if (
|
||||||
|
VOLUME_UNITS.includes(first as any) &&
|
||||||
|
units.every((u) => u === first)
|
||||||
|
) {
|
||||||
|
return first as (typeof VOLUME_UNITS)[number];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hass.config.unit_system.length === "km" ? "L" : "gal";
|
||||||
|
};
|
||||||
|
|
||||||
export const energyStatisticHelpUrl =
|
export const energyStatisticHelpUrl =
|
||||||
"/docs/energy/faq/#troubleshooting-missing-entities";
|
"/docs/energy/faq/#troubleshooting-missing-entities";
|
||||||
|
@ -108,6 +108,8 @@ export interface StatisticsValidationResultMeanTypeChanged {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const VOLUME_UNITS = ["L", "gal", "ft³", "m³", "CCF"] as const;
|
||||||
|
|
||||||
export interface StatisticsUnitConfiguration {
|
export interface StatisticsUnitConfiguration {
|
||||||
energy?: "Wh" | "kWh" | "MWh" | "GJ";
|
energy?: "Wh" | "kWh" | "MWh" | "GJ";
|
||||||
power?: "W" | "kW";
|
power?: "W" | "kW";
|
||||||
@ -122,7 +124,7 @@ export interface StatisticsUnitConfiguration {
|
|||||||
| "psi"
|
| "psi"
|
||||||
| "mmHg";
|
| "mmHg";
|
||||||
temperature?: "°C" | "°F" | "K";
|
temperature?: "°C" | "°F" | "K";
|
||||||
volume?: "L" | "gal" | "ft³" | "m³";
|
volume?: (typeof VOLUME_UNITS)[number];
|
||||||
}
|
}
|
||||||
|
|
||||||
const _statisticTypes = [
|
const _statisticTypes = [
|
||||||
|
@ -25,7 +25,6 @@ import {
|
|||||||
computeConsumptionData,
|
computeConsumptionData,
|
||||||
getEnergyDataCollection,
|
getEnergyDataCollection,
|
||||||
getEnergyGasUnit,
|
getEnergyGasUnit,
|
||||||
getEnergyWaterUnit,
|
|
||||||
getSummedData,
|
getSummedData,
|
||||||
} from "../../data/energy";
|
} from "../../data/energy";
|
||||||
import { fileDownload } from "../../util/file_download";
|
import { fileDownload } from "../../util/file_download";
|
||||||
@ -158,7 +157,6 @@ class PanelEnergy extends LitElement {
|
|||||||
energyData.prefs,
|
energyData.prefs,
|
||||||
energyData.state.statsMetadata
|
energyData.state.statsMetadata
|
||||||
);
|
);
|
||||||
const waterUnit = getEnergyWaterUnit(this.hass);
|
|
||||||
const electricUnit = "kWh";
|
const electricUnit = "kWh";
|
||||||
|
|
||||||
const energy_sources = energyData.prefs.energy_sources;
|
const energy_sources = energyData.prefs.energy_sources;
|
||||||
@ -335,7 +333,7 @@ class PanelEnergy extends LitElement {
|
|||||||
printCategory(
|
printCategory(
|
||||||
"water_consumption",
|
"water_consumption",
|
||||||
water_consumptions,
|
water_consumptions,
|
||||||
waterUnit,
|
energyData.state.waterUnit,
|
||||||
"water_consumption_cost",
|
"water_consumption_cost",
|
||||||
water_consumptions_cost
|
water_consumptions_cost
|
||||||
);
|
);
|
||||||
|
@ -24,7 +24,6 @@ import {
|
|||||||
energySourcesByType,
|
energySourcesByType,
|
||||||
getEnergyDataCollection,
|
getEnergyDataCollection,
|
||||||
getEnergyGasUnit,
|
getEnergyGasUnit,
|
||||||
getEnergyWaterUnit,
|
|
||||||
formatConsumptionShort,
|
formatConsumptionShort,
|
||||||
getSummedData,
|
getSummedData,
|
||||||
computeConsumptionData,
|
computeConsumptionData,
|
||||||
@ -373,7 +372,7 @@ class HuiEnergyDistrubutionCard
|
|||||||
${formatConsumptionShort(
|
${formatConsumptionShort(
|
||||||
this.hass,
|
this.hass,
|
||||||
waterUsage,
|
waterUsage,
|
||||||
getEnergyWaterUnit(this.hass)
|
this._data.waterUnit
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<svg width="80" height="30">
|
<svg width="80" height="30">
|
||||||
@ -603,7 +602,7 @@ class HuiEnergyDistrubutionCard
|
|||||||
${formatConsumptionShort(
|
${formatConsumptionShort(
|
||||||
this.hass,
|
this.hass,
|
||||||
waterUsage,
|
waterUsage,
|
||||||
getEnergyWaterUnit(this.hass)
|
this._data.waterUnit
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<span class="label"
|
<span class="label"
|
||||||
|
@ -14,7 +14,6 @@ import {
|
|||||||
energySourcesByType,
|
energySourcesByType,
|
||||||
getEnergyDataCollection,
|
getEnergyDataCollection,
|
||||||
getEnergyGasUnit,
|
getEnergyGasUnit,
|
||||||
getEnergyWaterUnit,
|
|
||||||
} from "../../../../data/energy";
|
} from "../../../../data/energy";
|
||||||
import {
|
import {
|
||||||
calculateStatisticSumGrowth,
|
calculateStatisticSumGrowth,
|
||||||
@ -140,7 +139,7 @@ export class HuiEnergySourcesTableCard
|
|||||||
this._data.statsMetadata
|
this._data.statsMetadata
|
||||||
);
|
);
|
||||||
|
|
||||||
const waterUnit = getEnergyWaterUnit(this.hass);
|
const waterUnit = this._data.waterUnit;
|
||||||
|
|
||||||
const compare = this._data.statsCompare !== undefined;
|
const compare = this._data.statsCompare !== undefined;
|
||||||
|
|
||||||
|
@ -13,10 +13,7 @@ import type {
|
|||||||
EnergyData,
|
EnergyData,
|
||||||
WaterSourceTypeEnergyPreference,
|
WaterSourceTypeEnergyPreference,
|
||||||
} from "../../../../data/energy";
|
} from "../../../../data/energy";
|
||||||
import {
|
import { getEnergyDataCollection } from "../../../../data/energy";
|
||||||
getEnergyDataCollection,
|
|
||||||
getEnergyWaterUnit,
|
|
||||||
} from "../../../../data/energy";
|
|
||||||
import type { Statistics, StatisticsMetaData } from "../../../../data/recorder";
|
import type { Statistics, StatisticsMetaData } from "../../../../data/recorder";
|
||||||
import { getStatisticLabel } from "../../../../data/recorder";
|
import { getStatisticLabel } from "../../../../data/recorder";
|
||||||
import type { FrontendLocaleData } from "../../../../data/translation";
|
import type { FrontendLocaleData } from "../../../../data/translation";
|
||||||
@ -163,7 +160,7 @@ export class HuiEnergyWaterGraphCard
|
|||||||
(source) => source.type === "water"
|
(source) => source.type === "water"
|
||||||
) as WaterSourceTypeEnergyPreference[];
|
) as WaterSourceTypeEnergyPreference[];
|
||||||
|
|
||||||
this._unit = getEnergyWaterUnit(this.hass);
|
this._unit = energyData.waterUnit;
|
||||||
|
|
||||||
const datasets: BarSeriesOption[] = [];
|
const datasets: BarSeriesOption[] = [];
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user