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

12 statements  

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

1"""Illuminance characteristic implementation.""" 

2 

3from __future__ import annotations 

4 

5from ..context import CharacteristicContext 

6from .base import BaseCharacteristic 

7from .utils.data_parser import DataParser 

8 

9# pylint: disable=duplicate-code 

10# Justification: This file follows the standard BLE characteristic base class pattern, 

11# which is intentionally duplicated across multiple characteristic implementations. 

12# These patterns are required by Bluetooth SIG specifications and represent legitimate 

13# code duplication for protocol compliance. 

14 

15 

16class IlluminanceCharacteristic(BaseCharacteristic[float]): 

17 """Illuminance characteristic (0x2AFB). 

18 

19 Measures light intensity in lux (lumens per square meter). 

20 Uses uint24 (3 bytes) with 0.01 lux resolution. 

21 """ 

22 

23 resolution: float = 0.01 

24 

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

26 """Decode illuminance characteristic. 

27 

28 Decodes a 24-bit unsigned integer representing illuminance in 0.01 lux increments 

29 per Bluetooth SIG Illuminance characteristic specification. 

30 

31 Args: 

32 data: Raw bytes from BLE characteristic (exactly 3 bytes, little-endian) 

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

34 

35 Returns: 

36 Illuminance in lux 

37 

38 Raises: 

39 InsufficientDataError: If data is not exactly 3 bytes 

40 """ 

41 raw_value = DataParser.parse_int24(data, 0, signed=False) 

42 return raw_value * self.resolution 

43 

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

45 """Encode illuminance value.""" 

46 raw_value = int(data / self.resolution) 

47 return DataParser.encode_int24(raw_value, signed=False)