Skip to content

Commit

Permalink
Fix for energy cards not refreshing hourly (#18854)
Browse files Browse the repository at this point in the history
  • Loading branch information
karwosts authored Dec 2, 2023
1 parent b28a4e6 commit 4c4fdde
Showing 1 changed file with 28 additions and 22 deletions.
50 changes: 28 additions & 22 deletions src/data/energy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,28 @@ const clearEnergyCollectionPreferences = (hass: HomeAssistant) => {
});
};

const scheduleHourlyRefresh = (collection: EnergyCollection) => {
if (collection._refreshTimeout) {
clearTimeout(collection._refreshTimeout);
}

if (collection._active && (!collection.end || collection.end > new Date())) {
// The stats are created every hour
// Schedule a refresh for 20 minutes past the hour
// If the end is larger than the current time.
const nextFetch = new Date();
if (nextFetch.getMinutes() >= 20) {
nextFetch.setHours(nextFetch.getHours() + 1);
}
nextFetch.setMinutes(20, 0, 0);

collection._refreshTimeout = window.setTimeout(
() => collection.refresh(),
nextFetch.getTime() - Date.now()
);
}
};

export const getEnergyDataCollection = (
hass: HomeAssistant,
options: { prefs?: EnergyPreferences; key?: string } = {}
Expand Down Expand Up @@ -609,28 +631,7 @@ export const getEnergyDataCollection = (
collection.prefs = await getEnergyPreferences(hass);
}

if (collection._refreshTimeout) {
clearTimeout(collection._refreshTimeout);
}

if (
collection._active &&
(!collection.end || collection.end > new Date())
) {
// The stats are created every hour
// Schedule a refresh for 20 minutes past the hour
// If the end is larger than the current time.
const nextFetch = new Date();
if (nextFetch.getMinutes() >= 20) {
nextFetch.setHours(nextFetch.getHours() + 1);
}
nextFetch.setMinutes(20, 0, 0);

collection._refreshTimeout = window.setTimeout(
() => collection.refresh(),
nextFetch.getTime() - Date.now()
);
}
scheduleHourlyRefresh(collection);

return getEnergyData(
hass,
Expand All @@ -647,6 +648,11 @@ export const getEnergyDataCollection = (
collection.subscribe = (subscriber: (data: EnergyData) => void) => {
const unsub = origSubscribe(subscriber);
collection._active++;

if (collection._refreshTimeout === undefined) {
scheduleHourlyRefresh(collection);
}

return () => {
collection._active--;
if (collection._active < 1) {
Expand Down

0 comments on commit 4c4fdde

Please sign in to comment.