matc/clusters/codec/
concentration_measurement.rs

1//! Generated Matter TLV encoders and decoders for Concentration Measurement Clusters
2//! Cluster ID: 0x0000
3//! 
4//! This file is automatically generated from ConcentrationMeasurement.xml
5
6use crate::tlv;
7use anyhow;
8use serde_json;
9
10
11// Attribute decoders
12
13/// Decode MeasuredValue attribute (0x0000)
14pub fn decode_measured_value(inp: &tlv::TlvItemValue) -> anyhow::Result<Option<u8>> {
15    if let tlv::TlvItemValue::Int(v) = inp {
16        Ok(Some(*v as u8))
17    } else {
18        Ok(None)
19    }
20}
21
22/// Decode MinMeasuredValue attribute (0x0001)
23pub fn decode_min_measured_value(inp: &tlv::TlvItemValue) -> anyhow::Result<Option<u8>> {
24    if let tlv::TlvItemValue::Int(v) = inp {
25        Ok(Some(*v as u8))
26    } else {
27        Ok(None)
28    }
29}
30
31/// Decode MaxMeasuredValue attribute (0x0002)
32pub fn decode_max_measured_value(inp: &tlv::TlvItemValue) -> anyhow::Result<Option<u8>> {
33    if let tlv::TlvItemValue::Int(v) = inp {
34        Ok(Some(*v as u8))
35    } else {
36        Ok(None)
37    }
38}
39
40/// Decode PeakMeasuredValue attribute (0x0003)
41pub fn decode_peak_measured_value(inp: &tlv::TlvItemValue) -> anyhow::Result<Option<u8>> {
42    if let tlv::TlvItemValue::Int(v) = inp {
43        Ok(Some(*v as u8))
44    } else {
45        Ok(None)
46    }
47}
48
49/// Decode PeakMeasuredValueWindow attribute (0x0004)
50pub fn decode_peak_measured_value_window(inp: &tlv::TlvItemValue) -> anyhow::Result<u8> {
51    if let tlv::TlvItemValue::Int(v) = inp {
52        Ok(*v as u8)
53    } else {
54        Err(anyhow::anyhow!("Expected Integer"))
55    }
56}
57
58/// Decode AverageMeasuredValue attribute (0x0005)
59pub fn decode_average_measured_value(inp: &tlv::TlvItemValue) -> anyhow::Result<Option<u8>> {
60    if let tlv::TlvItemValue::Int(v) = inp {
61        Ok(Some(*v as u8))
62    } else {
63        Ok(None)
64    }
65}
66
67/// Decode AverageMeasuredValueWindow attribute (0x0006)
68pub fn decode_average_measured_value_window(inp: &tlv::TlvItemValue) -> anyhow::Result<u8> {
69    if let tlv::TlvItemValue::Int(v) = inp {
70        Ok(*v as u8)
71    } else {
72        Err(anyhow::anyhow!("Expected Integer"))
73    }
74}
75
76/// Decode Uncertainty attribute (0x0007)
77pub fn decode_uncertainty(inp: &tlv::TlvItemValue) -> anyhow::Result<u8> {
78    if let tlv::TlvItemValue::Int(v) = inp {
79        Ok(*v as u8)
80    } else {
81        Err(anyhow::anyhow!("Expected Integer"))
82    }
83}
84
85/// Decode MeasurementUnit attribute (0x0008)
86pub fn decode_measurement_unit(inp: &tlv::TlvItemValue) -> anyhow::Result<u8> {
87    if let tlv::TlvItemValue::Int(v) = inp {
88        Ok(*v as u8)
89    } else {
90        Err(anyhow::anyhow!("Expected Integer"))
91    }
92}
93
94/// Decode MeasurementMedium attribute (0x0009)
95pub fn decode_measurement_medium(inp: &tlv::TlvItemValue) -> anyhow::Result<u8> {
96    if let tlv::TlvItemValue::Int(v) = inp {
97        Ok(*v as u8)
98    } else {
99        Err(anyhow::anyhow!("Expected Integer"))
100    }
101}
102
103/// Decode LevelValue attribute (0x000A)
104pub fn decode_level_value(inp: &tlv::TlvItemValue) -> anyhow::Result<u8> {
105    if let tlv::TlvItemValue::Int(v) = inp {
106        Ok(*v as u8)
107    } else {
108        Err(anyhow::anyhow!("Expected Integer"))
109    }
110}
111
112
113// JSON dispatcher function
114
115/// Decode attribute value and return as JSON string
116/// 
117/// # Parameters
118/// * `cluster_id` - The cluster identifier
119/// * `attribute_id` - The attribute identifier
120/// * `tlv_value` - The TLV value to decode
121/// 
122/// # Returns
123/// JSON string representation of the decoded value or error
124pub fn decode_attribute_json(cluster_id: u32, attribute_id: u32, tlv_value: &crate::tlv::TlvItemValue) -> String {
125    // Verify this is the correct cluster
126    if cluster_id != 0x0000 {
127        return format!("{{\"error\": \"Invalid cluster ID. Expected 0x0000, got {}\"}}", cluster_id);
128    }
129    
130    match attribute_id {
131        0x0000 => {
132            match decode_measured_value(tlv_value) {
133                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
134                Err(e) => format!("{{\"error\": \"{}\"}}", e),
135            }
136        }
137        0x0001 => {
138            match decode_min_measured_value(tlv_value) {
139                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
140                Err(e) => format!("{{\"error\": \"{}\"}}", e),
141            }
142        }
143        0x0002 => {
144            match decode_max_measured_value(tlv_value) {
145                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
146                Err(e) => format!("{{\"error\": \"{}\"}}", e),
147            }
148        }
149        0x0003 => {
150            match decode_peak_measured_value(tlv_value) {
151                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
152                Err(e) => format!("{{\"error\": \"{}\"}}", e),
153            }
154        }
155        0x0004 => {
156            match decode_peak_measured_value_window(tlv_value) {
157                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
158                Err(e) => format!("{{\"error\": \"{}\"}}", e),
159            }
160        }
161        0x0005 => {
162            match decode_average_measured_value(tlv_value) {
163                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
164                Err(e) => format!("{{\"error\": \"{}\"}}", e),
165            }
166        }
167        0x0006 => {
168            match decode_average_measured_value_window(tlv_value) {
169                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
170                Err(e) => format!("{{\"error\": \"{}\"}}", e),
171            }
172        }
173        0x0007 => {
174            match decode_uncertainty(tlv_value) {
175                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
176                Err(e) => format!("{{\"error\": \"{}\"}}", e),
177            }
178        }
179        0x0008 => {
180            match decode_measurement_unit(tlv_value) {
181                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
182                Err(e) => format!("{{\"error\": \"{}\"}}", e),
183            }
184        }
185        0x0009 => {
186            match decode_measurement_medium(tlv_value) {
187                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
188                Err(e) => format!("{{\"error\": \"{}\"}}", e),
189            }
190        }
191        0x000A => {
192            match decode_level_value(tlv_value) {
193                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
194                Err(e) => format!("{{\"error\": \"{}\"}}", e),
195            }
196        }
197        _ => format!("{{\"error\": \"Unknown attribute ID: {}\"}}", attribute_id),
198    }
199}
200
201/// Get list of all attributes supported by this cluster
202/// 
203/// # Returns
204/// Vector of tuples containing (attribute_id, attribute_name)
205pub fn get_attribute_list() -> Vec<(u32, &'static str)> {
206    vec![
207        (0x0000, "MeasuredValue"),
208        (0x0001, "MinMeasuredValue"),
209        (0x0002, "MaxMeasuredValue"),
210        (0x0003, "PeakMeasuredValue"),
211        (0x0004, "PeakMeasuredValueWindow"),
212        (0x0005, "AverageMeasuredValue"),
213        (0x0006, "AverageMeasuredValueWindow"),
214        (0x0007, "Uncertainty"),
215        (0x0008, "MeasurementUnit"),
216        (0x0009, "MeasurementMedium"),
217        (0x000A, "LevelValue"),
218    ]
219}
220