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

20 statements  

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

1"""Date Time characteristic implementation.""" 

2 

3from __future__ import annotations 

4 

5from datetime import datetime 

6 

7from ...types.gatt_enums import ValueType 

8from ..context import CharacteristicContext 

9from .base import BaseCharacteristic 

10from .utils import DataParser 

11 

12 

13class DateTimeCharacteristic(BaseCharacteristic[datetime]): 

14 """Date Time characteristic (0x2A08). 

15 

16 org.bluetooth.characteristic.date_time 

17 

18 Represents date and time in 7-byte format: year(2), month(1), day(1), hours(1), minutes(1), seconds(1). 

19 """ 

20 

21 _manual_value_type = ValueType.DATETIME 

22 expected_length = 7 

23 

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

25 """Parse date time value. 

26 

27 Args: 

28 data: Raw bytearray from BLE characteristic (7 bytes, validated by base class). 

29 ctx: Optional CharacteristicContext. 

30 

31 Returns: 

32 Python datetime object with parsed date and time. 

33 """ 

34 return datetime( 

35 year=DataParser.parse_int16(data, 0, signed=False), 

36 month=data[2], 

37 day=data[3], 

38 hour=data[4], 

39 minute=data[5], 

40 second=data[6], 

41 ) 

42 

43 def _encode_value(self, data: datetime) -> bytearray: 

44 """Encode datetime value back to bytes. 

45 

46 Args: 

47 data: Python datetime object to encode 

48 

49 Returns: 

50 Encoded bytes (7 bytes) 

51 """ 

52 result = bytearray() 

53 result.extend(DataParser.encode_int16(data.year, signed=False)) 

54 result.append(data.month) 

55 result.append(data.day) 

56 result.append(data.hour) 

57 result.append(data.minute) 

58 result.append(data.second) 

59 return result