Skip to main content

自定义策略

在 Home Assistant 2021.5 中引入。

策略是生成仪表板配置的 JavaScript 函数。当用户尚未创建仪表板配置时,会显示一个自动生成的仪表板。该配置是使用内置策略生成的。

开发人员可以创建自己的策略来生成仪表板。策略可以使用所有 Home Assistant 的数据和用户的仪表板配置来创建新内容。

策略可以应用于整个配置或特定视图。

策略在 JavaScript 文件中定义为自定义元素,并通过 仪表板资源 包含。Home Assistant 将调用类中的静态函数,而不是将其渲染为自定义元素。

仪表板策略

仪表板策略负责生成完整的仪表板配置。这可以是从头开始,或基于传入的现有仪表板配置。

两个参数传递给策略:

描述
config仪表板策略配置。
hassHome Assistant 对象。
class StrategyDemo {
static async generate(config, hass) {
return {
title: "生成的仪表板",
views: [
{
"cards": [
{
"type": "markdown",
"content": `生成于 ${(new Date).toLocaleString()}`
}
]
}
]
};
}
}

customElements.define("ll-strategy-my-demo", StrategyDemo);

使用以下仪表板配置来使用该策略:

strategy:
type: custom:my-demo

视图策略

视图策略负责生成特定仪表板视图的配置。当用户打开特定视图时,调用策略。

两个参数传递给策略:

描述
config视图策略配置。
hassHome Assistant 对象。
class StrategyDemo {
static async generate(config, hass) {
return {
"cards": [
{
"type": "markdown",
"content": `生成于 ${(new Date).toLocaleString()}`
}
]
};
}
}

customElements.define("ll-strategy-my-demo", StrategyDemo);

使用以下仪表板配置来使用该策略:

views:
- strategy:
type: custom:my-demo

完整示例

建议仪表板策略将尽可能多的工作留给视图策略。这样仪表板将尽快显示给用户。这可以通过让仪表板生成依赖于其自身策略的视图配置来完成。

以下示例将为每个区域创建一个视图,每个视图在网格中显示该区域的所有实体。

class StrategyDashboardDemo {
static async generate(config, hass) {
// 查询我们需要的所有数据。通过将其存储在策略选项中,我们将使其对视图可用。
const [areas, devices, entities] = await Promise.all([
hass.callWS({ type: "config/area_registry/list" }),
hass.callWS({ type: "config/device_registry/list" }),
hass.callWS({ type: "config/entity_registry/list" }),
]);

// 每个视图都是基于策略,因此我们延迟渲染,直到打开它
return {
views: areas.map((area) => ({
strategy: {
type: "custom:my-demo",
area,
devices,
entities,
},
title: area.name,
path: area.area_id,
})),
};
}
}

class StrategyViewDemo {
static async generate(config, hass) {
const { area, devices, entities } = config;

const areaDevices = new Set();

// 查找与该区域链接的所有设备
for (const device of devices) {
if (device.area_id === area.area_id) {
areaDevices.add(device.id);
}
}

const cards = [];

// 查找所有直接链接到该区域的实体
// 或链接到与该区域链接的设备的实体。
for (const entity of entities) {
if (
entity.area_id
? entity.area_id === area.area_id
: areaDevices.has(entity.device_id)
) {
cards.push({
type: "button",
entity: entity.entity_id,
});
}
}

return {
cards: [
{
type: "grid",
cards,
},
],
};
}
}

customElements.define("ll-strategy-dashboard-my-demo", StrategyDashboardDemo);
customElements.define("ll-strategy-view-my-demo", StrategyViewDemo);

使用以下仪表板配置来使用该策略:

strategy:
type: custom:my-demo