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
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-11 20:14 +0000
1"""Temperature characteristic implementation."""
3from __future__ import annotations
5from ..context import CharacteristicContext
6from .base import BaseCharacteristic
7from .utils.data_parser import DataParser
10class TemperatureCharacteristic(BaseCharacteristic[float]):
11 """Temperature characteristic (0x2A6E).
13 org.bluetooth.characteristic.temperature
15 Temperature measurement characteristic.
16 """
18 expected_type: type | None = float # Allows both float and None (for unknown value)
20 def _decode_value(self, data: bytearray, ctx: CharacteristicContext | None = None) -> float | None:
21 """Decode temperature characteristic.
23 Decodes a 16-bit signed integer representing temperature in 0.01°C increments
24 per Bluetooth SIG Temperature characteristic specification.
26 Args:
27 data: Raw bytes from BLE characteristic (exactly 2 bytes, little-endian)
28 ctx: Optional context for parsing (device info, flags, etc.)
30 Returns:
31 Temperature in degrees Celsius, or None if value is unknown (-32768)
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
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)