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
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-11 20:14 +0000
1"""Date Time characteristic implementation."""
3from __future__ import annotations
5from datetime import datetime
7from ...types.gatt_enums import ValueType
8from ..context import CharacteristicContext
9from .base import BaseCharacteristic
10from .utils import DataParser
13class DateTimeCharacteristic(BaseCharacteristic[datetime]):
14 """Date Time characteristic (0x2A08).
16 org.bluetooth.characteristic.date_time
18 Represents date and time in 7-byte format: year(2), month(1), day(1), hours(1), minutes(1), seconds(1).
19 """
21 _manual_value_type = ValueType.DATETIME
22 expected_length = 7
24 def _decode_value(self, data: bytearray, ctx: CharacteristicContext | None = None) -> 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.
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 )
43 def _encode_value(self, data: datetime) -> bytearray:
44 """Encode datetime value back to bytes.
46 Args:
47 data: Python datetime object to encode
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