Skip to content

Commit d802f3a

Browse files
bthome.py - more object_ids
1 parent a702c11 commit d802f3a

File tree

1 file changed

+41
-12
lines changed

1 file changed

+41
-12
lines changed

src/bthome.py

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)