Compare commits

..

1 Commits

Author SHA1 Message Date
J. Nick Koston
3d4b2de906 Enable compression for development 2023-02-27 16:10:45 -06:00
2 changed files with 80 additions and 132 deletions

View File

@@ -11,8 +11,10 @@ import {
} from "date-fns/esm";
import { Collection, getCollection } from "home-assistant-js-websocket";
import { groupBy } from "../common/util/group-by";
import { subscribeOne } from "../common/util/subscribe-one";
import { HomeAssistant } from "../types";
import { ConfigEntry, getConfigEntries } from "./config_entries";
import { subscribeEntityRegistry } from "./entity_registry";
import {
fetchStatistics,
getStatisticMetadata,
@@ -193,12 +195,6 @@ export interface EnergyPreferencesValidation {
device_consumption: EnergyValidationIssue[][];
}
export interface EnergyInfoAndCO2Signal {
energyInfo: EnergyInfo;
co2SignalEntity: string | undefined;
co2SignalConfigEntry: ConfigEntry | undefined;
}
export const getEnergyInfo = (hass: HomeAssistant) =>
hass.callWS<EnergyInfo>({
type: "energy/info",
@@ -338,11 +334,16 @@ export const getReferencedStatisticIds = (
return statIDs;
};
const getEnergyInfoAndCO2Signal = async (
hass: HomeAssistant
): Promise<EnergyInfoAndCO2Signal> => {
const [configEntries, info] = await Promise.all([
const getEnergyData = async (
hass: HomeAssistant,
prefs: EnergyPreferences,
start: Date,
end?: Date,
compare?: boolean
): Promise<EnergyData> => {
const [configEntries, entityRegistryEntries, info] = await Promise.all([
getConfigEntries(hass, { domain: "co2signal" }),
subscribeOne(hass.connection, subscribeEntityRegistry),
getEnergyInfo(hass),
]);
@@ -351,14 +352,15 @@ const getEnergyInfoAndCO2Signal = async (
: undefined;
let co2SignalEntity: string | undefined;
if (co2SignalConfigEntry) {
for (const entity of Object.values(hass.entities)) {
if (entity.platform !== "co2signal") {
for (const entry of entityRegistryEntries) {
if (entry.config_entry_id !== co2SignalConfigEntry.entry_id) {
continue;
}
// The integration offers 2 entities. We want the % one.
const co2State = hass.states[entity.entity_id];
const co2State = hass.states[entry.entity_id];
if (!co2State || co2State.attributes.unit_of_measurement !== "%") {
continue;
}
@@ -368,24 +370,6 @@ const getEnergyInfoAndCO2Signal = async (
}
}
return <EnergyInfoAndCO2Signal>{
energyInfo: info,
co2SignalEntity: co2SignalEntity,
co2SignalConfigEntry: co2SignalConfigEntry,
};
};
const getEnergyDataWithInfo = async (
hass: HomeAssistant,
energyInfoAndCO2Signal: EnergyInfoAndCO2Signal,
prefs: EnergyPreferences,
start: Date,
end?: Date,
compare?: boolean
): Promise<EnergyData> => {
const info = energyInfoAndCO2Signal.energyInfo;
const co2SignalEntity = energyInfoAndCO2Signal.co2SignalEntity;
const co2SignalConfigEntry = energyInfoAndCO2Signal.co2SignalConfigEntry;
const consumptionStatIDs: string[] = [];
for (const source of prefs.energy_sources) {
// grid source
@@ -421,35 +405,34 @@ const getEnergyDataWithInfo = async (
volume: lengthUnit === "km" ? "L" : "gal",
};
const _energyStats: Statistics | Promise<Statistics> = energyStatIds.length
? fetchStatistics(
hass!,
startMinHour,
end,
energyStatIds,
period,
energyUnits,
["sum"]
)
: {};
const _waterStats: Statistics | Promise<Statistics> = waterStatIds.length
? fetchStatistics(
hass!,
startMinHour,
end,
waterStatIds,
period,
waterUnits,
["sum"]
)
: {};
const stats = {
...(energyStatIds.length
? await fetchStatistics(
hass!,
startMinHour,
end,
energyStatIds,
period,
energyUnits,
["sum"]
)
: {}),
...(waterStatIds.length
? await fetchStatistics(
hass!,
startMinHour,
end,
waterStatIds,
period,
waterUnits,
["sum"]
)
: {}),
};
let statsCompare;
let startCompare;
let endCompare;
let _energyStatsCompare: Statistics | Promise<Statistics> = {};
let _waterStatsCompare: Statistics | Promise<Statistics> = {};
if (compare) {
if (dayDifference > 27 && dayDifference < 32) {
// When comparing a month, we want to start at the begining of the month
@@ -460,36 +443,38 @@ const getEnergyDataWithInfo = async (
const compareStartMinHour = addHours(startCompare, -1);
endCompare = addMilliseconds(start, -1);
if (energyStatIds.length) {
_energyStatsCompare = fetchStatistics(
hass!,
compareStartMinHour,
endCompare,
energyStatIds,
period,
energyUnits,
["sum"]
);
}
if (waterStatIds.length) {
_waterStatsCompare = fetchStatistics(
hass!,
compareStartMinHour,
endCompare,
waterStatIds,
period,
waterUnits,
["sum"]
);
}
statsCompare = {
...(energyStatIds.length
? await fetchStatistics(
hass!,
compareStartMinHour,
endCompare,
energyStatIds,
period,
energyUnits,
["sum"]
)
: {}),
...(waterStatIds.length
? await fetchStatistics(
hass!,
compareStartMinHour,
endCompare,
waterStatIds,
period,
waterUnits,
["sum"]
)
: {}),
};
}
let _fossilEnergyConsumption: undefined | Promise<FossilEnergyConsumption>;
let _fossilEnergyConsumptionCompare:
| undefined
| Promise<FossilEnergyConsumption>;
let fossilEnergyConsumption: FossilEnergyConsumption | undefined;
let fossilEnergyConsumptionCompare: FossilEnergyConsumption | undefined;
if (co2SignalEntity !== undefined) {
_fossilEnergyConsumption = getFossilEnergyConsumption(
fossilEnergyConsumption = await getFossilEnergyConsumption(
hass!,
start,
consumptionStatIDs,
@@ -498,7 +483,7 @@ const getEnergyDataWithInfo = async (
dayDifference > 35 ? "month" : dayDifference > 2 ? "day" : "hour"
);
if (compare) {
_fossilEnergyConsumptionCompare = getFossilEnergyConsumption(
fossilEnergyConsumptionCompare = await getFossilEnergyConsumption(
hass!,
startCompare,
consumptionStatIDs,
@@ -509,39 +494,6 @@ const getEnergyDataWithInfo = async (
}
}
const statsMetadata: Record<string, StatisticsMetaData> = {};
const _getStatisticMetadata:
| Promise<StatisticsMetaData[]>
| StatisticsMetaData[] = allStatIDs.length
? getStatisticMetadata(hass, allStatIDs)
: [];
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) {
@@ -555,6 +507,12 @@ const getEnergyDataWithInfo = async (
}
});
const statsMetadataArray = await getStatisticMetadata(hass, allStatIDs);
const statsMetadata: Record<string, StatisticsMetaData> = {};
statsMetadataArray.forEach((x) => {
statsMetadata[x.statistic_id] = x;
});
const data: EnergyData = {
start,
end,
@@ -615,9 +573,6 @@ export const getEnergyDataCollection = (
energyCollectionKeys.push(options.key);
let energyInfoAndCO2Signal: EnergyInfoAndCO2Signal | undefined;
let forceRefreshEnergyInfo = false;
const collection = getCollection<EnergyData>(
hass.connection,
key,
@@ -645,20 +600,14 @@ export const getEnergyDataCollection = (
}
nextFetch.setMinutes(20, 0, 0);
collection._refreshTimeout = window.setTimeout(() => {
forceRefreshEnergyInfo = true;
collection.refresh();
}, nextFetch.getTime() - Date.now());
collection._refreshTimeout = window.setTimeout(
() => collection.refresh(),
nextFetch.getTime() - Date.now()
);
}
if (!energyInfoAndCO2Signal || forceRefreshEnergyInfo) {
energyInfoAndCO2Signal = await getEnergyInfoAndCO2Signal(hass);
forceRefreshEnergyInfo = false;
}
return getEnergyDataWithInfo(
return getEnergyData(
hass,
energyInfoAndCO2Signal,
collection.prefs,
collection.start,
collection.end,

View File

@@ -19,7 +19,6 @@ module.exports = {
"**/*.json": "js",
"**/*.css": "js",
},
compress: true,
middleware: [cors()],
plugins: rollupWDSPlugins,
};