Skip to content

Commit 54f6ae9

Browse files
committed
Fix duplicate events from multiple gateways #1039
1 parent 6cb5cea commit 54f6ae9

2 files changed

Lines changed: 53 additions & 1 deletion

File tree

custom_components/xiaomi_gateway3/core/gateway/miot.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,15 @@ async def miot_process_properties(self, data: list):
2424
# convert miio response format to multiple responses in lumi format
2525
devices: Dict[str, Optional[list]] = {}
2626
for item in data:
27-
if item["did"] not in self.devices:
27+
device = self.devices.get(item["did"])
28+
if not device:
2829
continue
30+
31+
if seq := item.get("tid"):
32+
if device.extra.get("seq") == seq:
33+
return
34+
device.extra["seq"] = seq
35+
2936
devices.setdefault(item["did"], []).append(item)
3037

3138
for did, payload in devices.items():
@@ -38,6 +45,12 @@ async def miot_process_event(self, data: dict):
3845
device = self.devices.get(data["did"])
3946
if not device:
4047
return
48+
49+
if seq := data.get("tid"):
50+
if device.extra.get("seq") == seq:
51+
return
52+
device.extra["seq"] = seq
53+
4154
payload = device.decode_miot([data])
4255
device.update(payload)
4356

tests/test_gateway.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import asyncio
2+
3+
from homeassistant.components.sensor import DOMAIN
4+
5+
from custom_components.xiaomi_gateway3.core.converters import MESH
6+
from custom_components.xiaomi_gateway3.core.device import XDevice
7+
from custom_components.xiaomi_gateway3.core.gateway.miot import MIoTGateway
8+
9+
assert DOMAIN # fix circular import
10+
11+
12+
def test_sequence():
13+
decode_miot = []
14+
15+
device = XDevice(MESH, 0, "123", "112233aabbcc")
16+
device.decode_miot = lambda *args: decode_miot.extend(args)
17+
18+
gw = MIoTGateway()
19+
gw.devices["123"] = device
20+
21+
loop = asyncio.new_event_loop()
22+
23+
# test 1
24+
coro = gw.miot_process_properties(
25+
[{"did": "123", "siid": 2, "piid": 4, "tid": 229, "value": 90}]
26+
)
27+
loop.run_until_complete(coro)
28+
29+
assert decode_miot
30+
31+
# test 2
32+
decode_miot.clear()
33+
34+
coro = gw.miot_process_properties(
35+
[{"did": "123", "siid": 2, "piid": 4, "tid": 229, "value": 90}]
36+
)
37+
loop.run_until_complete(coro)
38+
39+
assert not decode_miot

0 commit comments

Comments
 (0)