Odjazdy na żywo PKP

Witam,

Ostatnio zauważyłem na stronie rozklad-pkp.pl że można wyświetlić sobie na żywo odjazdy z wybranej stacji kolejowej, wystarczy wyszukać staję i kliknąć TICKER DLA TABLICY STACYJNEJ wychodzi coś takiego:

Przechwytywanie

Chciałbym jakoś te dane wyciągnąć do HA i zrobić kartę coś jak w tym temacie:

Próbowałem wyciągnąć dane w NR jak w ww przykładzie, ale dostaję błędy, przed debugowaniu strony też nie rzuciły mi się w oczy właściwe dane do wyciągnięcia. Proszę o pomoc.

Cześć,
jakieś postępy w tym pomyśle?

Postępy były, dane wyciągnąłem ale niestety PKP po kilku godzinach blokuje adres IP ze względu na duży ruch, zrobiłem nawet przycisk aby odpytywało serwer jak potrzebuję danych ale i tak po 2-3 użyciach dziennie blokowali IP. Z tego powodu dalsze prace zarzuciłem.

Odświeżę temat, bo dzięki stronie bilkom udało się stworzyć coś takiego:

kaliska

Fajnie tylko co nam - użytkownikom forum - to daje? Wiemy, że można więc koledzy “do roboty” :wink:.

2 polubienia

Coś w tym stylu :wink: tutaj flow do NodeRED
pkp.zip (2,2 KB)

Oraz karta:

type: custom:vertical-stack-in-card
cards:
  - type: custom:html-template-card
    ignore_line_breaks: true
    content: >
      <style>
        .center-header { text-align: center; width: 100%; }
        table { margin-bottom: -15px; } /* Reduce bottom margin of the header table */
      </style> <table width="100%" border="0" style="border: 0px black solid;
      border-collapse: collapse;"> <!-- Header Row --> <tr> <!-- Icon Cell -->
      <td class="icon" width="20%" style="padding: 4px 4px 2px 4px;"> <span
      style="color: royalblue;" data-darkreader-inline-color="">
        <ha-icon icon="mdi:train-variant"></ha-icon>
      </span> </td> <!-- Title Cell --> <td class="center-header" colspan="2"
      style="padding: 4px 4px 2px 4px;"> <span style="color: white;"
      data-darkreader-inline-color="">
        <b>Łódź Kaliska</b>
      </span> </td> <!-- Sensor Cell --> <td width="15%" style="text-align:
      center; padding: 4px 4px 2px 4px;"> <span style="color: white"
      data-darkreader-inline-color="">
        {{ states('sensor.time') }}
      </span> </td> </tr>
  - type: custom:flex-table-card
    entities:
      include:
        - sensor.lodz_kaliska_1
        - sensor.lodz_kaliska_2
        - sensor.lodz_kaliska_3
        - sensor.lodz_kaliska_4
        - sensor.lodz_kaliska_5
        - sensor.lodz_kaliska_6
        - sensor.lodz_kaliska_7
        - sensor.lodz_kaliska_8
        - sensor.lodz_kaliska_9
        - sensor.lodz_kaliska_10
    columns:
      - name: ' '
        data: przewoznik
        icon: mdi:train
        align: center
        modify: |-
          if (x.length == 0) {
            " ";
          } else
          switch(true) {
            case x.includes('TLK'):
              '<div style="background-color: blue; color: white;">' + x + '</div>';
              break;
            case x.includes('LP'):
              '<div style="background-color: lightgoldenrodyellow; color: black;">' + x + '</div>';
              break;
            case x.includes('L'):
              '<div style="background-color: yellow; color: black;">' + x + '</div>';
              break;
            case x.includes('IC'):
              '<div style="background-color: orange; color: black;">' + x + '</div>';
              break;
            case x.includes('IR'):
              '<div style="background-color: darkred; color: white;">' + x + '</div>';
              break;
            case x.includes('R'):
              '<div style="background-color: red; color: white;">' + x + '</div>';
              break;
            case x.includes('KW'):
              '<div style="background-color: magenta; color: white;">' + x + '</div>';
              break;
            default:
              x;
          }
      - name: ' '
        data: czas
        icon: mdi:clock-outline
        align: center
        modify: if(x.length == 0){" "}else{x}
      - name: ' '
        data: opoznienie
        icon: mdi:clock-alert-outline
        align: center
        modify: |-
          if (x.length == 0) {
            " ";
          } else {
            if (x === "+0'") {
              '<div style="color: green;">' + x + '</div>';
            } else {
              '<div style="color: red;">' + x + '</div>';
            }
          }
      - name: ' '
        data: kierunek
        icon: mdi:directions-fork
        align: c
        modify: if(x.length == 0){" "}else{x}
    css:
      tbody tr td:nth-child(1)+: 'min-width: 73px;width: 73px;'
      tbody tr td:nth-child(2)+: 'min-width: 43px;width: 43px;'
      tbody tr td:nth-child(3)+: 'min-width: 38px;width: 38px;'

