验证输入
configuration.yaml
文件包含组件和平台的配置选项。我们使用voluptuous来确保用户提供的配置是有效的。为了设置平台或组件,有些条目是可选的,或者可能是必需的。其他类型必须是已定义的类型或来自已定义的列表。
我们对配置进行了测试,以确保用户有良好的体验,并尽量减少Home Assistant运行之前平台或组件设置出现问题时的通知。
除了voluptuous的默认类型外,还有许多自定义类型可供选择。要了解概述,请查看config_validation.py helper。
- Types:
string
,byte
, andboolean
- Entity ID:
entity_id
andentity_ids
- Numbers:
small_float
andpositive_int
- Time:
time
,time_zone
- Misc:
template
,slug
,temperature_unit
,latitude
,longitude
,isfile
,sun_event
,ensure_list
,port
,url
, andicon
要使用MQTT,验证平台,可以使用valid_subscribe_topic
和valid_publish_topic
。
请记住以下几点:
- 使用在
const.py
中定义的常量 - 从要集成的集成中导入
PLATFORM_SCHEMA
并扩展它。 - 优先顺序是必需的,其次是可选的
- 可选配置键的默认值需要是有效值。Don’t use a default which is
None
likevol.Optional(CONF_SOMETHING, default=None): cv.string
, set the default todefault=''
if required.
片段
默认名称
如果用户没有提供使用的名称,通常为传感器设置一个默认值。
1 | DEFAULT_NAME = "Sensor name" |
限制值
1 | DEFAULT_METHOD = "GET" |
端口
All port numbers are from a range of 1 to 65535.
1 | DEFAULT_PORT = 993 |
列表
如果传感器有一个预定义的可用选项列表,测试以确保配置条目与列表匹配。
1 | SENSOR_TYPES = { |
向代码中添加类型提示
略
获取实例URL
在某些情况下,集成需要知道匹配当前用例所需需求的用户Home Assistant实例的URL。例如,导致设备需要向Home Assistant通信数据,或者外部服务或设备从Home Assistant获取数据(例如,生成的图像或声音文件)。
考虑到用户可以有一堆不同的URL可用,获取一个实例URL可能相当复杂:
- 一个用户配置的内部家庭网络URL。
- 自动检测的内部家庭网络URL。
- 一个用户配置的,公共可访问的,从互联网工作的外部URL。
- 一个由Nabu Casa提供的家庭助理云的URL,以防用户有一个订阅。
url可以在非标准端口(例如,不是80或443)上提供,并且可以使用或不使用SSL (http:// vs https://).)
,这增加了额外的复杂性
幸运的是,HA提供了一个助手方法来缓解这一点。
URL 助手
Home Assistant提供了一个网络助手方法来获取与集成需求匹配的实例URL,该方法称为get_url。
helper方法的签名:
1 | # homeassistant.helpers.network.get_url |
方法的不同参数:
- require_current_request要求返回的URL与用户当前在浏览器中使用的URL匹配。如果当前没有请求,则会引发错误。
- require_ssl:要求返回的URL以使用https方案。
- require_standard_port:要求返回的URL使用标准HTTP端口。因此,http方案需要端口80,https方案需要端口443。
- allow_internal:允许该URL为用户的内部设置URL或检测到的内网URL。如果只需要外部URL,则将此设置为False。
- allow_external:允许URL为用户设置的外部URL或Home Assistant云URL。如果只需要一个内部URL,则将此设置为False。
- allow_cloud:允许返回Home Assistant Cloud URL,如果不需要云URL,则设置为False。
- allow_ip:允许URL的主机部分为IP地址,在用例不可用的情况下设置为False。
- prefer_external:默认情况下,我们更喜欢内部url而不是外部url。将此选项设置为True将逻辑转换为外部URL而不是内部URL。
- prefer_cloud:默认情况下,首选由用户设置的外部URL,但是,在极少数情况下,云URL可能更可靠。将此选项设置为True将优先使用Home Assistant Cloud URL,而不是用户定义的外部URL。
默认行为
默认情况下,不传递附加参数(get_url(hass)),它将尝试:
- 获取用户设置的内部URL,或者如果不可用,尝试从网络接口检测一个(基于http设置)。
- 如果一个内部URL失败,它将尝试获取一个外部URL。它优先使用用户设置的外部URL,以防失败;获得一个家庭助理云URL,如果是可用的。
默认的目标是:允许任何URL,但最好是本地URL,没有要求。
使用示例
使用helper的最基本的例子:
1 | from homeassistant.helpers.network import get_url |
这个调用helper方法的示例将返回一个内部URL,最好是用户集或检测到的URL。如果不能提供,它将尝试用户的外部URL。最后,如果用户没有设置,它将尝试使用Home Assistant云URL。
如果绝对没有可用的URL(或者没有匹配给定需求的URL),将引发一个异常:NoURLAvailableError
。
1 | from homeassistant.helpers import network |
上面的例子展示了URL帮助器的更复杂的用法。在这种情况下,请求的URL可能不是内部地址,URL可能不包含IP地址,需要SSL,必须在标准端口上提供服务。
如果没有可用的,则可以捕获和处理NoURLAvailableError异常。