RESTful 传感器
rest
传感器平台用于消费设备、应用程序或 Web 服务所暴露的 RESTful API
提示: 如果您想使用相同的端点创建多个 传感器
,请使用 RESTful 配置说明。
要启用此传感器,请在您的 configuration.yaml
configuration.yaml 文件是 Home Assistant 的主要配置文件。它列出了要加载的集成及其特定配置。在某些情况下,需要直接在 configuration.yaml 文件中手动编辑配置。大多数集成可以在 UI 中配置。 [Learn more] 文件中添加以下行以进行 GET 请求:
# 示例 configuration.yaml 条目
sensor:
- platform: rest
resource: http://IP_ADDRESS/ENDPOINT
或进行 POST 请求:
# 示例 configuration.yaml 条目
sensor:
- platform: rest
resource: http://IP_ADDRESS/ENDPOINT
method: POST
payload: '{ "device" : "heater" }'
或者基于模板的请求:
# 示例 configuration.yaml 条目
sensor:
- platform: rest
resource_template: http://IP_ADDRESS/{{ now().strftime('%Y-%m-%d') }}
headers:
Authorization: >
Bearer {{ states("input_text.my_access_token") }}
params:
start_date: >
{{ (now() - timedelta(days = 1)).strftime('%Y-%m-%d') }}
Configuration Variables
定义实体状态是否可用的模板。
设置设备的 类,更改设备状态和前端显示的图标。
请求的头部。
为 REST 传感器的图标定义模板。
从 JSON 字典结果中提取值的键的列表,然后设置为传感器属性。如果端点返回类型为 text/xml
、application/xml
或 application/xhtml+xml
的 XML,则会根据此 规范
一个 JSONPathjson_attributes
的位置。
为 REST 传感器的名称定义模板。
请求的查询参数。
为 REST 传感器的实体图片定义模板。
带有模板支持的包含值的资源或端点。
传感器的 state_class。
使用 resource
或 resource_template
之一。
curl
可以帮助您识别要在 Home Assistant 前端显示的变量。下面的示例显示运行 aREST
$ curl -X GET http://192.168.1.31/temperature/
{"temperature": 77, "id": "sensor02", "name": "livingroom", "connected": true}
预期的响应是一个字典或以字典作为第 0 个元素的列表。
使用模板
对于传入数据,值模板将传入的 JSON 或原始数据转换为有效的有效负载。
传入的有效负载使用可能的 JSON 值进行渲染,因此在渲染时,可以使用 value_json
访问基于 JSON 的有效负载中的属性,否则可以使用 value
变量来处理非 JSON 基础的数据。
此外,this
可以作为模板中的变量使用。this
属性指的是实体的当前 实体状态。
关于 this
变量的更多信息可以在 模板文档 中找到。
带 json 的示例值模板:
给定有效负载:
{ "state": "ON", "temperature": 21.902 }
模板 {{ value_json.temperature | round(1) }}
渲染为 21.9
。
示例
在本节中,您将找到一些关于如何使用此传感器的实际示例。
外部 IP 地址
您可以使用 ipify
sensor:
- platform: rest
name: "外部 IP"
resource: "https://api.ipify.org/?format=json"
value_template: "{{ value_json.ip }}"
- platform: rest
name: "外部 IPv6"
resource: "https://api6.ipify.org/?format=json"
value_template: "{{ value_json.ip }}"
从本地 Glances 实例获取单一值
glances 传感器对所有暴露的值执行完全相同的操作。
sensor:
- platform: rest
resource: http://IP_ADRRESS:61208/api/2/mem/used
name: 使用的内存
value_template: "{{ value_json.used| multiply(0.000000954) | round(0) }}"
unit_of_measurement: MB
从另一个 Home Assistant 实例获取值
Home Assistant API 暴露您附加传感器的数据。如果您运行多个未连接的 Home Assistant 实例,您仍然可以从中获取信息。
如果资源变量中的 Home Assistant 实例受到 API 密码保护,您可以将 ?api_password=YOUR_PASSWORD
附加到资源 URL 以进行身份验证,或使用 headers:
。
sensor:
- platform: rest
resource: http://IP_ADDRESS:8123/api/states/sensor.weather_temperature
name: 温度
value_template: "{{ value_json.state }}"
unit_of_measurement: "°C"
访问受 HTTP 身份验证保护的端点
REST 传感器支持 HTTP 身份验证和自定义头部。
sensor:
- platform: rest
resource: http://IP_ADDRESS:5000/sensor
username: ha1
password: test1
authentication: basic
headers:
User-Agent: Home Assistant
Content-Type: application/json
头部将包含所有相关细节。这也将使您能够访问受令牌保护的端点。
Content-Length: 1024
Host: IP_ADDRESS1:5000
Authorization: Basic aGExOnRlc3Qx
Accept-Encoding: identity
Content-Type: application/json
User-Agent: Home Assistant
如果您正在访问受到 Bearer
令牌保护的资源并在 Authorization
头中,您可以将令牌放在传感器配置的头字段中(不推荐)或将令牌存储在您的 secrets.yaml
文件中。在这种情况下,请确保在 secrets
文件中包括单词 Bearer
。
sensor:
- platform: rest
resource: http://IP_ADDRESS:5000/sensor
headers:
Authorization: !secret my_sensor_secret_token
secrets.yaml
文件的示例条目:
my_sensor_secret_token: Bearer gh_DHQIXKVf6Pr4H8Yqz8uhApk_mnV6Zje6Pr4H8Yqz8A8nCxz6SBghQdS51
使用 GitHub 获取 Home Assistant 的最新版本
此示例与 updater
集成非常相似,但信息是从 GitHub 获取的。
sensor:
- platform: rest
resource: https://api.github.com/repos/home-assistant/home-assistant/releases/latest
username: YOUR_GITHUB_USERNAME
password: YOUR_GITHUB_ACCESS_TOKEN
authentication: basic
value_template: "{{ value_json.tag_name }}"
headers:
Accept: application/vnd.github.v3+json
Content-Type: application/json
User-Agent: Home Assistant REST sensor
获取多个 JSON 属性并将其呈现为值
JSON Test
rest:
- resource: "http://date.jsontest.com/"
sensor:
- name: "时间"
value_template: "{{ value_json.time }}"
- name: "日期"
value_template: "{{ value_json.date }}"
- name: "毫秒"
value_template: "{{ value_json.milliseconds_since_epoch }}"
JSONPlaceholderxmltodict
转换为 JSON。您可能会发现 XMLtoDict 调试工具
sensor:
- platform: rest
name: JSON 用户
json_attributes_path: "$.[0].address"
json_attributes:
- street
- suite
- city
- zipcode
resource: https://jsonplaceholder.typicode.com/users
value_template: "{{ value_json[0].name }}"
此示例从 OpenWeatherMap
rest:
- resource: "https://api.openweathermap.org/data/2.5/weather?zip=80302,us&APPID=VERYSECRETAPIKEY"
sensor:
- name: "报告"
value_template: "{{ value_json['weather'][0]['description'].title() }}"
picture: "{{ 'https://openweathermap.org/img/w/' + value_json['weather'][0]['icon'].lower() + '.png' }}"
- name: "外部温度"
value_template: "{{ value_json['main']['temp'] - 273.15 }}"
unit_of_measurement: "°C"
- name: "外部压力"
value_template: "{{ value_json['main']['pressure'] }}"
unit_of_measurement: "hP"
- name: "外部湿度"
value_template: "{{ value_json['main']['humidity'] }}"
unit_of_measurement: "%"
此配置展示了如何从字典中提取多个值。该方法避免了对 REST 服务的频繁请求,因为结果只请求一次。通过使用模板传感器,可以从该单个请求中创建多个传感器。
{
"bedroom1": {
"temperature": 15.79,
"humidity": 55.78,
"battery": 5.26,
"timestamp": "2019-02-27T22:21:37Z"
},
"bedroom2": {
"temperature": 18.99,
"humidity": 49.81,
"battery": 5.08,
"timestamp": "2019-02-27T22:23:44Z"
},
"bedroom3": {
"temperature": 18.58,
"humidity": 47.95,
"battery": 5.15,
"timestamp": "2019-02-27T22:21:22Z"
}
}
rest:
resource: "http://<address_to_rest_service>"
sensor:
- name: "卧室1 温度"
value_template: "{{ value_json['bedroom1']['temperature'] }}"
device_class: temperature
unit_of_measurement: "°C"
- name: "卧室1 湿度"
value_template: "{{ value_json['bedroom1']['humidity'] }}"
device_class: humidity
unit_of_measurement: "%"
- name: "卧室1 电池"
value_template: "{{ value_json['bedroom1']['battery'] }}"
device_class: battery
unit_of_measurement: "V"
- name: "卧室2 温度"
value_template: "{{ value_json['bedroom2']['temperature'] }}"
device_class: temperature
unit_of_measurement: "°C"
下面的示例展示了如何从 Steamist Steam 浴室 Wi-Fi 接口的 XML 文件中提取多个值。该值用于创建多个传感器,而不必多次轮询端点。
rest:
# Steam 控制器
- resource: "http://192.168.1.105/status.xml"
scan_interval: 15
sensor:
- name: "蒸汽温度"
value_template: "{{ value_json['response']['temp0'] | regex_findall_index('([0-9]+)XF') }}"
unit_of_measurement: "°F"
- name: "蒸汽剩余时间"
value_template: "{{ value_json['response']['time0'] }}"
unit_of_measurement: "分钟"
rest_command:
set_steam_led:
url: http://192.168.1.105/leds.cgi?led={{ led }}
供参考,上述示例的端点的 XML 内容如下:
<?xml version="1.0" encoding="utf-8"?>
<response>
<scan>0</scan>
<ver>12556</ver>
<count>48</count>
<ssid>alexander</ssid>
<bss>
<valid>0</valid>
<name>0</name>
<privacy>0</privacy>
<wlan>0</wlan>
<strength>0</strength>
</bss>
<led0>0</led0>
<led1>0</led1>
<led2>0</led2>
<led3>0</led3>
<led4>0</led4>
<led5>0</led5>
<led6>0</led6>
<led7>0</led7>
<btn0>up</btn0>
<btn1>up</btn1>
<btn2>up</btn2>
<btn3>up</btn3>
<pot0>0</pot0>
<usr0>0</usr0>
<temp0>0x73XF0x73XF</temp0>
<time0> 0</time0>
</response>