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

18 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-18 11:17 +0000

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

2 

3from __future__ import annotations 

4 

5from datetime import datetime 

6 

7from ..context import CharacteristicContext 

8from .base import BaseCharacteristic 

9from .utils import DataParser 

10 

11 

12class DateTimeCharacteristic(BaseCharacteristic[datetime]): 

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

14 

15 org.bluetooth.characteristic.date_time 

16 

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

18 """ 

19 

20 expected_length = 7 

21 

22 def _decode_value( 

23 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True 

24 ) -> 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 validate: Whether to validate ranges (default True) 

31 

32 Returns: 

33 Python datetime object with parsed date and time. 

34 """ 

35 return datetime( 

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

37 month=data[2], 

38 day=data[3], 

39 hour=data[4], 

40 minute=data[5], 

41 second=data[6], 

42 ) 

43 

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

45 """Encode datetime value back to bytes. 

46 

47 Args: 

48 data: Python datetime object to encode 

49 

50 Returns: 

51 Encoded bytes (7 bytes) 

52 """ 

53 result = bytearray() 

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

55 result.append(data.month) 

56 result.append(data.day) 

57 result.append(data.hour) 

58 result.append(data.minute) 

59 result.append(data.second) 

60 return result