Halte specifieke data

97 views
Skip to first unread message

Monkeypwn

unread,
Mar 20, 2024, 7:43:59 AMMar 20
to openov
Hallo!

Ik zou in mijn app willen weergeven wat de volgende bussen zijn voor een specifieke halte.
Ik snap niet direct hoe dat moet ik veronderstel dat dit iets met die kv78 te maken heeft? Alle hulp is welkom. 
De app is gemaakt in javascript

Tristan van Triest

unread,
Mar 20, 2024, 8:42:02 AMMar 20
to openov
Hi Barre,

In feite maakt de taal niet uit, het volgende princiepe geld:

In KV7/8 komt zeer veel informatie naar binnen. Waaronder de DATEDPASSTIME van KV8 Turbo (meer uitleg:  BISON KV78 turbo - leveringsproces, versie 8.5.0, release.pdf (dova.nu))

Elke regel in zo'n bericht komt overeen met een (geschatte) halteertijd van een BTM (Bus, Metro, Tram) voertuig. In elke regel van deze berichten zit een UserStopCode.

De UserStopCode is het haltenummer binnen het domein van de vervoerder (bijv. Arriva).

Afhankelijk van waar je je haltes vandaan haalt (deze komen ook binnen in KV7 Turbo via de "TIMINGPOINT" blokken), kan je dus per haltenummer de ritten koppelen.

In hele simpele SQL iets zoals: SELECT * FROM passtimes WHERE UserStopCode = 'het halte nummer'.

KV7/8 Turbo is een zeer uitgebreid koppelvlak waar enorm veel data binnenkomt. Zorg er dus voor dat je grote hoeveelheden data kan verwerken. Je zal uitiendelijk moeten kijken naar multi-threading om het bij te kunnen houden zonder berichten te missen. Zorg er voor dat je het bovenstaande gelinkte document goed doorneemt om te snappen wat de data betekend.

Tristan
Op woensdag 20 maart 2024 om 12:43:59 UTC+1 schreef barre.dh...@gmail.com:

Monkeypwn

unread,
Mar 20, 2024, 9:15:59 AMMar 20
to openov
De haltes zijn eigenlijk op voorhand bepaald en nadien zal er een instantie van de app runnen met deze haltes in. Ik zou dus in principe de berichten kunnen filteren op deze halte nummers en alleen naar deze kijken?  Als ik het goed heb komt 1 kv8passtimes bericht overeen met 1 rit voor 1 halte?. Zou ik dan in principe heel veel van die data gewoon kunnen weggooien als ik toch alleen op zoek ben naar informatie over maximaal 2-4 haltes?  ik subscribe nu hier op tcp://pubsub.besteffort.ndovloket.nl:7817 ik denk dat dit juist is?
Ik krijg nu dit binnen als ik het uitprint het gewoon raw uitprint in python 

