Search code examples
websocketpython-asyncioautobahn

Autoban asyncio client arguments


Disclaimer: This is my first time working with WS and MQTT, so structure may be wrong. Please point this out.

I am using autoban with asyncio to receive and send messages to a HA (HomeAssistant) instance through websockets.

Once my python code receives messages, I want to forward them using MQTT to AWS IoT service. This communication needs to work both ways.

I have made this work as a script where everything is floating within a file. I am trying to make this work in a class structure, which is how my final work will be done.

In order to do that, I need my WebSocketClientProtocol to have access to AWSIoTClient .publish and .subscribe. Although WebSocketClientProtocol initialization is done through a factory, as a result I am not sure how to pass any arguments to it. For instance:

if __name__ == "__main__":

    aws_iot_client = AWSIoTClient(...)

    factory = WebSocketServerFactory('ws://localhost:8123/api/websocket')
    factory.protocol = HomeAssistantProtocol

How can I pass aws_iot_client to HomeAssistantProtocol?

I have found examples of Autobahn - Twisted that do this using self.factory on the WebSocketClientProtocol subclass, but this is not available for asyncio.


Solution

  • I found that calling run_until_complete on returns transport, protocol instances, so I can then I can pass the AWS client to it.

    loop = asyncio.get_event_loop()
    coro = loop.create_connection(factory, '127.0.0.1', 9000)
    transport, protocol = loop.run_until_complete(coro)