AlexxIT / XiaomiGateway3

Home Assistant custom component for control Xiaomi Multimode Gateway (aka Gateway 3), Xiaomi Multimode Gateway 2, Aqara Hub E1 on default firmwares over LAN
https://github.com/AlexxIT/Blog
MIT License
2.47k stars 345 forks source link

Devices remain unavailble after network connection failure (in v1.6.2) #530

Closed almazikv closed 1 year ago

almazikv commented 2 years ago

In my summer house I have a script that restarts my mikrotik router every night. So during restart my HA loses connection to Xiaomi gateway 3. After upgrade to 1.6.2 I see following problem: my devices remain with state "unavailable" in HA after network is restored. I wrote an automain that reloads an integration if devices are unavailable for more than 5 minutes. It works as workaround. I see no logs from integration in HA for this period (standard log level)

AlexxIT commented 2 years ago

Maybe related: https://github.com/AlexxIT/XiaomiGateway3/issues/497#issuecomment-979148950

baggein commented 2 years ago

Может быть связано: # 497 (комментарий)

У меня похожая проблема - после перезагрузки роутера интеграция 1.6.2 не подхватывает шлюз (и соответственно все подключенные к нему устройства). С сетью проблем не вижу (всё зафиксировано и на статике, шлюз с сервера HA пингуется - да и в MiHome всё работает, т.е. по сети подцепляется), шлюз прошит на рекомендованную прошивку 1.5.0_0102, HA на текущий момент 2021.11.5. Все остальные устройства к HA цепляются (wifi светильники, пылесос и т.п.). Если перезагрузить интеграцию либо хост целиком - всё сразу работает без проблем и отвалов.... С анализом логов туго )

AlexxIT commented 2 years ago

Fixed in v1.6.3

rauko27 commented 2 years ago

@AlexxIT на версии 1.6.3 также отваливается но ошибка теперь такая:

Logger: custom_components.xiaomi_gateway3.core.mini_mqtt
Source: custom_components/xiaomi_gateway3/core/mini_mqtt.py:213 
Integration: Xiaomi Gateway 3 (documentation, issues) 
First occurred: 14:01:02 (3 occurrences) 
Last logged: 14:10:38

