diff --git a/src/panels/energy/ha-panel-energy.ts b/src/panels/energy/ha-panel-energy.ts
index 747778befc..eca00a476d 100644
--- a/src/panels/energy/ha-panel-energy.ts
+++ b/src/panels/energy/ha-panel-energy.ts
@@ -1,7 +1,6 @@
import type { CSSResultGroup, PropertyValues } from "lit";
import { LitElement, css, html, nothing } from "lit";
import { customElement, property, state } from "lit/decorators";
-import { classMap } from "lit/directives/class-map";
import { navigate } from "../../common/navigate";
import type { LocalizeKeys } from "../../common/translations/localize";
import "../../components/ha-alert";
@@ -11,13 +10,9 @@ import "../../components/ha-top-app-bar-fixed";
import type { EnergyPreferences } from "../../data/energy";
import { getEnergyDataCollection } from "../../data/energy";
import type { LovelaceConfig } from "../../data/lovelace/config/types";
-import {
- isStrategyView,
- type LovelaceViewConfig,
-} from "../../data/lovelace/config/view";
+import type { LovelaceViewConfig } from "../../data/lovelace/config/view";
import { haStyle } from "../../resources/styles";
import type { HomeAssistant, PanelInfo } from "../../types";
-import "../lovelace/components/hui-energy-period-selector";
import "../lovelace/hui-root";
import type { Lovelace } from "../lovelace/types";
import "../lovelace/views/hui-view";
@@ -37,7 +32,6 @@ const OVERVIEW_VIEW = {
strategy: {
type: "energy-overview",
collection_key: DEFAULT_ENERGY_COLLECTION_KEY,
- show_period_selector: true,
},
} as LovelaceViewConfig;
@@ -46,7 +40,6 @@ const ENERGY_VIEW = {
strategy: {
type: "energy",
collection_key: DEFAULT_ENERGY_COLLECTION_KEY,
- show_period_selector: true,
},
} as LovelaceViewConfig;
@@ -55,7 +48,6 @@ const WATER_VIEW = {
strategy: {
type: "water",
collection_key: DEFAULT_ENERGY_COLLECTION_KEY,
- show_period_selector: true,
},
} as LovelaceViewConfig;
@@ -64,7 +56,6 @@ const GAS_VIEW = {
strategy: {
type: "gas",
collection_key: DEFAULT_ENERGY_COLLECTION_KEY,
- show_period_selector: true,
},
} as LovelaceViewConfig;
@@ -210,16 +201,6 @@ class PanelEnergy extends LitElement {
return nothing;
}
- const routePath = this.route?.path?.split("/")[1] || "";
- const currentView = this._lovelace.config.views.find(
- (view) => view.path === routePath
- );
-
- const showEnergySelector =
- currentView &&
- isStrategyView(currentView) &&
- currentView.strategy?.show_period_selector;
-
return html`
- ${showEnergySelector
- ? html`
-
-
-
- `
- : nothing}
`;
}
@@ -356,50 +323,6 @@ class PanelEnergy extends LitElement {
align-items: center;
justify-content: center;
}
- hui-root.has-period-selector {
- --view-container-padding-bottom: var(--ha-space-18);
- }
- .period-selector {
- position: fixed;
- z-index: 4;
- bottom: max(var(--ha-space-4), var(--safe-area-inset-bottom, 0px));
- left: max(
- var(--mdc-drawer-width, 0px),
- var(--safe-area-inset-left, 0px)
- );
- right: var(--safe-area-inset-right, 0);
- inset-inline-start: max(
- var(--mdc-drawer-width, 0px),
- var(--safe-area-inset-left, 0px)
- );
- inset-inline-end: var(--safe-area-inset-right, 0);
- transition:
- left var(--ha-animation-duration-normal) ease,
- right var(--ha-animation-duration-normal) ease,
- inset-inline-start var(--ha-animation-duration-normal) ease,
- inset-inline-end var(--ha-animation-duration-normal) ease;
- margin: 0 auto;
- max-width: calc(min(470px, 100% - var(--ha-space-4)));
- box-sizing: border-box;
- padding-left: var(--ha-space-2);
- padding-right: 0;
- padding-inline-start: var(--ha-space-4);
- padding-inline-end: 0;
- --ha-card-box-shadow:
- 0px 3px 5px -1px rgba(0, 0, 0, 0.2),
- 0px 6px 10px 0px rgba(0, 0, 0, 0.14),
- 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
- --ha-card-border-color: var(--divider-color);
- --ha-card-border-width: var(--ha-card-border-width, 1px);
- }
- @media all and (max-width: 450px), all and (max-height: 500px) {
- hui-root.has-period-selector {
- --view-container-padding-bottom: var(--ha-space-14);
- }
- .period-selector {
- bottom: max(var(--ha-space-2), var(--safe-area-inset-bottom, 0px));
- }
- }
`,
];
}
diff --git a/src/panels/energy/strategies/energy-overview-view-strategy.ts b/src/panels/energy/strategies/energy-overview-view-strategy.ts
index ff4be6179f..74e4d7aa76 100644
--- a/src/panels/energy/strategies/energy-overview-view-strategy.ts
+++ b/src/panels/energy/strategies/energy-overview-view-strategy.ts
@@ -13,16 +13,23 @@ export class EnergyOverviewViewStrategy extends ReactiveElement {
_config: LovelaceStrategyConfig,
hass: HomeAssistant
): Promise {
+ const collectionKey =
+ _config.collection_key || DEFAULT_ENERGY_COLLECTION_KEY;
+
const view: LovelaceViewConfig = {
type: "sections",
sections: [],
dense_section_placement: true,
- max_columns: 2,
+ max_columns: 3,
+ footer: {
+ column_span: 1.1,
+ card: {
+ type: "energy-date-selection",
+ collection_key: collectionKey,
+ },
+ },
};
- const collectionKey =
- _config.collection_key || DEFAULT_ENERGY_COLLECTION_KEY;
-
const energyCollection = getEnergyDataCollection(hass, {
key: collectionKey,
});
diff --git a/src/panels/energy/strategies/energy-view-strategy.ts b/src/panels/energy/strategies/energy-view-strategy.ts
index a602534f75..5b518c34bc 100644
--- a/src/panels/energy/strategies/energy-view-strategy.ts
+++ b/src/panels/energy/strategies/energy-view-strategy.ts
@@ -2,6 +2,7 @@ import { ReactiveElement } from "lit";
import { customElement } from "lit/decorators";
import type { GridSourceTypeEnergyPreference } from "../../../data/energy";
import { getEnergyDataCollection } from "../../../data/energy";
+import type { LovelaceCardConfig } from "../../../data/lovelace/config/card";
import type { LovelaceStrategyConfig } from "../../../data/lovelace/config/strategy";
import type { LovelaceViewConfig } from "../../../data/lovelace/config/view";
import type { HomeAssistant } from "../../../types";
@@ -14,11 +15,22 @@ export class EnergyViewStrategy extends ReactiveElement {
_config: LovelaceStrategyConfig,
hass: HomeAssistant
): Promise {
- const view: LovelaceViewConfig = { cards: [] };
-
const collectionKey =
_config.collection_key || DEFAULT_ENERGY_COLLECTION_KEY;
+ const view: LovelaceViewConfig = {
+ type: "sections",
+ max_columns: 3,
+ sections: [],
+ footer: {
+ column_span: 1.1,
+ card: {
+ type: "energy-date-selection",
+ collection_key: collectionKey,
+ },
+ },
+ };
+
const energyCollection = getEnergyDataCollection(hass, {
key: collectionKey,
});
@@ -36,8 +48,6 @@ export class EnergyViewStrategy extends ReactiveElement {
return view;
}
- view.type = "sidebar";
-
const hasGrid = prefs.energy_sources.find(
(source): source is GridSourceTypeEnergyPreference =>
source.type === "grid" &&
@@ -50,83 +60,95 @@ export class EnergyViewStrategy extends ReactiveElement {
const hasBattery = prefs.energy_sources.some(
(source) => source.type === "battery"
);
- view.cards!.push({
+
+ const mainCards: LovelaceCardConfig[] = [];
+ const gaugeCards: LovelaceCardConfig[] = [];
+
+ // Only include if we have a grid source & return.
+ if (hasReturn) {
+ const card = {
+ type: "energy-grid-neutrality-gauge",
+ collection_key: collectionKey,
+ };
+ gaugeCards.push(card);
+ }
+
+ // Only include if we have a solar source.
+ if (hasSolar) {
+ if (hasReturn) {
+ const card = {
+ type: "energy-solar-consumed-gauge",
+ collection_key: collectionKey,
+ };
+ gaugeCards.push(card);
+ }
+ if (hasGrid) {
+ const card = {
+ type: "energy-self-sufficiency-gauge",
+ collection_key: collectionKey,
+ };
+ gaugeCards.push(card);
+ }
+ }
+
+ // Only include if we have a grid
+ if (hasGrid) {
+ const card = {
+ type: "energy-carbon-consumed-gauge",
+ collection_key: collectionKey,
+ };
+ gaugeCards.push(card);
+ }
+
+ if (gaugeCards.length) {
+ view.sections!.push({
+ type: "grid",
+ column_span: 3,
+ cards:
+ gaugeCards.length === 1
+ ? [gaugeCards[0]]
+ : gaugeCards.map((card) => ({
+ ...card,
+ grid_options: { columns: 6 },
+ })),
+ });
+ }
+
+ mainCards.push({
type: "energy-compare",
collection_key: collectionKey,
+ grid_options: { columns: 36 },
});
// Only include if we have a grid or battery.
if (hasGrid || hasBattery) {
- view.cards!.push({
+ mainCards.push({
title: hass.localize("ui.panel.energy.cards.energy_usage_graph_title"),
type: "energy-usage-graph",
collection_key: collectionKey,
+ grid_options: { columns: 36 },
});
}
// Only include if we have a solar source.
if (hasSolar) {
- view.cards!.push({
+ mainCards.push({
title: hass.localize("ui.panel.energy.cards.energy_solar_graph_title"),
type: "energy-solar-graph",
collection_key: collectionKey,
- });
- }
-
- // Only include if we have a grid or battery.
- if (hasGrid || hasBattery) {
- view.cards!.push({
- title: hass.localize("ui.panel.energy.cards.energy_distribution_title"),
- type: "energy-distribution",
- view_layout: { position: "sidebar" },
- collection_key: collectionKey,
+ grid_options: { columns: 36 },
});
}
if (hasGrid || hasSolar || hasBattery) {
- view.cards!.push({
+ mainCards.push({
title: hass.localize(
"ui.panel.energy.cards.energy_sources_table_title"
),
type: "energy-sources-table",
collection_key: collectionKey,
types: ["grid", "solar", "battery"],
- });
- }
-
- // Only include if we have a grid source & return.
- if (hasReturn) {
- view.cards!.push({
- type: "energy-grid-neutrality-gauge",
- view_layout: { position: "sidebar" },
- collection_key: collectionKey,
- });
- }
-
- // Only include if we have a solar source.
- if (hasSolar) {
- if (hasReturn) {
- view.cards!.push({
- type: "energy-solar-consumed-gauge",
- view_layout: { position: "sidebar" },
- collection_key: collectionKey,
- });
- }
- if (hasGrid) {
- view.cards!.push({
- type: "energy-self-sufficiency-gauge",
- view_layout: { position: "sidebar" },
- collection_key: collectionKey,
- });
- }
- }
-
- // Only include if we have a grid
- if (hasGrid) {
- view.cards!.push({
- type: "energy-carbon-consumed-gauge",
- view_layout: { position: "sidebar" },
- collection_key: collectionKey,
+ grid_options: { columns: 36 },
});
}
@@ -137,29 +159,38 @@ export class EnergyViewStrategy extends ReactiveElement {
hass,
(d) => d.stat_consumption
);
- view.cards!.push({
+ mainCards.push({
title: hass.localize(
"ui.panel.energy.cards.energy_devices_detail_graph_title"
),
type: "energy-devices-detail-graph",
collection_key: collectionKey,
+ grid_options: { columns: 36 },
});
- view.cards!.push({
+ mainCards.push({
title: hass.localize(
"ui.panel.energy.cards.energy_devices_graph_title"
),
type: "energy-devices-graph",
collection_key: collectionKey,
+ grid_options: { columns: 36 },
});
- view.cards!.push({
+ mainCards.push({
title: hass.localize("ui.panel.energy.cards.energy_sankey_title"),
type: "energy-sankey",
collection_key: collectionKey,
group_by_floor: showFloorsAndAreas,
group_by_area: showFloorsAndAreas,
+ grid_options: { columns: 36 },
});
}
+ view.sections!.push({
+ type: "grid",
+ column_span: 3,
+ cards: mainCards,
+ });
+
return view;
}
}
diff --git a/src/panels/energy/strategies/gas-view-strategy.ts b/src/panels/energy/strategies/gas-view-strategy.ts
index 754018170d..1c97b5a677 100644
--- a/src/panels/energy/strategies/gas-view-strategy.ts
+++ b/src/panels/energy/strategies/gas-view-strategy.ts
@@ -13,14 +13,22 @@ export class GasViewStrategy extends ReactiveElement {
_config: LovelaceStrategyConfig,
hass: HomeAssistant
): Promise {
- const view: LovelaceViewConfig = {
- type: "sections",
- sections: [{ type: "grid", cards: [] }],
- };
-
const collectionKey =
_config.collection_key || DEFAULT_ENERGY_COLLECTION_KEY;
+ const view: LovelaceViewConfig = {
+ type: "sections",
+ max_columns: 3,
+ sections: [{ type: "grid", cards: [], column_span: 3 }],
+ footer: {
+ column_span: 1.1,
+ card: {
+ type: "energy-date-selection",
+ collection_key: collectionKey,
+ },
+ },
+ };
+
const energyCollection = getEnergyDataCollection(hass, {
key: collectionKey,
});
@@ -49,6 +57,9 @@ export class GasViewStrategy extends ReactiveElement {
title: hass.localize("ui.panel.energy.cards.energy_gas_graph_title"),
type: "energy-gas-graph",
collection_key: collectionKey,
+ grid_options: {
+ columns: 24,
+ },
});
section.cards!.push({
@@ -56,6 +67,9 @@ export class GasViewStrategy extends ReactiveElement {
type: "energy-sources-table",
collection_key: collectionKey,
types: ["gas"],
+ grid_options: {
+ columns: 12,
+ },
});
return view;
diff --git a/src/panels/energy/strategies/water-view-strategy.ts b/src/panels/energy/strategies/water-view-strategy.ts
index 058a5e01a4..7579e169d3 100644
--- a/src/panels/energy/strategies/water-view-strategy.ts
+++ b/src/panels/energy/strategies/water-view-strategy.ts
@@ -14,14 +14,22 @@ export class WaterViewStrategy extends ReactiveElement {
_config: LovelaceStrategyConfig,
hass: HomeAssistant
): Promise {
- const view: LovelaceViewConfig = {
- type: "sections",
- sections: [{ type: "grid", cards: [] }],
- };
-
const collectionKey =
_config.collection_key || DEFAULT_ENERGY_COLLECTION_KEY;
+ const view: LovelaceViewConfig = {
+ type: "sections",
+ max_columns: 3,
+ sections: [{ type: "grid", cards: [], column_span: 3 }],
+ footer: {
+ column_span: 1.1,
+ card: {
+ type: "energy-date-selection",
+ collection_key: collectionKey,
+ },
+ },
+ };
+
const energyCollection = getEnergyDataCollection(hass, {
key: collectionKey,
});
@@ -52,6 +60,9 @@ export class WaterViewStrategy extends ReactiveElement {
title: hass.localize("ui.panel.energy.cards.energy_water_graph_title"),
type: "energy-water-graph",
collection_key: collectionKey,
+ grid_options: {
+ columns: 24,
+ },
});
section.cards!.push({
title: hass.localize(
@@ -60,6 +71,9 @@ export class WaterViewStrategy extends ReactiveElement {
type: "energy-sources-table",
collection_key: collectionKey,
types: ["water"],
+ grid_options: {
+ columns: 12,
+ },
});
}
@@ -76,6 +90,9 @@ export class WaterViewStrategy extends ReactiveElement {
collection_key: collectionKey,
group_by_floor: showFloorsAndAreas,
group_by_area: showFloorsAndAreas,
+ grid_options: {
+ columns: 24,
+ },
});
}
diff --git a/src/panels/lovelace/components/hui-energy-period-selector.ts b/src/panels/lovelace/components/hui-energy-period-selector.ts
index 4580a9550e..ce45c682ec 100644
--- a/src/panels/lovelace/components/hui-energy-period-selector.ts
+++ b/src/panels/lovelace/components/hui-energy-period-selector.ts
@@ -125,7 +125,7 @@ export class HuiEnergyPeriodSelector extends SubscribeMixin(LitElement) {
}
private _measure() {
- this.narrow = this.offsetWidth < 450;
+ this.narrow = this.offsetWidth < 425;
this._collapseButtons = this.offsetWidth < 320;
}
diff --git a/src/panels/lovelace/views/hui-view-footer.ts b/src/panels/lovelace/views/hui-view-footer.ts
index 952c702355..02d2a447dc 100644
--- a/src/panels/lovelace/views/hui-view-footer.ts
+++ b/src/panels/lovelace/views/hui-view-footer.ts
@@ -241,8 +241,9 @@ export class HuiViewFooter extends LitElement {
box-sizing: content-box;
margin: 0 auto;
max-width: calc(
- var(--footer-column-span, 1) * var(--column-max-width, 500px) +
- (var(--footer-column-span, 1) - 1) * var(--column-gap, 32px)
+ var(--footer-column-span, 1) / var(--column-count, 1) * 100% +
+ (var(--footer-column-span, 1) - var(--column-count, 1)) /
+ var(--column-count, 1) * var(--column-gap, 32px)
);
}