3 个不稳定版本
0.2.0 | 2023年6月6日 |
---|---|
0.1.1 | 2023年4月25日 |
0.1.0 | 2023年3月30日 |
#1041 in 编码
37KB
750 行
Home Assistant REST
本项目为开发者提供了一套标准且易用的Rust API,用于调用Home Assistant REST API中的各种端点。它处理请求和响应的序列化和反序列化,并允许开发者使用提供的结构。目前该项目仍在积极开发中,API可能随时会发生变化。
示例用法
use home_assistant_rest::{get::StateEnum, Client};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let base_url = "REPLACE_WITH_HASS_BASE_URL";
let token = "REPLACE_WITH_ACCESS_TOKEN";
let client = Client::new(base_url, token)?;
let api_status = client.get_api_status().await?;
if api_status.message != "API running." {
println!("API is NOT running");
} else {
println!("API is running, getting status of \"sun.sun\" entity");
let state_entity = client.get_states_of_entity("sun.sun").await?;
if let Some(state) = state_entity.state {
match state {
StateEnum::Boolean(x) => println!("Value is boolean with value {}", x),
StateEnum::Decimal(x) => println!("Value is decimal with value {}", x),
StateEnum::Integer(x) => println!("Value is integer with value {}", x),
StateEnum::String(x) => println!("Value is string with value \"{}\"", x),
}
} else {
println!("Value was not provided");
}
}
Ok(())
}
API 状态
端点 | 请求类型 | 已实现 | 已测试 |
---|---|---|---|
/api/ |
GET | ✅ | ✅ |
/api/config |
GET | ✅ | ✅ |
/api/events |
GET | ✅ | ✅ |
/api/services |
GET | ✅ | ✅ |
/api/history/period/<timestamp> |
GET | ✅ | ✅ |
/api/logbook/<timestamp> |
GET | ✅ | ✅ |
/api/states |
GET | ✅ | ✅ |
/api/states/<entity_id> |
GET | ✅ | ✅ |
/api/error_log |
GET | ✅ | ✅ |
/api/camera_proxy/<camera entity_id> |
GET | ❌ | ❌ |
/api/calendars |
GET | ✅ | ✅ |
/api/calendars/<calendar entity_id> |
GET | ✅ | ✅ |
/api/states/<entity_id> |
POST | ✅ | ✅ |
/api/events/<event_type> |
POST | ❌ | ❌ |
/api/services/<domain>/<service> |
POST | ❌ | ❌ |
/api/template |
POST | ✅ | ✅ |
/api/config/core/check_config |
POST | ✅ | ✅ |
/api/intent/handle |
POST | ❌ | ❌ |
规范与实现之间的差异
Home Assistant提供了一个API规范,其中列出了各种不同端点的参数和输出。然而,在实现这个库时,我发现了一些规范与我本地的Home Assistant实例之间的不一致。以下是我迄今为止发现的一些差异。
- 对于
/api/services
端点,示例中将services
属性列为一个字符串列表。然而,在本地测试中,services
属性的实际类型实际上是一个映射。 - 对于
/api/camera_proxy/<camera entity_id>
端点,列出的唯一参数是相机ID和时间。然而,查看开发者工具面板,它显示还需要一个唯一的令牌才能检索图像。 - 非字符串类型的序列化,尤其是对
状态
属性的序列化。我见过许多实体将它们的状态报告为整数、十进制或布尔值,但当这种状态在JSON响应中序列化时,类型是字符串而不是底层类型。为了解决这个问题,在反序列化状态时,我们首先尝试将状态反序列化为底层类型,如果失败,则默认使用字符串类型。这不是理想的做法,因为解析各种不同类型成本较高。在将来,我会考虑添加一个选项,允许用户选择退出这个“功能”。
作者
Stefan Bossbaly
许可证
本项目采用MIT许可证 - 请参阅LICENSE文件以获取详细信息
致谢
依赖项
~5–19MB
~264K SLoC