树莓派MQTT-IO连接报错:paho.mqtt.client无WebsocketWrapper属性
问题
群晖虚拟机运行Home Assistant,内置Mosquitto broker;树莓派部署MQTT-IO v2.3.0,通过MQTT连接HA实现GPIO控制智能家居,稳定运行超一年。上周树莓派SD卡损坏,无备份需重新部署,旧卡可短暂启动对比配置但未发现问题。执行python3 -m mqtt_io /home/Kwarco/Desktop/config.yml后,终端报AttributeError: module 'paho.mqtt.client' has no attribute 'WebsocketWrapper'错误,Mosquitto日志显示连接后立即断开。HA端无改动,仅软件版本不同,已尝试降级树莓派系统无效,也无法安装旧版MQTT-IO,需排查解决。
相关日志与配置
终端输入
python3 -m mqtt_io /home/Kwarco/Desktop/config.yml
终端输出
2024-06-14 22:33:59 mqtt_io.server [INFO] Digital output 'Ctrl_GordijnDicht' current value is False (raw: True) 2024-06-14 22:34:00 mqtt_io.server [INFO] Digital output 'Ctrl_GordijnOpen' current value is False (raw: True) 2024-06-14 22:34:01 mqtt_io.server [INFO] Digital output 'Ctrl_VerluchtingPower' current value is False (raw: True) 2024-06-14 22:34:02 mqtt_io.server [INFO] Digital output 'Ctrl_Verluchting1' current value is False (raw: True) 2024-06-14 22:34:03 mqtt_io.server [INFO] Digital output 'Ctrl_Verluchting2' current value is False (raw: True) 2024-06-14 22:34:04 mqtt_io.server [INFO] Digital output 'Ctrl_Verluchting3' current value is False (raw: True) 2024-06-14 22:34:05 mqtt_io.server [INFO] Digital output 'Ctrl_LuikDicht' current value is False (raw: False) 2024-06-14 22:34:06 mqtt_io.server [INFO] Digital output 'Ctrl_LuikOpen' current value is False (raw: False) 2024-06-14 22:34:06 mqtt_io.server [INFO] Connecting to MQTT... 2024-06-14 22:34:06 mqtt_io.server [ERROR] Exception in critical task: Traceback (most recent call last): File "/usr/local/lib/python3.11/dist-packages/mqtt_io/server.py", line 1380, in _main_loop await self._connect_mqtt() File "/usr/local/lib/python3.11/dist-packages/mqtt_io/server.py", line 707, in _connect_mqtt await self.mqtt.connect() File "/usr/local/lib/python3.11/dist-packages/mqtt_io/mqtt/asyncio_mqtt.py", line 51, in inner await func(*args, **kwargs) File "/usr/local/lib/python3.11/dist-packages/mqtt_io/mqtt/asyncio_mqtt.py", line 116, in connect await self._client.connect(timeout=timeout) File "/home/Kwarco/.local/lib/python3.11/site-packages/asyncio_mqtt/client.py", line 82, in connect if not isinstance(client_socket, mqtt.WebsocketWrapper): ^^^^^^^^^^^^^^^^^^^^^ AttributeError: module 'paho.mqtt.client' has no attribute 'WebsocketWrapper' 2024-06-14 22:34:08 mqtt_io.server [INFO] Reconnecting to MQTT broker (infinite retries remaining) 2024-06-14 22:34:08 mqtt_io.server [INFO] Connecting to MQTT... 2024-06-14 22:34:08 mqtt_io.server [ERROR] Exception in critical task: Traceback (most recent call last): File "/usr/local/lib/python3.11/dist-packages/mqtt_io/server.py", line 1380, in _main_loop await self._connect_mqtt() File "/usr/local/lib/python3.11/dist-packages/mqtt_io/server.py", line 707, in _connect_mqtt await self.mqtt.connect() File "/usr/local/lib/python3.11/dist-packages/mqtt_io/mqtt/asyncio_mqtt.py", line 51, in inner await func(*args, **kwargs) File "/usr/local/lib/python3.11/dist-packages/mqtt_io/mqtt/asyncio_mqtt.py", line 116, in connect await self._client.connect(timeout=timeout) File "/home/Kwarco/.local/lib/python3.11/site-packages/asyncio_mqtt/client.py", line 82, in connect if not isinstance(client_socket, mqtt.WebsocketWrapper): ^^^^^^^^^^^^^^^^^^^^^ AttributeError: module 'paho.mqtt.client' has no attribute 'WebsocketWrapper' ^CTraceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "/usr/local/lib/python3.11/dist-packages/mqtt_io/__main__.py", line 115, in <module> main() File "/usr/local/lib/python3.11/dist-packages/mqtt_io/__main__.py", line 107, in main mqtt_gpio.run() File "/usr/local/lib/python3.11/dist-packages/mqtt_io/server.py", line 1458, in run self.loop.run_until_complete(self._main_task) File "/usr/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/dist-packages/mqtt_io/server.py", line 1422, in _main_loop await asyncio.sleep(reconnect_delay) File "/usr/lib/python3.11/asyncio/tasks.py", line 639, in sleep return await future ^^^^^^^^^^^^ asyncio.exceptions.CancelledError Exception ignored in: <coroutine object MqttIo.digital_output_loop at 0x75804708> Traceback (most recent call last): File "/usr/local/lib/python3.11/dist-packages/mqtt_io/server.py", line 1304, in digital_output_loop File "/usr/lib/python3.11/asyncio/queues.py", line 160, in get File "/usr/lib/python3.11/asyncio/base_events.py", line 761, in call_soon File "/usr/lib/python3.11/asyncio/base_events.py", line 519, in _check_closed RuntimeError: Event loop is closed Exception ignored in: <function Client.__del__ at 0x758173e8> Traceback (most recent call last): File "/home/Kwarco/.local/lib/python3.11/site-packages/paho/mqtt/client.py", line 880, in __del__ File "/home/Kwarco/.local/lib/python3.11/site-packages/paho/mqtt/client.py", line 1139, in _reset_sockets File "/home/Kwarco/.local/lib/python3.11/site-packages/paho/mqtt/client.py", line 1132, in _sock_close File "/home/Kwarco/.local/lib/python3.11/site-packages/paho/mqtt/client.py", line 2867, in _call_socket_close File "/home/Kwarco/.local/lib/python3.11/site-packages/asyncio_mqtt/client.py", line 308, in _on_socket_close File "/usr/lib/python3.11/asyncio/base_events.py", line 761, in call_soon File "/usr/lib/python3.11/asyncio/base_events.py", line 519, in _check_closed RuntimeError: Event loop is closed sys:1: RuntimeWarning: coroutine 'MqttIo._mqtt_publish' was never awaited
Mosquitto Broker日志
2024-06-14 22:34:06: New client connected from 192.168.XX.XX:43371 as mqtt-io-1634c5d8600786512fd602 (p2, c0, k60, u'Kwarco'). 2024-06-14 22:34:08: New connection from 192.168.XX.XX:51041 on port 1883. 2024-06-14 22:34:08: Client mqtt-io-1634c5d8600786512fd602 already connected, closing old connection. 2024-06-14 22:34:08: New client connected from 192.168.XX.XX:51041 as mqtt-io-1634c5d860079c65156613caae5cfa86512fd602 (p2, c0, k60, u'Kwarco'). 2024-06-14 22:34:09: Client mqtt-io-1634c5d8600786512fd602 closed its connection.
config.yml配置文件
mqtt: host: 192.168.xx.xx port: 1883 user: "Kwarco" password: "xxxxxxxxxxxxxx" ha_discovery: enabled: yes topic_prefix: pimqtt/gpio status_topic: status status_payload_running: online status_payload_stopped: offline status_payload_dead: dead gpio_modules: - name: raspberrypi module: raspberrypi digital_outputs: - name: Ctrl_GordijnDicht module: raspberrypi pin: 2 # GPIO on_payload: "ON" off_payload: "OFF" inverted: true initial: high - name: Ctrl_GordijnOpen module: raspberrypi pin: 3 # GPIO on_payload: "ON" off_payload: "OFF" inverted: true initial: high - name: Ctrl_VerluchtingPower module: raspberrypi pin: 26 # GPIO on_payload: "ON" off_payload: "OFF" inverted: true initial: high - name: Ctrl_Verluchting1 module: raspberrypi pin: 6 # GPIO on_payload: "ON" off_payload: "OFF" inverted: true initial: high - name: Ctrl_Verluchting2 module: raspberrypi pin: 13 # GPIO on_payload: "ON" off_payload: "OFF" inverted: true initial: high - name: Ctrl_Verluchting3 module: raspberrypi pin: 19 # GPIO on_payload: "ON" off_payload: "OFF" inverted: true initial: high - name: Ctrl_LuikDicht module: raspberrypi pin: 7 # GPIO on_payload: "ON" off_payload: "OFF" inverted: false initial: low - name: Ctrl_LuikOpen module: raspberrypi pin: 1 # GPIO on_payload: "ON" off_payload: "OFF" inverted: false initial: low
解决方案
该错误是asyncio-mqtt与paho-mqtt版本不兼容导致:新版paho-mqtt已移除WebsocketWrapper属性,但当前安装的asyncio-mqtt仍在调用它。
步骤1:卸载冲突库
pip3 uninstall -y asyncio-mqtt paho-mqtt
步骤2:安装兼容版本
针对MQTT-IO v2.3.0,安装适配的依赖版本:
pip3 install asyncio-mqtt==0.12.0 paho-mqtt==1.6.1
步骤3:重启服务
python3 -m mqtt_io /home/Kwarco/Desktop/config.yml
备选方案:虚拟环境隔离依赖
若全局安装仍有问题,可创建虚拟环境避免依赖冲突:
# 安装虚拟环境工具 sudo apt-get install python3-venv # 创建并激活虚拟环境 python3 -m venv mqttio-env source mqttio-env/bin/activate # 安装指定版本的MQTT-IO及依赖 pip install mqtt-io==2.3.0 asyncio-mqtt==0.12.0 paho-mqtt==1.6.1 # 启动服务 python -m mqtt_io /home/Kwarco/Desktop/config.yml
内容的提问来源于stack exchange,提问作者Marco Houben
相关产品推荐
相关产品推荐

