This is an auto generated lib containing concrete types that can easily serialise/deserialiwe any json MQTT payloads from zigbee2mqtt.
To speed up compile time all structs are behind feature flags, these are split into vendors e.g. if you are using a
sensor by xiaomi then you will need to add the xiaomi feature to your Cargo.toml like zigbee2mqtt-types = {features = ["xiaomi"]}
Example of using a door contact sensor debug is also a feature so
for this to compile the following Cargo.toml line is needed zigbee2mqtt-types = {features = ["debug", "xiaomi"]}
```rust
use zigbee2mqtt_types::vendors::xiaomi::ZigbeeMccgq11lm;
fn contactsensormccgq11lm() { //https://www.zigbee2mqtt.io/devices/MCCGQ11LM.html let json = "".toowned() + "{\n" + " \"voltage\": 2995,\n" + " \"battery\": 97,\n" + " \"devicetemperature\": 19,\n" + " \"poweroutagecount\": 6,\n" + " \"linkquality\": 247,\n" + " \"contact\": false,\n" + "}"; let parsed: ZigbeeMccgq11lm = match serdejson::fromstr(&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);
} ```
Last gotcha is all not all model/vendor names strings conform to Rusts struct/package naming convention, so I needed
todo some transformation to them. Models roughtly remove all invalid chars and have Zigbee infront of them. Vendors have
an _
in place of any invalid chars
example of changes to models
txt
"ZS057-D0Z" = "ZigbeeZs057Dd0z"
"BF 265" = "ZigbeeBf265"
"5110.40" = "Zigbee5110F40"
"MEAZON_BIZY_PLUG" = "ZigbeeMeazonUbizyUplug"
example of changes to vendors
txt
"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_"
Model function that does conversion is here Vendor function that does conversion is here
While creating a recent project I found myself being lazy with how I was defining my structs to consume MQTT payloads and given they are already defined in Zigbee2MQTT I went looking for a way to generate them programmatically.
All development should be in the generator binary as zigbee-herdsman updates too frequently to maintain human updating of this lib.
Up to date issues can be seen here https://gitlab.com/seam345/zigbee2mqtt-types/-/issues