Coverage for src / bluetooth_sig / gatt / characteristics / temperature.py: 100%

12 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-01-11 20:14 +0000

1"""Temperature characteristic implementation.""" 

2 

3from __future__ import annotations 

4 

5from ..context import CharacteristicContext 

6from .base import BaseCharacteristic 

7from .utils.data_parser import DataParser 

8 

9 

10class TemperatureCharacteristic(BaseCharacteristic[float]): 

11 """Temperature characteristic (0x2A6E). 

12 

13 org.bluetooth.characteristic.temperature 

14 

15 Temperature measurement characteristic. 

16 """ 

17 

18 expected_type: type | None = float # Allows both float and None (for unknown value) 

19 

20 def _decode_value(self, data: bytearray, ctx: CharacteristicContext | None = None) -> float | None: 

21 """Decode temperature characteristic. 

22 

23 Decodes a 16-bit signed integer representing temperature in 0.01°C increments 

24 per Bluetooth SIG Temperature characteristic specification. 

25 

26 Args: 

27 data: Raw bytes from BLE characteristic (exactly 2 bytes, little-endian) 

28 ctx: Optional context for parsing (device info, flags, etc.) 

29 

30 Returns: 

31 Temperature in degrees Celsius, or None if value is unknown (-32768) 

32 

33 Raises: 

34 InsufficientDataError: If data is not exactly 2 bytes 

35 """ 

36 raw_value = DataParser.parse_int16(data, 0, signed=True) 

37 return raw_value * 0.01 

38 

39 def _encode_value(self, data: float) -> bytearray: 

40 """Encode temperature value.""" 

41 raw_value = int(data / 0.01) 

42 return DataParser.encode_int16(raw_value, signed=True)