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}" />'
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}" />'