Closed Masterz69 closed 1 month ago
Same bug
тоже самое, перестает работать после нескольких часов. ограничение API?
Так же переодически выскакивает
У меня совсем перестало работать. Рестарт ХА не помогает.
Аналогично, через пару часов отваливается, после рестарта интеграции снова включается.
У меня все ломается когда в ответ на запрос местополжения в async_get_location
приходит такое:
<?xml version="1.0" encoding="utf-8"?><document><html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>openresty</center>
</body>
</html>
</document>
Такая же проблема. После перезагрузки сервера работоспособность восстанавливается. 1 ошибка в журнале сервера:
Эта ошибка возникла в кастомной интеграции. Logger: custom_components.gismeteo Source: helpers/update_coordinator.py:193 Integration: Gismeteo (documentation, issues) First occurred: 21:00:57 (1 occurrences) Last logged: 21:00:57 Timeout fetching gismeteo data
2 ошибка: Эта ошибка возникла в кастомной интеграции. Logger: custom_components.gismeteo Source: helpers/update_coordinator.py:219 Integration: Gismeteo (documentation, issues) First occurred: 21:45:57 (1 occurrences) Last logged: 21:45:57 Error fetching gismeteo data: Can't update weather data! Invalid server response.
the same
аналогично
Ситуация ухудшается
Это ошибки на стороне ГисМетео. Они возвращают XML с ошибкой 5XX. Проблему можно было бы решить скачивая сначала во временный файл, и после, если он корректный переименовывая его. Но непонятно тогда как поступить если API будет очень долго не возвращать ничего полезного? Тогда у нас застрянет устаревший прогноз.
@vegetate7, не всегда это происходит при обновлении прогноза. У меня, например, интеграция отваливается целиком если при старте прилетает bad gateway при попытке определения местоположения https://github.com/Limych/ha-gismeteo/issues/68#issuecomment-962039941 (его, кстати, можно кэшировать и если не получилось получить от gismeteo использовать значение из кэша: HA не так часто куда-то переезжает).
уточните, это не из-за того, что мы слишком часто запрашиваем данные у АПИ гисметео, это из-за некорректной логики в интеграции?
есть решение?
The same problem...
The same problem... we are waiting for a solution to the problem...
I have the same problem... I am waiting for a solution to this problem...
Господа,
К сожалению, причина в перриодической недоступности данных находится на стороне Гисметео.
Для исключения перегрузок сервиса и блокирования доступа с самой первой версии данного модуля в него встроена система кэширования запросов. Модуль не может создать такой нагрузки, чтобы вы получили бан. Даже если вас будет много.
Повлиять на работу сервером Гисметео я не имею никакой возможности. Обращать внимание техподдержки Гисметео на проблему ОПАСНО, т.к. данный модуль фактически использует недокументированную возможности системы для бесплатного доступа к данным, которые Гисметео пытается ПРОДАВАТЬ.
В сложившейся ситуации нам с Вами остаётся только ждать, когда техподдержка Гисметео сама заметит проблему и исправит её.
@Limych спасибо за разъяснения. Но почему при отсутствии ответа от Гисметео не показывается старый прогноз, а ошибка?
@Limych может тогда все-же сохранять старые данные, пока новые не будут получены полностью? Ну, скажем, в течении 1 часа. Это не совсем кеш, другая логика - патемся получить свежие данные, и если неудачно - показываем старые. Если старые больше "времени хранения" - тогда уже показывать ошибки. Чтобы можно было заметить, если что-то совсем сломалось.
@vegetate7, Попробую сделать такую логику, когда время будет...
Главное - фиксировать время последней актуализации данных (last-updated), чтобы было понятно, насколько данные свежие
Желающие тестируют новую логику кэширования: https://github.com/Limych/ha-gismeteo/releases/tag/2.3.5-beta
Опубликовано как бета, т.к. не уверен пока в безошибочности кода.
Максимальные сроки кэширования установлены в неделю для локаций и 3 часа для прогнозов.
UPD. Уже увидел первый баг: last_updated выдаёт как timestamp. Исправлю чуть позже.
UPD. Уже увидел первый баг: last_updated выдаёт как timestamp. Исправлю чуть позже.
Взял из dev ветки. Вроде работает, но появилась новая проблема.
Сконфигурировано два сенсора, daily и hourly. Один из них не апдейтится. Порядок расположения в configuration.yaml неважен, может не апдетить один, а после перезагрузки не апдейтит другой:
В 6:47 была перезагрузка.
@vegetate7, Логи! Дебаг-логи на стол, пожалуйста! Без них любые заявления для меня не имеют смысла.
Ок, с логом (и картинками). Теперь не обновился часовой сенсор. Понаблюдал внимательнее, какой из сенсоров будет обновляться - не зависит от перезагрузки. Просто иногда обновляется часовой, иногда дневной. А иногда и оба. Закономерность не нашел. Можно было бы конечно и так оставить, но боюсь это указывает на какую-то проблему, которая может в другом месте вылезти.
Лог: home-assistant.log
По логу видно, что когда приходит время обновить кеш - оба сенсора скачивают с гисметео одновременно.
вот. Я его наконец-то поймал. Добавил размер контента в месте где логгится результат запроса, и все стало видно. Собственно прям в конце лога:
2022-01-10 22:49:19 DEBUG (MainThread) [custom_components.gismeteo.api] Data retrieved from https://services.gismeteo.ru/inform-service/inf_chrome/forecast/?city=4578&lang=en, status: 200, size: 228
2022-01-10 22:49:19 DEBUG (MainThread) [custom_components.gismeteo.cache] Store cache file /config/.storage/forecast_4578.xml
Смысл в том ,что опозновать правильный ли пришел ответ от сервера только по HTTPStatus - не получится.
В данном случае мы получили XML c 502 Bad Gateway
но HTTP статус все равно 200. и этот "плохой" ответ мы и записали в кеш в _async_get_data.
Нужно попробовать декодировать перед self._cache.save_cache(cache_fname, data)
и сохранять только если найден какой-нибудь обязательный элемент.
Примерно так можно решить проблему. Внимание, нет никакой защиты от сильно устаревших данных (если что-то совсем испортится, будет просто продолжать показывать старый прогноз) Я не очень силен в питоне.
diff -urb gismeteo/api.py gismeteo.xmlfix/api.py
--- gismeteo/api.py 2022-01-07 05:25:24.256879150 +0600
+++ gismeteo.xmlfix/api.py 2022-01-11 20:25:02.651523711 +0600
@@ -193,10 +193,17 @@
if resp.status != HTTPStatus.OK:
_LOGGER.error("Invalid response from Gismeteo API: %s", resp.status)
else:
+ data = await resp.text()
_LOGGER.debug(
- "Data retrieved from %s, status: %s", url, resp.status
+ "Data retrieved from %s, status: %s, size: %d", url, resp.status, len(data)
+ )
+ try:
+ xml = etree.fromstring(data)
+ except (etree.ParseError, TypeError, AttributeError) as ex:
+ data = None
+ _LOGGER.debug(
+ "Data retrieved from %s, is invalid", url
)
- data = await resp.text()
if not data and data_cached:
_LOGGER.debug("Cached response used")
Environment
System Health
Home Assistant Community Store
GitHub API | ok -- | -- Github API Calls Remaining | 4876 Installed Version | 1.13.2 Stage | running Available Repositories | 912 Installed Repositories | 20Home Assistant Cloud
logged_in | false -- | -- can_reach_cert_server | ok can_reach_cloud_auth | ok can_reach_cloud | pendingHome Assistant Supervisor
host_os | Home Assistant OS 6.1 -- | -- update_channel | stable supervisor_version | supervisor-2021.06.8 docker_version | 20.10.6 disk_total | 54.3 GB disk_used | 13.5 GB healthy | true supported | true board | rpi4-64 supervisor_api | ok version_api | ok installed_addons | Samba Backup (4.5.0), SSH & Web Terminal (9.0.0), File editor (5.3.3), Mosquitto broker (5.1.1), Z-Wave JS to MQTT (0.23.2), Zigbee2mqtt (1.18.2-1), MariaDB (2.4.0), phpMyAdmin (0.4.3), Samba share (9.5.0)Lovelace
dashboards | 8 -- | -- resources | 8 views | 29 mode | storageDescribe the bug
As far as I noticed - after core upgrade to 2021.7.x Gismeteo intergration entities frequently (several times par day) become unavailable. But not sure this (HA core version) is a reason.
Configuration.yaml
Steps to Reproduce
Expected behavior
Debug log
Additional context
After integration restart it starts to show data.