PiotrMachowski / Home-Assistant-custom-components-Rozkladzik

This sensor uses unofficial API to get data from https://www.rozkladzik.pl and provide information about departures for chosen stop.
MIT License
11 stars 2 forks source link

Problem z odświeżaniem danych #13

Open darth-aragoth opened 6 months ago

darth-aragoth commented 6 months ago

Cześć ! Niby wszystko fajnie działa, dodałem potrzebne przystanki i autobusy, ale jest jakiś problem z odświeżaniem danych. Przykład: w momencie pisania tego posta jest godzina 23:30, a HA pokazuje, że najbliższy odjazd autobusu jest o 23:11 (0 minut), a kolejny 23:43 (32 minuty). Odświeżanie przeglądarki oczywiście sprawdzone i nie pomaga.

image

Nie dałoby się do konfiguracji dodać jakiegoś parametru typu refresh_interval, który wymuszałby aktualizację danych co x minut? Albo na sztywno ustalić np. 5 minut - częściej raczej nie ma sensu, a rzadziej z kolei mamy małą dezinformację :)

PiotrMachowski commented 6 months ago

Nie ma żadnych błędów w logach? W momencie gdy pierwszy odjazd dojdzie do 0m powinny zostać pobrane kolejne odjazdy, może był jakiś błąd pobierania, przez co dane nie zostały zaktualizowane

darth-aragoth commented 6 months ago

Jak sprawdzałem wczoraj, nie było żadnych błędów w logach. Ale dziwna sprawa, dzisiaj integracja kompletnie przestała aktualizować dane, wszystkie karty z rozkładami są puste, a w logach mamy błąd 'Connection refused'. Nie wiem, czy tylko u mnie jest taki problem.

Rejestrator: homeassistant.components.sensor
Źródło: helpers/entity_platform.py:356
integracja: Sensor (dokumentacja, Problemy)
Pierwsze zdarzenie: 09:09:05 (1 zdarzenia)
Ostatnio zalogowany: 09:09:05

