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
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-11 20:14 +0000
1"""Illuminance characteristic implementation."""
3from __future__ import annotations
5from ..context import CharacteristicContext
6from .base import BaseCharacteristic
7from .utils.data_parser import DataParser
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.
16class IlluminanceCharacteristic(BaseCharacteristic[float]):
17 """Illuminance characteristic (0x2AFB).
19 Measures light intensity in lux (lumens per square meter).
20 Uses uint24 (3 bytes) with 0.01 lux resolution.
21 """
23 resolution: float = 0.01
25 def _decode_value(self, data: bytearray, ctx: CharacteristicContext | None = None) -> float:
26 """Decode illuminance characteristic.
28 Decodes a 24-bit unsigned integer representing illuminance in 0.01 lux increments
29 per Bluetooth SIG Illuminance characteristic specification.
31 Args:
32 data: Raw bytes from BLE characteristic (exactly 3 bytes, little-endian)
33 ctx: Optional context for parsing (device info, flags, etc.)
35 Returns:
36 Illuminance in lux
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
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)