@@ -41,54 +41,30 @@ def _pack_device_name():
4141 device_name_bytes = bytes ([len (device_name_bytes )]) + device_name_bytes
4242 return device_name_bytes
4343
44- # Functions to conver integer or float values to little endian fixed-point decimal
45- def _pack_battery ():
46- return pack ('BB' , BATTERY_UINT8 , battery )
47-
48- def _pack_temperature (object_id ):
49- if object_id == TEMPERATURE_SINT16 :
50- temperature_bytes = pack ('<Bh' , TEMPERATURE_SINT16 , round (temperature * _TEMPERATURE_SINT16_SCALING ))
51- else :
52- temperature_bytes = bytes ()
53- return temperature_bytes
54-
55- def _pack_humidity (object_id ):
56- if object_id == HUMIDITY_UINT16 :
57- humidity_bytes = pack ('<Bh' , HUMIDITY_UINT16 , round (humidity * _HUMIDITY_UINT16_SCALING ))
58- else :
59- humidity_bytes = bytes ()
60- return humidity_bytes
61-
62- def _pack_pressure (object_id ):
63- if object_id == PRESSURE_UINT24 :
64- pressure_bytes = pack ('<BL' , PRESSURE_UINT24 , round (pressure * _PRESSURE_UINT24_SCALING ))[:- 1 ]
65- else :
66- pressure_bytes = bytes ()
67- return pressure_bytes
68-
69- def _pack_illuminance (object_id ):
70- if object_id == ILLUMINANCE_UINT24 :
71- illuminance_bytes = pack ('<BL' , ILLUMINANCE_UINT24 , round (illuminance * _ILLUMINANCE_UINT24_SCALING ))[:- 1 ]
44+ # The BTHome object ID determines the number of bytes and fixed point decimal multiplier.
45+ def _pack_bthome_data (object_id ):
46+ if object_id == BATTERY_UINT8 :
47+ bthome_bytes = pack ('BB' , BATTERY_UINT8 , battery )
48+ elif object_id == TEMPERATURE_SINT16 :
49+ bthome_bytes = pack ('<Bh' , TEMPERATURE_SINT16 , round (temperature * _TEMPERATURE_SINT16_SCALING ))
50+ elif object_id == HUMIDITY_UINT16 :
51+ bthome_bytes = pack ('<Bh' , HUMIDITY_UINT16 , round (humidity * _HUMIDITY_UINT16_SCALING ))
52+ elif object_id == PRESSURE_UINT24 :
53+ bthome_bytes = pack ('<BL' , PRESSURE_UINT24 , round (pressure * _PRESSURE_UINT24_SCALING ))[:- 1 ]
54+ elif object_id == ILLUMINANCE_UINT24 :
55+ bthome_bytes = pack ('<BL' , ILLUMINANCE_UINT24 , round (illuminance * _ILLUMINANCE_UINT24_SCALING ))[:- 1 ]
7256 else :
73- illuminance_bytes = bytes ()
74- return illuminance_bytes
57+ bthome_bytes = bytes ()
58+ print ("Packing with data:" , bthome_bytes .hex ().upper ())
59+ return bthome_bytes
7560
7661# Concatenate an arbitrary number of sensor readings using parameters of sensor data constants to indicate what's included.
7762def _pack_service_data (* args ):
7863 service_data_bytes = pack ('B' , _SERVICE_DATA_UUID16 ) # indicates a 16-bit service UUID follows
7964 service_data_bytes += pack ('<h' , _SERVICE_UUID16 )
8065 service_data_bytes += pack ('B' , _DEVICE_INFO_FLAGS )
8166 for object_id in args :
82- if object_id == BATTERY_UINT8 :
83- service_data_bytes += _pack_battery ()
84- if object_id == TEMPERATURE_SINT16 :
85- service_data_bytes += _pack_temperature (TEMPERATURE_SINT16 )
86- if object_id == HUMIDITY_UINT16 :
87- service_data_bytes += _pack_humidity (HUMIDITY_UINT16 )
88- if object_id == PRESSURE_UINT24 :
89- service_data_bytes += _pack_pressure (PRESSURE_UINT24 )
90- if object_id == ILLUMINANCE_UINT24 :
91- service_data_bytes += _pack_illuminance (ILLUMINANCE_UINT24 )
67+ service_data_bytes += _pack_bthome_data (object_id )
9268 service_data_bytes = pack ('B' , len (service_data_bytes )) + service_data_bytes
9369 return service_data_bytes
9470
0 commit comments