TionAPI / tion_python

Python module for Tion
GNU Lesser General Public License v3.0
64 stars 9 forks source link

Нестабильная работа S4 #25

Closed makp0 closed 3 years ago

makp0 commented 3 years ago

Версия модуля: 1.3.0 Модель бризера: S4 Версия прошивки (если известна):

Описание проблемы

коммит 6c9006269fc03b5a4cb9e64115e5c52cb62a133d делает контроль бризера нестабильным, любая команда исполняется бризером в избирательном порядке. проверил тут 5be1869 без этого комита - работает безупречно.

Порядок действий, которые приводят к проявлению проблемы

  1. установить HA tion 1.8.0
  2. сменить температуру или operation mode на инной.

ожидание: смена состояния реальность: после первой принятой команды, бризер некоторое время недоступен для последующих команд

Логи

  File "/home/homeassistant/.homeassistant/custom_components/tion/climate.py", line 376, in async_set_fan_mode
    await self._async_set_state(fan_speed=fan_mode, is_on=True)
  File "/home/homeassistant/.homeassistant/custom_components/tion/climate.py", line 432, in _async_set_state
    await self._tion_entry.set(**kwargs)
  File "/home/homeassistant/.homeassistant/custom_components/tion/__init__.py", line 205, in set
    self.__tion.set(kwargs)
  File "/srv/homeassistant/lib/python3.7/site-packages/tion_btle/tion.py", line 264, in set
    self.disconnect()
  File "/srv/homeassistant/lib/python3.7/site-packages/tion_btle/tion.py", line 566, in disconnect
    self._disconnect()
  File "/srv/homeassistant/lib/python3.7/site-packages/tion_btle/tion.py", line 331, in _disconnect
    if self.connection_status != "disc":
  File "/srv/homeassistant/lib/python3.7/site-packages/tion_btle/tion.py", line 297, in connection_status
    raise e
  File "/srv/homeassistant/lib/python3.7/site-packages/tion_btle/tion.py", line 292, in connection_status
    connection_status = self._btle.getState()
  File "/srv/homeassistant/lib/python3.7/site-packages/bluepy/btle.py", line 471, in getState
    status = self.status()
  File "/srv/homeassistant/lib/python3.7/site-packages/bluepy/btle.py", line 379, in status
    return self._waitResp(['stat'])
  File "/srv/homeassistant/lib/python3.7/site-packages/bluepy/btle.py", line 375, in _waitResp
    raise BTLEInternalError("Unexpected response (%s)" % respType, resp)
bluepy.btle.BTLEInternalError: Unexpected response (rd)
  File "/home/homeassistant/.homeassistant/custom_components/tion/climate.py", line 376, in async_set_fan_mode
    await self._async_set_state(fan_speed=fan_mode, is_on=True)
  File "/home/homeassistant/.homeassistant/custom_components/tion/climate.py", line 432, in _async_set_state
    await self._tion_entry.set(**kwargs)
  File "/home/homeassistant/.homeassistant/custom_components/tion/__init__.py", line 205, in set
    self.__tion.set(kwargs)
  File "/srv/homeassistant/lib/python3.7/site-packages/tion_btle/tion.py", line 264, in set
    self.disconnect()
  File "/srv/homeassistant/lib/python3.7/site-packages/tion_btle/tion.py", line 566, in disconnect
    self._disconnect()
  File "/srv/homeassistant/lib/python3.7/site-packages/tion_btle/tion.py", line 333, in _disconnect
    self._disable_notifications()
  File "/srv/homeassistant/lib/python3.7/site-packages/tion_btle/tion.py", line 397, in _disable_notifications
    self.__write_to_notify_handle(setup_data)
  File "/srv/homeassistant/lib/python3.7/site-packages/tion_btle/tion.py", line 371, in __write_to_notify_handle
    result = self._btle.writeCharacteristic(notify_handle, data, withResponse=True)
  File "/srv/homeassistant/lib/python3.7/site-packages/bluepy/btle.py", line 543, in writeCharacteristic
    return self._getResp('wr')
  File "/srv/homeassistant/lib/python3.7/site-packages/bluepy/btle.py", line 416, in _getResp
    self.delegate.handleNotification(hnd, data)
  File "/srv/homeassistant/lib/python3.7/site-packages/tion_btle/tion.py", line 23, in handleNotification
    self.__topic.read()
  File "/srv/homeassistant/lib/python3.7/site-packages/bluepy/btle.py", line 197, in read
    return self.peripheral.readCharacteristic(self.valHandle)
  File "/srv/homeassistant/lib/python3.7/site-packages/bluepy/btle.py", line 530, in readCharacteristic
    resp = self._getResp('rd')
  File "/srv/homeassistant/lib/python3.7/site-packages/bluepy/btle.py", line 416, in _getResp
    self.delegate.handleNotification(hnd, data)
  File "/srv/homeassistant/lib/python3.7/site-packages/tion_btle/tion.py", line 23, in handleNotification
    self.__topic.read()
  File "/srv/homeassistant/lib/python3.7/site-packages/bluepy/btle.py", line 197, in read
    return self.peripheral.readCharacteristic(self.valHandle)
  File "/srv/homeassistant/lib/python3.7/site-packages/bluepy/btle.py", line 530, in readCharacteristic
    resp = self._getResp('rd')
  File "/srv/homeassistant/lib/python3.7/site-packages/bluepy/btle.py", line 407, in _getResp
    resp = self._waitResp(wantType + ['ntfy', 'ind'], timeout)
  File "/srv/homeassistant/lib/python3.7/site-packages/bluepy/btle.py", line 375, in _waitResp
    raise BTLEInternalError("Unexpected response (%s)" % respType, resp)
bluepy.btle.BTLEInternalError: Unexpected response (wr)
IATkachenko commented 3 years ago

А можно логи tion_btle на уровне debug ещё? configuration.yaml

logger:
  default: warning
  logs:
    tion_btle: debug
    tion_btle.tion: debug
    tion_btle.s4: debug

И лог хочется с сообщения "Connecting" от tion_btle.tion на уровне DEBUG.

Код из упомянутого коммита работает во время подключения/отключения от бризера, которое происходит при отправке каждой команды из HA, чтобы оставлять возможность штатного управления бризером (с пульта или телефона). А добавляется отписка от уведомлений перед отключением, что не должно влиять на следующее подключение, но, судя по всему, как-то влияет.

Еще есть идея про __write_to_notify_handle: можете в ней (371 строка) выставить withResponse=False

result = self._btle.writeCharacteristic(notify_handle, data, withResponse=False)

Ну и раз есть возможность тестировать -- воспользуюсь ей: комментирование 332 и 333 строк tion.py из модуля должно быть эквивалентно откату коммита. Можете проверить что проблема именно в отписке от уведомлений?

ps. Мой 3S это все ест вполне успешно, без дополнительных ошибок/проблем.