MBusinoLibPy 0.10.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,782 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Lookup tables for getCodeName()/getCodeUnits()/getDeviceClass()/getStateClass().
3
+
4
+ Diese vier C++-switch-Anweisungen sind hier als Dicts 1:1 abgebildet - jede
5
+ Every C++ fall-through group (several `case` before one `return`) is a group of
6
+ dict entries with a comment line. Missing keys mean the
7
+ C++ `default` return:
8
+
9
+ * CODE_UNITS: no entry -> C++ `return 0` (NULL) -> Python None
10
+ * CODE_NAME / DEVICE_CLASS / STATE_CLASS: no entry -> C++ `return ""` -> Python ""
11
+ """
12
+
13
+ from .enums import MBUS_CODE
14
+
15
+
16
+ # ---------------------------------------------------------------------------
17
+ # Helper function from MBusinoLib.cpp line 1167: _volumeClassFromMedium()
18
+ # (called directly by getDeviceClass() for the volume codes)
19
+ # ---------------------------------------------------------------------------
20
+ # C++: switch (medium) with the M-Bus medium codes from decodeHeader().
21
+ _MEDIUM_TO_VOLUME_CLASS = {
22
+ 0x03: "gas", # Gas
23
+ 0x06: "water", # Warm Water
24
+ 0x07: "water", # Water
25
+ 0x15: "water", # Hot water
26
+ 0x16: "water", # Cold water
27
+ 0x17: "water", # Dual water
28
+ # default: -> "volume" (unknown medium, everything else, incl. 0xFF)
29
+ }
30
+
31
+
32
+ def _volume_class_from_medium(medium: int) -> str:
33
+ """Corresponds to _volumeClassFromMedium() in MBusinoLib.cpp line 1167-1180.
34
+
35
+ Picks the Home Assistant device_class for cumulative volume records:
36
+ Wasser-Medien -> "water", Gas -> "gas", alles andere (inkl. 0xFF) -> "volume".
37
+ """
38
+ return _MEDIUM_TO_VOLUME_CLASS.get(medium, "volume")
39
+
40
+
41
+ # ===========================================================================
42
+ # getCodeUnits() - C++ MBusinoLib.cpp line 660
43
+ # ===========================================================================
44
+ CODE_UNITS = {
45
+ # Corresponds to MBusinoLib::getCodeUnits() in MBusinoLib.cpp line 660 (C++ switch with fall-through groups).
46
+ # Every comment line names one C++ fall-through group, the lines below are its case statements.
47
+ # C++: ENERGY_WH -> return "Wh"
48
+ MBUS_CODE.ENERGY_WH: "Wh",
49
+ # C++: ENERGY_J -> return "J"
50
+ MBUS_CODE.ENERGY_J: "J",
51
+ # C++: VOLUME_M3 -> return "m³"
52
+ MBUS_CODE.VOLUME_M3: "m³",
53
+ # C++: MASS_KG -> return "kg"
54
+ MBUS_CODE.MASS_KG: "kg",
55
+ # C++: ON_TIME_S / OPERATING_TIME_S / AVG_DURATION_S / ACTUAL_DURATION_S -> return "s"
56
+ MBUS_CODE.ON_TIME_S: "s",
57
+ MBUS_CODE.OPERATING_TIME_S: "s",
58
+ MBUS_CODE.AVG_DURATION_S: "s",
59
+ MBUS_CODE.ACTUAL_DURATION_S: "s",
60
+ # C++: ON_TIME_MIN / OPERATING_TIME_MIN / AVG_DURATION_MIN / ACTUAL_DURATION_MIN -> return "min"
61
+ MBUS_CODE.ON_TIME_MIN: "min",
62
+ MBUS_CODE.OPERATING_TIME_MIN: "min",
63
+ MBUS_CODE.AVG_DURATION_MIN: "min",
64
+ MBUS_CODE.ACTUAL_DURATION_MIN: "min",
65
+ # C++: ON_TIME_H / OPERATING_TIME_H / AVG_DURATION_H / ACTUAL_DURATION_H -> return "h"
66
+ MBUS_CODE.ON_TIME_H: "h",
67
+ MBUS_CODE.OPERATING_TIME_H: "h",
68
+ MBUS_CODE.AVG_DURATION_H: "h",
69
+ MBUS_CODE.ACTUAL_DURATION_H: "h",
70
+ # C++: ON_TIME_DAYS / OPERATING_TIME_DAYS / AVG_DURATION_DAYS
71
+ # ACTUAL_DURATION_DAYS -> return "d"
72
+ MBUS_CODE.ON_TIME_DAYS: "d",
73
+ MBUS_CODE.OPERATING_TIME_DAYS: "d",
74
+ MBUS_CODE.AVG_DURATION_DAYS: "d",
75
+ MBUS_CODE.ACTUAL_DURATION_DAYS: "d",
76
+ # C++: POWER_W / MAX_POWER_W -> return "W"
77
+ MBUS_CODE.POWER_W: "W",
78
+ MBUS_CODE.MAX_POWER_W: "W",
79
+ # C++: POWER_J_H -> return "J/h"
80
+ MBUS_CODE.POWER_J_H: "J/h",
81
+ # C++: VOLUME_FLOW_M3_H -> return "m³/h"
82
+ MBUS_CODE.VOLUME_FLOW_M3_H: "m³/h",
83
+ # C++: VOLUME_FLOW_M3_MIN -> return "m³/min"
84
+ MBUS_CODE.VOLUME_FLOW_M3_MIN: "m³/min",
85
+ # C++: VOLUME_FLOW_M3_S -> return "m³/s"
86
+ MBUS_CODE.VOLUME_FLOW_M3_S: "m³/s",
87
+ # C++: MASS_FLOW_KG_H -> return "kg/h"
88
+ MBUS_CODE.MASS_FLOW_KG_H: "kg/h",
89
+ # C++: FLOW_TEMPERATURE_C / RETURN_TEMPERATURE_C / EXTERNAL_TEMPERATURE_C
90
+ # TEMPERATURE_LIMIT_C -> return "°C"
91
+ MBUS_CODE.FLOW_TEMPERATURE_C: "°C",
92
+ MBUS_CODE.RETURN_TEMPERATURE_C: "°C",
93
+ MBUS_CODE.EXTERNAL_TEMPERATURE_C: "°C",
94
+ MBUS_CODE.TEMPERATURE_LIMIT_C: "°C",
95
+ # C++: TEMPERATURE_DIFF_K -> return "K"
96
+ MBUS_CODE.TEMPERATURE_DIFF_K: "K",
97
+ # C++: PRESSURE_BAR -> return "bar"
98
+ MBUS_CODE.PRESSURE_BAR: "bar",
99
+ # C++: TIME_POINT_DATE -> return "YYYYMMDD"
100
+ MBUS_CODE.TIME_POINT_DATE: "YYYYMMDD",
101
+ # C++: TIME_POINT_DATETIME -> return "YYYYMMDDhhmm"
102
+ MBUS_CODE.TIME_POINT_DATETIME: "YYYYMMDDhhmm",
103
+ # C++: BAUDRATE_BPS -> return "bit/s"
104
+ MBUS_CODE.BAUDRATE_BPS: "bit/s",
105
+ # C++: VOLTS -> return "V"
106
+ MBUS_CODE.VOLTS: "V",
107
+ # C++: AMPERES -> return "A"
108
+ MBUS_CODE.AMPERES: "A",
109
+ # C++: VOLUME_FT3 -> return "ft³"
110
+ MBUS_CODE.VOLUME_FT3: "ft³",
111
+ # C++: VOLUME_GAL -> return "gal"
112
+ MBUS_CODE.VOLUME_GAL: "gal",
113
+ # C++: VOLUME_FLOW_GAL_M -> return "gal/min"
114
+ MBUS_CODE.VOLUME_FLOW_GAL_M: "gal/min",
115
+ # C++: VOLUME_FLOW_GAL_H -> return "gal/h"
116
+ MBUS_CODE.VOLUME_FLOW_GAL_H: "gal/h",
117
+ # C++: FLOW_TEMPERATURE_F / RETURN_TEMPERATURE_F / TEMPERATURE_DIFF_F
118
+ # EXTERNAL_TEMPERATURE_F / TEMPERATURE_LIMIT_F -> return "°F"
119
+ MBUS_CODE.FLOW_TEMPERATURE_F: "°F",
120
+ MBUS_CODE.RETURN_TEMPERATURE_F: "°F",
121
+ MBUS_CODE.TEMPERATURE_DIFF_F: "°F",
122
+ MBUS_CODE.EXTERNAL_TEMPERATURE_F: "°F",
123
+ MBUS_CODE.TEMPERATURE_LIMIT_F: "°F",
124
+ # C++: STORAGE_INTERVAL_MONTH / REMAIN_BAT_LIFE_MONTH -> return "month"
125
+ MBUS_CODE.STORAGE_INTERVAL_MONTH: "month",
126
+ MBUS_CODE.REMAIN_BAT_LIFE_MONTH: "month",
127
+ # C++: RELATIVE_HUMIDITY / BATTERY_PERCENTAGE / CHAMBER_POLLUTION_LEVEL
128
+ # MOISTURE_LEVEL_PERCENT -> return "%"
129
+ MBUS_CODE.RELATIVE_HUMIDITY: "%",
130
+ MBUS_CODE.BATTERY_PERCENTAGE: "%",
131
+ MBUS_CODE.CHAMBER_POLLUTION_LEVEL: "%",
132
+ MBUS_CODE.MOISTURE_LEVEL_PERCENT: "%",
133
+ # C++: REACTIVE_ENERGY -> return "kvarh"
134
+ MBUS_CODE.REACTIVE_ENERGY: "kvarh",
135
+ # C++: REACTIVE_POWER -> return "kvar"
136
+ MBUS_CODE.REACTIVE_POWER: "kvar",
137
+ # C++: APPARENT_POWER -> return "kVA"
138
+ MBUS_CODE.APPARENT_POWER: "kVA",
139
+ # C++: PHASE_VOLT_DEG / PHASE_CURR_DEG -> return "°"
140
+ MBUS_CODE.PHASE_VOLT_DEG: "°",
141
+ MBUS_CODE.PHASE_CURR_DEG: "°",
142
+ # C++: FREQUENCY -> return "Hz"
143
+ MBUS_CODE.FREQUENCY: "Hz",
144
+ # C++: CARBON_DIOXIDE_PPM / CARBON_MONOXIDE_PPM -> return "ppm"
145
+ MBUS_CODE.CARBON_DIOXIDE_PPM: "ppm",
146
+ MBUS_CODE.CARBON_MONOXIDE_PPM: "ppm",
147
+ # C++: VOLATILE_ORG_COMP_ppb -> return "ppb"
148
+ MBUS_CODE.VOLATILE_ORG_COMP_ppb: "ppb",
149
+ # C++: VOLATILE_ORG_COMP_UG_M3 / PARTICLES_UNSPEC_UG_M3 / PARTICLES_PM1_UG_M3
150
+ # PARTICLES_PM2_5_UG_M3 / PARTICLES_PM10_UG_M3 -> return "µg/m³"
151
+ MBUS_CODE.VOLATILE_ORG_COMP_UG_M3: "µg/m³",
152
+ MBUS_CODE.PARTICLES_UNSPEC_UG_M3: "µg/m³",
153
+ MBUS_CODE.PARTICLES_PM1_UG_M3: "µg/m³",
154
+ MBUS_CODE.PARTICLES_PM2_5_UG_M3: "µg/m³",
155
+ MBUS_CODE.PARTICLES_PM10_UG_M3: "µg/m³",
156
+ # C++: PARTICLES_UNSPEC_1M3 / PARTICLES_PM1_1M3 / PARTICLES_PM2_5_1M3
157
+ # PARTICLES_PM10_1M3 -> return "1/m³"
158
+ MBUS_CODE.PARTICLES_UNSPEC_1M3: "1/m³",
159
+ MBUS_CODE.PARTICLES_PM1_1M3: "1/m³",
160
+ MBUS_CODE.PARTICLES_PM2_5_1M3: "1/m³",
161
+ MBUS_CODE.PARTICLES_PM10_1M3: "1/m³",
162
+ # C++: ILLUMINANCE_LUX -> return "lx"
163
+ MBUS_CODE.ILLUMINANCE_LUX: "lx",
164
+ # C++: LUMINOUS_INTENSITY_CD -> return "cd"
165
+ MBUS_CODE.LUMINOUS_INTENSITY_CD: "cd",
166
+ # C++: RADIANT_FLUX_DENS -> return "W/m²"
167
+ MBUS_CODE.RADIANT_FLUX_DENS: "W/m²",
168
+ # C++: WIND_SPEED_M_S -> return "m/s"
169
+ MBUS_CODE.WIND_SPEED_M_S: "m/s",
170
+ # C++: RAINFALL_L_MM / DISTANCE_MM -> return "mm"
171
+ MBUS_CODE.RAINFALL_L_MM: "mm",
172
+ MBUS_CODE.DISTANCE_MM: "mm",
173
+ # C++: FORMAZIN_NEPHELOMETER_U -> return "FNU"
174
+ MBUS_CODE.FORMAZIN_NEPHELOMETER_U: "FNU",
175
+ # C++: DECIBEL_A -> return "dB"
176
+ MBUS_CODE.DECIBEL_A: "dB",
177
+ }
178
+ # Note: the 44 enum codes without an entry return `return 0` (NULL) in C++,
179
+ # e.g. UNKNOWN_VIF, ACCESS_NUMBER, MANUFACTURER - they carry no unit.
180
+
181
+
182
+ # ===========================================================================
183
+ # getCodeName() - C++ MBusinoLib.cpp line 847
184
+ # ===========================================================================
185
+ CODE_NAME = {
186
+ # Corresponds to MBusinoLib::getCodeName() in MBusinoLib.cpp line 847 (C++ switch with fall-through groups).
187
+ # Every comment line names one C++ fall-through group, the lines below are its case statements.
188
+ # C++: UNKNOWN_VIF -> return "unknown_vif"
189
+ MBUS_CODE.UNKNOWN_VIF: "unknown_vif",
190
+ # C++: ENERGY_WH / ENERGY_J -> return "energy"
191
+ MBUS_CODE.ENERGY_WH: "energy",
192
+ MBUS_CODE.ENERGY_J: "energy",
193
+ # C++: VOLUME_M3 / VOLUME_FT3 / VOLUME_GAL -> return "volume"
194
+ MBUS_CODE.VOLUME_M3: "volume",
195
+ MBUS_CODE.VOLUME_FT3: "volume",
196
+ MBUS_CODE.VOLUME_GAL: "volume",
197
+ # C++: MASS_KG -> return "mass"
198
+ MBUS_CODE.MASS_KG: "mass",
199
+ # C++: ON_TIME_S / ON_TIME_MIN / ON_TIME_H / ON_TIME_DAYS -> return "on_time"
200
+ MBUS_CODE.ON_TIME_S: "on_time",
201
+ MBUS_CODE.ON_TIME_MIN: "on_time",
202
+ MBUS_CODE.ON_TIME_H: "on_time",
203
+ MBUS_CODE.ON_TIME_DAYS: "on_time",
204
+ # C++: OPERATING_TIME_S / OPERATING_TIME_MIN / OPERATING_TIME_H
205
+ # OPERATING_TIME_DAYS -> return "operating_time"
206
+ MBUS_CODE.OPERATING_TIME_S: "operating_time",
207
+ MBUS_CODE.OPERATING_TIME_MIN: "operating_time",
208
+ MBUS_CODE.OPERATING_TIME_H: "operating_time",
209
+ MBUS_CODE.OPERATING_TIME_DAYS: "operating_time",
210
+ # C++: AVG_DURATION_S / AVG_DURATION_MIN / AVG_DURATION_H
211
+ # AVG_DURATION_DAYS -> return "avg_duration"
212
+ MBUS_CODE.AVG_DURATION_S: "avg_duration",
213
+ MBUS_CODE.AVG_DURATION_MIN: "avg_duration",
214
+ MBUS_CODE.AVG_DURATION_H: "avg_duration",
215
+ MBUS_CODE.AVG_DURATION_DAYS: "avg_duration",
216
+ # C++: ACTUAL_DURATION_S / ACTUAL_DURATION_MIN / ACTUAL_DURATION_H
217
+ # ACTUAL_DURATION_DAYS -> return "actual_duration"
218
+ MBUS_CODE.ACTUAL_DURATION_S: "actual_duration",
219
+ MBUS_CODE.ACTUAL_DURATION_MIN: "actual_duration",
220
+ MBUS_CODE.ACTUAL_DURATION_H: "actual_duration",
221
+ MBUS_CODE.ACTUAL_DURATION_DAYS: "actual_duration",
222
+ # C++: POWER_W / MAX_POWER_W / POWER_J_H -> return "power"
223
+ MBUS_CODE.POWER_W: "power",
224
+ MBUS_CODE.MAX_POWER_W: "power",
225
+ MBUS_CODE.POWER_J_H: "power",
226
+ # C++: VOLUME_FLOW_M3_H / VOLUME_FLOW_M3_MIN / VOLUME_FLOW_M3_S / VOLUME_FLOW_GAL_M
227
+ # VOLUME_FLOW_GAL_H -> return "volume_flow"
228
+ MBUS_CODE.VOLUME_FLOW_M3_H: "volume_flow",
229
+ MBUS_CODE.VOLUME_FLOW_M3_MIN: "volume_flow",
230
+ MBUS_CODE.VOLUME_FLOW_M3_S: "volume_flow",
231
+ MBUS_CODE.VOLUME_FLOW_GAL_M: "volume_flow",
232
+ MBUS_CODE.VOLUME_FLOW_GAL_H: "volume_flow",
233
+ # C++: MASS_FLOW_KG_H -> return "mass_flow"
234
+ MBUS_CODE.MASS_FLOW_KG_H: "mass_flow",
235
+ # C++: FLOW_TEMPERATURE_C / FLOW_TEMPERATURE_F -> return "flow_temperature"
236
+ MBUS_CODE.FLOW_TEMPERATURE_C: "flow_temperature",
237
+ MBUS_CODE.FLOW_TEMPERATURE_F: "flow_temperature",
238
+ # C++: RETURN_TEMPERATURE_C / RETURN_TEMPERATURE_F -> return "return_temperature"
239
+ MBUS_CODE.RETURN_TEMPERATURE_C: "return_temperature",
240
+ MBUS_CODE.RETURN_TEMPERATURE_F: "return_temperature",
241
+ # C++: EXTERNAL_TEMPERATURE_C / EXTERNAL_TEMPERATURE_F -> return "external_temperature"
242
+ MBUS_CODE.EXTERNAL_TEMPERATURE_C: "external_temperature",
243
+ MBUS_CODE.EXTERNAL_TEMPERATURE_F: "external_temperature",
244
+ # C++: TEMPERATURE_LIMIT_C / TEMPERATURE_LIMIT_F -> return "temperature_limit"
245
+ MBUS_CODE.TEMPERATURE_LIMIT_C: "temperature_limit",
246
+ MBUS_CODE.TEMPERATURE_LIMIT_F: "temperature_limit",
247
+ # C++: TEMPERATURE_DIFF_K / TEMPERATURE_DIFF_F -> return "temperature_diff"
248
+ MBUS_CODE.TEMPERATURE_DIFF_K: "temperature_diff",
249
+ MBUS_CODE.TEMPERATURE_DIFF_F: "temperature_diff",
250
+ # C++: PRESSURE_BAR -> return "pressure"
251
+ MBUS_CODE.PRESSURE_BAR: "pressure",
252
+ # C++: TIME_POINT_DATE / TIME_POINT_DATETIME -> return "time_point"
253
+ MBUS_CODE.TIME_POINT_DATE: "time_point",
254
+ MBUS_CODE.TIME_POINT_DATETIME: "time_point",
255
+ # C++: BAUDRATE_BPS -> return "baudrate"
256
+ MBUS_CODE.BAUDRATE_BPS: "baudrate",
257
+ # C++: VOLTS -> return "voltage"
258
+ MBUS_CODE.VOLTS: "voltage",
259
+ # C++: AMPERES -> return "current"
260
+ MBUS_CODE.AMPERES: "current",
261
+ # C++: FABRICATION_NUMBER -> return "fab_number"
262
+ MBUS_CODE.FABRICATION_NUMBER: "fab_number",
263
+ # C++: BUS_ADDRESS -> return "bus_address"
264
+ MBUS_CODE.BUS_ADDRESS: "bus_address",
265
+ # C++: CREDIT -> return "credit"
266
+ MBUS_CODE.CREDIT: "credit",
267
+ # C++: DEBIT -> return "debit"
268
+ MBUS_CODE.DEBIT: "debit",
269
+ # C++: ACCESS_NUMBER -> return "access_number"
270
+ MBUS_CODE.ACCESS_NUMBER: "access_number",
271
+ # C++: MANUFACTURER -> return "manufacturer"
272
+ MBUS_CODE.MANUFACTURER: "manufacturer",
273
+ # C++: PARAMETER_SET_ID -> return "set_id"
274
+ MBUS_CODE.PARAMETER_SET_ID: "set_id",
275
+ # C++: MODEL_VERSION -> return "model_version"
276
+ MBUS_CODE.MODEL_VERSION: "model_version",
277
+ # C++: HARDWARE_VERSION -> return "hardware_version"
278
+ MBUS_CODE.HARDWARE_VERSION: "hardware_version",
279
+ # C++: FIRMWARE_VERSION -> return "firmware_version"
280
+ MBUS_CODE.FIRMWARE_VERSION: "firmware_version",
281
+ # C++: SOFTWARE_VERSION -> return "software_version"
282
+ MBUS_CODE.SOFTWARE_VERSION: "software_version",
283
+ # C++: CUSTOMER_LOCATION -> return "customer_location"
284
+ MBUS_CODE.CUSTOMER_LOCATION: "customer_location",
285
+ # C++: CUSTOMER -> return "customer"
286
+ MBUS_CODE.CUSTOMER: "customer",
287
+ # C++: ERROR_FLAGS -> return "error_flags"
288
+ MBUS_CODE.ERROR_FLAGS: "error_flags",
289
+ # C++: ERROR_MASK -> return "error_mask"
290
+ MBUS_CODE.ERROR_MASK: "error_mask",
291
+ # C++: DIGITAL_OUTPUT -> return "digital_output"
292
+ MBUS_CODE.DIGITAL_OUTPUT: "digital_output",
293
+ # C++: DIGITAL_INPUT -> return "digital_input"
294
+ MBUS_CODE.DIGITAL_INPUT: "digital_input",
295
+ # C++: RESPONSE_DELAY_TIME -> return "response_delay"
296
+ MBUS_CODE.RESPONSE_DELAY_TIME: "response_delay",
297
+ # C++: RETRY -> return "retry"
298
+ MBUS_CODE.RETRY: "retry",
299
+ # C++: SIZE_OF_STORAGE_BLOCK -> return "sizeof_storageblock"
300
+ MBUS_CODE.SIZE_OF_STORAGE_BLOCK: "sizeof_storageblock",
301
+ # C++: STORAGE_INTERVAL_MONTH -> return "storage_interval"
302
+ MBUS_CODE.STORAGE_INTERVAL_MONTH: "storage_interval",
303
+ # C++: GENERIC -> return "generic"
304
+ MBUS_CODE.GENERIC: "generic",
305
+ # C++: RESET_COUNTER / CUMULATION_COUNTER -> return "counter"
306
+ MBUS_CODE.RESET_COUNTER: "counter",
307
+ MBUS_CODE.CUMULATION_COUNTER: "counter",
308
+ # C++: CUSTOMIZED_VIF -> return "customized_vif"
309
+ MBUS_CODE.CUSTOMIZED_VIF: "customized_vif",
310
+ # C++: MANUFACTURER_SPECIFIC -> return "manufactur_specific"
311
+ MBUS_CODE.MANUFACTURER_SPECIFIC: "manufactur_specific",
312
+ # C++: RELATIVE_HUMIDITY -> return "humidity"
313
+ MBUS_CODE.RELATIVE_HUMIDITY: "humidity",
314
+ # C++: REACTIVE_ENERGY -> return "reactive_energy"
315
+ MBUS_CODE.REACTIVE_ENERGY: "reactive_energy",
316
+ # C++: REACTIVE_POWER -> return "reactive_power"
317
+ MBUS_CODE.REACTIVE_POWER: "reactive_power",
318
+ # C++: APPARENT_POWER -> return "apparent_power"
319
+ MBUS_CODE.APPARENT_POWER: "apparent_power",
320
+ # C++: PHASE_VOLT_DEG -> return "phase_deg_voltage"
321
+ MBUS_CODE.PHASE_VOLT_DEG: "phase_deg_voltage",
322
+ # C++: PHASE_CURR_DEG -> return "phase_deg_current"
323
+ MBUS_CODE.PHASE_CURR_DEG: "phase_deg_current",
324
+ # C++: FREQUENCY -> return "frequency"
325
+ MBUS_CODE.FREQUENCY: "frequency",
326
+ # C++: SPECIAL_SUPPLIER_INFO -> return "special_suppl_info"
327
+ MBUS_CODE.SPECIAL_SUPPLIER_INFO: "special_suppl_info",
328
+ # C++: CURRENT_SELECTED_APL -> return "current_selected_appl."
329
+ MBUS_CODE.CURRENT_SELECTED_APL: "current_selected_appl.",
330
+ # C++: SUB_DEVICES -> return "sub_devices"
331
+ MBUS_CODE.SUB_DEVICES: "sub_devices",
332
+ # C++: REMAIN_BAT_LIFE_MONTH -> return "remain_bat_life"
333
+ MBUS_CODE.REMAIN_BAT_LIFE_MONTH: "remain_bat_life",
334
+ # C++: CARBON_DIOXIDE_PPM -> return "CO²"
335
+ MBUS_CODE.CARBON_DIOXIDE_PPM: "CO²",
336
+ # C++: CARBON_MONOXIDE_PPM -> return "CO"
337
+ MBUS_CODE.CARBON_MONOXIDE_PPM: "CO",
338
+ # C++: VOLATILE_ORG_COMP_ppb / VOLATILE_ORG_COMP_UG_M3 -> return "VOC"
339
+ MBUS_CODE.VOLATILE_ORG_COMP_ppb: "VOC",
340
+ MBUS_CODE.VOLATILE_ORG_COMP_UG_M3: "VOC",
341
+ # C++: PARTICLES_UNSPEC_UG_M3 / PARTICLES_UNSPEC_1M3 -> return "particels_unspecific"
342
+ MBUS_CODE.PARTICLES_UNSPEC_UG_M3: "particels_unspecific",
343
+ MBUS_CODE.PARTICLES_UNSPEC_1M3: "particels_unspecific",
344
+ # C++: PARTICLES_PM1_UG_M3 / PARTICLES_PM1_1M3 -> return "particles_PM1"
345
+ MBUS_CODE.PARTICLES_PM1_UG_M3: "particles_PM1",
346
+ MBUS_CODE.PARTICLES_PM1_1M3: "particles_PM1",
347
+ # C++: PARTICLES_PM2_5_UG_M3 / PARTICLES_PM2_5_1M3 -> return "particles_PM2,5"
348
+ MBUS_CODE.PARTICLES_PM2_5_UG_M3: "particles_PM2,5",
349
+ MBUS_CODE.PARTICLES_PM2_5_1M3: "particles_PM2,5",
350
+ # C++: PARTICLES_PM10_UG_M3 / PARTICLES_PM10_1M3 -> return "particles_PM10"
351
+ MBUS_CODE.PARTICLES_PM10_UG_M3: "particles_PM10",
352
+ MBUS_CODE.PARTICLES_PM10_1M3: "particles_PM10",
353
+ # C++: ILLUMINANCE_LUX -> return "illuminance"
354
+ MBUS_CODE.ILLUMINANCE_LUX: "illuminance",
355
+ # C++: LUMINOUS_INTENSITY_CD -> return "luminus_idensity"
356
+ MBUS_CODE.LUMINOUS_INTENSITY_CD: "luminus_idensity",
357
+ # C++: RADIANT_FLUX_DENS -> return "radiant_flux_density"
358
+ MBUS_CODE.RADIANT_FLUX_DENS: "radiant_flux_density",
359
+ # C++: WIND_SPEED_M_S -> return "wind_speed"
360
+ MBUS_CODE.WIND_SPEED_M_S: "wind_speed",
361
+ # C++: RAINFALL_L_MM -> return "rainfall"
362
+ MBUS_CODE.RAINFALL_L_MM: "rainfall",
363
+ # C++: FORMAZIN_NEPHELOMETER_U -> return "formazin_nephelometric"
364
+ MBUS_CODE.FORMAZIN_NEPHELOMETER_U: "formazin_nephelometric",
365
+ # C++: POTENTIAL_HYDROGEN_PH -> return "PH"
366
+ MBUS_CODE.POTENTIAL_HYDROGEN_PH: "PH",
367
+ # C++: DISMOUNTS_COUNTER -> return "dismounts_counter"
368
+ MBUS_CODE.DISMOUNTS_COUNTER: "dismounts_counter",
369
+ # C++: TEST_BUTTON_COUNTER -> return "test_button_counter"
370
+ MBUS_CODE.TEST_BUTTON_COUNTER: "test_button_counter",
371
+ # C++: ALARM_COUNTER -> return "alarm_counter"
372
+ MBUS_CODE.ALARM_COUNTER: "alarm_counter",
373
+ # C++: ALARM_MUTE_COUNTER -> return "alarm_mute_counter"
374
+ MBUS_CODE.ALARM_MUTE_COUNTER: "alarm_mute_counter",
375
+ # C++: OBSTACLE_DETECT_COUNTER -> return "obstacle_detect_counter"
376
+ MBUS_CODE.OBSTACLE_DETECT_COUNTER: "obstacle_detect_counter",
377
+ # C++: SMOKE_ENTRIES_COUNTER -> return "smoke_entries_counter"
378
+ MBUS_CODE.SMOKE_ENTRIES_COUNTER: "smoke_entries_counter",
379
+ # C++: SMOKE_CHAMBER_DEFECTS -> return "smoke_chamber_defects"
380
+ MBUS_CODE.SMOKE_CHAMBER_DEFECTS: "smoke_chamber_defects",
381
+ # C++: SELF_TEST_COUNTER -> return "self_test_counter"
382
+ MBUS_CODE.SELF_TEST_COUNTER: "self_test_counter",
383
+ # C++: SOUNDER_DEFECT_COUNTER -> return "sounder_defect_counter"
384
+ MBUS_CODE.SOUNDER_DEFECT_COUNTER: "sounder_defect_counter",
385
+ # C++: DECIBEL_A -> return "decibel_A"
386
+ MBUS_CODE.DECIBEL_A: "decibel_A",
387
+ # C++: BATTERY_PERCENTAGE -> return "battery"
388
+ MBUS_CODE.BATTERY_PERCENTAGE: "battery",
389
+ # C++: CHAMBER_POLLUTION_LEVEL -> return "chamber_pollution_level"
390
+ MBUS_CODE.CHAMBER_POLLUTION_LEVEL: "chamber_pollution_level",
391
+ # C++: DISTANCE_MM -> return "distance"
392
+ MBUS_CODE.DISTANCE_MM: "distance",
393
+ # C++: MOISTURE_LEVEL_PERCENT -> return "moisture_level"
394
+ MBUS_CODE.MOISTURE_LEVEL_PERCENT: "moisture_level",
395
+ # C++: PRESSURE_SENS_STATUS -> return "pressure_sens_status"
396
+ MBUS_CODE.PRESSURE_SENS_STATUS: "pressure_sens_status",
397
+ # C++: SMOKE_ALARM_STATUS -> return "smoke_alarm_status"
398
+ MBUS_CODE.SMOKE_ALARM_STATUS: "smoke_alarm_status",
399
+ # C++: CO_ALARM_STATUS -> return "CO_alarm_status"
400
+ MBUS_CODE.CO_ALARM_STATUS: "CO_alarm_status",
401
+ # C++: HEAT_ALARM_STATUS -> return "heat_alarm_status"
402
+ MBUS_CODE.HEAT_ALARM_STATUS: "heat_alarm_status",
403
+ # C++: DOOR_WINDOW_SENS_STATUS -> return "door_window_sens_status"
404
+ MBUS_CODE.DOOR_WINDOW_SENS_STATUS: "door_window_sens_status",
405
+ }
406
+
407
+
408
+ # ===========================================================================
409
+ # getDeviceClass() - C++ MBusinoLib.cpp line 1182
410
+ # ===========================================================================
411
+ # NOTE: the three volume codes are missing here on purpose - in C++ they
412
+ # switch to _volumeClassFromMedium(medium); that special case lives
413
+ # steckt in MBusinoLib.get_device_class().
414
+ DEVICE_CLASS = {
415
+ # Corresponds to MBusinoLib::getDeviceClass() in MBusinoLib.cpp line 1182 (C++ switch with fall-through groups).
416
+ # Every comment line names one C++ fall-through group, the lines below are its case statements.
417
+ # C++: ENERGY_WH / ENERGY_J -> return "energy"
418
+ MBUS_CODE.ENERGY_WH: "energy",
419
+ MBUS_CODE.ENERGY_J: "energy",
420
+ # C++: MASS_KG -> return "weight"
421
+ MBUS_CODE.MASS_KG: "weight",
422
+ # C++: OPERATING_TIME_S / OPERATING_TIME_MIN / OPERATING_TIME_H / OPERATING_TIME_DAYS
423
+ # ON_TIME_S / ON_TIME_MIN / ON_TIME_H / ON_TIME_DAYS / AVG_DURATION_S / AVG_DURATION_MIN
424
+ # AVG_DURATION_H / AVG_DURATION_DAYS / ACTUAL_DURATION_S / ACTUAL_DURATION_MIN
425
+ # ACTUAL_DURATION_H / ACTUAL_DURATION_DAYS -> return "duration"
426
+ MBUS_CODE.OPERATING_TIME_S: "duration",
427
+ MBUS_CODE.OPERATING_TIME_MIN: "duration",
428
+ MBUS_CODE.OPERATING_TIME_H: "duration",
429
+ MBUS_CODE.OPERATING_TIME_DAYS: "duration",
430
+ MBUS_CODE.ON_TIME_S: "duration",
431
+ MBUS_CODE.ON_TIME_MIN: "duration",
432
+ MBUS_CODE.ON_TIME_H: "duration",
433
+ MBUS_CODE.ON_TIME_DAYS: "duration",
434
+ MBUS_CODE.AVG_DURATION_S: "duration",
435
+ MBUS_CODE.AVG_DURATION_MIN: "duration",
436
+ MBUS_CODE.AVG_DURATION_H: "duration",
437
+ MBUS_CODE.AVG_DURATION_DAYS: "duration",
438
+ MBUS_CODE.ACTUAL_DURATION_S: "duration",
439
+ MBUS_CODE.ACTUAL_DURATION_MIN: "duration",
440
+ MBUS_CODE.ACTUAL_DURATION_H: "duration",
441
+ MBUS_CODE.ACTUAL_DURATION_DAYS: "duration",
442
+ # C++: POWER_W / MAX_POWER_W -> return "power"
443
+ MBUS_CODE.POWER_W: "power",
444
+ MBUS_CODE.MAX_POWER_W: "power",
445
+ # C++: VOLUME_FLOW_M3_H / VOLUME_FLOW_M3_MIN / VOLUME_FLOW_M3_S / VOLUME_FLOW_GAL_M
446
+ # VOLUME_FLOW_GAL_H -> return "volume_flow_rate"
447
+ MBUS_CODE.VOLUME_FLOW_M3_H: "volume_flow_rate",
448
+ MBUS_CODE.VOLUME_FLOW_M3_MIN: "volume_flow_rate",
449
+ MBUS_CODE.VOLUME_FLOW_M3_S: "volume_flow_rate",
450
+ MBUS_CODE.VOLUME_FLOW_GAL_M: "volume_flow_rate",
451
+ MBUS_CODE.VOLUME_FLOW_GAL_H: "volume_flow_rate",
452
+ # C++: FLOW_TEMPERATURE_C / FLOW_TEMPERATURE_F / RETURN_TEMPERATURE_C / RETURN_TEMPERATURE_F
453
+ # EXTERNAL_TEMPERATURE_C / EXTERNAL_TEMPERATURE_F / TEMPERATURE_LIMIT_C
454
+ # TEMPERATURE_LIMIT_F -> return "temperature"
455
+ MBUS_CODE.FLOW_TEMPERATURE_C: "temperature",
456
+ MBUS_CODE.FLOW_TEMPERATURE_F: "temperature",
457
+ MBUS_CODE.RETURN_TEMPERATURE_C: "temperature",
458
+ MBUS_CODE.RETURN_TEMPERATURE_F: "temperature",
459
+ MBUS_CODE.EXTERNAL_TEMPERATURE_C: "temperature",
460
+ MBUS_CODE.EXTERNAL_TEMPERATURE_F: "temperature",
461
+ MBUS_CODE.TEMPERATURE_LIMIT_C: "temperature",
462
+ MBUS_CODE.TEMPERATURE_LIMIT_F: "temperature",
463
+ # C++: TEMPERATURE_DIFF_K / TEMPERATURE_DIFF_F -> return "temperature_delta"
464
+ MBUS_CODE.TEMPERATURE_DIFF_K: "temperature_delta",
465
+ MBUS_CODE.TEMPERATURE_DIFF_F: "temperature_delta",
466
+ # C++: PRESSURE_BAR -> return "pressure"
467
+ MBUS_CODE.PRESSURE_BAR: "pressure",
468
+ # C++: BAUDRATE_BPS -> return "data_rate"
469
+ MBUS_CODE.BAUDRATE_BPS: "data_rate",
470
+ # C++: VOLTS -> return "voltage"
471
+ MBUS_CODE.VOLTS: "voltage",
472
+ # C++: AMPERES -> return "current"
473
+ MBUS_CODE.AMPERES: "current",
474
+ # C++: RELATIVE_HUMIDITY -> return "humidity"
475
+ MBUS_CODE.RELATIVE_HUMIDITY: "humidity",
476
+ # C++: FREQUENCY -> return "frequency"
477
+ MBUS_CODE.FREQUENCY: "frequency",
478
+ # C++: APPARENT_POWER -> return "apparent_power"
479
+ MBUS_CODE.APPARENT_POWER: "apparent_power",
480
+ # C++: REACTIVE_POWER -> return "reactive_power"
481
+ MBUS_CODE.REACTIVE_POWER: "reactive_power",
482
+ # C++: REACTIVE_ENERGY -> return "reactive_energy"
483
+ MBUS_CODE.REACTIVE_ENERGY: "reactive_energy",
484
+ # C++: BATTERY_PERCENTAGE -> return "battery"
485
+ MBUS_CODE.BATTERY_PERCENTAGE: "battery",
486
+ # C++: MOISTURE_LEVEL_PERCENT -> return "moisture"
487
+ MBUS_CODE.MOISTURE_LEVEL_PERCENT: "moisture",
488
+ # C++: ILLUMINANCE_LUX -> return "illuminance"
489
+ MBUS_CODE.ILLUMINANCE_LUX: "illuminance",
490
+ # C++: RADIANT_FLUX_DENS -> return "irradiance"
491
+ MBUS_CODE.RADIANT_FLUX_DENS: "irradiance",
492
+ # C++: WIND_SPEED_M_S -> return "wind_speed"
493
+ MBUS_CODE.WIND_SPEED_M_S: "wind_speed",
494
+ # C++: POTENTIAL_HYDROGEN_PH -> return "ph"
495
+ MBUS_CODE.POTENTIAL_HYDROGEN_PH: "ph",
496
+ # C++: DISTANCE_MM -> return "distance"
497
+ MBUS_CODE.DISTANCE_MM: "distance",
498
+ # C++: DECIBEL_A -> return "sound_pressure"
499
+ MBUS_CODE.DECIBEL_A: "sound_pressure",
500
+ # C++: CARBON_DIOXIDE_PPM -> return "carbon_dioxide"
501
+ MBUS_CODE.CARBON_DIOXIDE_PPM: "carbon_dioxide",
502
+ # C++: CARBON_MONOXIDE_PPM -> return "carbon_monoxide"
503
+ MBUS_CODE.CARBON_MONOXIDE_PPM: "carbon_monoxide",
504
+ # C++: VOLATILE_ORG_COMP_UG_M3 -> return "volatile_organic_compounds"
505
+ MBUS_CODE.VOLATILE_ORG_COMP_UG_M3: "volatile_organic_compounds",
506
+ # C++: PARTICLES_PM1_UG_M3 -> return "pm1"
507
+ MBUS_CODE.PARTICLES_PM1_UG_M3: "pm1",
508
+ # C++: PARTICLES_PM2_5_UG_M3 -> return "pm25"
509
+ MBUS_CODE.PARTICLES_PM2_5_UG_M3: "pm25",
510
+ # C++: PARTICLES_PM10_UG_M3 -> return "pm10"
511
+ MBUS_CODE.PARTICLES_PM10_UG_M3: "pm10",
512
+ # C++: RAINFALL_L_MM -> return "precipitation"
513
+ MBUS_CODE.RAINFALL_L_MM: "precipitation",
514
+ # C++: MASS_FLOW_KG_H / POWER_J_H / TIME_POINT_DATE / TIME_POINT_DATETIME / UNKNOWN_VIF
515
+ # FABRICATION_NUMBER / BUS_ADDRESS / CREDIT / DEBIT / ACCESS_NUMBER / MANUFACTURER
516
+ # PARAMETER_SET_ID / MODEL_VERSION / HARDWARE_VERSION / FIRMWARE_VERSION
517
+ # SOFTWARE_VERSION / CUSTOMER_LOCATION / CUSTOMER / ERROR_FLAGS / ERROR_MASK
518
+ # DIGITAL_OUTPUT / DIGITAL_INPUT / RESPONSE_DELAY_TIME / RETRY / SIZE_OF_STORAGE_BLOCK
519
+ # STORAGE_INTERVAL_MONTH / GENERIC / RESET_COUNTER / CUMULATION_COUNTER / CUSTOMIZED_VIF
520
+ # MANUFACTURER_SPECIFIC / PHASE_VOLT_DEG / PHASE_CURR_DEG / SPECIAL_SUPPLIER_INFO
521
+ # CURRENT_SELECTED_APL / SUB_DEVICES / REMAIN_BAT_LIFE_MONTH / VOLATILE_ORG_COMP_ppb
522
+ # PARTICLES_UNSPEC_UG_M3 / PARTICLES_UNSPEC_1M3 / PARTICLES_PM1_1M3
523
+ # PARTICLES_PM2_5_1M3 / PARTICLES_PM10_1M3 / LUMINOUS_INTENSITY_CD
524
+ # FORMAZIN_NEPHELOMETER_U / DISMOUNTS_COUNTER / TEST_BUTTON_COUNTER / ALARM_COUNTER
525
+ # ALARM_MUTE_COUNTER / OBSTACLE_DETECT_COUNTER / SMOKE_ENTRIES_COUNTER
526
+ # SMOKE_CHAMBER_DEFECTS / SELF_TEST_COUNTER / SOUNDER_DEFECT_COUNTER
527
+ # CHAMBER_POLLUTION_LEVEL / PRESSURE_SENS_STATUS / SMOKE_ALARM_STATUS / CO_ALARM_STATUS
528
+ # HEAT_ALARM_STATUS / DOOR_WINDOW_SENS_STATUS -> return ""
529
+ MBUS_CODE.MASS_FLOW_KG_H: "",
530
+ MBUS_CODE.POWER_J_H: "",
531
+ MBUS_CODE.TIME_POINT_DATE: "",
532
+ MBUS_CODE.TIME_POINT_DATETIME: "",
533
+ MBUS_CODE.UNKNOWN_VIF: "",
534
+ MBUS_CODE.FABRICATION_NUMBER: "",
535
+ MBUS_CODE.BUS_ADDRESS: "",
536
+ MBUS_CODE.CREDIT: "",
537
+ MBUS_CODE.DEBIT: "",
538
+ MBUS_CODE.ACCESS_NUMBER: "",
539
+ MBUS_CODE.MANUFACTURER: "",
540
+ MBUS_CODE.PARAMETER_SET_ID: "",
541
+ MBUS_CODE.MODEL_VERSION: "",
542
+ MBUS_CODE.HARDWARE_VERSION: "",
543
+ MBUS_CODE.FIRMWARE_VERSION: "",
544
+ MBUS_CODE.SOFTWARE_VERSION: "",
545
+ MBUS_CODE.CUSTOMER_LOCATION: "",
546
+ MBUS_CODE.CUSTOMER: "",
547
+ MBUS_CODE.ERROR_FLAGS: "",
548
+ MBUS_CODE.ERROR_MASK: "",
549
+ MBUS_CODE.DIGITAL_OUTPUT: "",
550
+ MBUS_CODE.DIGITAL_INPUT: "",
551
+ MBUS_CODE.RESPONSE_DELAY_TIME: "",
552
+ MBUS_CODE.RETRY: "",
553
+ MBUS_CODE.SIZE_OF_STORAGE_BLOCK: "",
554
+ MBUS_CODE.STORAGE_INTERVAL_MONTH: "",
555
+ MBUS_CODE.GENERIC: "",
556
+ MBUS_CODE.RESET_COUNTER: "",
557
+ MBUS_CODE.CUMULATION_COUNTER: "",
558
+ MBUS_CODE.CUSTOMIZED_VIF: "",
559
+ MBUS_CODE.MANUFACTURER_SPECIFIC: "",
560
+ MBUS_CODE.PHASE_VOLT_DEG: "",
561
+ MBUS_CODE.PHASE_CURR_DEG: "",
562
+ MBUS_CODE.SPECIAL_SUPPLIER_INFO: "",
563
+ MBUS_CODE.CURRENT_SELECTED_APL: "",
564
+ MBUS_CODE.SUB_DEVICES: "",
565
+ MBUS_CODE.REMAIN_BAT_LIFE_MONTH: "",
566
+ MBUS_CODE.VOLATILE_ORG_COMP_ppb: "",
567
+ MBUS_CODE.PARTICLES_UNSPEC_UG_M3: "",
568
+ MBUS_CODE.PARTICLES_UNSPEC_1M3: "",
569
+ MBUS_CODE.PARTICLES_PM1_1M3: "",
570
+ MBUS_CODE.PARTICLES_PM2_5_1M3: "",
571
+ MBUS_CODE.PARTICLES_PM10_1M3: "",
572
+ MBUS_CODE.LUMINOUS_INTENSITY_CD: "",
573
+ MBUS_CODE.FORMAZIN_NEPHELOMETER_U: "",
574
+ MBUS_CODE.DISMOUNTS_COUNTER: "",
575
+ MBUS_CODE.TEST_BUTTON_COUNTER: "",
576
+ MBUS_CODE.ALARM_COUNTER: "",
577
+ MBUS_CODE.ALARM_MUTE_COUNTER: "",
578
+ MBUS_CODE.OBSTACLE_DETECT_COUNTER: "",
579
+ MBUS_CODE.SMOKE_ENTRIES_COUNTER: "",
580
+ MBUS_CODE.SMOKE_CHAMBER_DEFECTS: "",
581
+ MBUS_CODE.SELF_TEST_COUNTER: "",
582
+ MBUS_CODE.SOUNDER_DEFECT_COUNTER: "",
583
+ MBUS_CODE.CHAMBER_POLLUTION_LEVEL: "",
584
+ MBUS_CODE.PRESSURE_SENS_STATUS: "",
585
+ MBUS_CODE.SMOKE_ALARM_STATUS: "",
586
+ MBUS_CODE.CO_ALARM_STATUS: "",
587
+ MBUS_CODE.HEAT_ALARM_STATUS: "",
588
+ MBUS_CODE.DOOR_WINDOW_SENS_STATUS: "",
589
+ }
590
+
591
+
592
+ # ===========================================================================
593
+ # getStateClass() - C++ MBusinoLib.cpp line 1382
594
+ # ===========================================================================
595
+ STATE_CLASS = {
596
+ # Corresponds to MBusinoLib::getStateClass() in MBusinoLib.cpp line 1382 (C++ switch with fall-through groups).
597
+ # Every comment line names one C++ fall-through group, the lines below are its case statements.
598
+ # C++: ENERGY_WH / ENERGY_J / VOLUME_M3 / VOLUME_FT3 / VOLUME_GAL / REACTIVE_ENERGY
599
+ # RAINFALL_L_MM / OPERATING_TIME_S / OPERATING_TIME_MIN / OPERATING_TIME_H
600
+ # OPERATING_TIME_DAYS / ON_TIME_S / ON_TIME_MIN / ON_TIME_H / ON_TIME_DAYS
601
+ # AVG_DURATION_S / AVG_DURATION_MIN / AVG_DURATION_H / AVG_DURATION_DAYS
602
+ # ACTUAL_DURATION_S / ACTUAL_DURATION_MIN / ACTUAL_DURATION_H
603
+ # ACTUAL_DURATION_DAYS -> return "total_increasing"
604
+ MBUS_CODE.ENERGY_WH: "total_increasing",
605
+ MBUS_CODE.ENERGY_J: "total_increasing",
606
+ MBUS_CODE.VOLUME_M3: "total_increasing",
607
+ MBUS_CODE.VOLUME_FT3: "total_increasing",
608
+ MBUS_CODE.VOLUME_GAL: "total_increasing",
609
+ MBUS_CODE.REACTIVE_ENERGY: "total_increasing",
610
+ MBUS_CODE.RAINFALL_L_MM: "total_increasing",
611
+ MBUS_CODE.OPERATING_TIME_S: "total_increasing",
612
+ MBUS_CODE.OPERATING_TIME_MIN: "total_increasing",
613
+ MBUS_CODE.OPERATING_TIME_H: "total_increasing",
614
+ MBUS_CODE.OPERATING_TIME_DAYS: "total_increasing",
615
+ MBUS_CODE.ON_TIME_S: "total_increasing",
616
+ MBUS_CODE.ON_TIME_MIN: "total_increasing",
617
+ MBUS_CODE.ON_TIME_H: "total_increasing",
618
+ MBUS_CODE.ON_TIME_DAYS: "total_increasing",
619
+ MBUS_CODE.AVG_DURATION_S: "total_increasing",
620
+ MBUS_CODE.AVG_DURATION_MIN: "total_increasing",
621
+ MBUS_CODE.AVG_DURATION_H: "total_increasing",
622
+ MBUS_CODE.AVG_DURATION_DAYS: "total_increasing",
623
+ MBUS_CODE.ACTUAL_DURATION_S: "total_increasing",
624
+ MBUS_CODE.ACTUAL_DURATION_MIN: "total_increasing",
625
+ MBUS_CODE.ACTUAL_DURATION_H: "total_increasing",
626
+ MBUS_CODE.ACTUAL_DURATION_DAYS: "total_increasing",
627
+ # C++: AMPERES / MASS_KG / POWER_W / MAX_POWER_W / POWER_J_H / VOLUME_FLOW_M3_H
628
+ # VOLUME_FLOW_M3_MIN / VOLUME_FLOW_M3_S / VOLUME_FLOW_GAL_M / VOLUME_FLOW_GAL_H
629
+ # MASS_FLOW_KG_H / FLOW_TEMPERATURE_C / FLOW_TEMPERATURE_F / RETURN_TEMPERATURE_C
630
+ # RETURN_TEMPERATURE_F / EXTERNAL_TEMPERATURE_C / EXTERNAL_TEMPERATURE_F
631
+ # TEMPERATURE_LIMIT_C / TEMPERATURE_LIMIT_F / TEMPERATURE_DIFF_K / TEMPERATURE_DIFF_F
632
+ # PRESSURE_BAR / BAUDRATE_BPS / VOLTS / RELATIVE_HUMIDITY / PHASE_VOLT_DEG
633
+ # PHASE_CURR_DEG / FREQUENCY / APPARENT_POWER / REACTIVE_POWER / BATTERY_PERCENTAGE
634
+ # MOISTURE_LEVEL_PERCENT / ILLUMINANCE_LUX / RADIANT_FLUX_DENS / WIND_SPEED_M_S
635
+ # POTENTIAL_HYDROGEN_PH / CARBON_DIOXIDE_PPM / CARBON_MONOXIDE_PPM
636
+ # VOLATILE_ORG_COMP_ppb / VOLATILE_ORG_COMP_UG_M3 / PARTICLES_UNSPEC_UG_M3
637
+ # PARTICLES_UNSPEC_1M3 / PARTICLES_PM1_UG_M3 / PARTICLES_PM1_1M3 / PARTICLES_PM2_5_UG_M3
638
+ # PARTICLES_PM2_5_1M3 / PARTICLES_PM10_UG_M3 / PARTICLES_PM10_1M3
639
+ # LUMINOUS_INTENSITY_CD / FORMAZIN_NEPHELOMETER_U / DISTANCE_MM / DECIBEL_A
640
+ # CHAMBER_POLLUTION_LEVEL -> return "measurement"
641
+ MBUS_CODE.AMPERES: "measurement",
642
+ MBUS_CODE.MASS_KG: "measurement",
643
+ MBUS_CODE.POWER_W: "measurement",
644
+ MBUS_CODE.MAX_POWER_W: "measurement",
645
+ MBUS_CODE.POWER_J_H: "measurement",
646
+ MBUS_CODE.VOLUME_FLOW_M3_H: "measurement",
647
+ MBUS_CODE.VOLUME_FLOW_M3_MIN: "measurement",
648
+ MBUS_CODE.VOLUME_FLOW_M3_S: "measurement",
649
+ MBUS_CODE.VOLUME_FLOW_GAL_M: "measurement",
650
+ MBUS_CODE.VOLUME_FLOW_GAL_H: "measurement",
651
+ MBUS_CODE.MASS_FLOW_KG_H: "measurement",
652
+ MBUS_CODE.FLOW_TEMPERATURE_C: "measurement",
653
+ MBUS_CODE.FLOW_TEMPERATURE_F: "measurement",
654
+ MBUS_CODE.RETURN_TEMPERATURE_C: "measurement",
655
+ MBUS_CODE.RETURN_TEMPERATURE_F: "measurement",
656
+ MBUS_CODE.EXTERNAL_TEMPERATURE_C: "measurement",
657
+ MBUS_CODE.EXTERNAL_TEMPERATURE_F: "measurement",
658
+ MBUS_CODE.TEMPERATURE_LIMIT_C: "measurement",
659
+ MBUS_CODE.TEMPERATURE_LIMIT_F: "measurement",
660
+ MBUS_CODE.TEMPERATURE_DIFF_K: "measurement",
661
+ MBUS_CODE.TEMPERATURE_DIFF_F: "measurement",
662
+ MBUS_CODE.PRESSURE_BAR: "measurement",
663
+ MBUS_CODE.BAUDRATE_BPS: "measurement",
664
+ MBUS_CODE.VOLTS: "measurement",
665
+ MBUS_CODE.RELATIVE_HUMIDITY: "measurement",
666
+ MBUS_CODE.PHASE_VOLT_DEG: "measurement",
667
+ MBUS_CODE.PHASE_CURR_DEG: "measurement",
668
+ MBUS_CODE.FREQUENCY: "measurement",
669
+ MBUS_CODE.APPARENT_POWER: "measurement",
670
+ MBUS_CODE.REACTIVE_POWER: "measurement",
671
+ MBUS_CODE.BATTERY_PERCENTAGE: "measurement",
672
+ MBUS_CODE.MOISTURE_LEVEL_PERCENT: "measurement",
673
+ MBUS_CODE.ILLUMINANCE_LUX: "measurement",
674
+ MBUS_CODE.RADIANT_FLUX_DENS: "measurement",
675
+ MBUS_CODE.WIND_SPEED_M_S: "measurement",
676
+ MBUS_CODE.POTENTIAL_HYDROGEN_PH: "measurement",
677
+ MBUS_CODE.CARBON_DIOXIDE_PPM: "measurement",
678
+ MBUS_CODE.CARBON_MONOXIDE_PPM: "measurement",
679
+ MBUS_CODE.VOLATILE_ORG_COMP_ppb: "measurement",
680
+ MBUS_CODE.VOLATILE_ORG_COMP_UG_M3: "measurement",
681
+ MBUS_CODE.PARTICLES_UNSPEC_UG_M3: "measurement",
682
+ MBUS_CODE.PARTICLES_UNSPEC_1M3: "measurement",
683
+ MBUS_CODE.PARTICLES_PM1_UG_M3: "measurement",
684
+ MBUS_CODE.PARTICLES_PM1_1M3: "measurement",
685
+ MBUS_CODE.PARTICLES_PM2_5_UG_M3: "measurement",
686
+ MBUS_CODE.PARTICLES_PM2_5_1M3: "measurement",
687
+ MBUS_CODE.PARTICLES_PM10_UG_M3: "measurement",
688
+ MBUS_CODE.PARTICLES_PM10_1M3: "measurement",
689
+ MBUS_CODE.LUMINOUS_INTENSITY_CD: "measurement",
690
+ MBUS_CODE.FORMAZIN_NEPHELOMETER_U: "measurement",
691
+ MBUS_CODE.DISTANCE_MM: "measurement",
692
+ MBUS_CODE.DECIBEL_A: "measurement",
693
+ MBUS_CODE.CHAMBER_POLLUTION_LEVEL: "measurement",
694
+ # C++: UNKNOWN_VIF / TIME_POINT_DATE / TIME_POINT_DATETIME / FABRICATION_NUMBER / BUS_ADDRESS
695
+ # CREDIT / DEBIT / ACCESS_NUMBER / MANUFACTURER / PARAMETER_SET_ID / MODEL_VERSION
696
+ # HARDWARE_VERSION / FIRMWARE_VERSION / SOFTWARE_VERSION / CUSTOMER_LOCATION / CUSTOMER
697
+ # ERROR_FLAGS / ERROR_MASK / DIGITAL_OUTPUT / DIGITAL_INPUT / RESPONSE_DELAY_TIME
698
+ # RETRY / SIZE_OF_STORAGE_BLOCK / STORAGE_INTERVAL_MONTH / GENERIC / RESET_COUNTER
699
+ # CUMULATION_COUNTER / CUSTOMIZED_VIF / MANUFACTURER_SPECIFIC / CURRENT_SELECTED_APL
700
+ # SUB_DEVICES / REMAIN_BAT_LIFE_MONTH / DISMOUNTS_COUNTER / TEST_BUTTON_COUNTER
701
+ # ALARM_COUNTER / ALARM_MUTE_COUNTER / OBSTACLE_DETECT_COUNTER / SMOKE_ENTRIES_COUNTER
702
+ # SMOKE_CHAMBER_DEFECTS / SELF_TEST_COUNTER / SOUNDER_DEFECT_COUNTER
703
+ # PRESSURE_SENS_STATUS / SMOKE_ALARM_STATUS / CO_ALARM_STATUS / HEAT_ALARM_STATUS
704
+ # DOOR_WINDOW_SENS_STATUS -> return ""
705
+ MBUS_CODE.UNKNOWN_VIF: "",
706
+ MBUS_CODE.TIME_POINT_DATE: "",
707
+ MBUS_CODE.TIME_POINT_DATETIME: "",
708
+ MBUS_CODE.FABRICATION_NUMBER: "",
709
+ MBUS_CODE.BUS_ADDRESS: "",
710
+ MBUS_CODE.CREDIT: "",
711
+ MBUS_CODE.DEBIT: "",
712
+ MBUS_CODE.ACCESS_NUMBER: "",
713
+ MBUS_CODE.MANUFACTURER: "",
714
+ MBUS_CODE.PARAMETER_SET_ID: "",
715
+ MBUS_CODE.MODEL_VERSION: "",
716
+ MBUS_CODE.HARDWARE_VERSION: "",
717
+ MBUS_CODE.FIRMWARE_VERSION: "",
718
+ MBUS_CODE.SOFTWARE_VERSION: "",
719
+ MBUS_CODE.CUSTOMER_LOCATION: "",
720
+ MBUS_CODE.CUSTOMER: "",
721
+ MBUS_CODE.ERROR_FLAGS: "",
722
+ MBUS_CODE.ERROR_MASK: "",
723
+ MBUS_CODE.DIGITAL_OUTPUT: "",
724
+ MBUS_CODE.DIGITAL_INPUT: "",
725
+ MBUS_CODE.RESPONSE_DELAY_TIME: "",
726
+ MBUS_CODE.RETRY: "",
727
+ MBUS_CODE.SIZE_OF_STORAGE_BLOCK: "",
728
+ MBUS_CODE.STORAGE_INTERVAL_MONTH: "",
729
+ MBUS_CODE.GENERIC: "",
730
+ MBUS_CODE.RESET_COUNTER: "",
731
+ MBUS_CODE.CUMULATION_COUNTER: "",
732
+ MBUS_CODE.CUSTOMIZED_VIF: "",
733
+ MBUS_CODE.MANUFACTURER_SPECIFIC: "",
734
+ MBUS_CODE.CURRENT_SELECTED_APL: "",
735
+ MBUS_CODE.SUB_DEVICES: "",
736
+ MBUS_CODE.REMAIN_BAT_LIFE_MONTH: "",
737
+ MBUS_CODE.DISMOUNTS_COUNTER: "",
738
+ MBUS_CODE.TEST_BUTTON_COUNTER: "",
739
+ MBUS_CODE.ALARM_COUNTER: "",
740
+ MBUS_CODE.ALARM_MUTE_COUNTER: "",
741
+ MBUS_CODE.OBSTACLE_DETECT_COUNTER: "",
742
+ MBUS_CODE.SMOKE_ENTRIES_COUNTER: "",
743
+ MBUS_CODE.SMOKE_CHAMBER_DEFECTS: "",
744
+ MBUS_CODE.SELF_TEST_COUNTER: "",
745
+ MBUS_CODE.SOUNDER_DEFECT_COUNTER: "",
746
+ MBUS_CODE.PRESSURE_SENS_STATUS: "",
747
+ MBUS_CODE.SMOKE_ALARM_STATUS: "",
748
+ MBUS_CODE.CO_ALARM_STATUS: "",
749
+ MBUS_CODE.HEAT_ALARM_STATUS: "",
750
+ MBUS_CODE.DOOR_WINDOW_SENS_STATUS: "",
751
+ }
752
+ # Note: SPECIAL_SUPPLIER_INFO has no own case in the C++ switch and falls
753
+ # through `default` to "" - therefore no entry here, .get(code, "") returns "".
754
+
755
+
756
+
757
+ # ===========================================================================
758
+ # decodeHeader() - medium names, C++ MBusinoLib.cpp line 1610-1636
759
+ # ===========================================================================
760
+ MEDIUM_NAMES = {
761
+ 0x01: "Oil",
762
+ 0x02: "Electricity",
763
+ 0x03: "Gas",
764
+ 0x04: "Heat",
765
+ 0x05: "Steam",
766
+ 0x06: "Warm Water",
767
+ 0x07: "Water",
768
+ 0x08: "Heat Cost Allocator",
769
+ 0x09: "Compressed Air",
770
+ 0x0A: "Cooling load meter (Volume)",
771
+ 0x0B: "Cooling load meter (Mass)",
772
+ 0x0C: "Heat (Volume)",
773
+ 0x0D: "Heat (Mass)",
774
+ 0x0E: "Combined Heat/Cooling",
775
+ 0x0F: "Bus/System component",
776
+ 0x14: "Calorific value",
777
+ 0x15: "Hot water",
778
+ 0x16: "Cold water",
779
+ 0x17: "Dual water",
780
+ 0x37: "Radio converter",
781
+ # default (all other codes) -> "Unknown"
782
+ }