3 个不稳定版本

0.2.0 2023年6月6日
0.1.1 2023年4月25日
0.1.0 2023年3月30日

#1041 in 编码

MIT 许可证

37KB
750

Home Assistant REST crates.io

本项目为开发者提供了一套标准且易用的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实例之间的不一致。以下是我迄今为止发现的一些差异。

  1. 对于/api/services端点,示例中将services属性列为一个字符串列表。然而,在本地测试中,services属性的实际类型实际上是一个映射。
  2. 对于/api/camera_proxy/<camera entity_id>端点,列出的唯一参数是相机ID和时间。然而,查看开发者工具面板,它显示还需要一个唯一的令牌才能检索图像。
  3. 非字符串类型的序列化,尤其是对状态属性的序列化。我见过许多实体将它们的状态报告为整数、十进制或布尔值,但当这种状态在JSON响应中序列化时,类型是字符串而不是底层类型。为了解决这个问题,在反序列化状态时,我们首先尝试将状态反序列化为底层类型,如果失败,则默认使用字符串类型。这不是理想的做法,因为解析各种不同类型成本较高。在将来,我会考虑添加一个选项,允许用户选择退出这个“功能”。

作者

Stefan Bossbaly

许可证

本项目采用MIT许可证 - 请参阅LICENSE文件以获取详细信息

致谢

依赖项

~5–19MB
~264K SLoC