[b'/GOVI/KV8passtimes/FO', b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00\xd5\x95\xdbn\xdbF\x10@\xdf\x03\xe4\x1f\xf2^\xa8X\xdeDIo\xaaH\x1bJt\x8bD)-`\xc0X\x91c\x8b)\xcd%\x96+\xc7\x02\xf6\xcf\xfa\xd0O\xca/dv\xc9\x95H[.\\\x07\x05j\x80\x10fF;\xb7\xb3\xc3\xe1\xd5\xe5\xa7MO\xec\xf9\x96]\x17\xb4,Ez\x07\xa5<c\x9a\x17\x90\xcf7\x1f\x86\xcbe\xe7b.\xa5\\G\x17\x9d\x9e$\xbfZ\xd2&\xb6\xdb!N\xc7&\x91\xe5\x0c\\o\xe0\xf9\xbf\x10k@\x88\xfc\xfe\xd7\xdf\xef\xdf]E\xc10\n\x83\xc5p\xb5\x8a\xc6\xd3P\xb6\xb5RP.>\xb0\xedW\x88\x05\x9e\x9d\x04T\xd0\xf9\xb7\x1c\xf8\x88%\xa0\x92r*R\x96\xa3\x19\xe4$\xcda\x91\xd1<O\xf3\xdb\xd9\xfen\x0b\\~d{\x9e\xc3\xa1\xd6.\x18\x17\xe9\xcda\xce\x13\xe0\xb5i]\x02_\tV\x9c\xb3\xe9\x14\x13\x16\xd3l\x05\xfc>\x8da\x02\xf7\x90ik\x1dwA\x85\x00\x9eW\x071{\x90r\xac\x13\xeb\x91\x13Z\x8au\x91`Y\x11\xe2Y\tzW\xc8\x00\x90U\xae\xeb\xd5\x1e\xe3\x12\xff\xc3ZU.\x19>\x14\xe8\n\xc9\x90\xf3\xf4\x9ef\xca\xebh\x0b\xa0@\n{\xaec\xc9\x88\xa7\x85r\xc1\xa0b_\xca)\x94%\xbd\x85\x11\xcb\x05\xe4\xc2\xa8\xd1\xa1\x00\xb9J\x13\xd0\x99\xaa\xc6\xe67#F\xe3\x1d^\xd6\x97\x1d`#;\x9a\xf2a\x1c\xa3C\xba\xcd\x0cLV\x91]\x02-Y^E\xd9o\x1bZ%\x9al\xc3Dq1\xc7\x1aZ%\x9acU\x9f\x0b\x96\xe6\xa2}\x81\x8d?\x9a\\U{:LD\xf9-\x88&\x93\xca\xd2&\xb2\x84\x98\xe1\xfd\xb5\xd8\x19[\xfbd\x00B\x13m]q\x90\xe2\x94\xe51\xacR\xfcy|\xe2\xe8r\xbd\x0c\xae\x7foi\x7f\xc8\r\xec\xd28\x83zn~\xcbX\xfc\xe7q\x166\x10Q3\x86\x1b\xf8\xca\xda\xa3X{\xd6F\xdd\xab:\xa4C\xe0\x91&\x8c)K\xd2\x9b4\xd6ss<\xd8nKY\x9a\xcd+\xbd\x1a\x135"\xda)|\x10\x9c\xd6\x11\xe5H\xb5\x9be\x90\x18\xc3j\xc7\xbe\x1d\x8d\xcaS[.2xP\xa3\xa1\rS\x96\xa78\x1d\x90\x18\t/.\xe4\x9c\xf1*\xf4\x88f\xd9)\xae\xd6ZA5\xcb!\x16\x97|\xde\xd3\xc3\x12n\x8e\xd3m\xf4a,\xf643\xda<\x8e\xf7\x05:\x1f\xaa\x17\x0b_\x9dq\xac\xde\xabZ\x19\xb1\x0c3\x1b-\x82\x87\xca\xf2\xfe\x1d.\xa0\xc6\xc6\x91\x9eE\xec\x9e\xb4\x88\xd3\x97D\xda\xb8\x8c\x1c\xc7%\xc4!\xd2\xeav\xfb^_^\xa1tfCu\xa5\xdd\xf3l\xfc\x0bu\x0fu\xef$\x04\xcb\xf1f<\xbbT\x9e\xf8t\xf0\xccz\xf6i6\xff2\xab-\x8f\x9e\xe1\xe42\x9c\x86\xe1\xec\x94y<\x8b\xc2\xe54\x0c\xc6\xb8\xe8tXW\xed\xc2\xa3\xf04D\xdfv\xbb\xb2\xeb\xf7}\xdf\x96\xa6\x99\xc5\xfa\xe3\xdc\xd8f\xf3Y\xf8\xa8\x07\xc7W\xa1\x9a6w\xe0:\xca\xd6.\x1f\x9fh\xb9\xc62\xce\x17\xdfx\xfe\x99\xac\x8b\xc9\x1c\xcf%=\xf2"\xb2\x8e"\xeb\x0e\xac\xaas#\xbc\x9el\x9d\xb9M\xf6I\xfc7I\xd6\xc1\xca\x1c\xd7%\xee\xcb\xc8\xda\x15Y\xe2\xea\x995\xc2\xeb\xc9\xd6\x99\x1f\x93%\x86,y\xbbd-\x17\xfb\xb3_H\xd6\xf7\xb5\x0b\xea=,\xea$\xbc\x9e\xac}\x8e,\x86\xed\xd6\xdb\xa0\x12\xde\x10\xd9\xbe\x8f\xc5\xf4\x1c\x85\t+#\x8eOl\xab"\xeb{\xcf\x93\xb5|\xdc\xcaV\xdd\xb0\xe7j\xc1\xff\xa9m`2?!\xeb\x1b\xb2\xfey\xb2=\x0f\xf3#ED*M3\x86\xac\xb2\x9d#k=%K\xfa\xff\xe1\xcc\xaam`\xfd\x8b\x99\xb5\xea\x86\xdd\xfeIx\xfd\xccZ\xcf\xcc\xacg\xc8zolf\x1b{\xd6\xad\xbe#\xdd\x97~\xc1\xaa\xf5\xe7c\xa1\'\xe1\xa7\xbe`\xdds{\xd67{\xf6\x99\x99\xfd\x9f\x90\xfd\x01\x9a\xc7C &\x0e\x00\x00']



