diff --git a/examples/read_bus.py b/examples/read_bus.py index ae03a90..6ed4a59 100644 --- a/examples/read_bus.py +++ b/examples/read_bus.py @@ -15,13 +15,6 @@ async def main(connect_str: str): - # SET THE connection params below - # example via signum: - # velbus = Velbus("tls://192.168.1.9:27015") - # example via plain IP - # velbus = Velbus("192.168.1.9:27015") - # example via serial device - # velbus = Velbus("/dev/ttyAMA0") velbus = Velbus(connect_str) await velbus.connect() for mod in (velbus.get_modules()).values(): @@ -32,4 +25,4 @@ async def main(connect_str: str): logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) logging.getLogger("asyncio").setLevel(logging.DEBUG) -asyncio.run(main(args.connect), debug=False) +asyncio.run(main(args.connect), debug=True) diff --git a/velbusaio/controller.py b/velbusaio/controller.py index a9a800f..101024d 100644 --- a/velbusaio/controller.py +++ b/velbusaio/controller.py @@ -46,7 +46,7 @@ def __init__( self._auto_reconnect = True self._dsn = dsn - self._handler = PacketHandler(self.send, self) + self._handler = PacketHandler(self) self._modules: dict[int, Module] = {} self._submodules: list[int] = [] self._send_queue: asyncio.Queue = asyncio.Queue() diff --git a/velbusaio/handler.py b/velbusaio/handler.py index 2e9a29c..6115e51 100644 --- a/velbusaio/handler.py +++ b/velbusaio/handler.py @@ -39,11 +39,10 @@ class PacketHandler: def __init__( self, - writer: Callable[[Message], Awaitable[None]], velbus: Velbus, ) -> None: - self._log = logging.getLogger("velbus-packet") - self._writer = writer + self._log = logging.getLogger("velbus-handler") + self._log.setLevel(logging.DEBUG) self._velbus = velbus self._typeResponseReceived = asyncio.Event() self._scanLock = threading.Lock() @@ -101,9 +100,9 @@ async def scan(self) -> None: ) self._scan_delay_msec = SCAN_MODULEINFO_TIMEOUT_INITIAL while self._scan_delay_msec > 50 and not module.is_loaded(): - self._log.debug( - f"\t... waiting {self._scan_delay_msec} is_loaded={module.is_loaded()}" - ) + # self._log.debug( + # f"\t... waiting {self._scan_delay_msec} is_loaded={module.is_loaded()}" + # ) self._scan_delay_msec = self._scan_delay_msec - 50 await asyncio.sleep(0.05) self._log.info( @@ -113,7 +112,6 @@ async def scan(self) -> None: self._log.error( f"Module {address} did not respond to info requests after successful type request" ) - self._scan_complete = True self._log.info("Module scan completed") @@ -181,6 +179,8 @@ async def handle(self, rawmsg: RawMessage) -> None: module_type = module.get_type() if commandRegistry.has_command(int(command_value), module_type): command = commandRegistry.get_command(command_value, module_type) + if not command: + return msg = command() msg.populate(priority, address, rtr, data) # restart the info completion time when info message received @@ -238,15 +238,16 @@ def _handle_module_subtype(self, msg: ModuleSubTypeMessage) -> None: } self._velbus.add_submodules(module, addrList) - def _channel_convert(self, module: str, channel: str, ctype: str) -> None | int: - data = keys_exists( - self.pdata, "ModuleTypes", h2(module), "ChannelNumbers", ctype - ) - if data and "Map" in data and h2(channel) in data["Map"]: - return data["Map"][h2(channel)] - if data and "Convert" in data: - return int(channel) - for offset in range(0, 8): - if channel & (1 << offset): - return offset + 1 - return None + +# def _channel_convert(self, module: str, channel: str, ctype: str) -> None | int: +# data = keys_exists( +# self.pdata, "ModuleTypes", h2(module), "ChannelNumbers", ctype +# ) +# if data and "Map" in data and h2(channel) in data["Map"]: +# return data["Map"][h2(channel)] +# if data and "Convert" in data: +# return int(channel) +# for offset in range(0, 8): +# if channel & (1 << offset): +# return offset + 1 +# return None diff --git a/velbusaio/module.py b/velbusaio/module.py index 8ae03f6..9ba366c 100644 --- a/velbusaio/module.py +++ b/velbusaio/module.py @@ -253,6 +253,7 @@ async def on_message(self, message: Message) -> None: """ Process received message """ + self._log.debug(f"RX: {message}") _channel_offset = self.calc_channel_offset(message.address) if isinstance( diff --git a/velbusaio/protocol.json b/velbusaio/protocol.json index 6ed40a6..1d12557 100644 --- a/velbusaio/protocol.json +++ b/velbusaio/protocol.json @@ -9045,6 +9045,74 @@ "Type": "SelectedProgram" } }, + "Memory": { + "Address": { + "049C": { "ModuleName": "0:Start" }, + "049D": { "ModuleName": "1" }, + "049E": { "ModuleName": "2" }, + "049F": { "ModuleName": "3" }, + "04A0": { "ModuleName": "4" }, + "04A1": { "ModuleName": "5" }, + "04A2": { "ModuleName": "6" }, + "04A3": { "ModuleName": "7" }, + "04A4": { "ModuleName": "8" }, + "04A5": { "ModuleName": "9" }, + "04A6": { "ModuleName": "10" }, + "04A7": { "ModuleName": "11" }, + "04A8": { "ModuleName": "12" }, + "04A9": { "ModuleName": "13" }, + "04AA": { "ModuleName": "14" }, + "04AB": { "ModuleName": "15" }, + "04AC": { "ModuleName": "16" }, + "04AD": { "ModuleName": "17" }, + "04AE": { "ModuleName": "18" }, + "04AF": { "ModuleName": "19" }, + "04B0": { "ModuleName": "20" }, + "04B1": { "ModuleName": "21" }, + "04B2": { "ModuleName": "22" }, + "04B3": { "ModuleName": "23" }, + "04B4": { "ModuleName": "24" }, + "04B5": { "ModuleName": "25" }, + "04B6": { "ModuleName": "26" }, + "04B7": { "ModuleName": "27" }, + "04B8": { "ModuleName": "28" }, + "04B9": { "ModuleName": "29" }, + "04BA": { "ModuleName": "30" }, + "04BB": { "ModuleName": "31" }, + "04BC": { "ModuleName": "32" }, + "04BD": { "ModuleName": "33" }, + "04BE": { "ModuleName": "34" }, + "04BF": { "ModuleName": "35" }, + "04C0": { "ModuleName": "36" }, + "04C1": { "ModuleName": "37" }, + "04C2": { "ModuleName": "38" }, + "04C3": { "ModuleName": "39" }, + "04C4": { "ModuleName": "40" }, + "04C5": { "ModuleName": "41" }, + "04C6": { "ModuleName": "42" }, + "04C7": { "ModuleName": "43" }, + "04C8": { "ModuleName": "44" }, + "04C9": { "ModuleName": "45" }, + "04CA": { "ModuleName": "46" }, + "04CB": { "ModuleName": "47" }, + "04CC": { "ModuleName": "48" }, + "04CD": { "ModuleName": "49" }, + "04CE": { "ModuleName": "50" }, + "04CF": { "ModuleName": "51" }, + "04D0": { "ModuleName": "52" }, + "04D1": { "ModuleName": "53" }, + "04D2": { "ModuleName": "54" }, + "04D3": { "ModuleName": "55" }, + "04D4": { "ModuleName": "56" }, + "04D5": { "ModuleName": "57" }, + "04D6": { "ModuleName": "58" }, + "04D7": { "ModuleName": "59" }, + "04D8": { "ModuleName": "60" }, + "04D9": { "ModuleName": "61" }, + "04DA": { "ModuleName": "62" }, + "04DB": { "ModuleName": "64:Save" } + } + }, "Info": "8 channel 0 to 10 V dimmer control module", "Type": "VMB8DC-20" },