@@ -26,7 +26,11 @@ class BTHome:
26
26
# Device name used in BLE advertisements.
27
27
_local_name = ""
28
28
29
- # See "Sensor Data" table at https://bthome.io/format/ Object ID column.
29
+ # Naming convention is:
30
+ # <property> "_" <data-type> "_x" <inverse of factor> = <object-id>
31
+ # For example, 0x02 temperature sint16 0.01 becomes:
32
+ # TEMPERATURE _ SINT16 _x 100 = 0x02
33
+ # See "Sensor Data" table at https://bthome.io/format/
30
34
BATTERY_UINT8_X1 = const (0x01 ) # %
31
35
TEMPERATURE_SINT16_X100 = const (0x02 ) # °C
32
36
HUMIDITY_UINT16_X100 = const (0x03 ) # %
@@ -39,10 +43,10 @@ class BTHome:
39
43
ENERGY_UINT24_X1000 = const (0x0A ) # kWh
40
44
POWER_UINT24_X100 = const (0x0B ) # W
41
45
VOLTAGE_UINT16_X1000 = const (0x0C ) # V
42
- PM2_5_UINT16_X1 = const (0x0D ) # ug/m3
43
- PM10_UINT16_X1 = const (0x0E ) # ug/m3
46
+ PM2_5_UINT16_X1 = const (0x0D ) # ug/m^3
47
+ PM10_UINT16_X1 = const (0x0E ) # ug/m^3
44
48
CO2_UINT16_X1 = const (0x12 ) # ppm
45
- TVOC_UINT16_X1 = const (0x13 ) # ug/m3
49
+ TVOC_UINT16_X1 = const (0x13 ) # ug/m^3
46
50
MOISTURE_UINT16_X100 = const (0x14 ) # %
47
51
HUMIDITY_UINT8_X1 = const (0x2E ) # %
48
52
MOISTURE_UINT8_X1 = const (0x2F ) # %
@@ -58,13 +62,19 @@ class BTHome:
58
62
UV_INDEX_UINT8_X10 = const (0x46 )
59
63
VOLUME_L_UINT16_X10 = const (0x47 ) # L
60
64
VOLUME_ML_UINT16_X1 = const (0x48 ) # mL
61
- VOLUME_FLOW_RATE_X1000 = const (0x49 ) # m3 /hr
65
+ VOLUME_FLOW_RATE_X1000 = const (0x49 ) # m^3 /hr
62
66
VOLTAGE_UINT16_X10 = const (0x4A ) # V
63
- GAS_UINT24_X1000 = const (0x4B ) # m3
64
- GAS_UINT32_X1000 = const (0x4C ) # m3
67
+ GAS_UINT24_X1000 = const (0x4B ) # m^3
68
+ GAS_UINT32_X1000 = const (0x4C ) # m^3
65
69
ENERGY_UINT32_X1000 = const (0x4D ) # kWh
66
70
VOLUME_UINT32_X1000 = const (0x4E ) # L
67
71
WATER_UINT32_X1000 = const (0x4F ) # L
72
+ TIMESTAMP_UINT48_X1 = const (0x50 ) # s
73
+ ACCELERATION_UINT16_X1000 = const (0x51 ) # m/s^2
74
+ GYROSCOPE_UINT16_X1000 = const (0x52 ) # °/s
75
+ TEXT_BYTES = const (0x53 )
76
+ RAW_BYTES = const (0x54 )
77
+ VOLUME_STORAGE_UINT32_X1000 = const (0x55 ) # L
68
78
69
79
# There is more than one way to represent most sensor properties. This
70
80
# dictionary maps the object id to the property name.
@@ -105,7 +115,11 @@ class BTHome:
105
115
GAS_UINT32_X1000 : "gas" ,
106
116
ENERGY_UINT32_X1000 : "energy" ,
107
117
VOLUME_UINT32_X1000 : "volume" ,
108
- WATER_UINT32_X1000 : "water"
118
+ WATER_UINT32_X1000 : "water" ,
119
+ TIMESTAMP_UINT48_X1 : "timestamp" ,
120
+ ACCELERATION_UINT16_X1000 : "acceleration" ,
121
+ GYROSCOPE_UINT16_X1000 : "gyroscope" ,
122
+ VOLUME_STORAGE_UINT32_X1000 : "volume_storage"
109
123
}
110
124
111
125
# Properties below are updated externally when sensor values are read.
@@ -133,7 +147,7 @@ class BTHome:
133
147
power = 0
134
148
precipitation = 0
135
149
pressure = 0
136
- raw = 0
150
+ raw = bytes ()
137
151
rotation = 0
138
152
speed = 0
139
153
temperature = 0
@@ -172,11 +186,11 @@ def pack_local_name(self):
172
186
173
187
# 8-bit unsigned integer with scaling of 1 (no decimal places)
174
188
def _pack_uint8_x1 (self , object_id , value ):
175
- return pack ("BB" , object_id , value )
189
+ return pack ("BB" , object_id , round ( value ) )
176
190
177
191
# 8-bit unsigned integer with scaling of 10 (1 decimal place)
178
192
def _pack_uint8_x10 (self , object_id , value ):
179
- return pack ("BB" , object_id , value * 10 )
193
+ return pack ("BB" , object_id , round ( value * 10 ) )
180
194
181
195
# 16-bit signed integer with scalling of 10 (1 decimal place)
182
196
def _pack_sint16_x10 (self , object_id , value ):
@@ -218,6 +232,15 @@ def _pack_uint32_x1(self, object_id, value):
218
232
def _pack_uint32_x1000 (self , object_id , value ):
219
233
return pack ("<BL" , object_id , round (value * 1000 ))
220
234
235
+ # 48-bit unsigned integer with scaling of 1 (no decimal places)
236
+ def _pack_uint48_x1 (self , object_id , value ):
237
+ return pack ("<BQ" , object_id , value )[:- 2 ]
238
+
239
+ def _pack_raw_text (self , object_id , value ):
240
+ packed_value = bytes (object_id ) + value .encode ()
241
+ packed_value = bytes ([len (packed_value )]) + packed_value
242
+ return packed_value
243
+
221
244
_object_id_functions = {
222
245
BATTERY_UINT8_X1 : _pack_uint8_x1 ,
223
246
TEMPERATURE_SINT16_X100 : _pack_sint16_x100 ,
@@ -256,7 +279,13 @@ def _pack_uint32_x1000(self, object_id, value):
256
279
GAS_UINT32_X1000 : _pack_uint32_x1000 ,
257
280
ENERGY_UINT32_X1000 : _pack_uint32_x1000 ,
258
281
VOLUME_UINT32_X1000 : _pack_uint32_x1000 ,
259
- WATER_UINT32_X1000 : _pack_uint32_x1000
282
+ WATER_UINT32_X1000 : _pack_uint32_x1000 ,
283
+ TIMESTAMP_UINT48_X1 : _pack_uint48_x1 ,
284
+ ACCELERATION_UINT16_X1000 : _pack_uint16_x1000 ,
285
+ GYROSCOPE_UINT16_X1000 : _pack_uint16_x1000 ,
286
+ TEXT_BYTES : _pack_raw_text ,
287
+ RAW_BYTES : _pack_raw_text ,
288
+ VOLUME_STORAGE_UINT32_X1000 : _pack_uint32_x1000
260
289
}
261
290
262
291
# Concatenate an arbitrary number of sensor readings using parameters
0 commit comments