@@ -26,7 +26,11 @@ class BTHome:
2626 # Device name used in BLE advertisements.
2727 _local_name = ""
2828
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/
3034 BATTERY_UINT8_X1 = const (0x01 ) # %
3135 TEMPERATURE_SINT16_X100 = const (0x02 ) # °C
3236 HUMIDITY_UINT16_X100 = const (0x03 ) # %
@@ -39,10 +43,10 @@ class BTHome:
3943 ENERGY_UINT24_X1000 = const (0x0A ) # kWh
4044 POWER_UINT24_X100 = const (0x0B ) # W
4145 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
4448 CO2_UINT16_X1 = const (0x12 ) # ppm
45- TVOC_UINT16_X1 = const (0x13 ) # ug/m3
49+ TVOC_UINT16_X1 = const (0x13 ) # ug/m^3
4650 MOISTURE_UINT16_X100 = const (0x14 ) # %
4751 HUMIDITY_UINT8_X1 = const (0x2E ) # %
4852 MOISTURE_UINT8_X1 = const (0x2F ) # %
@@ -58,13 +62,19 @@ class BTHome:
5862 UV_INDEX_UINT8_X10 = const (0x46 )
5963 VOLUME_L_UINT16_X10 = const (0x47 ) # L
6064 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
6266 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
6569 ENERGY_UINT32_X1000 = const (0x4D ) # kWh
6670 VOLUME_UINT32_X1000 = const (0x4E ) # L
6771 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
6878
6979 # There is more than one way to represent most sensor properties. This
7080 # dictionary maps the object id to the property name.
@@ -105,7 +115,11 @@ class BTHome:
105115 GAS_UINT32_X1000 : "gas" ,
106116 ENERGY_UINT32_X1000 : "energy" ,
107117 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"
109123 }
110124
111125 # Properties below are updated externally when sensor values are read.
@@ -133,7 +147,7 @@ class BTHome:
133147 power = 0
134148 precipitation = 0
135149 pressure = 0
136- raw = 0
150+ raw = bytes ()
137151 rotation = 0
138152 speed = 0
139153 temperature = 0
@@ -172,11 +186,11 @@ def pack_local_name(self):
172186
173187 # 8-bit unsigned integer with scaling of 1 (no decimal places)
174188 def _pack_uint8_x1 (self , object_id , value ):
175- return pack ("BB" , object_id , value )
189+ return pack ("BB" , object_id , round ( value ) )
176190
177191 # 8-bit unsigned integer with scaling of 10 (1 decimal place)
178192 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 ) )
180194
181195 # 16-bit signed integer with scalling of 10 (1 decimal place)
182196 def _pack_sint16_x10 (self , object_id , value ):
@@ -218,6 +232,15 @@ def _pack_uint32_x1(self, object_id, value):
218232 def _pack_uint32_x1000 (self , object_id , value ):
219233 return pack ("<BL" , object_id , round (value * 1000 ))
220234
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+
221244 _object_id_functions = {
222245 BATTERY_UINT8_X1 : _pack_uint8_x1 ,
223246 TEMPERATURE_SINT16_X100 : _pack_sint16_x100 ,
@@ -256,7 +279,13 @@ def _pack_uint32_x1000(self, object_id, value):
256279 GAS_UINT32_X1000 : _pack_uint32_x1000 ,
257280 ENERGY_UINT32_X1000 : _pack_uint32_x1000 ,
258281 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
260289 }
261290
262291 # Concatenate an arbitrary number of sensor readings using parameters
0 commit comments