Error while setting up rozkladzik platform for sensor
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/urllib3/connection.py", line 174, in _new_conn
    conn = connection.create_connection(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/urllib3/util/connection.py", line 95, in create_connection
    raise err
  File "/usr/local/lib/python3.12/site-packages/urllib3/util/connection.py", line 85, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 715, in urlopen
    httplib_response = self._make_request(
                       ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 404, in _make_request
    self._validate_conn(conn)
  File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 1058, in _validate_conn
    conn.connect()
  File "/usr/local/lib/python3.12/site-packages/urllib3/connection.py", line 363, in connect
    self.sock = conn = self._new_conn()
                       ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/urllib3/connection.py", line 186, in _new_conn
    raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x7f66a65700>: Failed to establish a new connection: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/requests/adapters.py", line 486, in send
    resp = conn.urlopen(
           ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 799, in urlopen
    retries = retries.increment(
              ^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/urllib3/util/retry.py", line 592, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='www.rozkladzik.pl', port=443): Max retries exceeded with url: /metropolia_gzm/data.txt (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f66a65700>: Failed to establish a new connection: [Errno 111] Connection refused'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 356, in _async_setup_platform
    await asyncio.shield(awaitable)
  File "/usr/local/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/rozkladzik/sensor.py", line 49, in setup_platform
    dev.append(RozkladzikSensor(entity_id, name, city, stop_id, stop_name, group_mode, lines, directions))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/rozkladzik/sensor.py", line 60, in __init__
    self._city_data = self.get_city_data()
                      ^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/rozkladzik/sensor.py", line 177, in get_city_data
    response = requests.get(url_template.format(self._city))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/requests/api.py", line 73, in get
    return request("get", url, params=params, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/requests/api.py", line 59, in request
    return session.request(method=method, url=url, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/requests/sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/requests/sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/requests/adapters.py", line 519, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='www.rozkladzik.pl', port=443): Max retries exceeded with url: /metropolia_gzm/data.txt (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f66a65700>: Failed to establish a new connection: [Errno 111] Connection refused'))
darth-aragoth commented 6 months ago

Wygląda na to, że www.rozkladzik.pl się na mnie obraził, bo nie potrafię nawet otworzyć ich strony :) Z innych adresów działa :/

PiotrMachowski commented 6 months ago

Niestety na to nie jestem w stanie poradzić :(

darth-aragoth commented 6 months ago

Wiem :) w międzyczasie dostęp do strony się odblokował, zobaczymy czy teraz odświeżanie będzie działało na bieżąco.

darth-aragoth commented 6 months ago

Czy nie jest przypadkiem tak, że API rozkladzika ma jakiś limit zapytań? Bo znowu jestem zablokowany i wszystkie moje rozkłady wyglądają tak: image

PiotrMachowski commented 6 months ago

Tak, mają limit, najwyraźniej znowu "dokręcili śrubę". Możliwe, że aż do takiego poziomu, że integracja nie może działać :/

darth-aragoth commented 6 months ago

To może dałoby się zrobić parametr, który pozwoliłby zwiększyć czas odświeżania? Wtedy znowu nasili się problem z 'czasem do odjazdu', nie wiem czy to jest budowane przez integrację czy zwracane wprost tekstem, bo wtedy albo trzeba by to jakoś wyliczać albo w ogóle móc wyłączyć, pokazując jedynie godzinę odjazdu.

PiotrMachowski commented 6 months ago

Zwiększenie częstotliwości odświeżania tylko pogorszy sprawę. W tym momencie dane są odświeżane tak rzadko, jak to możliwe (dopiero w momencie, kiedy pozycja znika z listy)

darth-aragoth commented 6 months ago

Ja właśnie miałem na myśli zmniejszenie częstotliwości - zwiększenie czasu odstępu między odświeżaniem :)

PiotrMachowski commented 6 months ago

Ach, sorry, źle przeczytałem. Dalsze zmniejszenie czasu między odświeżeniami chyba nie ma sensu, bo by wprowadziło błędy w wyświetlanych danych.

Dla tego przykładu: image odświeżenie nastąpi o 23:11, 23:43 i o 00:23

darth-aragoth commented 6 months ago

Niby tak, ale przynajmniej byłaby jakakolwiek informacja :) Teraz po zablokowaniu nie widać kompletnie nic, jak na którymś obrazku wyżej. A jeśli dałoby się wyłączyć ten segment:

image

to aż tak bardzo w błąd by nie wprowadzało, po prostu trzeba by sprawdzić, czy aktualna godzina nie jest większa niż ta pokazywana na rozkładzie.

PiotrMachowski commented 6 months ago

Tabelkę możesz sobie sam wyrenderować z dowolnymi danymi w środku używając takiego szablonu:

<table width="100%" border=1 style="border: 1px black solid; border-collapse: collapse;">
{% for r in state_attr('sensor.rozkladzik_wroclaw_1709', 'list') -%}
<tr><td style="text-align: center; padding: 4px">{{r['line']}} kier. {{r['direction']}}: {{r['departure']}}</td></tr>
{%- endfor %}
'</table>

interwał odświeżania można zmienić już teraz:

sensor:
  - platform: rozkladzik
    city: 'wroclaw'
    scan_interval: 3600
    stops:
      - id: 1281
        name: 'Plac Grunwaldzki'
        directions:
          - "Reja"
      - id: 94
        name: 'Rynek'
        stops_group_mode: true
        lines:
          - "33"
nepozs commented 3 weeks ago

Problem polega na czasowym banowaniu IP przez rozkladzik.pl (na jak długo nie wiem, bo za pierwszym razem - bardzo dawno temu sądziłęm, że po prostu serwis został wyłączony - po banie nie można nawet otworzyć ich strony).

Wprawdzie nie udało mi się ustalić czy jest to quota na ilość pobranych danych czy na ilość zapytań, ale wydaje się, że to drugie - u znajomego, gdzie odjeżdzą kilka autobusów dziennie jak się okazuje integracja działą bezproblemowo, natomiast u siebie zdefiniowałęm 2 przystanki o częstym ruchu rzędu kilku minut i dane przestają być pobierane już koło 9 rano).

Sądzę że stały refresh dostatecznie rzadko mógł by pomóc (choć za cenę utraty części funkcjonalności) - może po prostu trzeba dopisać linijkę w dokumentacji i z ostrzeżeniem w FAQ?