@golemio/pid 3.13.2-dev.1802603210 → 3.13.2-dev.1803100353

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ # Dokumentace pro práci s cache
2
+
3
+ - [**Redis cache**](./types/redis.md)
4
+ - [**In-memory cache**](./types/in_memory.md)
5
+ - [**PostgreSQL cache**](./types/psql.md)
@@ -0,0 +1,58 @@
1
+ # In-memory cache
2
+
3
+ - Cachování v paměti instance služby
4
+ - Nejdříve se načtou data z PSQL, následně si instance služby data drží v paměti
5
+ - Variabilní nebo žádné TTL (tedy pro obnovení dat je nutné službu/instanci/pod restartovat)
6
+ - Vhodné pro data, která se často nemění, ale zároveň se nevyplatí je ukládat do Redisu
7
+
8
+ ## Kolejové obvody
9
+
10
+ - Třída [CachedMetroRailTrackLookup](../../../src/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/metro/CachedMetroRailtrackLookup.ts)
11
+ - Využití v rámci procesování metro zpráv manipulací shape anchor pointů na trase pro přesnější určení stavu vozidla (`on_track` X `at_stop`) a zpoždění na příjezdu/odjezdu do/ze zastávky
12
+ - Viz [MetroShapePointsFixer](../../../src/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/metro/MetroShapePointsFixer.ts)
13
+ - TTL žádné
14
+ - :warning: Dříve se nové kolejové obvody načítaly podle potřeby ROPIDu (zpravidla 2x za rok), takže současný způsob cachování byl v pořádku. Nyní se načítají každý den spolu s JŘ stažením z Blob Storage (kde si soubor ROPIDu spravuje sám), takže je absence TTL kvůli neaktualizaci dat problematická (neaktuálnost kolejových obvodů a špatné určení stavu vozidla, případně zpoždění v zastávce), je potřeba to řešit jinak
15
+
16
+ ```mermaid
17
+ flowchart TB;
18
+ initial[Příjem zprávy, zpárování s GTFS, uložení do DB]-->amqp_updateDelay[AMQP updateDelay];
19
+ amqp_updateDelay--select-->trips[(PSQL trips)];
20
+ amqp_updateDelay--select-->positions[(PSQL positions)];
21
+
22
+ trips--Anchor pointy neexistují-->anchor_points_new[Vytvoření anchor points podle GTFS shapes];
23
+ positions--Anchor pointy neexistují-->anchor_points_new;
24
+ trips--Anchor pointy existují-->anchor_points_exist[Načtení anchor points z Redisu];
25
+ positions--Anchor pointy existují-->anchor_points_exist;
26
+
27
+ anchor_points_new-->fixer[MetroShapePointsFixer];
28
+ fixer-->lookup[CachedMetroRailTrackLookup];
29
+ lookup--select pokud cache miss<-->railtrack[(PSQL metro railtrack data)];
30
+ lookup-->save_anchor_points[Uložení anchor points do Redisu];
31
+ save_anchor_points-->continue[Pokračování ve zpracování zprávy];
32
+
33
+ anchor_points_exist-->continue;
34
+ ```
35
+
36
+ ## Popisky vozidel
37
+
38
+ - Třída [VehicleDescriptorCachedRepository](../../../src/output-gateway/public/data-access/VehicleDescriptorCachedRepository.ts)
39
+ - Využití v rámci:
40
+ - Public VP detailu pro získání dodatečných informací o konkrétním vozidle na trase (pokud si uživatel vyžádá `scope[]=vehicle_descriptor`)
41
+ - Public odjezdů pro získání dodatečných informací (USB nabíječky, klimatizace) o vozidle na každém odjezdu z vybraných zastávek, pokud už víme, které vozidlo daný spoj obsluhuje
42
+ - TTL 4 hodiny
43
+ - Data stahujeme 2x denně, takže současný způsob cachování teď ničemu úplně nevadí
44
+
45
+ ```mermaid
46
+ flowchart TB;
47
+ api_request_vp[GET /v2/public/vehiclepositions/$vehicle_id]-->process_vp[Zpracování API requestu];
48
+ api_request_departures[GET /v2/public/departureboards]-->process_departures[Zpracování API requestu];
49
+
50
+ process_vp--uživatel vyžádal vehicle_descriptor-->descriptor_repository[VehicleDescriptorCachedRepository];
51
+ process_vp--uživatel nevyžádal vehicle_descriptor-->continue[Pokračování ve zpracování];
52
+
53
+ process_departures--známe vozidlo k odjezdu-->descriptor_repository;
54
+ process_departures--neznáme vozidlo k odjezdu-->continue;
55
+
56
+ descriptor_repository--select pokud cache miss<-->descriptors[(PSQL vehicle descriptors)];
57
+ descriptor_repository-->continue;
58
+ ```
@@ -0,0 +1,76 @@
1
+ # PostgreSQL cache
2
+
3
+ - V současnosti cachujeme pouze kontext k danému RT spoji - tedy stav vozidla/spoje po poslední zpracované zprávě
4
+ - Nemusíme tedy dotahovat předchozí pozice z DB, ale veškeré informace máme ve sloupci `last_position_context` v tabulce `vehicle_positions_trips`
5
+ - Uložen jako JSON objekt s variabilními daty a atributy - v závislosti na stavu vozidla/spoje některé atributy chybí nebo jsou prázdné/null
6
+ - Pokud se jedná o první pozici na spoji, pak všechny atributy kromě `tripId` budou null a nepovinné atributy můžou chybět
7
+ - Aktuální interface viz [IVPTripsLastPositionContext](../../../src/schema-definitions/vehicle-positions/models/interfaces/VPTripsLastPositionInterfaces.ts)
8
+
9
+ ```typescript
10
+ interface IVPTripsLastPositionContext {
11
+ lastPositionId: string | null;
12
+ lastPositionLat?: number | null;
13
+ lastPositionLng?: number | null;
14
+ lastPositionOriginTimestamp: number | null;
15
+ lastPositionTracking: Feature<Point, IVPTripsPositionAttributes> | null;
16
+ lastPositionCanceled: boolean | null;
17
+ lastPositionLastStop: {
18
+ id: string | null;
19
+ sequence: number | null;
20
+ arrival_time: number | null;
21
+ arrival_delay: number | null;
22
+ departure_time: number | null;
23
+ departure_delay: number | null;
24
+ };
25
+ lastPositionDelay: number | null;
26
+ atStopStreak: IVPTripsComputedPositionAtStopStreak;
27
+ lastPositionBeforeTrackDelayed: {
28
+ delay: number | null;
29
+ origin_timestamp: Date;
30
+ } | null;
31
+ lastPositionState: StatePositionEnum | null;
32
+ lastStopSequence?: number | null;
33
+ lastPositionStateChange: string | null;
34
+ tripId: string;
35
+ }
36
+ ```
37
+
38
+ - **lastPositionId** - ID poslední pozice, koresponduje ID záznamu v tabulce `vehiclepositions_positions`
39
+ - _poznámka_: využití během aktualizace tripu v databázi (lze nahradit přímo pozicí). Rovněž se využívá během propagace zpoždění
40
+ - **lastPositionLat** - poslední známá zeměpisná šířka vozidla
41
+ - _poznámka_: nepoužívá se a může být null, pokud je spoj zrušen a nepodařilo se zjistit poslední známou polohu
42
+ - **lastPositionLng** - poslední známá zeměpisná délka vozidla
43
+ - _poznámka_: nepoužívá se a může být null, pokud je spoj zrušen a nepodařilo se zjistit poslední známou polohu
44
+ - **lastPositionOriginTimestamp** - `origin_timestamp` poslední pozice (timestamp odeslání zprávy z vozidla)
45
+ - _poznámka_: využití během propagace zpoždění a určení duplikovaných zpráv. :warning: unix timestamp v milisekundách
46
+ - **lastPositionTracking** - pokud je poslední pozice tracked, pak je zde uložena jako GeoJSON objekt, jinak null
47
+ - _poznámka_: využití během určení stavu vozidla jedoucího z/do garáže, projetí poslední zastávky a ujeté trasy `shape_dist_traveled` a azimutu u propagované pozice
48
+ - **lastPositionCanceled** - indikátor, zda byl spoj předchozí zprávou deklarován jako zrušený
49
+ - _poznámka_: využití během aktualizace tripu v databázi. Zbytečné a lze nahradit stavem pozice
50
+ - **lastPositionLastStop** - informace o poslední zastávce, kterou vozidlo projelo
51
+ - _poznámka_: využití pouze pro výpočet zpoždění na zastávce
52
+ - **id** - GTFS ID zastávky. V současnosti je vždy null a nepoužívá se
53
+ - **sequence** - pořadí zastávky v rámci GTFS stop times
54
+ - **arrival_time** - čas příjezdu na zastávku podle GTFS
55
+ - **arrival_delay** - vypočítané zpoždění příjezdu na zastávku oproti GTFS v sekundách
56
+ - **departure_time** - čas odjezdu ze zastávky podle GTFS
57
+ - **departure_delay** - vypočítané zpoždění odjezdu ze zastávky oproti GTFS v sekundách
58
+ - **lastPositionDelay** - poslední vypočítané zpoždění vozidla na spoji
59
+ - _poznámka_: využití pouze pro výpočet zpoždění na zastávce
60
+ - **atStopStreak** - informace o délce pobytu vozidla na zastávce
61
+ - _poznámka_: využití pro přesnější určení zpoždění vozidla během pobytu na zastávce a taky pro výpočet zpoždění během příjezdu a odjezdu na zastávku
62
+ - **firstPositionTimestamp** - timestamp první pozice na zastávce
63
+ - **firstPositionDelay** - zpoždění v sekundách během první pozice na zastávce. Liší se od zpoždění během příjezdu na zastávku, které se počítá jinak
64
+ - **stop_sequence** - pořadí zastávky v rámci GTFS stop times
65
+ - **lastPositionBeforeTrackDelayed** - dodatečné informace o poslední pozici
66
+ - _poznámka_: vyplněno pouze v případě, že poslední pozice spoje byla zpropagována z předchozího spoje na oběhu, jinak null. Využití pro určení zpozdění vozidla a taky pro určení stavu vozidla jedoucího z/do garáže
67
+ - **delay** - zpoždění poslední pozice oproti GTFS v sekundách
68
+ - **origin_timestamp** - timestamp poslední pozice (timestamp odeslání zprávy z vozidla)
69
+ - **lastPositionState** - stav vozidla během poslední pozice
70
+ - _poznámka_: využití pro určení stavu a správné určení segmentu trasy (mezi jakými zastávkami se vozidlo nachází, díky tomu přesnější zpoždění vozidla)
71
+ - **lastStopSequence** - pořadí poslední projeté zastávky v rámci GTFS stop times
72
+ - _poznámka_: využití během určení, zda se vozidlo navrátilo na trase zpět
73
+ - **lastPositionStateChange** - timestamp poslední změny stavu vozidla
74
+ - _poznámka_: využití pro určení stavu vozidla a zda se má vůbec vypočítat zpoždění
75
+ - **tripId** - RT ID spoje, ke kterému se kontext vztahuje. Koresponduje ID záznamu v tabulce `vehiclepositions_trips`
76
+ - _poznámka_: využití během aktualizace tripu v databázi. Zbytečné, šlo by udělat lépe
@@ -0,0 +1,314 @@
1
+ # Redis cache
2
+
3
+ ## Cache pro načítání GTFS jízdních řádů
4
+
5
+ ### files:gtfsStatic:*
6
+
7
+ - Klíč `files:gtfsStatic:*`, kde `*` je název souboru, popř. cesta k souboru v případě ZIP archivu
8
+ - Hodnota CSV/JSON jako string
9
+ - TTL žádné
10
+ - Retence dat až do úspěšného načtení GTFS jíždních řádů
11
+ - Cache obsahuje všechny načtené soubory z ROPID FTP (viz [implementační dokumentace](../../implementation_documentation.md#files-gtfs-static#ropid-ftp-obecně))
12
+ - Menší soubory jsou ukládány pomocí `SET`, větší jsou streamovány pomocí knihovny [redis-wstream](https://github.com/jeffbski/redis-wstream) (`SET` + `APPEND`)
13
+ - Menší soubory jsou následně načteny pomocí `GET`, větší jsou streamovány z Redisu do PSQL pomocí knihovny [redis-rstream](https://github.com/jeffbski/redis-rstream) (`GETRANGE`)
14
+
15
+ ### Flowchart
16
+
17
+ ```mermaid
18
+ flowchart TD;
19
+ redis_1[("Redis files:gtfsStatic:*")];
20
+ redis_2[("Redis files:gtfsStatic:*")];
21
+ redis_3[("Redis files:gtfsStatic:*")];
22
+
23
+ psql[("PSQL ropidgtfs_*_tmp")];
24
+ amqp_transformAndSaveData[AMQP transformAndSaveData];
25
+
26
+ initial["Zpráva z cronu, stažení z ROPID FTP"];
27
+ initial--SET malý soubor-->redis_1;
28
+ initial--Wstream velký soubor-->redis_1;
29
+ initial-->amqp_transformAndSaveData;
30
+
31
+ amqp_transformAndSaveData--GET malý soubor<-->redis_2;
32
+ amqp_transformAndSaveData--Rstream velký soubor<-->redis_2;
33
+ amqp_transformAndSaveData--INSERT malý soubor-->psql;
34
+ amqp_transformAndSaveData--COPY stream velký soubor-->psql;
35
+
36
+ continue[Pokračování v načítání JŘ];
37
+ amqp_transformAndSaveData-->continue;
38
+
39
+ cache_manager["DataCacheManager"];
40
+ continue-->cache_manager;
41
+ cache_manager--Truncate-->redis_3;
42
+
43
+ ```
44
+
45
+ ## Cache pro GTFS-RT feedy
46
+
47
+ ### files:gtfsRt
48
+
49
+ - Klíč `files:gtfsRt`, pomocný `files:gtfsRt_*_timestamp`, kde `*` je název feedu bez přípony
50
+ - Hodnota je hash mapa, kde klíč je název feedu s příponou `.pb`
51
+ - `trip_updates.pb`
52
+ - `vehicle_positions.pb`
53
+ - `pid_feed.pb`
54
+ - `alerts.pb`
55
+ - Hodnota v hash mapě je binární blob reprezentující specifický GTFS-RT feed
56
+ - Hodnota v pomocném klíči je unix timestamp poslední aktualizace daného feed v milisekundách
57
+ - TTL žádné
58
+ - Retence dat aktivní, vždy uchováváme nejnovější feedy
59
+ - Všechny feedy jsou ukládány pomocí `HSET`, pomocné timestampy pomocí `SET`
60
+ - Feedy jsou nabízený přes API `/v2/vehiclepositions/gtfsrt/{feed}`, kde `{feed}` je název feedu s příponou `.pb`
61
+ - Žádaný feed se načte pomocí `HGET` a vrátí se jako binární blob. Pokud feed neexistuje, vrátí se 404
62
+ - Pomocný timestamp se načte pomocí `GET` a vrátí se jako hodnota hlavičky `Last-Modified` převedená na ISO string. Pokud timestamp neexistuje, hodnota hlavičky bude unix timestamp 0 jako ISO string. Využívá se především pro monitoring a alerting
63
+ - Feedy se generují 3x za minutu (rabín 2x)
64
+
65
+ ### Flowchart
66
+
67
+ ```mermaid
68
+ flowchart TD;
69
+ redis_f_1[("Redis files:gtfsRt")];
70
+ redis_t_1[("Redis files:gtfsRt_*_timestamp")];
71
+ psql[("PSQL vehiclepositions_*, ropidvymi_*")];
72
+
73
+ connector[("OG Redis connector")];
74
+ repository["IE GtfsRtRedisRepository"];
75
+
76
+ get_gtfsrt["GET /v2/vehiclepositions/gtfsrt/$feed"];
77
+
78
+ initial["Zpráva z cronu, vygenerování feedů"];
79
+ initial--Select<-->psql;
80
+ initial-->repository;
81
+ repository--HSET *.pb-->redis_f_1;
82
+ repository--SET *_timestamp-->redis_t_1;
83
+
84
+ get_gtfsrt-->connector;
85
+ connector--HGET *.pb<-->redis_f_1;
86
+ connector--GET *_timestamp<-->redis_t_1;
87
+ ```
88
+
89
+ ## Cache pro zpracování RT dat
90
+
91
+ ### gtfsRunSchedule:*
92
+
93
+ - TODO doplnit
94
+
95
+ ### gtfsBlockSchedule:*
96
+
97
+ - TODO doplnit
98
+
99
+ ### gtfsDelayComputation:*
100
+
101
+ - TODO doplnit
102
+
103
+ ### Flowchart
104
+
105
+ ```mermaid
106
+ flowchart TD;
107
+ todo["TODO"];
108
+ ```
109
+
110
+ ## Cache pro předzpracování a párování dat z Telmaxu (Arriva City)
111
+
112
+ ### vpRegionalBusCisLookup:*
113
+
114
+ - TODO doplnit
115
+
116
+ ### vpRegionalBusGtfsLookup:*
117
+
118
+ - TODO doplnit
119
+
120
+ ### Flowchart
121
+
122
+ ```mermaid
123
+ flowchart TD;
124
+ todo["TODO"];
125
+ ```
126
+
127
+ ## Cache pro public API
128
+
129
+ ### vpPublicCache:*
130
+
131
+ - Hlavní komponentou je sorted set `vpPublicCache:$setId`, kde `$setId` je ID vygenerované datové sady (4 náhodné bajty reprentované hexadecimálně)
132
+ - Score je GPS souřadnice (`GEOADD`), member je ID vozidla. Sorted set se používá jako základ pro public VP (`GEOSEARCH`)
133
+ - ID nejnovější datové sady se propaguje přes PubSub channel `vpPublicCache`
134
+ - Další komponenty:
135
+ - `vpPublicCache:$setId:trip-$gtfsTripId` - list ID vozidel asociovaných s daným GTFS trip id (možnost více vozidel na jednom spoji)
136
+ - `vpPublicCache:$setId:vehicle-$vehicleId` - JSON jako string s informacemi o vozidle a spoji, které vykonává
137
+ - `vpPublicCache:$setId:future-trip-$gtfsTripId` - list ID vozidel asociovaných s daným GTFS trip id (možnost více vozidel na jednom spoji). Vozidlo je před trasou a vykonává předchozí spoj na oběhu (nemá se zobrazit na mapě). Využití v public odjezdech
138
+ - `vpPublicCache:$setId:future-vehicle-$vehicleId-$gtfsTripId` - JSON jako string s informacemi o vozidle. Vozidlo je před trasou a vykonává předchozí spoj na oběhu (nemá se zobrazit na mapě). Využití v public odjezdech a public VP detailu s GTFS lookupem
139
+ - `vpPublicCache:$setId:canceled-trips-$gtfsTripId` - JSON jako string s informacemi o zrušeném spoji. Využití v public odjezdech
140
+ - TTL 1 minuta
141
+ - Nová datová sada se generuje přibližně jednou za 3 vteřiny a obsahuje všechny RT spoje (aktivní, budoucí a zrušené)
142
+
143
+ ### vpPublicStopTimeCache:*
144
+
145
+ - Klíč `vpPublicStopTimeCache:*`, kde `*` je kombinace ID vozidla a GTFS id spoje (možnost více vozidel na jednom spoji)
146
+ - Hodnota je JSON jako string s informacemi o zastávkách a jejich časech
147
+ - `sequence` - pořadí zastávky podle GTFS stop times
148
+ - `arr_delay` - čas příjezdu na zastávku - reálný čas u projetých zastávek, predikce u budoucích
149
+ - `dep_delay` - čas odjezdu ze zastávky - reálný čas u projetých zastávek, predikce u budoucích
150
+ - `cis_stop_platform_code` - nástupiště/kolej podle CIS u vlakových zastávek, jinde null
151
+ - `platform_code` - označení zastávky podle GTFS
152
+ - `stop_id` - GTFS id zastávky
153
+ - TTL 1 hodina a 5 minut
154
+ - Automatické promazání dat po úspěšném načtení GTFS jíždních řádů
155
+ - Cca jednou za 5 vteřin se přenačtou stop times pro všechny aktivní spoje. Generování může běžet pouze jednou, po dokončení tasku se spustí znovu (max čekání 4.8 vteřin)
156
+
157
+ ### gtfsPublicDepartureCache:*
158
+
159
+ - Klíč `gtfsPublicDepartureCache:*`, kde `*` je GTFS id zastávky
160
+ - Hodnota je sorted set, kde score je unix timestamp odjezdu v sekundách a member jsou relevantní informace o odjezdu
161
+ - Existuje záznam pro každou zastávku v GTFS. Pokud v ní ale není žádný odjezd, je vyplněný pouze jeden prázdný member - detekce validní zastávky bez odjezdu
162
+ - TTL 7 hodin
163
+ - Retence dat aktivní, jednou za hodinu se smažou všechny odjezdy starší než 3 hodiny
164
+ - Jednou za hodinu se vygenerují nové odjezdy pro všechny zastávky v intervalu +5 hodin až +7 hodin, po přenačtení JŘ se přegenerují všechny odjezdy v interval -3 hodiny až +7 hodin
165
+ - Ukládá se pomocí `ZADD`, čte se pomocí `ZRANGEBYSCORE` (-inf, now + `minutesAfter`)
166
+ - Využití v public odjezdech
167
+
168
+ ### Flowchart (refresh)
169
+
170
+ ```mermaid
171
+ flowchart LR;
172
+ finish_up_gtfs["Dokončení zpracování GTFS JŘ"];
173
+
174
+ psql_rt[("PSQL vehiclepositions_*")];
175
+ psql_stop_times[("PSQL v_public_vehiclepositions_combined_stop_times")];
176
+ psql_departures[("PSQL ropidgtfs_departures")];
177
+
178
+ redis_pubsub_channel["Redis channel vpPublicCache"];
179
+ redis_public_cache[("Redis vpPublicCache:*")];
180
+ redis_stop_times[("Redis vpPublicStopTimeCache:*")];
181
+ redis_departures[("Redis gtfsPublicDepartureCache:*")];
182
+
183
+ amqp_refreshPublicTripCache[AMQP refreshPublicTripCache];
184
+ %% amqp_refreshPublicTripCache--"Čekání max 2.4 vteřin od spuštění tasku"-->amqp_refreshPublicTripCache;
185
+ amqp_refreshPublicStopTimeCache[AMQP refreshPublicStopTimeCache];
186
+ %% amqp_refreshPublicStopTimeCache--"Čekání max 4.8 vteřin od spuštění tasku"-->amqp_refreshPublicStopTimeCache;
187
+ amqp_refreshPublicGtfsDepartureCache[AMQP refreshPublicGtfsDepartureCache];
188
+
189
+ cron_public_cache["Cron public VP 1x za minutu (backup)"];
190
+ cron_public_cache-->amqp_refreshPublicTripCache;
191
+
192
+ cron_stop_times["Cron zastávky spojů 1x za minutu (backup)"];
193
+ cron_stop_times-->amqp_refreshPublicStopTimeCache;
194
+
195
+ cron_departures["Cron odjezdy 1x za hodinu"];
196
+ cron_departures--"{fromHours: 5, toHours: 7}"-->amqp_refreshPublicGtfsDepartureCache;
197
+
198
+ finish_up_gtfs--"Truncate"-->redis_stop_times;
199
+ finish_up_gtfs--"{fromHours: -3, toHours: 7}"-->amqp_refreshPublicGtfsDepartureCache;
200
+
201
+ amqp_refreshPublicTripCache--"Aktivní spoje a jejich polohy"<-->psql_rt;
202
+ amqp_refreshPublicTripCache--"GEOADD + RPUSH + SET"-->redis_public_cache;
203
+ amqp_refreshPublicTripCache--"ID/název nové datové sady"-->redis_pubsub_channel;
204
+
205
+ amqp_refreshPublicStopTimeCache--"Zastávky u všech aktivních spojů"<-->psql_stop_times;
206
+ amqp_refreshPublicStopTimeCache--"MSET"-->redis_stop_times;
207
+
208
+ amqp_refreshPublicGtfsDepartureCache--"Odjezdy v intervalu"<-->psql_departures;
209
+ amqp_refreshPublicGtfsDepartureCache--"ZREMRANGEBYSCORE + ZADD"-->redis_departures;
210
+ ```
211
+
212
+ ### Flowchart (public API VP)
213
+ ```mermaid
214
+ flowchart TD;
215
+ redis_pubsub_channel["Redis channel vpPublicCache"];
216
+ redis_subscriber["VPSubscriber"];
217
+ redis_public_cache[("Redis vpPublicCache:* (RT info)")];
218
+ redis_public_cache_misc[("Redis vpPublicCache:* (aktivní, budoucí a zrušené spoje)")];
219
+ redis_repository["OG PublicVehiclePositionsRepository"];
220
+
221
+ redis_repository<-->redis_public_cache_misc;
222
+ redis_repository<-->redis_public_cache;
223
+
224
+ redis_subscriber--"Přihlášení k odběru"-->redis_pubsub_channel;
225
+ redis_pubsub_channel--"ID/název nové datové sady"-->redis_subscriber--"setCurrentSetName"-->redis_repository;
226
+
227
+ get_vp["GET /v2/public/vehiclepositions"];
228
+ get_vp--"GEOSEARCH + vehicle_id lookup pouze aktivních spojů"-->redis_repository;
229
+ ```
230
+
231
+ ### Flowchart (public API VP detail)
232
+ ```mermaid
233
+ flowchart TD;
234
+ redis_pubsub_channel["Redis channel vpPublicCache"];
235
+ redis_subscriber["VPSubscriber"];
236
+ redis_public_cache[("Redis vpPublicCache:* (RT info)")];
237
+ redis_public_cache_misc[("Redis vpPublicCache:* (aktivní, budoucí a zrušené spoje)")];
238
+ redis_stop_times[("Redis vpPublicStopTimeCache:*")];
239
+ redis_delay_computation[("Redis gtfsDelayComputation:* (pouze shapes)")];
240
+ redis_repository["OG PublicVehiclePositionsRepository"];
241
+ redis_repository<-->redis_public_cache_misc;
242
+ redis_repository<-->redis_public_cache;
243
+
244
+ redis_subscriber--"Přihlášení k odběru"-->redis_pubsub_channel;
245
+ redis_pubsub_channel--"ID/název nové datové sady"-->redis_subscriber--"setCurrentSetName"-->redis_repository;
246
+
247
+ get_vp_detail["GET /v2/public/vehiclepositions/$vehicle_id"];
248
+
249
+ get_vp_detail--"Lookup aktivního GTFS spoje"-->redis_repository;
250
+ get_vp_detail--"scope[]=stop_times"<-->redis_stop_times;
251
+ get_vp_detail--"scope[]=shapes"<-->redis_delay_computation;
252
+ ```
253
+
254
+ ### Flowchart (public API VP detail with GTFS)
255
+ ```mermaid
256
+ flowchart TD;
257
+ redis_pubsub_channel["Redis channel vpPublicCache"];
258
+ redis_subscriber["VPSubscriber"];
259
+ redis_public_cache[("Redis vpPublicCache:* (RT info)")];
260
+ redis_public_cache_misc[("Redis vpPublicCache:* (aktivní, budoucí a zrušené spoje)")];
261
+ redis_stop_times[("Redis vpPublicStopTimeCache:*")];
262
+ redis_delay_computation[("Redis gtfsDelayComputation:* (pouze shapes)")];
263
+ redis_repository["OG PublicVehiclePositionsRepository"];
264
+
265
+ redis_repository<-->redis_public_cache_misc;
266
+ redis_repository<-->redis_public_cache;
267
+
268
+ redis_subscriber--"Přihlášení k odběru"-->redis_pubsub_channel;
269
+ redis_pubsub_channel--"ID/název nové datové sady"-->redis_subscriber--"setCurrentSetName"-->redis_repository;
270
+
271
+ get_vp_detail_with_gtfs["GET /v2/public/vehiclepositions/$vehicle_id;gtfsTripId=$gtfsTripId"];
272
+
273
+ get_vp_detail_with_gtfs--"Lookup aktivního nebo budoucího GTFS spoje (exact match)"-->redis_repository;
274
+ get_vp_detail_with_gtfs--"scope[]=stop_times"<-->redis_stop_times;
275
+ get_vp_detail_with_gtfs--"scope[]=shapes"<-->redis_delay_computation;
276
+ ```
277
+
278
+ ### Flowchart (public API GTFS static lookup)
279
+
280
+ :warning: GTFS static lookup neřeší RT informace a jako jediný EP je napojený přímo na PSQL. Kvůli předpokládáně nižšímu využití (detail odjezdů v budoucnosti) to tolik nevadí
281
+
282
+ ```mermaid
283
+ flowchart TD;
284
+ psql_trip[("PSQL ropidgtfs_trips, ropidgtfs_routes, ropidgtfs_precomputed_trip_schedule")];
285
+ psql_stop_times[("PSQL ropidgtfs_stop_times, ropidgtfs_stops")];
286
+ psql_shapes[("PSQL ropidgtfs_shapes")];
287
+
288
+ get_gtfs_detail["GET /v2/public/gtfs/trips/$trip_id"];
289
+ get_gtfs_detail--"Lookup GTFS trip id"<-->psql_trip;
290
+ get_gtfs_detail--"scope[]=stop_times"<-->psql_stop_times;
291
+ get_gtfs_detail--"scope[]=shapes"<-->psql_shapes;
292
+ ```
293
+
294
+ ### Flowchart (public API departures)
295
+ ```mermaid
296
+ flowchart TD;
297
+ redis_pubsub_channel["Redis channel vpPublicCache"];
298
+ redis_subscriber["VPSubscriber"];
299
+ redis_public_cache[("Redis vpPublicCache:* (RT info)")];
300
+ redis_public_cache_misc[("Redis vpPublicCache:* (aktivní, budoucí a zrušené spoje)")];
301
+ redis_departures[("Redis gtfsPublicDepartureCache:*")];
302
+ redis_repository["OG PublicVehiclePositionsRepository"];
303
+
304
+ redis_subscriber--"Přihlášení k odběru"-->redis_pubsub_channel;
305
+ redis_pubsub_channel--"ID/název nové datové sady"-->redis_subscriber--"setCurrentSetName"-->redis_repository;
306
+
307
+ get_departures["GET /v2/public/departureboards"];
308
+
309
+ get_departures--"Odjezdy pro zastávky"-->redis_departures;
310
+ get_departures--"Aktivní vozidlo podle GTFS trip id"-->redis_repository<-->redis_public_cache_misc;
311
+ rt_info["Obohacení o RT informace"];
312
+ get_departures--"Alespoň jedno vozidlo připadá nějakému spoji (aktivní, budoucí i zrušené) na odjezdu"-->rt_info;
313
+ rt_info--"RT informace o spoji"-->redis_repository<-->redis_public_cache;
314
+ ```
@@ -0,0 +1,17 @@
1
+ # Dokumentace zpracování vstupních RT dat
2
+
3
+ - **Popis vstupních dat podle poskytovatele**
4
+ - [HTTP MPVNet](./input_realtime_data/http_mpvnet.md)
5
+ - [Městské a příměstské autobusy (mimo DPP)](./input_realtime_data/http_mpvnet.md#městské-a-příměstské-autobusy-mimo-dpp)
6
+ - [Přívozy](./input_realtime_data/http_mpvnet.md#přívozy)
7
+ - [Vlaky](./input_realtime_data/http_mpvnet.md#vlaky)
8
+ - [TCP DPP tramvaje](./input_realtime_data/tcp_dpp_tram.md)
9
+ - [TCP DPP autobusy a trolejbusy](./input_realtime_data/tcp_dpp_bus.md)
10
+ - [TCP DPP metro](./input_realtime_data/tcp_dpp_metro.md)
11
+ - [TCP Telmax Arriva City](./input_realtime_data/tcp_telmax_arriva_city.md)
12
+ - **Popis určení stavu vozidla na trase podle poskytovatele**
13
+ - [HTTP MPVNet](./state_position_tracking/http_mpvnet.md)
14
+ - [TCP DPP](./state_position_tracking/tcp_dpp_common.md)
15
+ - [TCP DPP metro](./state_position_tracking/tcp_dpp_metro.md)
16
+ - [TCP Telmax Arriva City](./state_position_tracking/tcp_telmax_arriva_city.md)
17
+ - [**Mapování MPVNet vehicle type na GTFS**](./vehicle_types.md)
@@ -0,0 +1,153 @@
1
+ # HTTP MPVNet
2
+
3
+ ## Městské a příměstské autobusy (mimo DPP)
4
+ ```xml
5
+ <?xml version="1.0" encoding="utf-8"?>
6
+
7
+ <m disp="http://77.93.194.81:8716/api">
8
+
9
+ <spoj ka="2" kb="0" den="2025-03-30" lin="100194" alias="194" spoj="4009" dopr="ABOUT ME" doprSkut="ABOUT ME" kmenl="194" t="3" tcis="A" np="true" po="2" vuzevc="1907" skol="false" posl="false" sled="2" lat="50.09078" lng="14.42738" cpoz="09:34:59" azimut="76" rychl="1" zast="63505" asw="14100002" zpoz_prij="-59">
10
+ <zast stan="A" odj="09:20" zast="59168" asw="29530001" zpoz_typ_odj="3" zpoz_odj="28" />
11
+
12
+ <zast stan="D" odj="09:23" zast="59104" asw="3610004" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="-33" zpoz_odj="9" />
13
+
14
+ <zast stan="I" odj="09:26" zast="57811" asw="3600009" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="-84" zpoz_odj="-44" />
15
+
16
+ <zast stan="A" odj="09:27" zast="59299" asw="7030081" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="-36" zpoz_odj="-3" />
17
+
18
+ <zast stan="B" odj="09:29" zast="63506" asw="14080002" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="-70" zpoz_odj="5" />
19
+
20
+ <zast stan="A" odj="09:32" zast="59300" asw="29620001" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="-94" zpoz_odj="-9" />
21
+
22
+ <zast stan="A" odj="09:33" zast="59108" asw="29630001" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="-18" zpoz_odj="-1" />
23
+
24
+ <zast stan="B" odj="09:35" zast="63505" asw="14100002" zpoz_typ_prij="3" zpoz_typ_odj="2" zpoz_prij="-59" zpoz_odj="0" />
25
+
26
+ <zast stan="A" odj="09:37" zast="63507" asw="14090001" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="0" zpoz_odj="0" />
27
+
28
+ <zast stan="B" odj="09:39" zast="59203" asw="29560002" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="0" zpoz_odj="0" />
29
+
30
+ <zast stan="B" odj="09:40" zast="58766" asw="320052" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="0" zpoz_odj="0" />
31
+
32
+ <zast stan="H" prij="09:41" zast="27863" asw="6890008" zpoz_typ_prij="2" zpoz_prij="0" />
33
+ </spoj>
34
+
35
+ </m>
36
+ ```
37
+ - _spoj_ - informace o spoji a vozidlu
38
+ - **ka** - ??? nepoužíváme
39
+ - **kb** - ??? nepoužíváme
40
+ - **den** - datum, kdy spoj vyjel
41
+ - **lin** - označení linky podle CIS
42
+ - **alias** - číslo/označení linky podle CIS
43
+ - **spoj** - označení spoje podle CIS
44
+ - **dopr** - smluvní dopravce podle JŘ
45
+ - **doprSkut** - reálný dopravce vykonávající oběh
46
+ - **kmenl** - kmenová linka, může se lišit od **alias**
47
+ - **t** - typ vozidla, viz [vehicle_types.md](../vehicle_types.md)
48
+ - **tcis** - ??? nepoužíváme
49
+ - **np** - indikátor nízkopodlažnosti
50
+ - **po** - oběhové číslo
51
+ - **vuzevc** - [Evidenční číslo vozidla](https://cs.wikipedia.org/wiki/Eviden%C4%8Dn%C3%AD_%C4%8D%C3%ADslo_vozidla)
52
+ - **skol** - nejspíš indikátor školního spoje ??? nepoužíváme
53
+ - **posl** - nejspíš indikátor poslední spoje na oběhu ??? nepoužíváme
54
+ - **sled** - indikátor, zda je spoj sledovaný (tracked)
55
+ - 0 - nesledovaný (spoj je před trasou nebo dojel nebo je zrušen)
56
+ - 2 - sledovaný (spoj je na trase nebo v zastávce)
57
+ - **lat** - zeměpisná šířka
58
+ - **lng** - zeměpisná délka
59
+ - **cpoz** - čas odeslání zprávy (nejspíš z vozidla), nesmí být více než 5 minut v budoucnu
60
+ - **azimut** - azimut
61
+ - **rychl** - rychlost vozidla
62
+ - **zast** - aktuální nebo poslední projetá zastávka CIS (miniuzel)
63
+ - **asw** - aktuální nebo poslední projetá zastávka ASW
64
+ - **zpoz_prij** - zpoždění na příjezdu do aktuální nebo poslední projeté zastávky
65
+ - **zpoz_odj** - zpoždění na odjezdu z poslední projeté zastávky. Pokud je vozidlo v zastávce, pak není vyplněno
66
+ - **zrus** - indikátor, zda byl spoj zrušen
67
+ - **zrusod** - příklad 59168/A, nejspíš od které zastávky byl spoj zrušen ???
68
+ - _zast_ - informace o projetých i budoucích zastávkách spoje
69
+ - **stan** - stanoviště/nástupiště/kolej podle CIS
70
+ - **odj** - čas odjezdu za zastávky podle JŘ
71
+ - **prij** - čas příjezdu do zastávky podle JŘ
72
+ - **zast** - identifikátor miniuzlu (CIS), kam zastávka patří
73
+ - **asw** - ASW identifikátor zastávky
74
+ - **zpoz_typ_prij** - typ zpoždění příjezd do zastávky (2 predikce, 3 reálný stav)
75
+ - **zpoz_typ_odj** - typ zpoždění odjezd ze zastávky (2 predikce, 3 reálný stav)
76
+ - **zpoz_prij** - zpoždění příjezd do zastávky
77
+ - **zpoz_odj** - zpoždění příjezd do zastávky
78
+
79
+ ## Přívozy
80
+ ```xml
81
+ <?xml version="1.0" encoding="utf-8"?>
82
+
83
+ <m disp="http://77.93.194.81:8716/api">
84
+
85
+ <spoj ka="2" kb="0" den="2025-03-30" lin="199693" alias="P3" spoj="4096" dopr="VITTUS GROUP" doprSkut="VITTUS GROUP" kmenl="1803" t="12" tcis="P" np="true" po="1" vuzevc="302" skol="false" posl="false" sled="0" lat="50.04807" lng="14.41222" cpoz="09:18:29" azimut="337" rychl="2">
86
+ <zast stan="K" odj="09:32" zast="58997" asw="1100011" zpoz_typ_odj="2" zpoz_odj="0" />
87
+
88
+ <zast stan="K" prij="09:34" zast="28003" asw="3370011" zpoz_typ_prij="2" zpoz_prij="0" />
89
+ </spoj>
90
+
91
+ </m>
92
+ ```
93
+
94
+ ## Vlaky
95
+ ```xml
96
+ <?xml version="1.0" encoding="utf-8"?>
97
+
98
+ <m disp="http://77.93.194.81:8716/api">
99
+
100
+ <spoj ka="1" kb="0" den="2025-03-30" lin="" alias="S8" spoj="9055" dopr="ČESKÉ DRÁHY" t="0" np="true" skol="false" posl="false" sled="2" lat="49.8657227" lng="14.4618721" cpoz="09:35:19" zast="5455746" zpoz_prij="600" zpoz_odj="600">
101
+ <zast stan="5S/22S" odj="08:25" zast="5457076" zpoz_typ_odj="3" zpoz_odj="720" />
102
+
103
+ <zast stan="-/6" prij="08:29" odj="08:30" zast="5457276" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="720" zpoz_odj="780" />
104
+
105
+ <zast stan="-/1" odj="08:34" zast="5457287" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="720" zpoz_odj="780" />
106
+
107
+ <zast stan="-/2" odj="08:38" zast="5457156" zpoz_zxtyp_prij="3" zpoz_typ_odj="3" zpoz_prij="660" zpoz_odj="720" />
108
+
109
+ <zast stan="2/-" prij="08:42" odj="08:43" zast="5457016" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="660" zpoz_odj="660" />
110
+
111
+ <zast stan="-/2" prij="08:46" odj="08:47" zast="5457386" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="720" zpoz_odj="720" />
112
+
113
+ <zast stan="-/1" odj="08:49" zast="5455526" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="780" zpoz_odj="840" />
114
+
115
+ <zast stan="-/3" odj="08:53" zast="5455536" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="720" zpoz_odj="780" />
116
+
117
+ <zast stan="-/1" odj="08:57" zast="5455556" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="720" zpoz_odj="780" />
118
+
119
+ <zast stan="2/3" prij="09:01" odj="09:02" zast="5455546" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="720" zpoz_odj="720" />
120
+
121
+ <zast stan="-/1" odj="09:05" zast="5458316" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="660" zpoz_odj="660" />
122
+
123
+ <zast stan="-/2" prij="09:12" odj="09:13" zast="5455696" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="600" zpoz_odj="600" />
124
+
125
+ <zast stan="-/1" odj="09:16" zast="5455716" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="600" zpoz_odj="660" />
126
+
127
+ <zast stan="-/1" odj="09:19" zast="5455726" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="600" zpoz_odj="660" />
128
+
129
+ <zast stan="-/1" odj="09:24" zast="5455746" zpoz_typ_prij="3" zpoz_typ_odj="3" zpoz_prij="600" zpoz_odj="600" />
130
+
131
+ <zast stan="-/1" prij="09:30" odj="09:31" zast="5455736" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
132
+
133
+ <zast prij="09:35" odj="09:36" zast="5455756" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
134
+
135
+ <zast prij="09:38" odj="09:39" zast="5455776" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
136
+
137
+ <zast prij="09:42" odj="09:43" zast="5455766" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
138
+
139
+ <zast odj="09:46" zast="5455796" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
140
+
141
+ <zast prij="09:49" odj="10:03" zast="5455786" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
142
+
143
+ <zast prij="10:06" odj="10:07" zast="5455806" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
144
+
145
+ <zast prij="10:11" odj="10:12" zast="5455816" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
146
+
147
+ <zast prij="10:14" odj="10:15" zast="5455096" zpoz_typ_prij="2" zpoz_typ_odj="2" zpoz_prij="720" zpoz_odj="720" />
148
+
149
+ <zast prij="10:19" zast="5455046" zpoz_typ_prij="2" zpoz_prij="300" />
150
+ </spoj>
151
+
152
+ </m>
153
+ ```
@@ -0,0 +1,27 @@
1
+ # TCP DPP autobusy a trolejbusy
2
+
3
+ ```xml
4
+ <M>
5
+
6
+ <V turnus="144/3" line="144" evc="3885" np="ano" lat="50.12460" lng="14.45489" akt="06750004" takt="2025-03-30T18:10:04" konc="06490001" tjr="2025-03-30T18:10:00" pkt="473060" tm="2025-03-30T18:10:06" events="P"/>
7
+
8
+ </M>
9
+ ```
10
+
11
+ - **turnus** - oběh
12
+ - **line** - linka
13
+ - **evc** - [Evidenční číslo vozidla](https://cs.wikipedia.org/wiki/Eviden%C4%8Dn%C3%AD_%C4%8D%C3%ADslo_vozidla)
14
+ - **np** - indikátor nízkopodlažnosti
15
+ - **lat** - zeměpisná šířka
16
+ - **lng** - zeměpisná délka
17
+ - **akt** - poslední projetá zastávka, nepoužíváme
18
+ - **takt** - timestamp odeslání zprávy z vozidla
19
+ - **konc** - poslední ASW zastávka spoje, nepoužíváme
20
+ - **tjr** - timestamp odeslání zprávy podle JŘ (v jaký čas mělo vozidlo na daném bodě být)
21
+ - **pkt** - identifikátor zprávy z vozidla/číslo TCP packetu??? Nepoužíváme
22
+ - **tm** - timestamp odeslání zprávy od DPP
23
+ - **events** - událost asociovaná se zprávou
24
+ - P - příjezd do zastávky
25
+ - O - odjezd ze zastávky
26
+ - V - spoj ukončen
27
+ - T - checkpoint na trase, vozidlo jen o sobě dává vědět
@@ -0,0 +1,24 @@
1
+ # TCP DPP metro
2
+
3
+ ```xml
4
+ <m linka="C" tm="2025-03-03T09:07:59Z" gvd="GD29c">
5
+
6
+ <vlak csp=" 6" csr=" 6" cv="225" ko="282901" odch="-25" />
7
+
8
+ <vlak csp="10" csr="10" cv="229" ko="313207" odch="0" />
9
+
10
+ <vlak csp="16" csr="16" cv="260" ko="3704" odch="15" />
11
+
12
+ <vlak csp="18" csr="18" cv="245" ko="4709" odch="50" />
13
+
14
+ </m>
15
+ ```
16
+
17
+ - **linka** - označení linky, koresponduje s GTFS `route.short_name`
18
+ - **tm** - timestamp odeslání zprávy od DPP
19
+ - **gvd** - grafikon, nepoužíváme
20
+ - **csp** - oběhové číslo podle JŘ, nevěříme
21
+ - **csr** - oběhové číslo doopravdy, nevěříme
22
+ - **cv** - číslo spoje, koresponduje s trip_number v obehy.csv, unikátní v rámci linky
23
+ - **ko** - kolejový obvod, určení GPS souřadnic
24
+ - **odch** - odchylka oproti `tm`, určení zpoždění (záporné číslo znamená zpoždění)
@@ -0,0 +1,26 @@
1
+ # TCP DPP tramvaje
2
+
3
+ ```xml
4
+ <M>
5
+
6
+ <V turnus="12/2" line="12" evc="8544" lat="50.10486" lng="14.53100" akt="51440002" takt="2025-03-30T18:11:52" konc="00720002" tjr="2025-03-30T18:10:00" pkt="591646" tm="2025-03-30T18:11:52" events="O"/>
7
+
8
+ </M>
9
+ ```
10
+ - **turnus** - oběh
11
+ - **line** - linka
12
+ - **evc** - [Evidenční číslo vozidla](https://cs.wikipedia.org/wiki/Eviden%C4%8Dn%C3%AD_%C4%8D%C3%ADslo_vozidla)
13
+ - **np** - indikátor nízkopodlažnosti
14
+ - **lat** - zeměpisná šířka
15
+ - **lng** - zeměpisná délka
16
+ - **akt** - poslední projetá zastávka, nepoužíváme
17
+ - **takt** - timestamp odeslání zprávy z vozidla
18
+ - **konc** - poslední ASW zastávka spoje, nepoužíváme
19
+ - **tjr** - timestamp odeslání zprávy podle JŘ (v jaký čas mělo vozidlo na daném bodě být)
20
+ - **pkt** - identifikátor zprávy z vozidla/číslo TCP packetu??? Nepoužíváme
21
+ - **tm** - timestamp odeslání zprávy od DPP
22
+ - **events** - událost asociovaná se zprávou
23
+ - P - příjezd do zastávky
24
+ - O - odjezd ze zastávky
25
+ - V - spoj ukončen
26
+ - T - checkpoint na trase, vozidlo jen o sobě dává vědět
@@ -0,0 +1,44 @@
1
+ # TCP Telmax Arriva City + Arriva City Neratovice
2
+
3
+ ```xml
4
+ <M>
5
+
6
+ <V imei="860425047186836" rz="5SB8545" pkt="573" lat="50.0451" lng="14.44866" tm="2025-03-30T18:07:09" events="Z" rych="13" smer="49" />
7
+
8
+ <V imei="862430061982423" rz="6SN8270" pkt="5527" lat="50.10773" lng="14.60353" tm="2025-03-30T18:07:11" events="P" line="100204" conn="4032" rych="0" smer="320" evc="9018" turnus="204716" ridic="200602" akt="55207" konc="55250" />
9
+
10
+ <V imei="867377023798816" rz="6SU3222" pkt="2837" lat="49.95867" lng="14.8828" tm="2025-03-30T18:07:09" events="Z" rych="39" smer="350" />
11
+
12
+ <V imei="867377023795952" rz="9U89136" pkt="1002" lat="49.86153" lng="14.58563" tm="2025-03-30T18:07:13" events="L" rych="48" smer="193" />
13
+
14
+ <V imei="867377023798816" rz="6SU3222" pkt="2838" lat="49.95876" lng="14.88278" tm="2025-03-30T18:07:10" events="Z" rych="39" smer="351" />
15
+
16
+ <V imei="867377023797230" rz="9U89064" pkt="939" lat="50.038" lng="14.45776" tm="2025-03-30T18:07:12" events="R" rych="11" smer="40" />
17
+
18
+ <V imei="867377023812609" rz="6AB1843" pkt="5024" lat="50.12651" lng="14.51493" tm="2025-03-30T18:07:11" events="T" rych="0" smer="347" />
19
+
20
+ <V imei="868711063963758" rz="6SU2942" pkt="4016" lat="50.07414" lng="14.56016" tm="2025-03-30T18:07:11" events="RZ" rych="13" smer="244" />
21
+
22
+ <V imei="867377023797214" rz="6AJ8958" pkt="4597" lat="50.09357" lng="14.49805" tm="2025-03-30T18:07:15" events="A" rych="15" smer="294" />
23
+
24
+ <V imei="867377023820230" rz="4AV4134" pkt="3974" lat="50.08041" lng="14.48195" tm="2025-03-30T18:07:11" events="L" rych="30" smer="78" />
25
+
26
+ </M>
27
+ ```
28
+ - **imei** - identifikátor palubního počítače/vozidla, u nás `external_trip_id`
29
+ - **rz** - SPZ, nepoužíváme
30
+ - **pkt** - identifikátor zprávy z vozidla/číslo TCP packetu??? Nepoužíváme
31
+ - **lat** - zeměpisná šířka
32
+ - **lng** - zeměpisná délka
33
+ - **tm** - timestamp odeslání právy z vozidla
34
+ - **events** - událost asociovaná se zprávou
35
+ - **R** - výjezd ze zastávky
36
+ - **line** - označení linky podle CIS
37
+ - **conn** - označení spoje podle CIS
38
+ - **rych** - rychlost vozidla
39
+ - **smer** - azimut
40
+ - **evc** - [Evidenční číslo vozidla](https://cs.wikipedia.org/wiki/Eviden%C4%8Dn%C3%AD_%C4%8D%C3%ADslo_vozidla)
41
+ - **turnus** - jiný formát než DPP???, nepoužíváme
42
+ - **ridic** - ??? nepoužíváme
43
+ - **akt** - aktuální zastávka , nepoužíváme
44
+ - **konc** - poslední zastávka, nepoužíváme
@@ -0,0 +1,55 @@
1
+ # HTTP MPVNet state_position
2
+
3
+ - Batch data chodí na VP-IG (vyšší jednotky MB během špičky)
4
+ - Formát vstupních dat viz [input_realtime_data/http_mpvnet.md](../input_realtime_data/http_mpvnet.md)
5
+ - (HTTP) Input Gateway
6
+ - Raw data se uloží na blob storage
7
+ - knihovnou `xml2js` se transformují na JSON
8
+ - validují se vůči JSON schématu a pošlou na Rabbita do fronty `saveDataToDB`
9
+ - saveDataToDB
10
+ - data se napasují na struktury tabulek `vehiclepositions_trips` a `vehiclepositions_positions` (stav je `unknown`, `tracking` se bere ze vstupních dat)
11
+ - všechny spoje se upsertují, nové spoje a jejich pozice se pošlou do fronty `updateGTFSTripId`, existující do `updateDelay`
12
+ - updateGTFSTripId
13
+ - duplikace vlakových spojů a pozic podle block id (určení tracking podle cis stop id)
14
+ - obohacení spojů GTFS daty (včetně oběhu a kmenové linky)
15
+ - upsert asociovaných pozic
16
+ - spoje se pošlou do fronty `updateDelay`
17
+ - updateDelay
18
+ - opět duplikace vlakových spojů, upsert asociovaných pozic
19
+ - opětovné načtení asociovaných pozic z DB
20
+ - určení trasy spoje podle GTFS shapes a stop times
21
+ - processing pozic, uložení do databáze
22
+ - Not tracking (`tracking` je `0` a nebo nepřišly souřadnice)
23
+ - pokud je poslední pozice neznámá, nebo je známá a ve stavu `on_track` nebo `at_stop`, je aktuální stav `before_track`
24
+ - pokud je poslední známá pozice s `tracking 2`
25
+ - pokud je pozice duplicitní (existuje pozice se stejným `origin_timestamp`), stav je `duplicate`
26
+ - jinak je stav `after_track`
27
+ - Tracking (`tracking` je `2`, souřadnice jsou známy)
28
+ - pokud je vozidlo 200 metrů od nejblizšího bodu (anchor points) na trase, stav je `off_track`
29
+ - pokud je nejbližší bod v zastávce, nastaví se stav na `at_stop`
30
+ - jinak je stav `on_track`
31
+ - Zrušený spoj (příznak `canceled` u pozice)
32
+ - stav je vždy `canceled`
33
+ - propagateDelay
34
+ - podle kmenové linky a oběhu vyhledáme navazující spoje
35
+ - podle GTFS trip id a registračního čísla poslední pozici ve stavu `before_track`
36
+ - přepsání stavu na `before_track_delayed`
37
+
38
+ ```mermaid
39
+ flowchart TB;
40
+ A[HTTP data]-->B[VP HTTP Input Gateway]--raw data-->Blob[Azure Blob Storage];
41
+ B--JSON xml2js-->C[AMQP saveDataToDB]--upsert-->trips[(DB trips)];
42
+ C--nové spoje bez GTFS dat-->D[AMQP updateGTFSTripId];
43
+ C--existující spoje-->E[AMQP updateDelay];
44
+ D--upsert-->trips;
45
+ D--upsert-->positions[(DB positions)];
46
+ D--nové spoje s GTFS daty-->E;
47
+ E--upsert-->trips;
48
+ E--upsert-->positions;
49
+ E--select-->trips;
50
+ E--select-->positions;
51
+ E--uložené spoje-->F[AMQP propagateDelay];
52
+ F--select-->trips;
53
+ F--select-->positions;
54
+ F--upsert-->positions;
55
+ ```
@@ -1,19 +1,7 @@
1
- # TCP common state_position
1
+ # TCP DPP common state_position
2
2
 
3
3
  - Data chodí na TCP-IG
4
-
5
- ```xml
6
- <M>
7
- <V turnus="17/3" line="17" evc="9168" np="ano" lat="50.05440" lng="14.41812" akt="03030001" takt="2022-08-02T21:56:22" konc="26200002" tjr="2022-08-02T21:56:00" pkt="1885317" tm="2022-08-02T21:56:22" events="O" />
8
- </M>
9
- ```
10
-
11
- ```xml
12
- <M>
13
- <V turnus="134/3" line="134" evc="3738" np="ano" lat="50.03952" lng="14.42919" akt="07960001" takt="2022-06-29T17:28:13" konc="01100005" tjr="2022-06-29T17:23:00" pkt="12709236" tm="2022-06-29T17:28:22" events="O" />
14
- </M>
15
- ```
16
-
4
+ - Formát vstupních dat viz [input_realtime_data/http_mpvnet.md](../input_realtime_data/tcp_dpp_bus.md) a [input_realtime_data/tcp_dpp_tram.md](../input_realtime_data/tcp_dpp_tram.md)
17
5
  - Transport (TCP) Input Gateway
18
6
  - Raw data se uloží na blob storage (1MB buffer)
19
7
  - knihovnou `xml2js` transformují na JSON
@@ -1,14 +1,7 @@
1
- # TCP metro state_position
1
+ # TCP DPP metro state_position
2
2
 
3
3
  - Data chodí na TCP-IG
4
-
5
- ```xml
6
- <m linka="A" tm="2022-07-20T13:45:34Z" gvd="GD20a">
7
- <vlak csp=" 3" csr=" 3" cv="279" ko="1809" odch="25" />
8
- <!--...-->
9
- </m>
10
- ```
11
-
4
+ - Formát vstupních dat viz [input_realtime_data/tcp_dpp_metro.md](../input_realtime_data/tcp_dpp_metro.md)
12
5
  - Transport (TCP) Input Gateway
13
6
  - Raw data se uloží na blob storage (1MB buffer)
14
7
  - knihovnou `xml2js` transformují na JSON
@@ -0,0 +1,7 @@
1
+ # TCP Telmax Arriva City state_position
2
+
3
+ - Data chodí na TCP-IG
4
+ - Data využíváme pouze na rabínovi, na produkci bereme z MPVNetu
5
+ - Formát vstupních dat viz [input_realtime_data/tcp_telmax_arriva_city.md](../input_realtime_data/tcp_telmax_arriva_city.md)
6
+ - Transport (TCP) Input Gateway
7
+ - TODO doplnit
@@ -0,0 +1,32 @@
1
+ # Mapování MPVNet vehicle type na GTFS
2
+
3
+ ## Typ vozidel podle MPV
4
+ - 0 - neznámý nebo vlak
5
+ - 1 - metro
6
+ - 2 - tramvaj
7
+ - 3 - autobus MHD
8
+ - 4 - příměstský autobus
9
+ - 5 - noční autobus
10
+ - 6 - noční tramvaj
11
+ - 7 - náhradní doprava
12
+ - 8 - lanovka
13
+ - 9 - školní spoj
14
+ - 10 - spoj pro lidi s hendikepem
15
+ - 11 - smluvní spoj
16
+ - 12 - loď
17
+ - 13 - vlak
18
+ - 14 - náhradní autobus za vlak
19
+ - 15 - náhradní tramvaj
20
+ - 16 - noční příměstský autobus
21
+ - 17 - ostatní
22
+ - 18 - trolejbus
23
+
24
+ ## Typ vozidel podle GTFS
25
+ - 0 - tramvaj, podle MPV 2, 6, 15
26
+ - 1 - metro, podle MPV 1
27
+ - 2 - vlak, podle MPV 0 a 13
28
+ - 3 - autobus, podle MPV 3, 4, 5, 7, 16
29
+ - 4 - loď, podle MPV 12
30
+ - 7 - lanovka, podle MPV 8
31
+ - 11 - trolejbus, podle MPV 18
32
+ - 1700 - smíšený nebo neznámý, nemapujeme z MPV
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@golemio/pid",
3
- "version": "3.13.2-dev.1802603210",
3
+ "version": "3.13.2-dev.1803100353",
4
4
  "description": "Golemio PID Module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,113 +0,0 @@
1
- # HTTP state_position
2
-
3
- - Batch data chodí na VP-IG (několik MB)
4
-
5
- ```xml
6
- <?xml version="1.0" encoding="utf-8"?>
7
- <m disp="http://77.93.194.81:8716/api">
8
- <spoj ka="2" kb="0" den="2023-03-21" lin="100115" alias="115" spoj="1061" dopr="ČSAD POLKOST"
9
- doprSkut="ČSAD POLKOST" kmenl="115" t="3" tcis="A" np="true" po="39" vuzevc="1861"
10
- skol="false" posl="false" sled="0" lat="50.0307" lng="14.49185" cpoz="10:00:04" azimut="337"
11
- rychl="26">
12
- <zast stan="B" odj="10:30" zast="56714" asw="520091" zpoz_typ_odj="2" zpoz_odj="0" />
13
- <zast stan="B" odj="10:32" zast="56794" asw="11310002" zpoz_typ_odj="2" zpoz_odj="0" />
14
- <zast stan="A" odj="10:34" zast="59066" asw="13410001" zpoz_typ_odj="2" zpoz_odj="0" />
15
- <zast stan="A" odj="10:36" zast="67975" asw="11320001" zpoz_typ_odj="2" zpoz_odj="0" />
16
- <zast stan="B" odj="10:37" zast="58953" asw="13340002" zpoz_typ_odj="2" zpoz_odj="0" />
17
- <zast stan="A" odj="10:40" zast="58789" asw="1810001" zpoz_typ_odj="2" zpoz_odj="0" />
18
- <zast stan="A" odj="10:41" zast="56794" asw="11310001" />
19
- <zast stan="F" prij="10:43" zast="56714" asw="520002" />
20
- </spoj>
21
- <spoj ka="2" kb="0" den="2023-03-21" lin="100117" alias="117" spoj="1016" dopr="ABOUT ME"
22
- doprSkut="ABOUT ME" kmenl="117" t="3" tcis="A" np="true" po="6" vuzevc="1950" skol="false"
23
- posl="false" sled="0" lat="50.04645" lng="14.46061" cpoz="09:59:56" azimut="165" rychl="0"
24
- zast="57408" asw="500006" zpoz_prij="14">
25
- <zast stan="B" odj="08:55" zast="66826" asw="32360002" zpoz_typ_odj="3" zpoz_odj="35" />
26
- <zast stan="B" odj="08:55" zast="67375" asw="9910002" zpoz_typ_odj="3" zpoz_odj="81" />
27
- <zast stan="C" odj="08:56" zast="55206" asw="2800053" zpoz_typ_odj="3" zpoz_odj="119" />
28
- <zast stan="B" odj="08:58" zast="55181" asw="620002" zpoz_typ_odj="3" zpoz_odj="113" />
29
- <zast stan="H8" odj="08:59" zast="51228" asw="10060052" zpoz_typ_odj="3" zpoz_odj="121" />
30
- <zast stan="A" odj="09:00" zast="67477" asw="26020001" zpoz_typ_odj="3" zpoz_odj="85" />
31
- <zast stan="E" odj="09:02" zast="51227" asw="9290005" zpoz_typ_odj="3" zpoz_odj="68" />
32
- <zast stan="A" odj="09:03" zast="51226" asw="9390001" zpoz_typ_odj="3" zpoz_odj="91" />
33
- <zast stan="A" odj="09:05" zast="55233" asw="11580001" zpoz_typ_odj="3" zpoz_odj="81" />
34
- <zast stan="D" odj="09:07" zast="43729" asw="760051" zpoz_typ_odj="3" zpoz_odj="2" />
35
- <zast stan="A" odj="09:08" zast="55214" asw="170001" zpoz_typ_odj="3" zpoz_odj="31" />
36
- <zast stan="A" odj="09:09" zast="55183" asw="7270001" zpoz_typ_odj="3" zpoz_odj="36" />
37
- <zast stan="A" odj="09:11" zast="55257" asw="7720001" zpoz_typ_odj="3" zpoz_odj="-9" />
38
- <zast stan="A" odj="09:12" zast="55220" asw="9950001" zpoz_typ_odj="3" zpoz_odj="-15" />
39
- <zast stan="B" odj="09:13" zast="55188" asw="9270002" zpoz_typ_odj="3" zpoz_odj="-2" />
40
- <zast stan="B" odj="09:15" zast="58807" asw="6250002" zpoz_typ_odj="3" zpoz_odj="-20" />
41
- <zast stan="B" odj="09:16" zast="58781" asw="4460002" zpoz_typ_odj="3" zpoz_odj="-5" />
42
- <zast stan="B" odj="09:17" zast="58863" asw="6580002" zpoz_typ_odj="3" zpoz_odj="1" />
43
- <zast stan="D" odj="09:18" zast="58863" asw="6580004" zpoz_typ_odj="3" zpoz_odj="-9" />
44
- <zast stan="A" odj="09:19" zast="59095" asw="3280001" zpoz_typ_odj="3" zpoz_odj="-24" />
45
- <zast stan="A" odj="09:20" zast="58972" asw="600001" zpoz_typ_odj="3" zpoz_odj="-8" />
46
- <zast stan="B" odj="09:21" zast="58836" asw="4940002" zpoz_typ_odj="3" zpoz_odj="-11" />
47
- <zast stan="B" odj="09:22" zast="58976" asw="8570002" zpoz_typ_odj="3" zpoz_odj="22" />
48
- <zast stan="D" odj="09:24" zast="58837" asw="4970004" zpoz_typ_odj="3" zpoz_odj="-4" />
49
- <zast stan="A" odj="09:25" zast="58869" asw="7220001" zpoz_typ_odj="3" zpoz_odj="-3" />
50
- <zast stan="B" odj="09:27" zast="47119" asw="8930002" zpoz_typ_odj="3" zpoz_odj="-28" />
51
- <zast stan="H" odj="09:29" zast="27948" asw="4880008" zpoz_typ_odj="3" zpoz_odj="-56" />
52
- <zast stan="A" odj="09:32" zast="57400" asw="4410001" zpoz_typ_odj="3" zpoz_odj="-38" />
53
- <zast stan="B" odj="09:33" zast="57401" asw="10480002" zpoz_typ_odj="3" zpoz_odj="-7" />
54
- <zast stan="B" odj="09:34" zast="59152" asw="9370002" zpoz_typ_odj="3" zpoz_odj="-11" />
55
- <zast stan="B" odj="09:35" zast="59258" asw="9380002" zpoz_typ_odj="3" zpoz_odj="-6" />
56
- <zast stan="B" odj="09:37" zast="58814" asw="3430002" zpoz_typ_odj="3" zpoz_odj="48" />
57
- <zast stan="L" prij="09:39" zast="57408" asw="500006" zpoz_typ_prij="3" zpoz_prij="14" />
58
- </spoj>
59
- <!--...-->
60
- </m>
61
- ```
62
-
63
- - (HTTP) Input Gateway
64
- - Raw data se uloží na blob storage
65
- - knihovnou `xml2js` se transformují na JSON
66
- - validují se vůči JSON schématu a pošlou na Rabbita do fronty `saveDataToDB`
67
- - saveDataToDB
68
- - data se napasují na struktury tabulek `vehiclepositions_trips` a `vehiclepositions_positions` (stav je `unknown`, `tracking` se bere ze vstupních dat)
69
- - všechny spoje se upsertují, nové spoje a jejich pozice se pošlou do fronty `updateGTFSTripId`, existující do `updateDelay`
70
- - updateGTFSTripId
71
- - duplikace vlakových spojů a pozic podle block id (určení tracking podle cis stop id)
72
- - obohacení spojů GTFS daty (včetně oběhu a kmenové linky)
73
- - upsert asociovaných pozic
74
- - spoje se pošlou do fronty `updateDelay`
75
- - updateDelay
76
- - opět duplikace vlakových spojů, upsert asociovaných pozic
77
- - opětovné načtení asociovaných pozic z DB
78
- - určení trasy spoje podle GTFS shapes a stop times
79
- - processing pozic, uložení do databáze
80
- - Not tracking (`tracking` je `0` a nebo nepřišly souřadnice)
81
- - pokud je poslední pozice neznámá, nebo je známá a ve stavu `on_track` nebo `at_stop`, je aktuální stav `before_track`
82
- - pokud je poslední známá pozice s `tracking 2`
83
- - pokud je pozice duplicitní (existuje pozice se stejným `origin_timestamp`), stav je `duplicate`
84
- - jinak je stav `after_track`
85
- - Tracking (`tracking` je `2`, souřadnice jsou známy)
86
- - pokud je vozidlo 200 metrů od nejblizšího bodu (anchor points) na trase, stav je `off_track`
87
- - pokud je nejbližší bod v zastávce, nastaví se stav na `at_stop`
88
- - jinak je stav `on_track`
89
- - Zrušený spoj (příznak `canceled` u pozice)
90
- - stav je vždy `canceled`
91
- - propagateDelay
92
- - podle kmenové linky a oběhu vyhledáme navazující spoje
93
- - podle GTFS trip id a registračního čísla poslední pozici ve stavu `before_track`
94
- - přepsání stavu na `before_track_delayed`
95
-
96
- ```mermaid
97
- flowchart TB;
98
- A[HTTP data]-->B[VP HTTP Input Gateway]--raw data-->Blob[Azure Blob Storage];
99
- B--JSON xml2js-->C[AMQP saveDataToDB]--upsert-->trips[(DB trips)];
100
- C--nové spoje bez GTFS dat-->D[AMQP updateGTFSTripId];
101
- C--existující spoje-->E[AMQP updateDelay];
102
- D--upsert-->trips;
103
- D--upsert-->positions[(DB positions)];
104
- D--nové spoje s GTFS daty-->E;
105
- E--upsert-->trips;
106
- E--upsert-->positions;
107
- E--select-->trips;
108
- E--select-->positions;
109
- E--uložené spoje-->F[AMQP propagateDelay];
110
- F--select-->trips;
111
- F--select-->positions;
112
- F--upsert-->positions;
113
- ```