#![allow(
clippy::all,
clippy::pedantic,
dead_code,
unreachable_pub,
unused_imports
)]
use crate::datatypes::SemanticTagStruct;
use crate::error::ClusterError;
use crate::types::Nullable;
use matter_codec::{ContainerKind, Element, Tag, TlvReader, TlvWriter, Value};
pub const CLUSTER_ID: u32 = 0x0200;
pub const CLUSTER_REVISION: u16 = 5;
pub mod command_id {}
pub mod attribute_id {
pub const MAX_PRESSURE: u32 = 0x0000;
pub const MAX_SPEED: u32 = 0x0001;
pub const MAX_FLOW: u32 = 0x0002;
pub const MIN_CONST_PRESSURE: u32 = 0x0003;
pub const MAX_CONST_PRESSURE: u32 = 0x0004;
pub const MIN_COMP_PRESSURE: u32 = 0x0005;
pub const MAX_COMP_PRESSURE: u32 = 0x0006;
pub const MIN_CONST_SPEED: u32 = 0x0007;
pub const MAX_CONST_SPEED: u32 = 0x0008;
pub const MIN_CONST_FLOW: u32 = 0x0009;
pub const MAX_CONST_FLOW: u32 = 0x000A;
pub const MIN_CONST_TEMP: u32 = 0x000B;
pub const MAX_CONST_TEMP: u32 = 0x000C;
pub const PUMP_STATUS: u32 = 0x0010;
pub const EFFECTIVE_OPERATION_MODE: u32 = 0x0011;
pub const EFFECTIVE_CONTROL_MODE: u32 = 0x0012;
pub const CAPACITY: u32 = 0x0013;
pub const SPEED: u32 = 0x0014;
pub const LIFETIME_RUNNING_HOURS: u32 = 0x0015;
pub const POWER: u32 = 0x0016;
pub const LIFETIME_ENERGY_CONSUMED: u32 = 0x0017;
pub const OPERATION_MODE: u32 = 0x0020;
pub const CONTROL_MODE: u32 = 0x0021;
}
bitflags::bitflags! {
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct Feature: u32 {
const PRSCONST = 1 << 0;
const PRSCOMP = 1 << 1;
const FLW = 1 << 2;
const SPD = 1 << 3;
const TEMP = 1 << 4;
const AUTO = 1 << 5;
const LOCAL = 1 << 6;
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum ControlModeEnum {
ConstantSpeed,
ConstantPressure,
ProportionalPressure,
ConstantFlow,
ConstantTemperature,
Automatic,
Unknown(u8),
}
impl ControlModeEnum {
#[must_use]
pub fn from_raw(v: u8) -> Self {
match v {
0 => Self::ConstantSpeed,
1 => Self::ConstantPressure,
2 => Self::ProportionalPressure,
3 => Self::ConstantFlow,
5 => Self::ConstantTemperature,
7 => Self::Automatic,
other => Self::Unknown(other),
}
}
#[must_use]
pub fn to_raw(self) -> u8 {
match self {
Self::ConstantSpeed => 0,
Self::ConstantPressure => 1,
Self::ProportionalPressure => 2,
Self::ConstantFlow => 3,
Self::ConstantTemperature => 5,
Self::Automatic => 7,
Self::Unknown(v) => v,
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum OperationModeEnum {
Normal,
Minimum,
Maximum,
Local,
Unknown(u8),
}
impl OperationModeEnum {
#[must_use]
pub fn from_raw(v: u8) -> Self {
match v {
0 => Self::Normal,
1 => Self::Minimum,
2 => Self::Maximum,
3 => Self::Local,
other => Self::Unknown(other),
}
}
#[must_use]
pub fn to_raw(self) -> u8 {
match self {
Self::Normal => 0,
Self::Minimum => 1,
Self::Maximum => 2,
Self::Local => 3,
Self::Unknown(v) => v,
}
}
}
bitflags::bitflags! {
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct PumpStatusBitmap: u16 {
const DEVICE_FAULT = 1 << 0;
const SUPPLY_FAULT = 1 << 1;
const SPEED_LOW = 1 << 2;
const SPEED_HIGH = 1 << 3;
const LOCAL_OVERRIDE = 1 << 4;
const RUNNING = 1 << 5;
const REMOTE_PRESSURE = 1 << 6;
const REMOTE_FLOW = 1 << 7;
const REMOTE_TEMPERATURE = 1 << 8;
}
}
pub fn decode_max_pressure(tlv: &[u8]) -> Result<Nullable<i16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Int(v),
..
}) => Ok(Nullable::Value(
i16::try_from(v).map_err(|_| ClusterError::InvalidLength("MaxPressure"))?,
)),
_ => Err(ClusterError::UnexpectedType {
context: "MaxPressure",
}),
}
}
pub fn decode_max_speed(tlv: &[u8]) -> Result<Nullable<u16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => Ok(Nullable::Value(
u16::try_from(v).map_err(|_| ClusterError::InvalidLength("MaxSpeed"))?,
)),
_ => Err(ClusterError::UnexpectedType {
context: "MaxSpeed",
}),
}
}
pub fn decode_max_flow(tlv: &[u8]) -> Result<Nullable<u16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => Ok(Nullable::Value(
u16::try_from(v).map_err(|_| ClusterError::InvalidLength("MaxFlow"))?,
)),
_ => Err(ClusterError::UnexpectedType { context: "MaxFlow" }),
}
}
pub fn decode_min_const_pressure(tlv: &[u8]) -> Result<Nullable<i16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Int(v),
..
}) => {
Ok(Nullable::Value(i16::try_from(v).map_err(|_| {
ClusterError::InvalidLength("MinConstPressure")
})?))
}
_ => Err(ClusterError::UnexpectedType {
context: "MinConstPressure",
}),
}
}
pub fn decode_max_const_pressure(tlv: &[u8]) -> Result<Nullable<i16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Int(v),
..
}) => {
Ok(Nullable::Value(i16::try_from(v).map_err(|_| {
ClusterError::InvalidLength("MaxConstPressure")
})?))
}
_ => Err(ClusterError::UnexpectedType {
context: "MaxConstPressure",
}),
}
}
pub fn decode_min_comp_pressure(tlv: &[u8]) -> Result<Nullable<i16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Int(v),
..
}) => {
Ok(Nullable::Value(i16::try_from(v).map_err(|_| {
ClusterError::InvalidLength("MinCompPressure")
})?))
}
_ => Err(ClusterError::UnexpectedType {
context: "MinCompPressure",
}),
}
}
pub fn decode_max_comp_pressure(tlv: &[u8]) -> Result<Nullable<i16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Int(v),
..
}) => {
Ok(Nullable::Value(i16::try_from(v).map_err(|_| {
ClusterError::InvalidLength("MaxCompPressure")
})?))
}
_ => Err(ClusterError::UnexpectedType {
context: "MaxCompPressure",
}),
}
}
pub fn decode_min_const_speed(tlv: &[u8]) -> Result<Nullable<u16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => {
Ok(Nullable::Value(u16::try_from(v).map_err(|_| {
ClusterError::InvalidLength("MinConstSpeed")
})?))
}
_ => Err(ClusterError::UnexpectedType {
context: "MinConstSpeed",
}),
}
}
pub fn decode_max_const_speed(tlv: &[u8]) -> Result<Nullable<u16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => {
Ok(Nullable::Value(u16::try_from(v).map_err(|_| {
ClusterError::InvalidLength("MaxConstSpeed")
})?))
}
_ => Err(ClusterError::UnexpectedType {
context: "MaxConstSpeed",
}),
}
}
pub fn decode_min_const_flow(tlv: &[u8]) -> Result<Nullable<u16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => {
Ok(Nullable::Value(u16::try_from(v).map_err(|_| {
ClusterError::InvalidLength("MinConstFlow")
})?))
}
_ => Err(ClusterError::UnexpectedType {
context: "MinConstFlow",
}),
}
}
pub fn decode_max_const_flow(tlv: &[u8]) -> Result<Nullable<u16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => {
Ok(Nullable::Value(u16::try_from(v).map_err(|_| {
ClusterError::InvalidLength("MaxConstFlow")
})?))
}
_ => Err(ClusterError::UnexpectedType {
context: "MaxConstFlow",
}),
}
}
pub fn decode_min_const_temp(tlv: &[u8]) -> Result<Nullable<i16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Int(v),
..
}) => {
Ok(Nullable::Value(i16::try_from(v).map_err(|_| {
ClusterError::InvalidLength("MinConstTemp")
})?))
}
_ => Err(ClusterError::UnexpectedType {
context: "MinConstTemp",
}),
}
}
pub fn decode_max_const_temp(tlv: &[u8]) -> Result<Nullable<i16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Int(v),
..
}) => {
Ok(Nullable::Value(i16::try_from(v).map_err(|_| {
ClusterError::InvalidLength("MaxConstTemp")
})?))
}
_ => Err(ClusterError::UnexpectedType {
context: "MaxConstTemp",
}),
}
}
pub fn decode_pump_status(tlv: &[u8]) -> Result<PumpStatusBitmap, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => Ok(PumpStatusBitmap::from_bits_retain(
u16::try_from(v).map_err(|_| ClusterError::InvalidLength("PumpStatus"))?,
)),
_ => Err(ClusterError::UnexpectedType {
context: "PumpStatus",
}),
}
}
pub fn decode_effective_operation_mode(tlv: &[u8]) -> Result<OperationModeEnum, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => Ok(OperationModeEnum::from_raw(u8::try_from(v).map_err(
|_| ClusterError::InvalidLength("EffectiveOperationMode"),
)?)),
_ => Err(ClusterError::UnexpectedType {
context: "EffectiveOperationMode",
}),
}
}
pub fn decode_effective_control_mode(tlv: &[u8]) -> Result<ControlModeEnum, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => Ok(ControlModeEnum::from_raw(u8::try_from(v).map_err(
|_| ClusterError::InvalidLength("EffectiveControlMode"),
)?)),
_ => Err(ClusterError::UnexpectedType {
context: "EffectiveControlMode",
}),
}
}
pub fn decode_capacity(tlv: &[u8]) -> Result<Nullable<i16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Int(v),
..
}) => Ok(Nullable::Value(
i16::try_from(v).map_err(|_| ClusterError::InvalidLength("Capacity"))?,
)),
_ => Err(ClusterError::UnexpectedType {
context: "Capacity",
}),
}
}
pub fn decode_speed(tlv: &[u8]) -> Result<Nullable<u16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => Ok(Nullable::Value(
u16::try_from(v).map_err(|_| ClusterError::InvalidLength("Speed"))?,
)),
_ => Err(ClusterError::UnexpectedType { context: "Speed" }),
}
}
pub fn decode_lifetime_running_hours(tlv: &[u8]) -> Result<Nullable<u32>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => Ok(Nullable::Value(u32::try_from(v).map_err(|_| {
ClusterError::InvalidLength("LifetimeRunningHours")
})?)),
_ => Err(ClusterError::UnexpectedType {
context: "LifetimeRunningHours",
}),
}
}
#[must_use]
#[allow(clippy::expect_used, clippy::missing_panics_doc)] pub fn encode_lifetime_running_hours(value: Nullable<u32>) -> Vec<u8> {
let mut buf = Vec::new();
let mut w = TlvWriter::new(&mut buf);
match value {
Nullable::Null => w.put_null(Tag::Anonymous).expect("infallible: vec writer"),
Nullable::Value(value) => {
w.put_uint(Tag::Anonymous, u64::from(value))
.expect("infallible: vec writer");
}
}
buf
}
pub fn decode_power(tlv: &[u8]) -> Result<Nullable<u32>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => Ok(Nullable::Value(
u32::try_from(v).map_err(|_| ClusterError::InvalidLength("Power"))?,
)),
_ => Err(ClusterError::UnexpectedType { context: "Power" }),
}
}
pub fn decode_lifetime_energy_consumed(tlv: &[u8]) -> Result<Nullable<u32>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => Ok(Nullable::Value(u32::try_from(v).map_err(|_| {
ClusterError::InvalidLength("LifetimeEnergyConsumed")
})?)),
_ => Err(ClusterError::UnexpectedType {
context: "LifetimeEnergyConsumed",
}),
}
}
#[must_use]
#[allow(clippy::expect_used, clippy::missing_panics_doc)] pub fn encode_lifetime_energy_consumed(value: Nullable<u32>) -> Vec<u8> {
let mut buf = Vec::new();
let mut w = TlvWriter::new(&mut buf);
match value {
Nullable::Null => w.put_null(Tag::Anonymous).expect("infallible: vec writer"),
Nullable::Value(value) => {
w.put_uint(Tag::Anonymous, u64::from(value))
.expect("infallible: vec writer");
}
}
buf
}
pub fn decode_operation_mode(tlv: &[u8]) -> Result<OperationModeEnum, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => Ok(OperationModeEnum::from_raw(
u8::try_from(v).map_err(|_| ClusterError::InvalidLength("OperationMode"))?,
)),
_ => Err(ClusterError::UnexpectedType {
context: "OperationMode",
}),
}
}
#[must_use]
#[allow(clippy::expect_used, clippy::missing_panics_doc)] pub fn encode_operation_mode(value: OperationModeEnum) -> Vec<u8> {
let mut buf = Vec::new();
let mut w = TlvWriter::new(&mut buf);
w.put_uint(Tag::Anonymous, u64::from(value.to_raw()))
.expect("infallible: vec writer");
buf
}
pub fn decode_control_mode(tlv: &[u8]) -> Result<ControlModeEnum, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => Ok(ControlModeEnum::from_raw(
u8::try_from(v).map_err(|_| ClusterError::InvalidLength("ControlMode"))?,
)),
_ => Err(ClusterError::UnexpectedType {
context: "ControlMode",
}),
}
}
#[must_use]
#[allow(clippy::expect_used, clippy::missing_panics_doc)] pub fn encode_control_mode(value: ControlModeEnum) -> Vec<u8> {
let mut buf = Vec::new();
let mut w = TlvWriter::new(&mut buf);
w.put_uint(Tag::Anonymous, u64::from(value.to_raw()))
.expect("infallible: vec writer");
buf
}