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 在 硬件支持
每月79次下载
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,但恐怕魔鬼正在等待)
- 可以启用 elapsed 功能,功能为
elapsed
,并将其转换为elapsed: u64
- 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,我可以考虑一种方法使其不互斥
- 对于任意的 iso,请使用功能
这些特征的表现如下
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