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
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 11:17 +0000
1"""Date Time characteristic implementation."""
3from __future__ import annotations
5from datetime import datetime
7from ..context import CharacteristicContext
8from .base import BaseCharacteristic
9from .utils import DataParser
12class DateTimeCharacteristic(BaseCharacteristic[datetime]):
13 """Date Time characteristic (0x2A08).
15 org.bluetooth.characteristic.date_time
17 Represents date and time in 7-byte format: year(2), month(1), day(1), hours(1), minutes(1), seconds(1).
18 """
20 expected_length = 7
22 def _decode_value(
23 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True
24 ) -> datetime:
25 """Parse date time value.
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)
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 )
44 def _encode_value(self, data: datetime) -> bytearray:
45 """Encode datetime value back to bytes.
47 Args:
48 data: Python datetime object to encode
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