状态
Home Assistant 跟踪状态机中实体的状态。状态机的要求非常少:
- 每个状态与通过实体 ID 识别的实体相关。这个 ID 由一个域和一个对象 ID 组成。例如
light.kitchen_ceiling
。您可以随意组合域和对象 ID,甚至可以覆盖现有状态。 - 每个状态都有一个主要属性描述实体的状态。对于灯来说,这个状态可以是“开”和“关”。您可以在状态中存储任何您想要的内容,只要它是字符串(如果不是,将被转换)。
- 您可以通过设置属性存储更多关于实体的信息。属性是一个字典,可以包含您想要的任何数据。唯一的要求是它必须是 JSON 可序列化的,因此您只能使用数字、字符串、字典和列表。
在组件中使用状态
这是一个关于如何创建和设置状态的简单教程/示例。我们将在一个叫做 "hello_state" 的组件中进行工作。此组件的目的是在前端显示给定的文本。
要开始,请创建文件 <config dir>/custom_components/hello_state.py
并复制以下示例代码。
"""
支持在前端显示文本。
有关此组件的更多详细信息,请参考文档:
https://developers.home-assistant.io/docs/dev_101_states
"""
import logging
_LOGGER = logging.getLogger(__name__)
DOMAIN = "hello_state"
def setup(hass, config):
"""设置 Hello State 组件。 """
_LOGGER.info("‘hello state’ 组件已经准备好!")
return True
-
在文件头部,我们决定添加一些细节:一个简短的描述和文档的链接。
-
我们希望进行一些日志记录。这意味着我们导入 Python 的日志模块并创建一个别名。
-
组件名称等同于域名。
-
setup
函数将负责初始化我们的组件。 该组件只会写一条日志消息。请记住,以后您有多个严重程度的选项:_LOGGER.info(msg)
_LOGGER.warning(msg)
_LOGGER.error(msg)
_LOGGER.critical(msg)
_LOGGER.exception(msg)
-
如果一切正常,我们返回
True
。
将组件添加到您的 configuration.yaml
文件中。
hello_state:
在启动或重启 Home Assistant 后,组件将在日志中创建一个条目。
16-03-12 14:16:42 INFO (MainThread) [custom_components.hello_state] ‘hello state’ 组件已经准备好!
下一步是引入配置选项。用户可以通过 configuration.yaml
向我们的组件传递配置选项。为了使用它们,我们将使用传入的 config
变量到我们的 setup
方法中。
import logging
_LOGGER = logging.getLogger(__name__)
DOMAIN = "hello_state"
CONF_TEXT = "text"
DEFAULT_TEXT = "没有文本!"
def setup(hass, config):
"""设置 Hello State 组件。 """
# 从配置中获取文本。如果未提供名称,则使用 DEFAULT_TEXT。
text = config[DOMAIN].get(CONF_TEXT, DEFAULT_TEXT)
# 状态格式为 DOMAIN.OBJECT_ID
hass.states.set("hello_state.Hello_State", text)
return True
要使用我们组件的最新功能,请更新您的 configuration.yaml
文件中的条目。
hello_state:
text: '你好,世界!'
由于 DEFAULT_TEXT
变量,即使在 configuration.yaml
文件中未使用 text:
字段,组件仍然会启动。通常会有一些必需的变量。检查是否提供了所有的强制配置变量很重要。如果没有,设置应该失败。我们将使用 voluptuous
作为辅助工具来实现这一点。下一段列出了重要部分。
import voluptuous as vol
import homeassistant.helpers.config_validation as cv
CONFIG_SCHEMA = vol.Schema(
{DOMAIN: vol.Schema({vol.Required(CONF_TEXT): cv.string,})}, extra=vol.ALLOW_EXTRA
)
现在,当配置中缺少 text:
时,Home Assistant 会提醒用户并不会设置您的组件。
在启动或重启 Home Assistant 后,如果 configuration.yaml
文件是最新的,组件将在前端可见。
为了在一个平台上暴露属性,您需要在实体类中定义一个名为 extra_state_attributes
的属性,该属性将返回一个属性字典:
@property
def extra_state_attributes(self):
"""返回实体特定的状态属性。"""
return self._attributes
实体还有一个类似的属性 state_attributes
,该属性不应被集成覆盖。此属性由基础实体组件用于向状态添加标准属性集。示例:灯光组件使用 state_attributes
将亮度添加到状态字典中。如果您正在设计一个新的集成,您应该定义 extra_state_attributes
。
要让您的集成包含在 Home Assistant 发布中,请按照 提交您的工作 部分中描述的步骤进行操作。基本上,您只 需将您的集成移动到您的分叉的 homeassistant/component/
目录中并创建一个拉取请求。