服务操作在 async_setup 中注册
理由
集成可以向 Home Assistant 添加自己的服务操作。
在过去,这些操作经常在 async_setup_entry
方法中注册,并在 async_unload_entry
方法中移除。
这样导致的结果是,服务操作仅在存在加载的条目时可用。
这并不理想,因为这样我们无法验证用户创建的使用这些服务操作的自动化,因为配置条目可能无法加载。
我们更希望集成在 async_setup
方法中设置它们的服务操作。
这样,如果目标配置条目未加载,我们可以让用户知道服务操作为什么没有工作。
验证应该发生在服务操作内部,并在输入无效时抛出 ServiceValidationError
。
示例实现
以下示例是一个在 async_setup
方法中注册服务操作的代码片段。
在此示例中,服务调用需要一个配置条目 ID 作为参数。
这用于首先获取配置条目,然后检查其是否已加载。
如果配置条目不存在或找到的配置条目未加载,我们将引发相关错误并显示给用户。
__init__py
:
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""设置我的集成."""
async def async_get_schedule(call: ServiceCall) -> ServiceResponse:
"""获取特定范围的日程安排."""
if not (entry := hass.config_entries.async_get_entry(call.data[ATTR_CONFIG_ENTRY_ID])):
raise ServiceValidationError("条目未找到")
if entry.state is not ConfigEntryState.LOADED:
raise ServiceValidationError("条目未加载")
client = cast(MyConfigEntry, entry).runtime_data
...
hass.services.async_register(
DOMAIN,
SERVICE_GET_SCHEDULE,
async_get_schedule,
schema=SERVICE_GET_SCHEDULE_SCHEMA,
supports_response=SupportsResponse.ONLY,
)
其他资源
有关如何设置服务操作的更多信息,请参见 服务文档。
例外情况
此规则没有例外。
相关规则
- action-exceptions: 服务操作在遇到失败时引发异常