Can't disconnect from gateway
Can't close connection
Can't publish b'{"cmd":"write","did":"lumi.158d0003019ef6","params":[{"res_name":"4.1.85","value":0}]}' to zigbee/recv
Traceback (most recent call last):
  File "/config/custom_components/xiaomi_gateway3/core/mini_mqtt.py", line 185, in disconnect
    await self.writer.drain()
  File "/usr/local/lib/python3.9/asyncio/streams.py", line 375, in drain
    raise exc
  File "/config/custom_components/xiaomi_gateway3/core/gateway3.py", line 584, in run_forever
    async for msg in self.mqtt:
  File "/config/custom_components/xiaomi_gateway3/core/mini_mqtt.py", line 285, in __anext__
    raise e
  File "/config/custom_components/xiaomi_gateway3/core/mini_mqtt.py", line 262, in __anext__
    msg: MQTTMessage = await asyncio.wait_for(
  File "/usr/local/lib/python3.9/asyncio/tasks.py", line 481, in wait_for
    return fut.result()
  File "/config/custom_components/xiaomi_gateway3/core/mini_mqtt.py", line 213, in read
    raw = await self.reader.read(1)
  File "/usr/local/lib/python3.9/asyncio/streams.py", line 684, in read
    await self._wait_for_data('read')
  File "/usr/local/lib/python3.9/asyncio/streams.py", line 517, in _wait_for_data
    await self._waiter
  File "/usr/local/lib/python3.9/asyncio/selector_events.py", line 856, in _read_ready__data_received
    data = self._sock.recv(self.max_size)
ConnectionResetError: [Errno 104] Connection reset by peer
almazikv commented 2 years ago

У меня ночная автоматизация по перезапуску интеграции при недоступности устройств тоже сработала. Значит в течении пяти минут не восстановилось соединение автоматом.

baggein commented 2 years ago

Да, 1.6.3 ситуацию не изменила....

almazikv, а можете пример автоматизации написать?

almazikv commented 2 years ago

Да, 1.6.3 ситуацию не изменила....

almazikv, а можете пример автоматизации написать?

trigger:
- platform: state
entity_id: sensor.veranda_temperature (замените на ваш сенсор - любой который подключен через xg3)
for:
hours: 0
minutes: 5
seconds: 0
milliseconds: 0
to: unavailable
condition: []
action:
- service: homeassistant.reload_config_entry
data:
entry_id: xxxxxx (возьмите из файла /config/.storage/core.config_entries, переменная entry_id где ваша интеграция xg3 - где именно ip адрес шлюза )
AlexxIT commented 2 years ago

@rauko27 это нормально перехваченная ошибка. То есть компонент должен продолжить работу в обычном режиме.

rauko27 commented 2 years ago

@AlexxIT к сожалению этого не происходит - в журнале просто повторяется эта ошибка при любом действии с зигби устройством подключенным к гв3

AlexxIT commented 2 years ago

@rauko27 вы можете зайти на свой шлюз через Telnet, выполнить команду top и выложить сюда первые три строчки.

rauko27 commented 2 years ago

@AlexxIT Я не очень знаком с консольными командами. Это нужно было?

Mem: 55408K used, 2992K free, 0K shrd, 5088K buff, 24256K cached CPU: 2.5% usr 6.9% sys 0.0% nic 90.2% idle 0.0% io 0.0% irq 0.1% sirq Load average: 2.67 2.68 2.67 2/95 3346

AlexxIT commented 2 years ago

@rauko27 это. Приложения на шлюзе работают в обычном режиме. У меня было предположение, что сам шлюз глючит

maury77 commented 2 years ago

the problem persist on 1.6.4

AlexxIT commented 2 years ago

@maury77 can you try master version?

m6U-hWE3pdH commented 2 years ago

У меня после обновления на 1.6.4 от шлюза отвалились все датчики, как ZigBee, так и BlueTooth. Перезагрузка не помогала. После отката на 1.6.3 датчики вернулись. Шлюз в режиме HA (без z2m). Логи не смотрел, нужно было быстро вернуть в рабочее состояние.

maury77 commented 2 years ago

@maury77 can you try master version?

Yes i use 1.6.4

now i build an automatiobto Reload Integration After 10 minutes of unavaibility

AlexxIT commented 2 years ago

@maury77 master version not same as 1.6.4

maury77 commented 2 years ago

Ok now I have installed the master ..

and starting monitoring the issue

Choochmeque commented 2 years ago

Got this in the logs after network failure/restore:

2022-01-25 23:20:50  DEBUG    xiaomi_cloud  MiCloud step1
2022-01-25 23:20:50  DEBUG    xiaomi_cloud  MiCloud step2
2022-01-25 23:20:51  DEBUG    xiaomi_cloud  MiCloud step3
2022-01-25 23:20:51  DEBUG    main          Loaded from MiCloud 6 devices
2022-01-25 23:20:51  DEBUG    gateway3      192.168.31.83 | Main loop step 0
2022-01-25 23:21:06  WARNING  mini_miio     192.168.31.83 | Device offline
2022-01-25 23:21:06  DEBUG    gateway3      192.168.31.83 | Can't enable telnet

Hub connected to the network:

PING 192.168.31.83 (192.168.31.83): 56 data bytes
64 bytes from 192.168.31.83: icmp_seq=0 ttl=64 time=18.478 ms
64 bytes from 192.168.31.83: icmp_seq=1 ttl=64 time=12.217 ms
64 bytes from 192.168.31.83: icmp_seq=2 ttl=64 time=12.944 ms
64 bytes from 192.168.31.83: icmp_seq=3 ttl=64 time=12.914 ms
64 bytes from 192.168.31.83: icmp_seq=4 ttl=64 time=6.837 ms
Choochmeque commented 2 years ago

Hello @AlexxIT , when I changed "gateway3.py: async def run_forever(self)" from this

            # if not telnet - enable it
            if not await self.check_port(23) and \
                    not await self.enable_telnet():
                await asyncio.sleep(30)
                continue

to this:

            port_is_open = await self.check_port(23)

            # if not telnet - enable it
            if not port_is_open and \
                    not await self.enable_telnet():
                await asyncio.sleep(30)
                continue

it solved the issue, could you confirm it?

It seems python does parallel computation in the if statement.

AlexxIT commented 2 years ago

I can't confirm it. Your changes make no sense

Choochmeque commented 2 years ago

Yes, you are right. (my bad, sorry)

AlexxIT commented 1 year ago

Please reopen the issue if it is still relevant