Potrzeba zainstalować z HACS: custom:vertical-stack-in-card, custom:html-template-card i custom:flex-table-card

5 polubień

Jesteś w stanie pomoc jak ustawić parametry dla innych stacji bo nie chce mi się załączyć.

W linku w node red:

https://bilkom.pl/stacje/tablica?nazwa=%C5%81%C3%B3d%C5%BA+Kaliska&stacja=5100039&data=${date}&time=${time}&przyjazd=false&_csrf=

Musisz zmienić parametry nazwa= i stacja=

Dzieki, literówka mi się wkradła i przejrzałem gdzie co nie tak a poza tym wczytał się nie kompletny układ na spokojnie człowiek usiadł i sprawdził gdzie był problem.

Po imporcie pkp.json mój NodeRED nie rozpoznaje noda html-pro:


Nie jest on także dostępny w repozytorium NodeRED, zatem zgodnie z instrukcją, próbuję zrobić contact the author :wink: Podpowiesz, proszę, jak to rozwiązać?

W NodeRED w prawym górnym rogu trzy kreski, potem manage palette, install i szukaj html-pro i zainstaluj.

https://flows.nodered.org/node/@nickcuper/node-red-contrib-html-pro

1 polubienie

Tak, faktycznie wreszcie znalazłem. Za pierwszym podejściem nie znalazło mi tego noda w repozytorium, stąd moja wątpliwość…

Dokładnie na bazie Twojego kodu próbuję zbudować także bliźniaczą tebelę PRZYJAZDów. Zauważyłem bowiem, że w adresie URL wystarczy zmienić parametr przyjazd na TRUE i mamy przyjazdy. Voilla!

1 polubienie

Tak przyjazdy też można i działa. A do tego możesz zrobić więcej przyjazdów czy odjazdów, ja obecnie na większe stacje mam po 30.

Jeden problem to taki że z jakiegoś powodu nie zawsze zaczytują się opóźnienia, po protu nie ma ich w źródle - na stronie też czasami się nie wczytują, muszę się zastanowić jak to ogarnąć ale powiem szczerze że nie mam pomysłu na to.

A może wystarczy dopisać kod warunkowy pełniący rolę semafora, żeby w przypadku braku danych z automatu podstawiało się zero? Nie będzie to przecież dalekie od prawdy… Druga opcja dla takiego przypadku to podstawianie liczby ujemnej (np. -1) a potem walidacja wartości: jeśli dodatnia to normalnie wyświetl, jeśli ujemna to napisz “brak danych”… to tylko sugestia, jeszcze nie sprawdzona, tylko pomysł “na gorąco”.

…I jeszcze SPOSTRZEŻENIE:
Z pełnego adresu URL https://bilkom.pl/stacje/tablica?nazwa=...&stacja=...&data=${date}&time=${time}&przyjazd=... można śmiało i bezstratnie usunąć jego fragment wskazujący na datę/czas: &data=${date}&time=${time}, ponieważ rozkład jazdy i tak będzie podawał ostatnie najbardziej aktualne (najbliższe w danej chwili) dane.

W przypadku braku danych o opóźnieniu one w karcie nie są wyświetlane:

Tutaj widać że nie ma dla Kaliskiej, więc to nie jest problem jak się wyświetla, tylko że nie zawsze ładuje te opóźnienia. Szkoda że nie ma jakiegoś API do rozkładów jazdy pociągów.

To nie jest problem, tylko tego nie rozumiesz.
Dla relacji które startują ze stacji trudno określić przyszłe opóźnienie - skoro ruszy dopiero w przyszłości.
Dla relacji przelotowych pociąg jest już dawno w ruch i jego aktualne opóźnienie jest znane.

Ja to doskonałe rozumiem :slight_smile: tylko to dotyczy również pociągów które mają opóźnienie raportowane. Tutaj przykład:


Po prostu raz się ładują opóźnienia a raz nie, na stronie Bilkom masz to samo, wystarczy parę razy odświeżyć stronę z tablicą.

Chcę jeszcze do tabeli odjazdów dodać kolumnę z numerem peronu odczytywanym z bilkomu.
Ponieważ nod html-pro jest pozbawiony instrukcji i na dodatek nie jestem biegły w css, mam do Ciebie wielką prośbę: czy możesz udostępnić przykładowy kod ścieżki css dla peronu, który odwoływałby się do właściwej pozycji źródła?

Peron 1
li.el:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(4)

Peron 2
li.el:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(4)

itd.

1 polubienie

Super! Dziękuję!
PS: masz może jakiś link, gdzie można się tego nauczyć? Ja na razie pytam o wszystko AI (no i Ciebie) ale wolę najpierw coś poczytać, żeby nie być takim lamusem…

PS. Wyszło!!! Oto odjazdy z peronami, przyjazdy już bez:

1 polubienie