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:
karwosts 2025-07-11 09:31:27 -07:00 committed by GitHub
parent 0714677a8a
commit ad7b8b66f2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 57 additions and 31 deletions

View File

@ -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";

View File

@ -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 = [

View File

@ -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
); );

View File

@ -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"

View File

@ -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;

View File

@ -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[] = [];