#zigbee2mqtt #zigbee2mqtt-json #type #lib #convert #definition #messages

已删除 zigbee2mqtt-types-generator

zigbee2mqtt JSON消息的结构定义

0.2.2 2023年5月4日

#36 in #zigbee2mqtt-json

MIT 许可协议

120KB
2.5K 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,
        "last_seen": "2022_10_20T11:55:07.199z", // this is a zigbee2mqtt setting, todo I need to make a nice way to handle this
        "power_outage_count": 6,
        "linkquality": 247,
        "contact": false,
        "elapsed": 2547593 // another zigbee2mqtt addon setting
    })
    .to_string();
    let parsed: zigbee2mqtt_types::xiaomi::ZigbeeMccgq11lm =
        match serde_json::from_str(&json) {
            Ok(contact) => contact,
            Err(err) => {
                println!("{:?}", err);
                assert!(false);
                unimplemented!()
            }
        };

    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 有效负载方面有点懒散,并且鉴于它们已经在 Zigbee2MQTT 中定义,所以我寻找了一种程序生成它们的方法。

贡献

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

未来目标

  • 改进库文档
  • 某种类型的扩展,以便可以正确解析“最后看到”
  • 添加获取和设置方法

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

依赖项

~4.5–6.5MB
~120K SLoC