Op woensdag 20 maart 2024 om 13:42:02 UTC+1 schreef Tristan van Triest:

Stefan de Konink

unread,
Mar 20, 2024, 9:18:13 AMMar 20
to ope...@googlegroups.com
Op 3/20/24 om 14:15 schreef Monkeypwn:
> De haltes zijn eigenlijk op voorhand bepaald en nadien zal er een
> instantie van de app runnen met deze haltes in. Ik zou dus in principe
> de berichten kunnen filteren op deze halte nummers en alleen naar deze
> kijken?  Als ik het goed heb komt 1 kv8passtimes bericht overeen met 1
> rit voor 1 halte?. Zou ik dan in principe heel veel van die data gewoon
> kunnen weggooien als ik toch alleen op zoek ben naar informatie over
> maximaal 2-4 haltes?  ik subscribe nu hier
> op tcp://pubsub.besteffort.ndovloket.nl:7817 ik denk dat dit juist is?
> Ik krijg nu dit binnen als ik het uitprint het gewoon raw uitprint in
> python


Je wilt nog even ungzippen :-)

from gzip import GzipFile
from io import BytesIO

multipart = subscriber.recv_multipart()
address = multipart[0]
contents = b''.join(multipart[1:])
contents = GzipFile('','r',0,BytesIO(contents)).read()
contents = contents.decode('UTF-8')
print(int(time.time()), address , contents)


--
Stefan

OpenPGP_0xDA0A21EE7E3D2959.asc
OpenPGP_signature.asc

Tristan van Triest

unread,
Mar 20, 2024, 9:23:34 AMMar 20
to openov
Als ik het goed heb komt 1 kv8passtimes bericht overeen met 1 rit voor 1 halte?


Dit is niet per se de situatie. Een KV8 Passtimes bericht heeft per lijn vaak updates voor meerdere haltes tegelijk, afhankelijk van welke haltes een "update" nodig hebben.

Concreet voorbeeld:

Arriva 23311 Rit 5080 komt 5 minuten later aan op een halte door een verkeerslicht. Het systeem achter de koppelvlakken berekend dan automatisch door wat dat betekend voor de opeenvolgende haltes. Als er haltes zijn die daardoor ook geupdated dienen te worden, zullen deze vaak in hetzelfde KV8 Passtimes bericht komen.

Uiteindelijk heb je dus een lijstje aan haltes met hun (nieuwe) halteertijden in elk KV8 passtimes bericht, uitzonderingen daargelaten.
Op woensdag 20 maart 2024 om 14:15:59 UTC+1 schreef barre.dh...@gmail.com:

Tristan van Triest

unread,
Mar 20, 2024, 9:28:10 AMMar 20
to openov
Ook nog een belangrijk detail:

Niet alle vervoerders delen onderling dezelfde haltenummers (userStopCodes) voor dezelfde haltes!

Dus stel nu Halte A heeft lijnen van GVB, ARR en CXX die deze passeren, dan is de kans groot dat de KV8 berichten voor deze halte ook andere userStopCodes gebruiken.
Om dit uit te zoeken kan je de Index gebruiken in het Centraal Halte Bestand, die je hier kan vinden.

Als je dit niet goed doet, zal je bijvoorbeeld bij een bepaalde halte (afhankelijk of er meerdere vervoerders langskomen) alleen de lijnen zien van een enkele vervoerder, of als je geluk hebt dat ze de nummers delen, twee. Dit is vooral in grote steden een belangrijk detail waar ik zelf eerst overheen had gekeken.


Op woensdag 20 maart 2024 om 14:23:34 UTC+1 schreef Tristan van Triest:

Monkeypwn

unread,
Mar 20, 2024, 9:34:08 AMMar 20
to openov

Dankuwel voor de zeer duidelijke uitleg! 
Ik kreeg vandaag de taak om deze app te maken en wist totaal niet hoe het werkte voor de bushaltes. 
Voor de treinen was het een stuk gemakkelijker dat was gewoon een http requestje sturen naar NS api haha!!
Op woensdag 20 maart 2024 om 14:23:34 UTC+1 schreef Tristan van Triest:

Monkeypwn

unread,
Mar 20, 2024, 9:34:08 AMMar 20
to openov
Oh dat wist ik niet dankuwel dit had ik zeker over het hoofd gezien!

Op woensdag 20 maart 2024 om 14:28:10 UTC+1 schreef Tristan van Triest:

Monkeypwn

