Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ Changelog
Unreleased
==========

- Construct the paho-mqtt client with ``CallbackAPIVersion.VERSION2`` and
update ``on_connect`` / ``on_disconnect`` to the v2 callback signatures.

Version 3.0.2
=============

Expand Down
18 changes: 12 additions & 6 deletions src/libdeye/mqtt_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ def __init__(
self._cloud_api = cloud_api
self._endpoint = ""
self._topic = ""
self._mqtt = mqtt.Client()
self._mqtt = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
if tls_context is not None:
self._mqtt.tls_set_context(tls_context)
else:
Expand Down Expand Up @@ -420,7 +420,11 @@ def disconnect(self) -> None:

def _mqtt_on_connect(
self,
*args: Any,
_mqtt: mqtt.Client,
_userdata: Any,
_connect_flags: mqtt.ConnectFlags,
_reason_code: mqtt.ReasonCode,
_properties: mqtt.Properties | None,
) -> None:
for topic, callbacks in self._subscribers.items():
if len(callbacks) > 0:
Expand All @@ -433,10 +437,12 @@ def _mqtt_on_connect(
def _mqtt_on_disconnect(
self,
_mqtt: mqtt.Client,
_userdata: None,
result_code: int,
_userdata: Any,
_disconnect_flags: mqtt.DisconnectFlags,
reason_code: mqtt.ReasonCode,
_properties: mqtt.Properties | None,
) -> None:
if result_code == 0: # User initiated disconnect
if reason_code == 0: # User initiated disconnect
return

# Update MQTT info and wait for it to complete before reconnecting
Expand All @@ -449,7 +455,7 @@ def _process_message_payload(self, msg: mqtt.MQTTMessage) -> Any:
raise NotImplementedError

def _mqtt_on_message(
self, _mqtt: mqtt.Client, _userdata: None, msg: mqtt.MQTTMessage
self, _mqtt: mqtt.Client, _userdata: Any, msg: mqtt.MQTTMessage
) -> None:
if msg.topic not in self._subscribers:
return
Expand Down
24 changes: 21 additions & 3 deletions tests/test_mqtt_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,13 @@ def test_mqtt_on_connect(self, base_client: MockBaseDeyeMqttClient) -> None:
# Call _mqtt_on_connect
with patch.object(base_client._mqtt, "subscribe") as mock_subscribe:
with patch.object(base_client._mqtt, "publish") as mock_publish:
base_client._mqtt_on_connect(base_client._mqtt, None, {}, 0, {})
base_client._mqtt_on_connect(
base_client._mqtt,
None,
mqtt.ConnectFlags(False),
mqtt.ReasonCode(mqtt.PacketTypes.CONNACK),
None,
)
mock_subscribe.assert_called_once_with(topic1)
mock_publish.assert_called_once_with(pending_topic, pending_command)
assert len(base_client._pending_commands) == 0
Expand All @@ -163,15 +169,27 @@ def test_mqtt_on_disconnect_user_initiated(
) -> None:
"""Test _mqtt_on_disconnect method with user initiated disconnect."""
with patch("asyncio.run_coroutine_threadsafe") as mock_run_coroutine_threadsafe:
base_client._mqtt_on_disconnect(base_client._mqtt, None, 0)
base_client._mqtt_on_disconnect(
base_client._mqtt,
None,
mqtt.DisconnectFlags(False),
mqtt.ReasonCode(mqtt.PacketTypes.DISCONNECT),
None,
)
mock_run_coroutine_threadsafe.assert_not_called()

def test_mqtt_on_disconnect_unexpected(
self, base_client: MockBaseDeyeMqttClient
) -> None:
"""Test _mqtt_on_disconnect method with unexpected disconnect."""
with patch("asyncio.run_coroutine_threadsafe") as mock_run_coroutine_threadsafe:
base_client._mqtt_on_disconnect(base_client._mqtt, None, 1)
base_client._mqtt_on_disconnect(
base_client._mqtt,
None,
mqtt.DisconnectFlags(False),
mqtt.ReasonCode(mqtt.PacketTypes.DISCONNECT, "Unspecified error"),
None,
)
mock_run_coroutine_threadsafe.assert_called_once()

def test_mqtt_on_message(self, base_client: MockBaseDeyeMqttClient) -> None:
Expand Down
Loading