From 275f08658f7bff96e0df8ef197d4e369aa163605 Mon Sep 17 00:00:00 2001 From: Wesley Ray Date: Mon, 29 Dec 2025 09:59:28 -0500 Subject: [PATCH] Feat: Implement correct response parsing and GetDevices decoder --- src/onecontrol_client.py | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/onecontrol_client.py b/src/onecontrol_client.py index 1b1d76e..ab4ce61 100644 --- a/src/onecontrol_client.py +++ b/src/onecontrol_client.py @@ -41,6 +41,7 @@ class OneControlClient: self.encoder = CobsEncoder() self.decoder = CobsDecoder() self._seq = 0 + self._pending_commands = {} # seq -> cmd_type async def connect(self): """Connect to OneControl device""" @@ -58,8 +59,37 @@ class OneControlClient: """Handle notifications from device""" try: decoded = self.decoder.decode(data) - print(f"Received: {decoded.hex()}") - # Parse response here + # print(f"Received: {decoded.hex()}") + + # Response Structure: [Event(1)] [Seq(2)] [RespType(1)] [Payload...] + if len(decoded) < 4: + return + + event_type = decoded[0] + seq = struct.unpack("= 128: + self._pending_commands.pop(seq, None) + else: + print(f"Received Response for unknown Seq {seq}: {payload.hex()}") + else: + print(f"Received Event {event_type}: {decoded.hex()}") + except Exception as e: print(f"Error decoding: {e}") @@ -72,6 +102,10 @@ class OneControlClient: """Send command to device""" # Build packet seq = self._next_seq() + + # Track pending command + self._pending_commands[seq] = cmd_type + packet = struct.pack(" {encoded.hex()}") + print(f"Sent (Seq {seq}): {packet.hex()}") async def get_devices(self, start_id: int = 0, max_count: int = 255): """Get list of devices (Command 1)"""