import serial BROADCAST = 0xfe class MDC(serial.Serial): """Samsung 400MX MDC remote control client Docs: https://www.samsung.com/us/pdf/MDC_400DXn460DXn570DXn700DXn820DXn460TXn_v1.pdf """ def command(self, command, data=[], target_id=BROADCAST): if target_id == 0: target_id = 0xff payload = bytearray([0xaa, command, target_id, len(data)] + data) # Checksum payload.append(sum(payload[1:]) & 0xff) self.write(payload) def read_frame(self): payload = bytearray([]) payload.extend(self.read(4)) if payload[0] != 0xaa: raise Exception('Invalid preamble %r' % payload[0]) if payload[1] != 0xff: raise Exception('Unexpected command field? %r' % command) payload.extend(self.read(payload[3])) checksum = ord(self.read(1)) expected_checksum = sum(payload[1:]) & 0xff if checksum != expected_checksum: raise Exception('Invalid checksum %r != %r' % (checksum, expected_checksum)) return payload[2], payload[4:] def request(self, *args, **kwargs): self.command(*args, **kwargs) return self.read_frame() if __name__ == '__main__': mdc = MDC('/dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0', 9600) mdc.command(0x10, []) while True: print(mdc.read_frame())