unread,
Mar 20, 2024, 9:34:08 AMMar 20
to openov
Dankjewel! 
Is al een stuk leesbaarder nu :)
Op woensdag 20 maart 2024 om 14:18:13 UTC+1 schreef Stefan de Konink:

Tristan van Triest

unread,
Mar 20, 2024, 9:42:33 AMMar 20
to openov
Wacht maar tot je het zonder een API wilt doen en met dezelfde ruwe data als KV7/8 maar dan de veel-complexere NS versie ;)

Op woensdag 20 maart 2024 om 14:34:08 UTC+1 schreef barre.dh...@gmail.com:

Monkeypwn

unread,
Mar 20, 2024, 9:46:02 AMMar 20
to openov
Ik kom in dit bestand het volgende tegen: <quay>
      <quaycode>NL:Q:40120050</quaycode>
      <quayref>NL:CHB:quay:40120050</quayref>
      <stopplacecode>NL:S:40120050</stopplacecode>
      <stopplaceref>NL:CHB:StopPlace:40120050</stopplaceref>
      <userstopcodes>
        <userstopcodedata>
          <dataownercode>SYNTUS</dataownercode>
          <userstopcode>40120050</userstopcode>
          <validfrom>2017-04-29 22:00:00</validfrom>
        </userstopcodedata>
        <userstopcodedata>
          <dataownercode>ARR</dataownercode>
          <userstopcode>40120050</userstopcode>
          <validfrom>2014-12-14 00:00:00</validfrom>
        </userstopcodedata>
        <userstopcodedata>
          <dataownercode>CXX</dataownercode>
          <userstopcode>40120050</userstopcode>
          <validfrom>2014-12-14 00:00:00</validfrom>
        </userstopcodedata>
        <userstopcodedata>
          <dataownercode>CXX</dataownercode>
          <userstopcode>40120055</userstopcode>
          <validfrom>2014-12-14 00:00:00</validfrom>
        </userstopcodedata>
        <userstopcodedata>
          <dataownercode>KEOLIS</dataownercode>
          <userstopcode>40120050</userstopcode>
          <validfrom>2020-12-13 00:00:00</validfrom>
        </userstopcodedata>
      </userstopcodes>
    </quay>
Betekent dit dat CXX voor eenzelfde halte 2 verschillende userstopcodes geeft?


Op woensdag 20 maart 2024 om 14:34:08 UTC+1 schreef Monkeypwn:

Monkeypwn

unread,
Mar 20, 2024, 9:47:34 AMMar 20
to openov
Als het kan liever een API toch hahah. Maar ik denk niet dat dit avontuurtje met de bussen lukt zonder API heb toch nog niets gevonden dat een uurrooster voor een specifieke halte aanbiedt via een rest api.

Op woensdag 20 maart 2024 om 14:42:33 UTC+1 schreef Tristan van Triest:

Stefan de Konink

unread,
Mar 20, 2024, 9:54:09 AMMar 20
to ope...@googlegroups.com
Op 3/20/24 om 14:47 schreef Monkeypwn:
> Als het kan liever een API toch hahah. Maar ik denk niet dat dit
> avontuurtje met de bussen lukt zonder API heb toch nog niets gevonden
> dat een uurrooster voor een specifieke halte aanbiedt via een rest api.

Wat zou je daarvoor willen betalen (per request)?

--
Stefan

OpenPGP_0xDA0A21EE7E3D2959.asc
OpenPGP_signature.asc

Tristan van Triest

unread,
Mar 20, 2024, 9:56:32 AMMar 20
to openov
Betekent dit dat CXX voor eenzelfde halte 2 verschillende userstopcodes geeft?

Klopt. Je wilt dus eigenlijk de quayCode 'NL:Q:40120050' gebruiken om deze specifieke halte te identificeren.
Dan nog een extra detail (het houdt niet op in de OV wereld, maar dat maakt 't nu net zo leuk ;-)):

Een quay is een halte aan een kant van de weg, of een platform. Als je dus alle ritten die bij een "stopplace" (de hele halte in zijn geheel, dus alle platforms of zeiden van de weg), moet je dus alle UserStopCodes zoeken bij alle Quays die vallen onder de gezochte StopPlaceCode.

Dus: StopPlaceCode heeft 1 of meer QuayCodes heeft 1 of meer UserStopCodes.

Je eindzoekterm van een halte zal dan zijn: NL:S:40120050. In jouw voorbeeld is de Quay en Stopplace code hetzelfde (zie na de Q: en de S:), maar dit hoeft niet het geval te zijn.

Op woensdag 20 maart 2024 om 14:46:02 UTC+1 schreef barre.dh...@gmail.com:
Reply all
Reply to author
Forward
0 new messages