matc/clusters/codec/
concentration_measurement.rs1use crate::tlv;
7use anyhow;
8use serde_json;
9
10
11pub 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
22pub 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
31pub 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
40pub 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
49pub 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
58pub 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
67pub 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
76pub 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
85pub 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
94pub 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
103pub 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
113pub fn decode_attribute_json(cluster_id: u32, attribute_id: u32, tlv_value: &crate::tlv::TlvItemValue) -> String {
125 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
201pub 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