HomeAssistant REST API

前言

HomeAssistant(下文称”HA”)官方允许直接调用他的api去控制设备,所以我们不一定要通过HA控制设备,也可以直接发请求给api控制设备

REST API | Home Assistant Developer Docs

在HA中所有的设备都可以分为一下几类:

  • switch
  • button
  • light
  • cover
  • camera
  • climate
  • fan
  • . . .

HA对这些设备有着通用的控制方法

获取所有服务

通过下面的请求获取HA中所有的服务

1
2
3
curl --location '<http://host:8123/api/services>' \\
--header 'Content-Type: application/json' \\
--header 'Authorization: Bearer 【token】'

我写了一个python脚本去处理这个请求的响应的json数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import json
import pandas as pd
from tqdm import tqdm

from webserver.iot.iot_sdk.baidu_text_transAPI import baidu_trans

# 给定的JSON数据
json_data = [] # 在这里插入你的JSON数据
# 从JSON文件加载数据
with open("HomeAssistant_all_services.json", "r") as json_file:
json_data = json.load(json_file)

# 定义一个空的列表,用于保存处理后的数据
excel_data = []

# 统计总字段数
total_fields = sum(len(service_info.get("fields", {})) for item in json_data for service_info in item["services"].values())

# 使用tqdm创建进度条
with tqdm(total=total_fields, desc="Processing fields") as pbar:
# 遍历JSON数据
for item in json_data:
domain = item.get("domain")
# if domain != "light":
# continue
services = item.get("services")

for service_name, service_info in services.items():
service_description = service_info.get("description", "")
fields = service_info.get("fields", "")
field_name = ''
selector = ''
filter = ''
example = ''
advanced = ''
required = ''
name = ''
field_description = ''
service_description_translate = baidu_trans(service_description)
service_description = service_description + "\\n" + service_description_translate
if fields:
for field_name, field_info in fields.items():
selector = field_info.get("selector", "")
filter = field_info.get("filter", "")
example = field_info.get("example", "")
advanced = field_info.get("advanced", "")
required = field_info.get("required", "")
field_description = field_info.get("description", "")
field_description_translate = baidu_trans(field_description,)
field_description = field_description + "\\n" + field_description_translate
excel_data.append(
[domain, service_name, service_description, field_name, selector, filter, example, advanced,
required, field_description])
# 更新进度条
pbar.update(1)
else:
# 将数据添加到excel_data列表中
excel_data.append(
[domain, service_name, service_description, field_name, selector, filter, example, advanced, required,
field_description])
# 更新进度条
pbar.update(1)

# 创建一个pandas的DataFrame
df = pd.DataFrame(excel_data,
columns=["domain", "services", "service_description", "fields", "selector", "filter", "example",
"advanced", "required",
"field_description"])

# 将DataFrame保存为Excel文件
df.to_excel("HomeAssistant_all_services.xlsx", index=False)

经过整理产出如下

HomeAssistant_all_services.xlsx

调用特定域中的服务

/api/services//

例如打开窗帘到指定位置

1
2
3
4
5
6
7
curl --location '<http://host:8123/api/services/cover/set_cover_position>' \\
--header 'Authorization: Bearer [token]' \\
--header 'Content-Type: application/json' \\
--data '{
"entity_id": "cover.ccb5d199a64e_motor",
"position":43
}'