use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Protocol {
Zigbee,
ZWave,
Thread,
Matter,
}
impl std::fmt::Display for Protocol {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Protocol::Zigbee => write!(f, "Zigbee"),
Protocol::ZWave => write!(f, "Z-Wave"),
Protocol::Thread => write!(f, "Thread"),
Protocol::Matter => write!(f, "Matter"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Capability {
OnOff,
Dimming,
ColorTemperature,
ColorRgb,
Temperature,
Humidity,
Pressure,
Motion,
Contact,
Lock,
Thermostat,
EnergyMonitoring,
WindowCovering,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HomeDevice {
pub id: String,
pub name: Option<String>,
pub protocol: Protocol,
pub manufacturer: Option<String>,
pub model: Option<String>,
pub firmware_version: Option<String>,
pub capabilities: Vec<Capability>,
}
impl HomeDevice {
pub fn new(id: impl Into<String>, protocol: Protocol) -> Self {
Self {
id: id.into(),
name: None,
protocol,
manufacturer: None,
model: None,
firmware_version: None,
capabilities: Vec::new(),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum AttributeValue {
Bool(bool),
U8(u8),
U16(u16),
U32(u32),
U64(u64),
I8(i8),
I16(i16),
I32(i32),
F32(f32),
F64(f64),
String(String),
Bytes(Vec<u8>),
Null,
}
impl std::fmt::Display for AttributeValue {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
AttributeValue::Bool(v) => write!(f, "{v}"),
AttributeValue::U8(v) => write!(f, "{v}"),
AttributeValue::U16(v) => write!(f, "{v}"),
AttributeValue::U32(v) => write!(f, "{v}"),
AttributeValue::U64(v) => write!(f, "{v}"),
AttributeValue::I8(v) => write!(f, "{v}"),
AttributeValue::I16(v) => write!(f, "{v}"),
AttributeValue::I32(v) => write!(f, "{v}"),
AttributeValue::F32(v) => write!(f, "{v}"),
AttributeValue::F64(v) => write!(f, "{v}"),
AttributeValue::String(v) => write!(f, "{v}"),
AttributeValue::Bytes(v) => write!(f, "0x{}", hex_encode(v)),
AttributeValue::Null => write!(f, "null"),
}
}
}
fn hex_encode(bytes: &[u8]) -> String {
bytes.iter().map(|b| format!("{b:02x}")).collect()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum HomeAutoEvent {
DeviceJoined(HomeDevice),
DeviceLeft { id: String, protocol: Protocol },
AttributeChanged {
device_id: String,
protocol: Protocol,
cluster: String,
attribute: String,
value: AttributeValue,
},
CommandSent {
device_id: String,
protocol: Protocol,
cluster: String,
command: String,
},
}