WebSocket API
Home Assistant 在 /api/websocket
处托管一个 WebSocket API。这个 API 可以用来将信息从 Home Assistant 实例流式传输到任何实现 WebSockets 的客户端。我们维护一个 JavaScript 库,我们在我们的前端中使用。
服务器状态
- 客户端连接。
- 认证阶段开始。
- 服务器发送
auth_required
消息。 - 客户端发送
auth
消息。 - 如果
auth
消息正确:进入第 3 步。 - 服务器发送
auth_invalid
。进入第 6 步。
- 服务器发送
- 发送
auth_ok
消息 - 认证阶段结束。
- 命令阶段开始。
- 客户端可以发送命令。
- 服务器可以发送先前命令的结果。
- 客户端或服务器断开会话。
在命令阶段,客户端会为每条消息附加一个唯一标识符。服务器将把这个标识符添加到每条消息中,以便客户端可以将每条消息与其来源关联起来。
消息格式
每个 API 消息都是一个包含 type
键的 JSON 序列化对象。在认证阶段之后,消息还必须包含一个 id
,这是一个整数,调用者可以用它来关联消息和响应。
认证消息示例:
{
"type": "auth",
"access_token": "ABCDEFGHIJKLMNOPQ"
}
{
"id": 5,
"type":"event",
"event":{
"data":{},
"event_type":"test_event",
"time_fired":"2016-11-26T01:37:24.265429+00:00",
"origin":"LOCAL"
}
}
认证阶段
当客户端连接到服务器时,服务器会发送 auth_required
。
{
"type": "auth_required",
"ha_version": "2021.5.3"
}
客户端的第一条消息应该是认证消息。您可以使用访问令牌进行身份验证。
{
"type": "auth",
"access_token": "ABCDEFGH"
}
如果客户端提供了有效的身份验证,认证阶段将通过服务器发送 auth_ok
消息而完成:
{
"type": "auth_ok",
"ha_version": "2021.5.3"
}
如果数据不正确,服务器将回复 auth_invalid
消息并断开会话。
{
"type": "auth_invalid",
"message": "无效的密码"
}
功能启用阶段
支持需要启用的功能的客户端应在其第一条消息中("id": 1
)发送以下格式的消息:
{
"id": 1,
"type": "supported_features",
"features": { coalesce_messages: 1 }
}
截至目前,唯一支持的功能是 'coalesce_messages',它会导致消息以批量的方式而非单独发送。
命令阶段
在此阶段,客户端可以向服务器发出命令。服务器将对每个命令响应一条 result
消息,指示命令何时完成,以及是否成功,以及命令的上下文。
{
"id": 6,
"type": "result",
"success": true,
"result": {
"context": {
"id": "326ef27d19415c60c492fe330945f954",
"parent_id": null,
"user_id": "31ddb597e03147118cf8d2f8fbea5553"
}
}
}
订阅事件
命令 subscribe_events
将使您的客户端订阅事件总线。您可以监听所有事件或特定事件类型。如果您希望监听多个事件类型,则必须发送多个 subscribe_events
命令。
{
"id": 18,
"type": "subscribe_events",
// 可选
"event_type": "state_changed"
}
服务器将通过结果消息响应,以指示订阅处于活动状态。
{
"id": 18,
"type": "result",
"success": true,
"result": null
}
对于每个匹配的事件,服务器将发送一条类型为 event
的消息。消息中的 id
将指向原始 listen_event
命令的 id
。
{
"id": 18,
"type":"event",
"event":{
"data":{
"entity_id":"light.bed_light",
"new_state":{
"entity_id":"light.bed_light",
"last_changed":"2016-11-26T01:37:24.265390+00:00",
"state":"on",
"attributes":{
"rgb_color":[
254,
208,
0
],
"color_temp":380,
"supported_features":147,
"xy_color":[
0.5,
0.5
],
"brightness":180,
"white_value":200,
"friendly_name":"床灯"
},
"last_updated":"2016-11-26T01:37:24.265390+00:00",
"context": {
"id": "326ef27d19415c60c492fe330945f954",
"parent_id": null,
"user_id": "31ddb597e03147118cf8d2f8fbea5553"
}
},
"old_state":{
"entity_id":"light.bed_light",
"last_changed":"2016-11-26T01:37:10.466994+00:00",
"state":"off",
"attributes":{
"supported_features":147,
"friendly_name":"床灯"
},
"last_updated":"2016-11-26T01:37:10.466994+00:00",
"context": {
"id": "e4af5b117137425e97658041a0538441",
"parent_id": null,
"user_id": "31ddb597e03147118cf8d2f8fbea5553"
}
}
},
"event_type":"state_changed",
"time_fired":"2016-11-26T01:37:24.265429+00:00",
"origin":"LOCAL",
"context": {
"id": "326ef27d19415c60c492fe330945f954",
"parent_id": null,
"user_id": "31ddb597e03147118cf8d2f8fbea5553"
}
}
}