7个不稳定版本 (3个重大更新)

0.4.0 2023年5月18日
0.3.0 2023年5月4日
0.2.2 2023年2月22日
0.2.1 2022年11月3日
0.1.1 2022年10月30日

#339硬件支持

Download history 4/week @ 2024-03-09 24/week @ 2024-03-30 25/week @ 2024-04-27

每月79次下载

MIT 许可证

1.5MB
22K SLoC

Zigbee2mqtt 类型

这是一个自动生成的库,包含可以将任何 zigbee2mqtt JSON MQTT 负载轻松反序列化的具体类型。

使用方法

为了加快编译时间,所有结构体都位于功能标志之后,这些标志被分为供应商等,例如,如果您使用的是小米的传感器,那么您需要在 Cargo.toml 中添加小米功能,例如:zigbee2mqtt-types = {features = ["xiaomi"]}

使用门接触传感器的示例(注意:调试也是一个功能)将 zigbee2mqtt-types = {features = ["debug", "xiaomi"]} 添加到 Cargo.toml 依赖项中

use zigbee2mqtt_types::xiaomi::ZigbeeMccgq11lm;

#[test]
fn contact_sensor_mccgq11lm() {
    //https://www.zigbee2mqtt.io/devices/MCCGQ11LM.html
    let json = serde_json::json!({
        "voltage": 2995,
        "battery": 97,
        "device_temperature": 19,
        "power_outage_count": 6,
        "linkquality": 247,
        "contact": false,
    })
    .to_string();
    let parsed: ZigbeeMccgq11lm =
        match serde_json::from_str(&json) {
            Ok(contact) => contact,
            Err(err) => {
                println!("{:?}", err);
                assert!(false);
            }
        };

    assert_eq!(2995, parsed.voltage);
    assert_eq!(97, parsed.battery);
    assert_eq!(19, parsed.device_temperature);
    assert_eq!(6, parsed.power_outage_count);
    assert_eq!(247, parsed.linkquality);
    assert_eq!(false, parsed.contact);
}

Zigbee2MQTT 有两个附加选项,可以将数据添加到 JSON 中,1) elapsed,2) last_seen。还有一个功能标志可以将这些也转换为它们的静态类型(注意:目前我正在将时间戳转换为 String,我不想进入将字符串转换为真实时间结构的转换,对此表示歉意。欢迎PR,但恐怕魔鬼正在等待)

  1. 可以启用 elapsed 功能,功能为 elapsed,并将其转换为 elapsed: u64
  2. Last_seen 可以是 iso_8601(本地和 UTC)或 epoch。注意:如果启用这些功能但 JSON 中不存在字段,则将抛出解析错误
    • 对于任意的 iso,请使用功能 last_seen_iso_8601,并将其转换为 last_seen: String
    • 对于纪元,使用特征 = last_seen_epoch,并将其转换为 last_seen: u64
    • 注意:last_seen 特征是互斥的,因为它们都解析到同一个结构体字段,只是类型不同,这违反了 Rust 的约定,但我没有看到同时启用两者的实际用例。如果您有一个,请打开一个 issue,我可以考虑一种方法使其不互斥

这些特征的表现如下

use zigbee2mqtt_types::xiaomi::ZigbeeMccgq11lm;

#[test]
fn contact_sensor_mccgq11lm_last_seen_iso_8601_elapsed() {
    //https://www.zigbee2mqtt.io/devices/MCCGQ11LM.html
    let json = serde_json::json!({
        "voltage": 2995,
        "battery": 97,
        "device_temperature": 19,
        "last_seen": "2022_10_20T11:55:07.199z", // zigbee2mqtt last_seen setting in ISO_8601 mode
        "power_outage_count": 6,
        "linkquality": 247,
        "contact": false,
        "elapsed": 2547593 // zigbee2mqtt elapsed setting true
    })
    .to_string();
    let parsed: ZigbeeMccgq11lm = match serde_json::from_str(&json) {
        Ok(contact) => contact,
        Err(err) => {
            println!("{:?}", err); // with last_seen or elapsed feature flags turned on a parse errr will be thrown if not present in the json
            assert!(false);
        }
    };

    assert_eq!("2022_10_20T11:55:07.199z", parsed.last_seen); // last_seen parsed to a string 
    assert_eq!(2547593, parsed.elapsed); // elapsed parsed to a u64

    assert_eq!(2995, parsed.voltage);
    assert_eq!(97, parsed.battery);
    assert_eq!(19, parsed.device_temperature);
    assert_eq!(6, parsed.power_outage_count);
    assert_eq!(247, parsed.linkquality);
    assert_eq!(false, parsed.contact);
}

一些注意事项

模型/供应商名称

一个注意事项是并非所有模型/供应商名称字符串都符合 Rust 的结构体/包命名约定,因此我需要对其进行一些转换。模型大致删除所有无效字符,并在它们前面加上 Zigbee。供应商用 _ 代替任何无效字符,例如模型的变化

"ZS057-D0Z" = "ZigbeeZs057Dd0z"
"BF 265" = "ZigbeeBf265"
"5110.40" = "Zigbee5110F40"
"MEAZON_BIZY_PLUG" = "ZigbeeMeazonUbizyUplug"

供应商的变化示例

"Eaton/Halo LED" = "eaton_halo_led"
"Custom devices (DiY)" = "custom_devices__diy_"
"Villeroy & Boch" = "villeroy___boch"
"J.XUAN" = "j_xuan"
 // the bellow is just removing non ascii chars I would personally prefer to swap them for similar ascii but for now I will _
"Müller Licht" = "m_ller_licht"
"Sinopé" = "sinop_"

执行转换的模型函数在此处:这里 执行转换的供应商函数在此处:这里

组合值

我目前不解析对象值,因此在 MQTT 上的飞利浦灯的 color 是 "color": {"hue":25,"saturation":95,"x":0.5267,"y":0.4133},简而言之,值中带有 { 的任何内容都不会被解析。这将在未来的更新中修复,我只是想减少范围

原因

在创建最近的项目时,我发现自己在定义结构体以消费 MQTT 负载时过于懒惰,鉴于它们已经在 Zigbee2MQTT 中定义,我就去寻找一种方法来程序化地生成它们。

贡献

所有开发都应该在顶级生成器二进制文件中,因为 zigbee-herdsman 更新得太频繁,以至于无法维护人工更新此库。目前我还没有使用 CI 来生成这个,但将来我计划这样做,以保持它与 zigbee-herdsman 保持同步

未来目标

  • 改进库文档
  • 某种类型的扩展,允许正确解析 last seen
  • 添加 get set 方法

最新问题可以在此处查看:https://gitlab.com/seam345/zigbee2mqtt-types/-/issues

依赖关系

~0.4–1.1MB
~26K SLoC