From b60552c025e52ac473310a727276e61d862a45fe Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Mon, 5 Jan 2026 07:28:15 -0800 Subject: [PATCH] Fix statistic-graph-card cutoff w/ energy date picker (#28810) * Fix statistics-graph energy-date mode end-time with 5min statistics * don't modify date/hour for 5minute graph * suggestedMax use period instead of days * go back to string types --- src/data/recorder.ts | 4 +- .../energy/common/energy-chart-options.ts | 39 ++++++++++--------- .../cards/hui-statistics-graph-card.ts | 5 +-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/data/recorder.ts b/src/data/recorder.ts index 97133133ed..1ed8a1af1a 100644 --- a/src/data/recorder.ts +++ b/src/data/recorder.ts @@ -16,6 +16,8 @@ export interface RecorderInfo { export type StatisticType = "change" | "state" | "sum" | "min" | "max" | "mean"; +export type StatisticPeriod = "5minute" | "hour" | "day" | "week" | "month"; + export type Statistics = Record; export interface StatisticValue { @@ -174,7 +176,7 @@ export const fetchStatistics = ( startTime: Date, endTime?: Date, statistic_ids?: string[], - period: "5minute" | "hour" | "day" | "week" | "month" = "hour", + period: StatisticPeriod = "hour", units?: StatisticsUnitConfiguration, types?: StatisticsTypes ) => diff --git a/src/panels/lovelace/cards/energy/common/energy-chart-options.ts b/src/panels/lovelace/cards/energy/common/energy-chart-options.ts index a2ce47a412..e58130431d 100644 --- a/src/panels/lovelace/cards/energy/common/energy-chart-options.ts +++ b/src/panels/lovelace/cards/energy/common/energy-chart-options.ts @@ -30,35 +30,33 @@ import { import { formatTime } from "../../../../../common/datetime/format_time"; import type { ECOption } from "../../../../../resources/echarts/echarts"; import { filterXSS } from "../../../../../common/util/xss"; +import type { StatisticPeriod } from "../../../../../data/recorder"; -export function getSuggestedMax( - dayDifference: number, - end: Date, - detailedDailyData = false -): number { +export function getSuggestedMax(period: StatisticPeriod, end: Date): number { let suggestedMax = new Date(end); + if (period === "5minute") { + return suggestedMax.getTime(); + } + suggestedMax.setMinutes(0, 0, 0); + if (period === "hour") { + return suggestedMax.getTime(); + } // Sometimes around DST we get a time of 0:59 instead of 23:59 as expected. // Correct for this when showing days/months so we don't get an extra day. - if (dayDifference > 2 && suggestedMax.getHours() === 0) { + if (suggestedMax.getHours() === 0) { suggestedMax = subHours(suggestedMax, 1); } - - if (!detailedDailyData) { - suggestedMax.setMinutes(0, 0, 0); - } - if (dayDifference > 35) { - suggestedMax.setDate(1); - } - if (dayDifference > 2) { - suggestedMax.setHours(0); + suggestedMax.setHours(0); + if (period === "day" || period === "week") { + return suggestedMax.getTime(); } + // period === month + suggestedMax.setDate(1); return suggestedMax.getTime(); } -export function getSuggestedPeriod( - dayDifference: number -): "month" | "day" | "hour" { +export function getSuggestedPeriod(dayDifference: number): StatisticPeriod { return dayDifference > 35 ? "month" : dayDifference > 2 ? "day" : "hour"; } @@ -96,7 +94,10 @@ export function getCommonOptions( xAxis: { type: "time", min: start, - max: getSuggestedMax(dayDifference, end, detailedDailyData), + max: getSuggestedMax( + detailedDailyData ? "5minute" : getSuggestedPeriod(dayDifference), + end + ), }, yAxis: { type: "value", diff --git a/src/panels/lovelace/cards/hui-statistics-graph-card.ts b/src/panels/lovelace/cards/hui-statistics-graph-card.ts index ba66d393aa..08778f66dc 100644 --- a/src/panels/lovelace/cards/hui-statistics-graph-card.ts +++ b/src/panels/lovelace/cards/hui-statistics-graph-card.ts @@ -334,10 +334,7 @@ export class HuiStatisticsGraphCard extends LitElement implements LovelaceCard { .maxYAxis=${this._config.max_y_axis} .startTime=${this._energyStart} .endTime=${this._energyEnd && this._energyStart - ? getSuggestedMax( - differenceInDays(this._energyEnd, this._energyStart), - this._energyEnd - ) + ? getSuggestedMax(this._period!, this._energyEnd) : undefined} .fitYData=${this._config.fit_y_data || false} .hideLegend=${this._config.hide_legend || false}