Commiting Strategy

This commit is contained in:
Zack Arnett 2021-11-17 20:17:03 -06:00
parent 1ebd2fb9f1
commit f3d018f047
4 changed files with 96 additions and 5 deletions

View File

@ -345,7 +345,8 @@ export const generateDefaultViewConfig = (
entityEntries: EntityRegistryEntry[], entityEntries: EntityRegistryEntry[],
entities: HassEntities, entities: HassEntities,
localize: LocalizeFunc, localize: LocalizeFunc,
energyPrefs?: EnergyPreferences energyPrefs?: EnergyPreferences,
areaOnly?: boolean
): LovelaceViewConfig => { ): LovelaceViewConfig => {
const states = computeDefaultViewStates(entities, entityEntries); const states = computeDefaultViewStates(entities, entityEntries);
const path = "default_view"; const path = "default_view";
@ -373,7 +374,7 @@ export const generateDefaultViewConfig = (
path, path,
title, title,
icon, icon,
splittedByAreas.otherEntities, areaOnly ? {} : splittedByAreas.otherEntities,
groupOrders groupOrders
); );
@ -390,7 +391,7 @@ export const generateDefaultViewConfig = (
); );
}); });
if (energyPrefs) { if (energyPrefs && !areaOnly) {
// Distribution card requires the grid to be configured // Distribution card requires the grid to be configured
const grid = energyPrefs.energy_sources.find( const grid = energyPrefs.energy_sources.find(
(source) => source.type === "grid" (source) => source.type === "grid"

View File

@ -0,0 +1,82 @@
import { STATE_NOT_RUNNING } from "home-assistant-js-websocket";
import { subscribeOne } from "../../../common/util/subscribe-one";
import { subscribeAreaRegistry } from "../../../data/area_registry";
import { subscribeDeviceRegistry } from "../../../data/device_registry";
import { subscribeEntityRegistry } from "../../../data/entity_registry";
import { LovelaceViewConfig } from "../../../data/lovelace";
import {
LovelaceDashboardStrategy,
LovelaceViewStrategy,
} from "./get-strategy";
let subscribedRegistries = false;
export class AreaOverviewStrategy {
static async generateView(
info: Parameters<LovelaceViewStrategy["generateView"]>[0]
): ReturnType<LovelaceViewStrategy["generateView"]> {
const hass = info.hass;
const view: LovelaceViewConfig = { cards: [] };
if (hass.config.state === STATE_NOT_RUNNING) {
return {
cards: [{ type: "starting" }],
};
}
if (hass.config.safe_mode) {
return {
cards: [{ type: "safe-mode" }],
};
}
// We leave this here so we always have the freshest data.
if (!subscribedRegistries) {
subscribedRegistries = true;
subscribeAreaRegistry(hass.connection, () => undefined);
subscribeDeviceRegistry(hass.connection, () => undefined);
subscribeEntityRegistry(hass.connection, () => undefined);
}
const [areaEntries] = await Promise.all([
subscribeOne(hass.connection, subscribeAreaRegistry),
]);
areaEntries.forEach((area) => {
view.cards?.push({
type: "area",
area: area.area_id,
image:
"https://www.boardandvellum.com/wp-content/uploads/2019/09/16x9-private_offices_vs_open_office_concepts-1242x699.jpg",
});
});
return view;
}
static async generateDashboard(
info: Parameters<LovelaceDashboardStrategy["generateDashboard"]>[0]
): ReturnType<LovelaceDashboardStrategy["generateDashboard"]> {
const [areaEntries] = await Promise.all([
subscribeOne(info.hass.connection, subscribeAreaRegistry),
]);
const areaViews = areaEntries.map((area) => ({
strategy: {
type: "original-states",
options: { areaId: area.area_id },
},
title: area.name,
}));
return {
title: info.hass.config.location_name,
views: [
{
strategy: { type: "area-overview" },
title: "Overview",
},
...areaViews,
],
};
}
}

View File

@ -29,6 +29,8 @@ const strategies: Record<
(await import("./original-states-strategy")).OriginalStatesStrategy, (await import("./original-states-strategy")).OriginalStatesStrategy,
energy: async () => energy: async () =>
(await import("../../energy/strategies/energy-strategy")).EnergyStrategy, (await import("../../energy/strategies/energy-strategy")).EnergyStrategy,
"area-overview": async () =>
(await import("./area-overview-strategy")).AreaOverviewStrategy,
}; };
const getLovelaceStrategy = async < const getLovelaceStrategy = async <

View File

@ -18,6 +18,7 @@ export class OriginalStatesStrategy {
info: Parameters<LovelaceViewStrategy["generateView"]>[0] info: Parameters<LovelaceViewStrategy["generateView"]>[0]
): ReturnType<LovelaceViewStrategy["generateView"]> { ): ReturnType<LovelaceViewStrategy["generateView"]> {
const hass = info.hass; const hass = info.hass;
const areaId = info.view.strategy?.options?.areaId;
if (hass.config.state === STATE_NOT_RUNNING) { if (hass.config.state === STATE_NOT_RUNNING) {
return { return {
@ -66,12 +67,17 @@ export class OriginalStatesStrategy {
// User can override default view. If they didn't, we will add one // User can override default view. If they didn't, we will add one
// that contains all entities. // that contains all entities.
const view = generateDefaultViewConfig( const view = generateDefaultViewConfig(
areaEntries, !areaId
? areaEntries
: areaEntries.filter(
(area) => area.area_id === info.view.strategy?.options?.area
),
deviceEntries, deviceEntries,
entityEntries, entityEntries,
hass.states, hass.states,
localize, localize,
energyPrefs energyPrefs,
Boolean(info.view.strategy?.options?.area)
); );
// Add map of geo locations to default view if loaded // Add map of geo locations to default view if loaded