Skip to content

emonhub (specifically EmonHubMqttInterfacer.py) fails when using Paho Client >=2.0 #222

Description

@glenm-nz

emonhub (specifically EmonHubMqttInterfacer.py) throws the following error when using Paho Client >=2.0

2025-06-07T20:44:34.517177+12:00 fnlctl systemd[1]: Started emonhub.service - emonHub data multiplexer.
2025-06-07T20:44:34.674514+12:00 fnlctl emonhub[10841]: Exception ignored in: <function Client.__del__ at 0x767855f963e0>
2025-06-07T20:44:34.682733+12:00 fnlctl emonhub[10841]: Traceback (most recent call last):
2025-06-07T20:44:34.682753+12:00 fnlctl emonhub[10841]:   File "/usr/lib/python3/dist-packages/paho/mqtt/client.py", line 874, in __del__
2025-06-07T20:44:34.682781+12:00 fnlctl emonhub[10841]:     self._reset_sockets()
2025-06-07T20:44:34.682792+12:00 fnlctl emonhub[10841]:   File "/usr/lib/python3/dist-packages/paho/mqtt/client.py", line 1133, in _reset_sockets
2025-06-07T20:44:34.682811+12:00 fnlctl emonhub[10841]:     self._sock_close()
2025-06-07T20:44:34.682824+12:00 fnlctl emonhub[10841]:   File "/usr/lib/python3/dist-packages/paho/mqtt/client.py", line 1119, in _sock_close
2025-06-07T20:44:34.683032+12:00 fnlctl emonhub[10841]:     if not self._sock:
2025-06-07T20:44:34.683409+12:00 fnlctl emonhub[10841]: AttributeError: 'Client' object has no attribute '_sock'

Emonhub verison: v2.7.2
Paho version: 2.0.0-1

Quick fix is to change the following line:

self._mqttc = mqtt.Client()

to be self._mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1) after which everthing works ok.

Alternatively you could look to change the on_connect and on-disconnect callbacks to replace the rc with reason_code
See https://eclipse.dev/paho/files/paho.mqtt.python/html/migrations.html for details on the version changes, but this will also include changing the comparisons for values other than zero.

Note this will be a breaking change for those running <Paho 2.0, and either they would need to upgrade Paho to >=2.0 or if the 'quickfix' option was taken to add the legacy callback version, they could just revert that line to self._mqttc = mqtt.Client()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions