示例#1
0
class IndividualAddressSerialWrite(APCI):
    """IndividualAddressSerialWrite service."""

    CODE = APCIExtendedService.INDIVIDUAL_ADDRESS_SERIAL_WRITE

    def __init__(
        self,
        serial: bytes | None = None,
        address: IndividualAddress | None = None,
    ) -> None:
        """Initialize a new instance of IndividualAddressSerialWrite."""
        if serial is None:
            serial = bytes([0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
        if address is None:
            address = IndividualAddress("0.0.0")

        self.serial = serial
        self.address = address

    def calculated_length(self) -> int:
        """Get length of APCI payload."""
        return 13

    def from_knx(self, raw: bytes) -> None:
        """Parse/deserialize from KNX/IP raw data."""
        self.serial, address_high, address_low, _ = struct.unpack(
            "!6sBBI", raw[2:])

        self.address = IndividualAddress((address_high, address_low))

    def to_knx(self) -> bytes:
        """Serialize to KNX/IP raw data."""
        if len(self.serial) != 6:
            raise ConversionError("Serial must be 6 bytes.")

        address_high, address_low = self.address.to_knx()
        payload = struct.pack("!6sBBI", self.serial, address_high, address_low,
                              0)

        return encode_cmd_and_payload(self.CODE, appended_payload=payload)

    def __str__(self) -> str:
        """Return object as readable string."""
        return f'<IndividualAddressSerialWrite serial="{self.serial.hex()}" address="{self.address}" />'
示例#2
0
class IndividualAddressWrite(APCI):
    """
    IndividualAddressWrite service.

    Payload contains the serial number and (new) address of the device.
    """

    CODE = APCIService.INDIVIDUAL_ADDRESS_WRITE

    def __init__(
        self,
        address: IndividualAddress | None = None,
    ) -> None:
        """Initialize a new instance of IndividualAddressWrite."""
        if address is None:
            address = IndividualAddress("0.0.0")

        self.address = address

    def calculated_length(self) -> int:
        """Get length of APCI payload."""
        return 3

    def from_knx(self, raw: bytes) -> None:
        """Parse/deserialize from KNX/IP raw data."""
        address_high, address_low = struct.unpack("!BB", raw[2:])

        self.address = IndividualAddress((address_high, address_low))

    def to_knx(self) -> bytes:
        """Serialize to KNX/IP raw data."""
        return encode_cmd_and_payload(self.CODE,
                                      appended_payload=bytes(
                                          self.address.to_knx()))

    def __str__(self) -> str:
        """Return object as readable string."""
        return f'<IndividualAddressWrite address="{self.address}" />'