"""Implementation of KNX raw payload abstractions.""" from __future__ import annotations from xknx.exceptions import ConversionError class DPTBinary: """The DPTBinary is a base class for all datatypes encoded directly into the last 6 bit of the APCI/data octet.""" __slots__ = ("value",) APCI_BITMASK = 0x3F # APCI uses first 2 bits def __init__(self, value: int | tuple[int]) -> None: """Initialize DPTBinary class.""" if isinstance(value, tuple): value = value[0] if not isinstance(value, int): raise TypeError() if not 0 <= value <= DPTBinary.APCI_BITMASK: raise ConversionError("Could not init DPTBinary", value=str(value)) self.value = value def __eq__(self, other: object) -> bool: """Equal operator.""" return isinstance(other, DPTBinary) and self.value == other.value def __repr__(self) -> str: """Return object representation.""" return f"DPTBinary({hex(self.value)})" def __str__(self) -> str: """Return object as readable string.""" return f'' class DPTArray: """The DPTArray is a base class for all datatypes appended to the KNX telegram.""" __slots__ = ("value",) def __init__(self, value: int | bytes | tuple[int, ...] | list[int]) -> None: """Initialize DPTArray class.""" self.value: tuple[int, ...] if isinstance(value, int): self.value = (value,) elif isinstance(value, list | bytes): self.value = tuple(value) elif isinstance(value, tuple): self.value = value else: raise TypeError() def __eq__(self, other: object) -> bool: """Equal operator.""" return isinstance(other, DPTArray) and self.value == other.value def __repr__(self) -> str: """Return object representation.""" return f"DPTArray(({', '.join(hex(b) for b in self.value)}))" def __str__(self) -> str: """Return object as readable string.""" return f''