public-transport / hafas-client Goto Github PK
View Code? Open in Web Editor NEWJavaScript client for HAFAS public transport APIs.
License: ISC License
JavaScript client for HAFAS public transport APIs.
License: ISC License
Although U-Bahn stations in Berlin don't have directly visible track numbers, it would be helpful to get them from the API, in a handful of situations:
For S-Bahn trains, track info is available.
Apple Maps already has information at with stop to enter/exit the train:
I found the following TODO: https://github.com/derhuerst/hafas-client/blob/d72fdc80921ad3d1ec494d676fbbb2c0d879d47d/parse.js#L144
Not sure if this is still an issue, but anyway, here is a list of fields I've identified in a stationBoard response, journey responses are similar
Here is an example journeyList from a stationboard with clarifications, from what I learned:
{
"jid": "1|593|7|80|9112017", < Journey Id, used to retrieve details from vehicle page >
"date": "20171109", < Date of departure >
"prodX": 0, < Line/Service number >
"dirTxt": "Ronse / Renaix", < Headsign of the vehicle / direction text >
"status": "P", < Unknown, always P for stationboards. Maybe for PROGNOSED? >
"isRchbl": true, < Unknown, always true for nmbs >
"isPartCncl": true, < Partially canceled train, means some stops ahead or earlier are canceled >
"isCncl": true, < Completely canceled train, doesn't appear together with isPartCncl >
"stbStop": {
"locX": 0, < Location of this stop >
"idx": 7, < Id of this object? >
"dCncl": true < Departure is canceled >
"dProdX": 0, < Departure Line/Service number >
"dPlatfS": "4", < Scheduled departure platform>
"dPlatfR": "3", < Realtime departure platform in case of platform change>
"dTimeS": "160000", <Scheduled departure time>
"dTimeR": "160000", < Realtime departure date>
"dProgType": "PROGNOSED" <Departure prognose type>
}
}
I came across following ProgType values: Scheduled, Reported, Prognosed, Calculated, Corrected, Partial_Failure_at_arr, Partial_failure_at_dep, canceled.
Partial failure indicates that the arrival or departure is canceled. Reported means the train left or arrived. This doesn't seem to be reliable on all endpoints however.
All values starting with lowercase d affect departures, all values starting with a affect arrivals. It seems they keep compatibility between the journey and stationboard data by using the same formats, which explains why they explicitly define the information as departure information.
R always indicates Realtime data (changes from the original plan), while S indicates a schedule. L at the end always indicates a List.
Our (iRail) implementation of Hafas parsing, in case it helps:
https://github.com/iRail/iRail/blob/master/api/data/NMBS/connections.php
You might know most (or all) of this information already, but I hope it can be a help. Feel free to ask if there are other fields you haven't figured out yet!
to help others get started.
Practically depends on the tests rewrite by @juliuste, as it will be a lot more straightforward afterwards.
An overview over the German ones:
https://github.com/highsource/verbundkarte#karte-der-verkehrs--und-tarifverbünde
arrivalDelay
arrivalPlatform
opt.passedStations
to stopovers
?dep.journeyId
-> dep.journeyPartId
line.class
nearby
: location
obj as single argjourneys
: make default accessibility
null
mic
/mac
#3schildbach/public-transport-enabler@61ed999
This applies to any ver
>= 1.19
. This also applies to the stbFltrEquiv
option.
Could you please include the license?
Even though the underlying HAFAS command is called LocDetails
, the VBB app only calls it for stations. Also, it fails with both POIs and addresses.
Hey Guys,
i´am getting the following error with the InsaProfile:
Failed to load https://reiseauskunft.insa.de/bin/mgate.exe?: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access.
Is there something i can do, to fix this issue?
Greetings Daniel
{
"common": {
"locL": [
{
"lid": "A=4@O=Berlin, Tempelhofer Park Eingang Oderstr.@X=13418720@Y=52476688@U=104@L=900981505@",
"type": "P",
"name": "Berlin, Tempelhofer Park Eingang Oderstr.",
"icoX": 1,
"extId": "900981505",
"state": "F",
"crd": {
"x": 13418720,
"y": 52476688,
"type": "WGS84"
},
"msgL": [
{
"type": "REM",
"remX": 0,
"tagL": [
"RES_LOC"
]
},
{
"type": "REM",
"remX": 1,
"tagL": [
"RES_LOC"
]
},
{
"type": "REM",
"remX": 2,
"tagL": [
"RES_LOC"
]
}
]
},
{
"lid": "A=2@O=12101 Berlin-Tempelhof, Peter-Str.r-Weg 1@l=@X=13384947@Y=52476283@u=0@U=103@L=770013812@",
"type": "A",
"name": "12101 Berlin-Tempelhof, Peter-Str.r-Weg 1",
"icoX": 2,
"extId": "770013812",
"state": "F",
"crd": {
"x": 13384947,
"y": 52476283,
"type": "WGS84"
},
"dist": 0
},
{
"lid": "A=1@O=Sommerbad Neukölln (Berlin)@X=13415951@Y=52480580@U=86@L=900079101@",
"type": "S",
"name": "Sommerbad Neukölln (Berlin)",
"icoX": 3,
"extId": "900079101",
"state": "F",
"crd": {
"x": 13415951,
"y": 52480580,
"type": "WGS84"
},
"pCls": 8,
"msgL": [
{
"type": "REM",
"remX": 3,
"tagL": [
"RES_LOC"
]
}
]
},
{
"lid": "A=1@O=U Platz der Luftbrücke (Berlin)@X=13386349@Y=52484976@U=86@L=900017102@",
"type": "S",
"name": "U Platz der Luftbrücke (Berlin)",
"icoX": 7,
"extId": "900017102",
"state": "F",
"crd": {
"x": 13386349,
"y": 52484976,
"type": "WGS84"
},
"pCls": 10,
"msgL": [
{
"type": "REM",
"remX": 4,
"tagL": [
"RES_LOC"
]
},
{
"type": "REM",
"remX": 3,
"tagL": [
"RES_LOC"
]
}
]
},
{
"lid": "A=1@O=U Paradestr. (Berlin)@X=13386727@Y=52478144@U=86@L=900068101@",
"type": "S",
"name": "U Paradestr. (Berlin)",
"icoX": 7,
"extId": "900068101",
"state": "F",
"crd": {
"x": 13386727,
"y": 52478144,
"type": "WGS84"
},
"pCls": 10,
"msgL": [
{
"type": "REM",
"remX": 6,
"tagL": [
"RES_LOC"
]
},
{
"type": "REM",
"remX": 7,
"tagL": [
"RES_LOC"
]
},
{
"type": "REM",
"remX": 3,
"tagL": [
"RES_LOC"
]
}
]
},
{
"lid": "A=1@O=Friedhöfe Columbiadamm (Berlin)@X=13407906@Y=52482207@U=86@L=900079151@",
"type": "S",
"name": "Friedhöfe Columbiadamm (Berlin)",
"icoX": 3,
"extId": "900079151",
"state": "F",
"crd": {
"x": 13407906,
"y": 52482207,
"type": "WGS84"
},
"pCls": 8,
"msgL": [
{
"type": "REM",
"remX": 3,
"tagL": [
"RES_LOC"
]
}
]
},
{
"lid": "A=1@O=Golßener Str. (Berlin)@X=13400121@Y=52483745@U=86@L=900069151@",
"type": "S",
"name": "Golßener Str. (Berlin)",
"icoX": 3,
"extId": "900069151",
"state": "F",
"crd": {
"x": 13400121,
"y": 52483745,
"type": "WGS84"
},
"pCls": 8,
"msgL": [
{
"type": "REM",
"remX": 3,
"tagL": [
"RES_LOC"
]
}
]
},
{
"lid": "A=1@O=Columbiadamm/Friesenstr. (Berlin)@X=13394476@Y=52484122@U=86@L=900069101@",
"type": "S",
"name": "Columbiadamm/Friesenstr. (Berlin)",
"icoX": 3,
"extId": "900069101",
"state": "F",
"crd": {
"x": 13394476,
"y": 52484122,
"type": "WGS84"
},
"pCls": 8,
"msgL": [
{
"type": "REM",
"remX": 3,
"tagL": [
"RES_LOC"
]
}
]
},
{
"lid": "A=1@O=Columbiadamm/Platz der Luftbrücke (Berlin)@X=13390008@Y=52484356@U=86@L=900017181@",
"type": "S",
"name": "Columbiadamm/Platz der Luftbrücke (Berlin)",
"icoX": 3,
"extId": "900017181",
"state": "F",
"crd": {
"x": 13389028,
"y": 52484518,
"type": "WGS84"
},
"pCls": 8,
"msgL": [
{
"type": "REM",
"remX": 3,
"tagL": [
"RES_LOC"
]
}
]
}
],
"prodL": [
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 0,
"prodCtx": {
"name": "Bus 104 ",
"num": "6679",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 1,
"prodCtx": {
"name": "Bus 104 ",
"num": "6679",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "U6",
"nameS": "U6",
"number": "U6",
"icoX": 8,
"cls": 2,
"oprX": 0,
"prodCtx": {
"name": " U6",
"num": "11544",
"line": "U6",
"matchId": "U6",
"catOut": "U ",
"catOutS": "U",
"catOutL": "U ",
"catIn": "U",
"catCode": "1",
"admin": "BVU---"
}
},
{
"name": "U6",
"nameS": "U6",
"number": "U6",
"icoX": 8,
"cls": 2,
"oprX": 1,
"prodCtx": {
"name": " U6",
"num": "11544",
"line": "U6",
"matchId": "U6",
"catOut": "U ",
"catOutS": "U",
"catOutL": "U ",
"catIn": "U",
"catCode": "1",
"admin": "BVU---"
}
},
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 0,
"prodCtx": {
"name": "Bus 104 ",
"num": "6723",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 1,
"prodCtx": {
"name": "Bus 104 ",
"num": "6723",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "U6",
"nameS": "U6",
"number": "U6",
"icoX": 8,
"cls": 2,
"oprX": 0,
"prodCtx": {
"name": " U6",
"num": "11546",
"line": "U6",
"matchId": "U6",
"catOut": "U ",
"catOutS": "U",
"catOutL": "U ",
"catIn": "U",
"catCode": "1",
"admin": "BVU---"
}
},
{
"name": "U6",
"nameS": "U6",
"number": "U6",
"icoX": 8,
"cls": 2,
"oprX": 1,
"prodCtx": {
"name": " U6",
"num": "11546",
"line": "U6",
"matchId": "U6",
"catOut": "U ",
"catOutS": "U",
"catOutL": "U ",
"catIn": "U",
"catCode": "1",
"admin": "BVU---"
}
},
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 1,
"prodCtx": {
"name": "Bus 104 ",
"num": "6715",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 1,
"prodCtx": {
"name": "Bus 104 ",
"num": "6680",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 1,
"prodCtx": {
"name": "Bus 104 ",
"num": "6728",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 1,
"prodCtx": {
"name": "Bus 104 ",
"num": "6670",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 1,
"prodCtx": {
"name": "Bus 104 ",
"num": "6714",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "U6",
"nameS": "U6",
"number": "U6",
"icoX": 8,
"cls": 2,
"oprX": 0,
"prodCtx": {
"name": " U6",
"num": "11548",
"line": "U6",
"matchId": "U6",
"catOut": "U ",
"catOutS": "U",
"catOutL": "U ",
"catIn": "U",
"catCode": "1",
"admin": "BVU---"
}
},
{
"name": "U6",
"nameS": "U6",
"number": "U6",
"icoX": 8,
"cls": 2,
"oprX": 1,
"prodCtx": {
"name": " U6",
"num": "11548",
"line": "U6",
"matchId": "U6",
"catOut": "U ",
"catOutS": "U",
"catOutL": "U ",
"catIn": "U",
"catCode": "1",
"admin": "BVU---"
}
},
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 0,
"prodCtx": {
"name": "Bus 104 ",
"num": "6715",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 1,
"prodCtx": {
"name": "Bus 104 ",
"num": "6673",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "U6",
"nameS": "U6",
"number": "U6",
"icoX": 8,
"cls": 2,
"oprX": 0,
"prodCtx": {
"name": " U6",
"num": "11550",
"line": "U6",
"matchId": "U6",
"catOut": "U ",
"catOutS": "U",
"catOutL": "U ",
"catIn": "U",
"catCode": "1",
"admin": "BVU---"
}
},
{
"name": "U6",
"nameS": "U6",
"number": "U6",
"icoX": 8,
"cls": 2,
"oprX": 1,
"prodCtx": {
"name": " U6",
"num": "11550",
"line": "U6",
"matchId": "U6",
"catOut": "U ",
"catOutS": "U",
"catOutL": "U ",
"catIn": "U",
"catCode": "1",
"admin": "BVU---"
}
},
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 0,
"prodCtx": {
"name": "Bus 104 ",
"num": "6680",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "104",
"nameS": "104",
"number": "104",
"icoX": 5,
"cls": 8,
"oprX": 1,
"prodCtx": {
"name": "Bus 104 ",
"num": "6717",
"line": "104",
"matchId": "104",
"catOut": "Bus ",
"catOutS": "B",
"catOutL": "Bus ",
"catIn": "B",
"catCode": "3",
"admin": "BVB---"
}
},
{
"name": "U6",
"nameS": "U6",
"number": "U6",
"icoX": 8,
"cls": 2,
"oprX": 0,
"prodCtx": {
"name": " U6",
"num": "11552",
"line": "U6",
"matchId": "U6",
"catOut": "U ",
"catOutS": "U",
"catOutL": "U ",
"catIn": "U",
"catCode": "1",
"admin": "BVU---"
}
},
{
"name": "U6",
"nameS": "U6",
"number": "U6",
"icoX": 8,
"cls": 2,
"oprX": 1,
"prodCtx": {
"name": " U6",
"num": "11552",
"line": "U6",
"matchId": "U6",
"catOut": "U ",
"catOutS": "U",
"catOutL": "U ",
"catIn": "U",
"catCode": "1",
"admin": "BVU---"
}
}
],
"polyL": [],
"layerL": [],
"crdSysL": [],
"opL": [
{
"name": "Berliner Verkehrsbetriebe",
"icoX": 6
},
{
"name": "Berliner Verkehrsbetriebe",
"icoX": 6,
"id": "Berliner Verkehrsbetriebe"
}
],
"remL": [
{
"type": "A",
"code": "B1",
"prio": 300,
"icoX": 0,
"txtN": "$IUR"
},
{
"type": "A",
"code": "B2",
"prio": 300,
"icoX": 0,
"txtN": "$IAD"
},
{
"type": "A",
"code": "P0",
"prio": 920,
"icoX": 0,
"txtN": "P0 (POI-Kategorie Sehenswertes: Sehenswertes, Ausflugsziele)"
},
{
"type": "A",
"code": "IS",
"prio": 999,
"icoX": 0,
"txtN": "Responsible DINO stop"
},
{
"type": "A",
"code": "FT",
"prio": 300,
"icoX": 0,
"txtN": "escalator"
},
{
"type": "A",
"code": "bf",
"prio": 2,
"icoX": 0,
"txtN": "barrier-free"
},
{
"type": "A",
"code": "AT",
"prio": 300,
"icoX": 0,
"txtN": "Aufzug"
},
{
"type": "A",
"code": "BL",
"prio": 300,
"icoX": 0,
"txtN": "Blindenleitstreifen"
},
{
"type": "A",
"code": "FB",
"prio": 350,
"icoX": 0,
"txtN": "Bicycle conveyance"
}
],
"icoL": [
{
"res": "INFO"
},
{
"res": "POI"
},
{
"res": "ADR"
},
{
"res": "B",
"fg": {
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"bg": {
"r": 170,
"g": 85,
"b": 153,
"a": 255
}
},
{
"res": "WALK"
},
{
"res": "B"
},
{
"res": "BVG",
"txt": "Berliner Verkehrsbetriebe"
},
{
"res": "U",
"fg": {
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"bg": {
"r": 0,
"g": 51,
"b": 153,
"a": 255
}
},
{
"res": "U"
}
]
},
"outConL": [
{
"cid": "C-0",
"date": "20181026",
"dur": "002500",
"chg": 1,
"sDays": {
"sDaysR": "not every day",
"sDaysI": "26. Oct until 2. Nov 2018 Mo - Fr",
"sDaysB": "7CF80000000000"
},
"dep": {
"locX": 0,
"dInR": true,
"dTimeS": "173300",
"type": "N"
},
"arr": {
"locX": 1,
"aOutR": true,
"aTimeS": "175800",
"type": "N"
},
"secL": [
{
"type": "WALK",
"icoX": 4,
"dep": {
"locX": 0,
"dInR": true,
"dTimeS": "173300",
"type": "N"
},
"arr": {
"locX": 2,
"aOutR": true,
"aTimeS": "174200",
"type": "N"
},
"gis": {
"dist": 564,
"durS": "000900",
"ctx": "G|1|G@F|A=4@O=Berlin, Tempelhofer Park Eingang Oderstr.@X=13418720@Y=52476688@U=104@L=900981505@|A=1@O=Sommerbad Neukölln (Berlin)@X=13415951@Y=52480580@U=86@L=900079101@|26102018|173300|174200|bf|ft@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§bt@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§tf@$f@$f@$f@$f@$f@$§|"
}
},
{
"type": "JNY",
"icoX": 5,
"dep": {
"locX": 2,
"idx": 17,
"dProdX": 0,
"dInR": true,
"dTimeS": "174200",
"dTimeR": "174000",
"dProgType": "CALCULATED",
"type": "N"
},
"arr": {
"locX": 3,
"idx": 22,
"aOutR": true,
"aTimeS": "174700",
"aTimeR": "174500",
"aProgType": "CALCULATED",
"type": "N"
},
"jny": {
"jid": "1|4885|0|86|26102018",
"prodX": 1,
"dirTxt": "Neu-Westend, Brixplatz",
"status": "P",
"isRchbl": true,
"freq": {
"minC": 9,
"maxC": 10,
"numC": 13
},
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261742$201810261747$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
"minChg": "000300"
},
{
"type": "JNY",
"icoX": 8,
"dep": {
"locX": 3,
"idx": 21,
"dProdX": 2,
"dInR": true,
"dTimeS": "175100",
"dTimeR": "175100",
"dProgType": "CALCULATED",
"type": "N"
},
"arr": {
"locX": 4,
"idx": 22,
"aOutR": true,
"aTimeS": "175200",
"aTimeR": "175200",
"aProgType": "CALCULATED",
"type": "N"
},
"jny": {
"jid": "1|19014|1|86|26102018",
"prodX": 3,
"dirTxt": "U Alt-Mariendorf (Berlin)",
"status": "P",
"isRchbl": true,
"freq": {
"minC": 5,
"maxC": 5,
"numC": 25
},
"ctxRecon": "T$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$201810261751$201810261752$ U6$$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 3,
"tLocX": 4,
"tagL": [
"RES_JNY_DTL_H3"
]
},
{
"type": "REM",
"remX": 8,
"fLocX": 3,
"tLocX": 4,
"tagL": [
"RES_JNY_DTL"
]
}
],
"subscr": "F"
},
"minChg": "000600"
},
{
"type": "WALK",
"icoX": 4,
"dep": {
"locX": 4,
"dInR": true,
"dTimeS": "175200",
"type": "N"
},
"arr": {
"locX": 1,
"aOutR": true,
"aTimeS": "175800",
"type": "N"
},
"gis": {
"dist": 332,
"durS": "000600",
"ctx": "G|1|G@F|A=1@O=U Paradestr. (Berlin)@X=13386727@Y=52478144@U=86@L=900068101@|A=2@O=12101 Berlin-Tempelhof, Peter-Str.r-Weg 1@l=@X=13384947@Y=52476283@u=0@U=103@L=770013812@|26102018|175200|175800|fb|ft@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§bt@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§tf@$f@$f@$f@$f@$f@$§|"
}
}
],
"ctxRecon": "G@F$A=4@O=Berlin, Tempelhofer Park Eingang Oderstr.@X=13418720@Y=52476688@L=900981505@a=128@$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$201810261733$201810261742$$$1$§T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261742$201810261747$Bus 104 $$1$§T$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$201810261751$201810261752$ U6$$1$§G@F$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$A=2@O=12101 Berlin-Tempelhof, Peter-Str.r-Weg 1@X=13384947@Y=52476283@u=0@L=770013812@a=128@$201810261752$201810261758$$$1$",
"freq": {
"minC": 9
},
"conSubscr": "U",
"cksum": "2f57e582_3"
},
{
"cid": "C-1",
"date": "20181026",
"dur": "002500",
"chg": 1,
"sDays": {
"sDaysR": "not every day",
"sDaysI": "26. Oct until 2. Nov 2018 Mo - Fr",
"sDaysB": "7CF80000000000"
},
"dep": {
"locX": 0,
"dInR": true,
"dTimeS": "174300",
"type": "N"
},
"arr": {
"locX": 1,
"aOutR": true,
"aTimeS": "180800",
"type": "N"
},
"secL": [
{
"type": "WALK",
"icoX": 4,
"dep": {
"locX": 0,
"dInR": true,
"dTimeS": "174300",
"type": "N"
},
"arr": {
"locX": 2,
"aOutR": true,
"aTimeS": "175200",
"type": "N"
},
"gis": {
"dist": 564,
"durS": "000900",
"ctx": "G|1|G@F|A=4@O=Berlin, Tempelhofer Park Eingang Oderstr.@X=13418720@Y=52476688@U=104@L=900981505@|A=1@O=Sommerbad Neukölln (Berlin)@X=13415951@Y=52480580@U=86@L=900079101@|26102018|174300|175200|bf|ft@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§bt@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§tf@$f@$f@$f@$f@$f@$§|"
}
},
{
"type": "JNY",
"icoX": 5,
"dep": {
"locX": 2,
"idx": 13,
"dProdX": 4,
"dInR": true,
"dTimeS": "175200",
"dTimeR": "174600",
"dProgType": "CALCULATED",
"type": "N"
},
"arr": {
"locX": 3,
"idx": 18,
"aOutR": true,
"aTimeS": "175700",
"aTimeR": "175100",
"aProgType": "CALCULATED",
"type": "N"
},
"jny": {
"jid": "1|4925|7|86|26102018",
"prodX": 5,
"dirTxt": "U Berliner Str.",
"status": "P",
"isRchbl": true,
"freq": {
"minC": 9,
"maxC": 10,
"numC": 13
},
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261752$201810261757$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
"minChg": "000300"
},
{
"type": "JNY",
"icoX": 8,
"dep": {
"locX": 3,
"idx": 21,
"dProdX": 6,
"dInR": true,
"dTimeS": "180100",
"dTimeR": "180100",
"dProgType": "CALCULATED",
"type": "N"
},
"arr": {
"locX": 4,
"idx": 22,
"aOutR": true,
"aTimeS": "180200",
"aTimeR": "180200",
"aProgType": "CALCULATED",
"type": "N"
},
"jny": {
"jid": "1|19012|8|86|26102018",
"prodX": 7,
"dirTxt": "U Alt-Mariendorf (Berlin)",
"status": "P",
"isRchbl": true,
"freq": {
"minC": 5,
"maxC": 5,
"numC": 25
},
"ctxRecon": "T$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$201810261801$201810261802$ U6$$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 3,
"tLocX": 4,
"tagL": [
"RES_JNY_DTL_H3"
]
},
{
"type": "REM",
"remX": 8,
"fLocX": 3,
"tLocX": 4,
"tagL": [
"RES_JNY_DTL"
]
}
],
"subscr": "F"
},
"minChg": "000600"
},
{
"type": "WALK",
"icoX": 4,
"dep": {
"locX": 4,
"dInR": true,
"dTimeS": "180200",
"type": "N"
},
"arr": {
"locX": 1,
"aOutR": true,
"aTimeS": "180800",
"type": "N"
},
"gis": {
"dist": 332,
"durS": "000600",
"ctx": "G|1|G@F|A=1@O=U Paradestr. (Berlin)@X=13386727@Y=52478144@U=86@L=900068101@|A=2@O=12101 Berlin-Tempelhof, Peter-Str.r-Weg 1@l=@X=13384947@Y=52476283@u=0@U=103@L=770013812@|26102018|180200|180800|fb|ft@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§bt@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§tf@$f@$f@$f@$f@$f@$§|"
}
}
],
"ctxRecon": "G@F$A=4@O=Berlin, Tempelhofer Park Eingang Oderstr.@X=13418720@Y=52476688@L=900981505@a=128@$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$201810261743$201810261752$$$1$§T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261752$201810261757$Bus 104 $$1$§T$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$201810261801$201810261802$ U6$$1$§G@F$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$A=2@O=12101 Berlin-Tempelhof, Peter-Str.r-Weg 1@X=13384947@Y=52476283@u=0@L=770013812@a=128@$201810261802$201810261808$$$1$",
"freq": {
"minC": 9
},
"conSubscr": "U",
"cksum": "79894c31_3"
},
{
"cid": "C-2",
"date": "20181026",
"dur": "002500",
"chg": 1,
"sDays": {
"sDaysR": "not every day",
"sDaysI": "26. Oct until 2. Nov 2018 Mo - Fr",
"sDaysB": "7CF80000000000"
},
"dep": {
"locX": 0,
"dInR": true,
"dTimeS": "175300",
"type": "N"
},
"arr": {
"locX": 1,
"aOutR": true,
"aTimeS": "181800",
"type": "N"
},
"secL": [
{
"type": "WALK",
"icoX": 4,
"dep": {
"locX": 0,
"dInR": true,
"dTimeS": "175300",
"type": "N"
},
"arr": {
"locX": 2,
"aOutR": true,
"aTimeS": "180200",
"type": "N"
},
"gis": {
"dist": 564,
"durS": "000900",
"ctx": "G|1|G@F|A=4@O=Berlin, Tempelhofer Park Eingang Oderstr.@X=13418720@Y=52476688@U=104@L=900981505@|A=1@O=Sommerbad Neukölln (Berlin)@X=13415951@Y=52480580@U=86@L=900079101@|26102018|175300|180200|bf|ft@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§bt@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§tf@$f@$f@$f@$f@$f@$§|"
}
},
{
"type": "JNY",
"icoX": 5,
"dep": {
"locX": 2,
"idx": 17,
"dProdX": 0,
"dInR": true,
"dTimeS": "180200",
"dTimeR": "180200",
"dProgType": "CALCULATED",
"type": "N"
},
"arr": {
"locX": 3,
"idx": 22,
"aOutR": true,
"aTimeS": "180700",
"aTimeR": "180700",
"aProgType": "CALCULATED",
"type": "N"
},
"jny": {
"jid": "1|4885|1|86|26102018",
"prodX": 1,
"dirTxt": "Neu-Westend, Brixplatz",
"status": "P",
"isRchbl": true,
"freq": {
"minC": 9,
"maxC": 17,
"numC": 13,
"jnyL": [
{
"jid": "1|4918|0|86|26102018",
"prodX": 8,
"dirTxt": "U Berliner Str.",
"stopL": [
{
"locX": 2,
"idx": 13,
"dProdX": 8,
"dTimeS": "181100",
"dDirTxt": "U Berliner Str.",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 14,
"aProdX": 8,
"aTimeS": "181200",
"dProdX": 8,
"type": "N"
},
{
"locX": 6,
"idx": 15,
"aProdX": 8,
"aTimeS": "181300",
"dProdX": 8,
"type": "N"
},
{
"locX": 7,
"idx": 16,
"aProdX": 8,
"aTimeS": "181400",
"dProdX": 8,
"type": "N"
},
{
"locX": 8,
"idx": 17,
"aProdX": 8,
"aTimeS": "181500",
"dProdX": 8,
"type": "N"
},
{
"locX": 3,
"idx": 18,
"aProdX": 8,
"aTimeS": "181600",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261811$201810261816$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
{
"jid": "1|4886|0|86|26102018",
"prodX": 9,
"dirTxt": "Neu-Westend, Brixplatz",
"stopL": [
{
"locX": 2,
"idx": 17,
"dProdX": 9,
"dTimeS": "182000",
"dDirTxt": "Neu-Westend, Brixplatz",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 18,
"aProdX": 9,
"aTimeS": "182100",
"dProdX": 9,
"type": "N"
},
{
"locX": 6,
"idx": 19,
"aProdX": 9,
"aTimeS": "182200",
"dProdX": 9,
"type": "N"
},
{
"locX": 7,
"idx": 20,
"aProdX": 9,
"aTimeS": "182300",
"dProdX": 9,
"type": "N"
},
{
"locX": 8,
"idx": 21,
"aProdX": 9,
"aTimeS": "182400",
"dProdX": 9,
"type": "N"
},
{
"locX": 3,
"idx": 22,
"aProdX": 9,
"aTimeS": "182500",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261820$201810261825$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
{
"jid": "1|4930|0|86|26102018",
"prodX": 10,
"dirTxt": "U Berliner Str.",
"stopL": [
{
"locX": 2,
"idx": 13,
"dProdX": 10,
"dTimeS": "183000",
"dDirTxt": "U Berliner Str.",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 14,
"aProdX": 10,
"aTimeS": "183100",
"dProdX": 10,
"type": "N"
},
{
"locX": 6,
"idx": 15,
"aProdX": 10,
"aTimeS": "183200",
"dProdX": 10,
"type": "N"
},
{
"locX": 7,
"idx": 16,
"aProdX": 10,
"aTimeS": "183300",
"dProdX": 10,
"type": "N"
},
{
"locX": 8,
"idx": 17,
"aProdX": 10,
"aTimeS": "183400",
"dProdX": 10,
"type": "N"
},
{
"locX": 3,
"idx": 18,
"aProdX": 10,
"aTimeS": "183500",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261830$201810261835$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
{
"jid": "1|4876|0|86|26102018",
"prodX": 11,
"dirTxt": "Neu-Westend, Brixplatz",
"stopL": [
{
"locX": 2,
"idx": 17,
"dProdX": 11,
"dTimeS": "184000",
"dDirTxt": "Neu-Westend, Brixplatz",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 18,
"aProdX": 11,
"aTimeS": "184100",
"dProdX": 11,
"type": "N"
},
{
"locX": 6,
"idx": 19,
"aProdX": 11,
"aTimeS": "184200",
"dProdX": 11,
"type": "N"
},
{
"locX": 7,
"idx": 20,
"aProdX": 11,
"aTimeS": "184300",
"dProdX": 11,
"type": "N"
},
{
"locX": 8,
"idx": 21,
"aProdX": 11,
"aTimeS": "184400",
"dProdX": 11,
"type": "N"
},
{
"locX": 3,
"idx": 22,
"aProdX": 11,
"aTimeS": "184500",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261840$201810261845$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
{
"jid": "1|4917|0|86|26102018",
"prodX": 12,
"dirTxt": "U Berliner Str.",
"stopL": [
{
"locX": 2,
"idx": 13,
"dProdX": 12,
"dTimeS": "185000",
"dDirTxt": "U Berliner Str.",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 14,
"aProdX": 12,
"aTimeS": "185100",
"dProdX": 12,
"type": "N"
},
{
"locX": 6,
"idx": 15,
"aProdX": 12,
"aTimeS": "185200",
"dProdX": 12,
"type": "N"
},
{
"locX": 7,
"idx": 16,
"aProdX": 12,
"aTimeS": "185300",
"dProdX": 12,
"type": "N"
},
{
"locX": 8,
"idx": 17,
"aProdX": 12,
"aTimeS": "185400",
"dProdX": 12,
"type": "N"
},
{
"locX": 3,
"idx": 18,
"aProdX": 12,
"aTimeS": "185500",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261850$201810261855$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
}
]
},
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261802$201810261807$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
"minChg": "000300"
},
{
"type": "JNY",
"icoX": 8,
"dep": {
"locX": 3,
"idx": 21,
"dProdX": 13,
"dInR": true,
"dTimeS": "181100",
"dTimeR": "181100",
"dProgType": "CALCULATED",
"type": "N"
},
"arr": {
"locX": 4,
"idx": 22,
"aProdX": 13,
"aOutR": true,
"aTimeS": "181200",
"aTimeR": "181200",
"aProgType": "CALCULATED",
"type": "N"
},
"jny": {
"jid": "1|19015|0|86|26102018",
"prodX": 14,
"dirTxt": "U Alt-Mariendorf (Berlin)",
"status": "P",
"isRchbl": true,
"freq": {
"minC": 5,
"maxC": 5,
"numC": 25
},
"ctxRecon": "T$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$201810261811$201810261812$ U6$$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 3,
"tLocX": 4,
"tagL": [
"RES_JNY_DTL_H3"
]
},
{
"type": "REM",
"remX": 8,
"fLocX": 3,
"tLocX": 4,
"tagL": [
"RES_JNY_DTL"
]
}
],
"subscr": "F"
},
"minChg": "000600"
},
{
"type": "WALK",
"icoX": 4,
"dep": {
"locX": 4,
"dInR": true,
"dTimeS": "181200",
"type": "N"
},
"arr": {
"locX": 1,
"aOutR": true,
"aTimeS": "181800",
"type": "N"
},
"gis": {
"dist": 332,
"durS": "000600",
"ctx": "G|1|G@F|A=1@O=U Paradestr. (Berlin)@X=13386727@Y=52478144@U=86@L=900068101@|A=2@O=12101 Berlin-Tempelhof, Peter-Str.r-Weg 1@l=@X=13384947@Y=52476283@u=0@U=103@L=770013812@|26102018|181200|181800|fb|ft@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§bt@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§tf@$f@$f@$f@$f@$f@$§|"
}
}
],
"ctxRecon": "G@F$A=4@O=Berlin, Tempelhofer Park Eingang Oderstr.@X=13418720@Y=52476688@L=900981505@a=128@$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$201810261753$201810261802$$$1$§T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261802$201810261807$Bus 104 $$1$§T$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$201810261811$201810261812$ U6$$1$§G@F$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$A=2@O=12101 Berlin-Tempelhof, Peter-Str.r-Weg 1@X=13384947@Y=52476283@u=0@L=770013812@a=128@$201810261812$201810261818$$$1$",
"freq": {
"minC": 9
},
"conSubscr": "U",
"cksum": "69738f03_3"
},
{
"cid": "C-3",
"date": "20181026",
"dur": "002600",
"chg": 1,
"sDays": {
"sDaysR": "not every day",
"sDaysI": "26. Oct until 2. Nov 2018 Mo - Fr",
"sDaysB": "7CF80000000000"
},
"dep": {
"locX": 0,
"dInR": true,
"dTimeS": "180200",
"type": "N"
},
"arr": {
"locX": 1,
"aOutR": true,
"aTimeS": "182800",
"type": "N"
},
"secL": [
{
"type": "WALK",
"icoX": 4,
"dep": {
"locX": 0,
"dInR": true,
"dTimeS": "180200",
"type": "N"
},
"arr": {
"locX": 2,
"aOutR": true,
"aTimeS": "181100",
"type": "N"
},
"gis": {
"dist": 564,
"durS": "000900",
"ctx": "G|1|G@F|A=4@O=Berlin, Tempelhofer Park Eingang Oderstr.@X=13418720@Y=52476688@U=104@L=900981505@|A=1@O=Sommerbad Neukölln (Berlin)@X=13415951@Y=52480580@U=86@L=900079101@|26102018|180200|181100|bf|ft@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§bt@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§tf@$f@$f@$f@$f@$f@$§|"
}
},
{
"type": "JNY",
"icoX": 5,
"dep": {
"locX": 2,
"idx": 13,
"dProdX": 15,
"dInR": true,
"dTimeS": "181100",
"dTimeR": "181100",
"dProgType": "CALCULATED",
"type": "N"
},
"arr": {
"locX": 3,
"idx": 18,
"aProdX": 15,
"aOutR": true,
"aTimeS": "181600",
"aTimeR": "181600",
"aProgType": "CALCULATED",
"type": "N"
},
"jny": {
"jid": "1|4918|0|86|26102018",
"prodX": 8,
"dirTxt": "U Berliner Str.",
"status": "P",
"isRchbl": true,
"freq": {
"minC": 9,
"maxC": 17,
"numC": 12,
"jnyL": [
{
"jid": "1|4886|0|86|26102018",
"prodX": 9,
"dirTxt": "Neu-Westend, Brixplatz",
"stopL": [
{
"locX": 2,
"idx": 17,
"dProdX": 9,
"dTimeS": "182000",
"dDirTxt": "Neu-Westend, Brixplatz",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 18,
"aProdX": 9,
"aTimeS": "182100",
"dProdX": 9,
"type": "N"
},
{
"locX": 6,
"idx": 19,
"aProdX": 9,
"aTimeS": "182200",
"dProdX": 9,
"type": "N"
},
{
"locX": 7,
"idx": 20,
"aProdX": 9,
"aTimeS": "182300",
"dProdX": 9,
"type": "N"
},
{
"locX": 8,
"idx": 21,
"aProdX": 9,
"aTimeS": "182400",
"dProdX": 9,
"type": "N"
},
{
"locX": 3,
"idx": 22,
"aProdX": 9,
"aTimeS": "182500",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261820$201810261825$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
{
"jid": "1|4930|0|86|26102018",
"prodX": 10,
"dirTxt": "U Berliner Str.",
"stopL": [
{
"locX": 2,
"idx": 13,
"dProdX": 10,
"dTimeS": "183000",
"dDirTxt": "U Berliner Str.",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 14,
"aProdX": 10,
"aTimeS": "183100",
"dProdX": 10,
"type": "N"
},
{
"locX": 6,
"idx": 15,
"aProdX": 10,
"aTimeS": "183200",
"dProdX": 10,
"type": "N"
},
{
"locX": 7,
"idx": 16,
"aProdX": 10,
"aTimeS": "183300",
"dProdX": 10,
"type": "N"
},
{
"locX": 8,
"idx": 17,
"aProdX": 10,
"aTimeS": "183400",
"dProdX": 10,
"type": "N"
},
{
"locX": 3,
"idx": 18,
"aProdX": 10,
"aTimeS": "183500",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261830$201810261835$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
{
"jid": "1|4876|0|86|26102018",
"prodX": 11,
"dirTxt": "Neu-Westend, Brixplatz",
"stopL": [
{
"locX": 2,
"idx": 17,
"dProdX": 11,
"dTimeS": "184000",
"dDirTxt": "Neu-Westend, Brixplatz",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 18,
"aProdX": 11,
"aTimeS": "184100",
"dProdX": 11,
"type": "N"
},
{
"locX": 6,
"idx": 19,
"aProdX": 11,
"aTimeS": "184200",
"dProdX": 11,
"type": "N"
},
{
"locX": 7,
"idx": 20,
"aProdX": 11,
"aTimeS": "184300",
"dProdX": 11,
"type": "N"
},
{
"locX": 8,
"idx": 21,
"aProdX": 11,
"aTimeS": "184400",
"dProdX": 11,
"type": "N"
},
{
"locX": 3,
"idx": 22,
"aProdX": 11,
"aTimeS": "184500",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261840$201810261845$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
{
"jid": "1|4917|0|86|26102018",
"prodX": 12,
"dirTxt": "U Berliner Str.",
"stopL": [
{
"locX": 2,
"idx": 13,
"dProdX": 12,
"dTimeS": "185000",
"dDirTxt": "U Berliner Str.",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 14,
"aProdX": 12,
"aTimeS": "185100",
"dProdX": 12,
"type": "N"
},
{
"locX": 6,
"idx": 15,
"aProdX": 12,
"aTimeS": "185200",
"dProdX": 12,
"type": "N"
},
{
"locX": 7,
"idx": 16,
"aProdX": 12,
"aTimeS": "185300",
"dProdX": 12,
"type": "N"
},
{
"locX": 8,
"idx": 17,
"aProdX": 12,
"aTimeS": "185400",
"dProdX": 12,
"type": "N"
},
{
"locX": 3,
"idx": 18,
"aProdX": 12,
"aTimeS": "185500",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261850$201810261855$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
{
"jid": "1|4879|0|86|26102018",
"prodX": 16,
"dirTxt": "Neu-Westend, Brixplatz",
"stopL": [
{
"locX": 2,
"idx": 17,
"dProdX": 16,
"dTimeS": "190000",
"dDirTxt": "Neu-Westend, Brixplatz",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 18,
"aProdX": 16,
"aTimeS": "190200",
"dProdX": 16,
"type": "N"
},
{
"locX": 6,
"idx": 19,
"aProdX": 16,
"aTimeS": "190300",
"dProdX": 16,
"type": "N"
},
{
"locX": 7,
"idx": 20,
"aProdX": 16,
"aTimeS": "190400",
"dProdX": 16,
"type": "N"
},
{
"locX": 8,
"idx": 21,
"aProdX": 16,
"aTimeS": "190500",
"dProdX": 16,
"type": "N"
},
{
"locX": 3,
"idx": 22,
"aProdX": 16,
"aTimeS": "190600",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261900$201810261906$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
}
]
},
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261811$201810261816$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
"minChg": "000300"
},
{
"type": "JNY",
"icoX": 8,
"dep": {
"locX": 3,
"idx": 21,
"dProdX": 17,
"dInR": true,
"dTimeS": "182100",
"dTimeR": "182100",
"dProgType": "CALCULATED",
"type": "N"
},
"arr": {
"locX": 4,
"idx": 22,
"aProdX": 17,
"aOutR": true,
"aTimeS": "182200",
"aTimeR": "182200",
"aProgType": "CALCULATED",
"type": "N"
},
"jny": {
"jid": "1|19014|2|86|26102018",
"prodX": 18,
"dirTxt": "U Alt-Mariendorf (Berlin)",
"status": "P",
"isRchbl": true,
"freq": {
"minC": 5,
"maxC": 5,
"numC": 25
},
"ctxRecon": "T$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$201810261821$201810261822$ U6$$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 3,
"tLocX": 4,
"tagL": [
"RES_JNY_DTL_H3"
]
},
{
"type": "REM",
"remX": 8,
"fLocX": 3,
"tLocX": 4,
"tagL": [
"RES_JNY_DTL"
]
}
],
"subscr": "F"
},
"minChg": "000600"
},
{
"type": "WALK",
"icoX": 4,
"dep": {
"locX": 4,
"dInR": true,
"dTimeS": "182200",
"type": "N"
},
"arr": {
"locX": 1,
"aOutR": true,
"aTimeS": "182800",
"type": "N"
},
"gis": {
"dist": 332,
"durS": "000600",
"ctx": "G|1|G@F|A=1@O=U Paradestr. (Berlin)@X=13386727@Y=52478144@U=86@L=900068101@|A=2@O=12101 Berlin-Tempelhof, Peter-Str.r-Weg 1@l=@X=13384947@Y=52476283@u=0@U=103@L=770013812@|26102018|182200|182800|fb|ft@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§bt@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§tf@$f@$f@$f@$f@$f@$§|"
}
}
],
"ctxRecon": "G@F$A=4@O=Berlin, Tempelhofer Park Eingang Oderstr.@X=13418720@Y=52476688@L=900981505@a=128@$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$201810261802$201810261811$$$1$§T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261811$201810261816$Bus 104 $$1$§T$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$201810261821$201810261822$ U6$$1$§G@F$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$A=2@O=12101 Berlin-Tempelhof, Peter-Str.r-Weg 1@X=13384947@Y=52476283@u=0@L=770013812@a=128@$201810261822$201810261828$$$1$",
"freq": {
"minC": 9
},
"conSubscr": "U",
"cksum": "b8a2c722_3"
},
{
"cid": "C-4",
"date": "20181026",
"dur": "002700",
"chg": 1,
"sDays": {
"sDaysR": "Mo - Fr",
"sDaysB": "7CF9F3E7CF9F00"
},
"dep": {
"locX": 0,
"dInR": true,
"dTimeS": "181100",
"type": "N"
},
"arr": {
"locX": 1,
"aOutR": true,
"aTimeS": "183800",
"type": "N"
},
"secL": [
{
"type": "WALK",
"icoX": 4,
"dep": {
"locX": 0,
"dInR": true,
"dTimeS": "181100",
"type": "N"
},
"arr": {
"locX": 2,
"aOutR": true,
"aTimeS": "182000",
"type": "N"
},
"gis": {
"dist": 564,
"durS": "000900",
"ctx": "G|1|G@F|A=4@O=Berlin, Tempelhofer Park Eingang Oderstr.@X=13418720@Y=52476688@U=104@L=900981505@|A=1@O=Sommerbad Neukölln (Berlin)@X=13415951@Y=52480580@U=86@L=900079101@|26102018|181100|182000|bf|ft@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§bt@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§tf@$f@$f@$f@$f@$f@$§|"
}
},
{
"type": "JNY",
"icoX": 5,
"dep": {
"locX": 2,
"idx": 17,
"dProdX": 19,
"dInR": true,
"dTimeS": "182000",
"dTimeR": "182000",
"dProgType": "CALCULATED",
"type": "N"
},
"arr": {
"locX": 3,
"idx": 22,
"aProdX": 19,
"aOutR": true,
"aTimeS": "182500",
"aTimeR": "182500",
"aProgType": "CALCULATED",
"type": "N"
},
"jny": {
"jid": "1|4886|0|86|26102018",
"prodX": 9,
"dirTxt": "Neu-Westend, Brixplatz",
"status": "P",
"isRchbl": true,
"freq": {
"minC": 9,
"maxC": 17,
"numC": 12,
"jnyL": [
{
"jid": "1|4930|0|86|26102018",
"prodX": 10,
"dirTxt": "U Berliner Str.",
"stopL": [
{
"locX": 2,
"idx": 13,
"dProdX": 10,
"dTimeS": "183000",
"dDirTxt": "U Berliner Str.",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 14,
"aProdX": 10,
"aTimeS": "183100",
"dProdX": 10,
"type": "N"
},
{
"locX": 6,
"idx": 15,
"aProdX": 10,
"aTimeS": "183200",
"dProdX": 10,
"type": "N"
},
{
"locX": 7,
"idx": 16,
"aProdX": 10,
"aTimeS": "183300",
"dProdX": 10,
"type": "N"
},
{
"locX": 8,
"idx": 17,
"aProdX": 10,
"aTimeS": "183400",
"dProdX": 10,
"type": "N"
},
{
"locX": 3,
"idx": 18,
"aProdX": 10,
"aTimeS": "183500",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261830$201810261835$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
{
"jid": "1|4876|0|86|26102018",
"prodX": 11,
"dirTxt": "Neu-Westend, Brixplatz",
"stopL": [
{
"locX": 2,
"idx": 17,
"dProdX": 11,
"dTimeS": "184000",
"dDirTxt": "Neu-Westend, Brixplatz",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 18,
"aProdX": 11,
"aTimeS": "184100",
"dProdX": 11,
"type": "N"
},
{
"locX": 6,
"idx": 19,
"aProdX": 11,
"aTimeS": "184200",
"dProdX": 11,
"type": "N"
},
{
"locX": 7,
"idx": 20,
"aProdX": 11,
"aTimeS": "184300",
"dProdX": 11,
"type": "N"
},
{
"locX": 8,
"idx": 21,
"aProdX": 11,
"aTimeS": "184400",
"dProdX": 11,
"type": "N"
},
{
"locX": 3,
"idx": 22,
"aProdX": 11,
"aTimeS": "184500",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261840$201810261845$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
{
"jid": "1|4917|0|86|26102018",
"prodX": 12,
"dirTxt": "U Berliner Str.",
"stopL": [
{
"locX": 2,
"idx": 13,
"dProdX": 12,
"dTimeS": "185000",
"dDirTxt": "U Berliner Str.",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 14,
"aProdX": 12,
"aTimeS": "185100",
"dProdX": 12,
"type": "N"
},
{
"locX": 6,
"idx": 15,
"aProdX": 12,
"aTimeS": "185200",
"dProdX": 12,
"type": "N"
},
{
"locX": 7,
"idx": 16,
"aProdX": 12,
"aTimeS": "185300",
"dProdX": 12,
"type": "N"
},
{
"locX": 8,
"idx": 17,
"aProdX": 12,
"aTimeS": "185400",
"dProdX": 12,
"type": "N"
},
{
"locX": 3,
"idx": 18,
"aProdX": 12,
"aTimeS": "185500",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261850$201810261855$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
{
"jid": "1|4879|0|86|26102018",
"prodX": 16,
"dirTxt": "Neu-Westend, Brixplatz",
"stopL": [
{
"locX": 2,
"idx": 17,
"dProdX": 16,
"dTimeS": "190000",
"dDirTxt": "Neu-Westend, Brixplatz",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 18,
"aProdX": 16,
"aTimeS": "190200",
"dProdX": 16,
"type": "N"
},
{
"locX": 6,
"idx": 19,
"aProdX": 16,
"aTimeS": "190300",
"dProdX": 16,
"type": "N"
},
{
"locX": 7,
"idx": 20,
"aProdX": 16,
"aTimeS": "190400",
"dProdX": 16,
"type": "N"
},
{
"locX": 8,
"idx": 21,
"aProdX": 16,
"aTimeS": "190500",
"dProdX": 16,
"type": "N"
},
{
"locX": 3,
"idx": 22,
"aProdX": 16,
"aTimeS": "190600",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261900$201810261906$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
{
"jid": "1|4920|0|86|26102018",
"prodX": 20,
"dirTxt": "U Berliner Str.",
"stopL": [
{
"locX": 2,
"idx": 13,
"dProdX": 20,
"dTimeS": "190900",
"dDirTxt": "U Berliner Str.",
"dDirFlg": "2",
"type": "N"
},
{
"locX": 5,
"idx": 14,
"aProdX": 20,
"aTimeS": "191100",
"dProdX": 20,
"type": "N"
},
{
"locX": 6,
"idx": 15,
"aProdX": 20,
"aTimeS": "191200",
"dProdX": 20,
"type": "N"
},
{
"locX": 7,
"idx": 16,
"aProdX": 20,
"aTimeS": "191300",
"dProdX": 20,
"type": "N"
},
{
"locX": 8,
"idx": 17,
"aProdX": 20,
"aTimeS": "191400",
"dProdX": 20,
"type": "N"
},
{
"locX": 3,
"idx": 18,
"aProdX": 20,
"aTimeS": "191500",
"type": "N"
}
],
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261909$201810261915$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
}
]
},
"ctxRecon": "T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261820$201810261825$Bus 104 $$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 2,
"tLocX": 3,
"tagL": [
"RES_JNY_DTL_H3"
]
}
],
"subscr": "F"
},
"minChg": "000300"
},
{
"type": "JNY",
"icoX": 8,
"dep": {
"locX": 3,
"idx": 21,
"dProdX": 21,
"dInR": true,
"dTimeS": "183100",
"dProgType": "PROGNOSED",
"type": "N"
},
"arr": {
"locX": 4,
"idx": 22,
"aProdX": 21,
"aOutR": true,
"aTimeS": "183200",
"aProgType": "PROGNOSED",
"type": "N"
},
"jny": {
"jid": "1|19013|2|86|26102018",
"prodX": 22,
"dirTxt": "U Alt-Mariendorf (Berlin)",
"status": "P",
"isRchbl": true,
"freq": {
"minC": 5,
"maxC": 5,
"numC": 25
},
"ctxRecon": "T$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$201810261831$201810261832$ U6$$1$",
"msgL": [
{
"type": "REM",
"remX": 5,
"fLocX": 3,
"tLocX": 4,
"tagL": [
"RES_JNY_DTL_H3"
]
},
{
"type": "REM",
"remX": 8,
"fLocX": 3,
"tLocX": 4,
"tagL": [
"RES_JNY_DTL"
]
}
],
"subscr": "F"
},
"minChg": "000600"
},
{
"type": "WALK",
"icoX": 4,
"dep": {
"locX": 4,
"dInR": true,
"dTimeS": "183200",
"type": "N"
},
"arr": {
"locX": 1,
"aOutR": true,
"aTimeS": "183800",
"type": "N"
},
"gis": {
"dist": 332,
"durS": "000600",
"ctx": "G|1|G@F|A=1@O=U Paradestr. (Berlin)@X=13386727@Y=52478144@U=86@L=900068101@|A=2@O=12101 Berlin-Tempelhof, Peter-Str.r-Weg 1@l=@X=13384947@Y=52476283@u=0@U=103@L=770013812@|26102018|183200|183800|fb|ft@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§bt@0@2000@120@-1@100@1@1000@0@@@@@false@0@-1@$f@$f@$f@$f@$f@$§tf@$f@$f@$f@$f@$f@$§|"
}
}
],
"ctxRecon": "G@F$A=4@O=Berlin, Tempelhofer Park Eingang Oderstr.@X=13418720@Y=52476688@L=900981505@a=128@$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$201810261811$201810261820$$$1$§T$A=1@O=Sommerbad Neukölln (Berlin)@L=900079101@a=128@$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$201810261820$201810261825$Bus 104 $$1$§T$A=1@O=U Platz der Luftbrücke (Berlin)@L=900017102@a=128@$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$201810261831$201810261832$ U6$$1$§G@F$A=1@O=U Paradestr. (Berlin)@L=900068101@a=128@$A=2@O=12101 Berlin-Tempelhof, Peter-Str.r-Weg 1@X=13384947@Y=52476283@u=0@L=770013812@a=128@$201810261832$201810261838$$$1$",
"freq": {
"minC": 9
},
"conSubscr": "U",
"cksum": "5d2ae5d2_3"
}
],
"outCtxScrB": "1|OB|MT#11#11133#11133#11158#11158#0#0#165#11124#1#-2147483642#0#1#2|PDH#3620a3acc83164b920b7eb39359edd0d|RD#26102018|RT#172425",
"outCtxScrF": "1|OF|MT#11#11171#11171#11198#11198#0#0#165#11163#5#-2147483642#0#1#2|PDH#3620a3acc83164b920b7eb39359edd0d|RD#26102018|RT#172425",
"fpB": "20181021",
"fpE": "20181208",
"planrtTS": "1540567421"
}
Version 1.16
of the protocol, which let's us get a lot more information from the server, seems to use two mandatory query parameters called mic
and mac
.
I've recorded a few requests: https://gist.github.com/derhuerst/bf3caf8685b69c44f16f073402a59e32
Hypothesis: They are hashes of the request body, salted. Similar to how DB does it. Edit: see 6f958e1, 5ac8d5f & schildbach/public-transport-enabler#187 (comment)
GET https://vbb.transport.rest/journeys?from=900000013102&to=900000009202&via=900000009102
{
"error": true,
"msg": "VBB error: HCI Service: location missing or invalid"
}
Key | Station ID | Station Name |
---|---|---|
from | 900000013102 | Kottbusser Tor |
to | 900000009202 | Osloer Straße |
via | 900000009102 | Leopoldplatz |
A Journey from Kottbusser Tor
over Leopoldplatz
to Osloer Straße
Example: Kottbusser Tor
-> Hallesches Tor
-> Leopoldplatz
-> Osloer Straße
Hi,
i want to filter now the products for the journey but received always the error "Can't connect to Hafas Error: unknown product express". It work only when i remove the line express.
This is my opt config:
{ suburban: true, subway: true, tram: true, bus: true, ferry: true, express: true, regional: true };
did someone make the same mistake in the search? Thanks for the answer.
to avoid confusion. Or maybe {minLat, maxLat, minLon, maxLon}
.
Apparently, the DB API does not support querying departures for 1440 min (1 day) at once.
Throw if the passed value is above to prevent implementations from implicitly relying on this gotcha.
@juliuste do you know the limit for ÖBB?
Hey Guys,
on the moment i have a problem with the INSA profile and the /departures endpoint.
With stationId 000005254 and duration: 20 i get an valid result set.
Try the same with 000005258 and it don´t work. I´m getting the following error:
TypeError: Cannot read property 'substr' of undefined at parseDateTime (..\node_modules\hafas-client\parse\date-time.js:6:22) at Object.parseWarning (..\node_modules\hafas-client\parse\warning.js:36:14) at d.warnings.c.himL.map.w (..\node_modules\hafas-client\lib\request.js:110:41) at Array.map (<anonymous>) at fetch.then.then (..\node_modules\hafas-client\lib\request.js:110:24) at <anonymous> at process._tickCallback (internal/process/next_tick.js:118:7)
Any Ideas on this?
Greetings Daniel
First of all, thank you very much for your work on this project which I consider very useful.
I wanted to add support for the saarfahrplan.de-API which also uses HAFAS, but it turns out the app isn't using the mgate.exe endpoint, but the (older?) query.exe one which does not return pretty JSON data, but gzipped hexadecimal files. I've recorded some requests, you can find them here.
I've read the following in your docs:
Note: hafas-client for now only supports the interface providing JSON (generated from XML), which is being used by the corresponding iOS/Android apps. It supports neither the JSONP, nor the XML, nor the HTML interface. If the endpoint does not end in mgate.exe, it mostly likely won't work.
Are there any plans to support other endpoints within this project? I would like to contribute on the integration!
So far, I've only parsed VBB lines.
In an effort to cover more than local Berlin & Brandenburg lines, I created a draft based on the wonderful public-transport-enabler
. Buses are still missing.
Also, most of the tram and bus lines won't be globally unique. We'd have to think of a clever mechanism to partially override/extend the global operators list. Maybe it's just better to always let profiles parse their line names.
Hi i get following error when i use it with react native. This is only with client.journys(..). client.locations(..) works fine.
This error is only when i am not in dubugging mode. When i am in debugging mode it works.
This is my code:
const createClient = require('hafas-client')
const dbProfile = require('hafas-client/p/db')
const client = createClient(dbProfile)
const münchenHbf = {
type: 'station',
id: '008000261',
name: 'München Hbf',
locations: {
type: 'location',
latitude:48.140364,
longitude:11.558735
}
}
const münchenPassing = {
type: 'station',
id: '008004158',
name: 'München-Pasing',
locations: {
type: 'location',
latitude:48.150036,
longitude:11.461624
}
}
const opt = {
//var date2 = new Date('2018-12-17T03:24:00');
when: new Date('2018-05-29T06:40:00'),
whenRepresents: 'departure', // use 'arrival' for journeys arriving before `when`
//earlierThan: null, // ref to get journeys earlier than the last query
//laterThan: null, // ref to get journeys later than the last query
results: 5, // how many journeys?
via: null, // let journeys pass this station
passedStations: false, // return stations on the way?
transfers: 5, // maximum of 5 transfers
transferTime: 0, // minimum time for a single transfer in minutes
accessibility: 'none', // 'none', 'partial' or 'complete'
bike: false, // only bike-friendly journeys
products: {
// these entries may vary from profile to profile
suburban: true,
subway: true,
tram: true,
bus: true,
ferry: true,
//express: true,
regional: true
},
tickets: false, // return tickets? only available with some profiles
polylines: false // return a shape for each leg?
}
client.journeys(münchenPassing, münchenHbf, opt)
.then((arr)=>{
console.log('===============arr=====================');
console.log(arr);
console.log('====================================');
})
.catch(console.error)
}
PARSE
request
request.js:54:13
more
index.js:134:18
journeys
index.js:168:14
componentDidMount
App.js:130:20
proxiedComponentDidMount
createPrototypeProxy.js:61:45
commitLifeCycles
ReactNativeRenderer-dev.js:10627:12
commitAllLifeCycles
ReactNativeRenderer-dev.js:12512:10
invokeGuardedCallback
ReactNativeRenderer-dev.js:39:15
invokeGuardedCallback
ReactNativeRenderer-dev.js:221:34
commitRoot
ReactNativeRenderer-dev.js:12677:10
completeRoot
ReactNativeRenderer-dev.js:13685:46
performWorkOnRoot
ReactNativeRenderer-dev.js:13635:23
performWork
ReactNativeRenderer-dev.js:13545:26
performSyncWork
ReactNativeRenderer-dev.js:13506:16
requestWork
ReactNativeRenderer-dev.js:13392:6
scheduleWorkImpl
ReactNativeRenderer-dev.js:13259:24
scheduleWork
ReactNativeRenderer-dev.js:13207:28
scheduleRootUpdate
ReactNativeRenderer-dev.js:13930:17
_updateContainerAtExpirationTime
ReactNativeRenderer-dev.js:13966:6
updateContainer
ReactNativeRenderer-dev.js:13991:8
render
ReactNativeRenderer-dev.js:14726:35
renderApplication
renderApplication.js:49:21
run
AppRegistry.js:102:10
runApplication
AppRegistry.js:194:26
__callFunction
MessageQueue.js:351:47
<unknown>
MessageQueue.js:116:26
__guardSafe
MessageQueue.js:314:6
callFunctionReturnFlushedQueue
MessageQueue.js:115:17
Since technically they belong to the API surface of hafas-client
and we need to prevent accidental breaking changes.
As discussed with @juliuste this is redundant information not specified in FPTF and therefore reduces the compatibility with other FPTF libraries.
This is a breaking change.
A=2@O=Sylt - Tinnum, Syltshuttle Ankunft@X=8314051@Y=54905780@u=66@U=94@L=981243564@p=1527064139@
A=2@O=Sylt - Tinnum, Syltshuttle Ankunft@X=8314051@Y=54905780@u=66@U=95@L=981243564@p=1527064139@
The only difference is U=94
vs U=95
. What does it mean?
This should be in hafas-client@3
hafas-client@4
.
Hey,
as described in this document: https://www.bmvi.de/SharedDocs/DE/Anlage/DG/hafas-rest-api.pdf?__blob=publicationFile , there should exist a "changeTimePercent"-Parameter.
Can you tell me, where I can add more optional parameters?
Thank you!
Right now, it's not possible to get arrivals, but they may differ significantly from the departure times.
@juliuste what do you think would be an intuitive method for getting both departures and arrivals (at once)? "station board", as used be HAFAS APIs doesn't seem to be very appropriate.
{
"type": "station",
"id": "900000100038",
"name": "Am Kupfergraben",
"location": {
"type": "location",
"latitude": 52.519414,
"longitude": 13.395393
},
"products": {
"suburban": false,
"subway": false,
"tram": true,
"bus": true,
"ferry": false,
"express": false,
"regional": false
}
}
Trips of the tram line 12
have the direction Mitte, Am Kupfergraben
however:
{
journeyId: '1|49718|11|86|24012018',
station: {
type: 'station',
id: '900000110502',
name: 'Raumerstr.',
location: { /* … */ },
products: { /* … */ }
},
when: '2018-01-24T09:00:00.000+01:00',
direction: 'Mitte, Am Kupfergraben',
line: {
type: 'line',
id: '27',
name: '12',
public: true,
class: 4,
productCode: 2,
operator: { /* … */ },
product: 'tram',
mode: 'train',
symbol: null,
nr: null,
metro: false,
express: false,
night: false
},
remarks: [ /* … */ ],
trip: 49718,
delay: null
}
1. Requires at least changing once
Magdeburg, Hasselbachplatz (Sternstr.) (Tram/Bus) to Stendal via Dessau
2. No changing required
Magdeburg, Hasselbachplatz (Sternstr.) (Tram/Bus) to Magdeburg, Universität via Magdeburg, Breiter Weg
3. the same as 2.?
departure.trip
& movement.trip
– They have a confusing name and may not even be the trip nr all the time. – 1269773departure.line
into dep.trip
& dep.trip.line
– dep.line.id
/arr.line.id
& dep.line.fahrtNr
/arr.line.fahrtNr
don't make sense. id
(as it currently is) and fahrtNr
are properties of the trip/vehicle, not the line.journey.refreshToken
to journey.id
For 8011160
(Berlin Hbf) to 8000309
(Regensburg Hbf), it reports an empty direction
:
const berlinHbf = '8011160'
const regensburgHbf = '8000309'
client.journeys(berlinHbf, regensburgHbf, {results: 1, tickets: true})
.then(([journey]) => {
const firstLeg = journey.legs[0]
return client.journeyLeg(firstLeg.id, firstLeg.line.name)
})
.then((data) => {
console.log(require('util').inspect(data, {depth: null}))
}, console.error)
node demo.js | grep direction
# direction: null
Apparently for non-ICE journey legs, it fails completely. E.g. for 8011160
(Berlin Hbf) to 8010035
(Berlin Karlshorst):
{ Error: HCI Service: problems during service execution
at request (/Users/j/web/hafas-client/lib/request.js:52:14)
at Object.journeyLeg (/Users/j/web/hafas-client/index.js:286:10)
at client.journeys.then (/Users/j/web/hafas-client/p/db/example.js:19:16)
at process._tickCallback (internal/process/next_tick.js:178:7)
isHafasError: true,
request:
{ lang: 'en',
svcReqL: [ [Object] ],
client: { id: 'DB', v: '16040000', type: 'IPH', name: 'DB Navigator' },
ext: 'DB.R15.12.a',
ver: '1.15',
auth: { type: 'AID', aid: 'n91dB8Z77MLdoR0K' } },
url: 'https://reiseauskunft.bahn.de/bin/mgate.exe?checksum=1f68d121702ff7ca65a4139a81ff8eaa',
statusCode: 200,
message: 'HCI Service: problems during service execution' }
opL
contains many different operators. Examples from VBB:
{
"name": "ODEG Ostdeutsche Eisenbahn GmbH",
"icoX": 2,
"id": "ODEG Ostdeutsche Eisenbahn GmbH"
},
{
"name": "S-Bahn Berlin GmbH",
"icoX": 7,
"id": "S-Bahn Berlin GmbH"
},
{
"name": "DB Regio AG",
"icoX": 10,
"id": "DB Regio AG"
},
{
"name": "Berliner Verkehrsbetriebe",
"icoX": 1,
"id": "Berliner Verkehrsbetriebe"
}
I want to change the timestamp of a journey using the opt
'when'. I guess its UNIX timestamp format, but I only got an error massage back when I enter e.g. when: 1526821200
. What is the correct way to change the departure time of a journey?
Thanks!
The DB API returns operators such as Nahreisezug
.
Hey @ALL,
where is the variable d defined? I received a undefined error on this line.
hafas-client/parse/stopover.js
The line:
const arr = profile.parseDateTime(profile, d.date, st.aTimeS)
Complete lines:
if (st.aCncl) { res.arrival = res.arrivalDelay = null const arr = profile.parseDateTime(profile, d.date, st.aTimeS) res.formerScheduledArrival = arr.toISO() } if (st.dCncl) { res.departure = res.departureDelay = null const arr = profile.parseDateTime(profile, d.date, st.dTimeS) res.formerScheduledDeparture = arr.toISO() }
>=8
– 46becf2tz-offset
branchstrip-leading-zeros
branchtest/lib/co.js
-> async
/await
– b825690Object.assign({}, o)
-> {...o}
The ÖBB public transport network intersects quite a lot with the German one. It might be worth supporting Austria.
oebb
will most likely benefit from being a hafas-client
profile. A lot of inspiration can also be taken from the implementation at public-transport-enabler.
Additional information:
const createClient = require('hafas-client')
const nahshProfile = require('hafas-client/p/nahsh')
const {inspect} = require('util')
const client = createClient(nahshProfile)
client.radar(54.4, 10.0, 54.2, 10.2)
.then((data) => {
console.log(inspect(data, {depth: null}))
})
.catch(console.error)
{
direction: 'Kiel Bahnhofsvorplatz',
trip: 31655,
line: { /* … */ },
location: { /* … */ },
nextStops: [ {
station: {
type: 'station',
id: '3490019',
name: 'Hamburg Airport',
location: { /* … */ }
},
departure: '2018-03-17T14:15:00.000+01:00',
departureDelay: null,
arrival: null,
arrivalDelay: null
}, {
station: {
type: 'station',
id: '3435009',
name: 'Neumünster Holstenhallen',
location: { /* … */ }
},
departure: '2018-03-17T15:10:00.000+01:00',
departureDelay: null,
arrival: '2018-03-17T15:10:00.000+01:00',
arrivalDelay: null
}, {
station: {
type: 'station',
id: '3440249',
name: 'Kiel Bahnhofsvorplatz',
location: { /* … */ }
},
departure: null,
departureDelay: null,
arrival: '2018-03-17T16:06:00.000+01:00',
arrivalDelay: null
}, {
station: {
type: 'station',
id: '3440249',
name: 'Kiel Bahnhofsvorplatz',
location: { /* … */ }
},
departure: null,
departureDelay: null,
arrival: '2018-03-17T16:06:00.000+01:00',
arrivalDelay: null
} ],
frames: [ {
origin: {
type: 'station',
id: '3491419',
name: undefined, // <----
location: {
type: 'location',
latitude: 54.225557,
longitude: 10.012491
}
},
destination: {
type: 'station',
id: '3491418',
name: undefined, // <----
location: {
type: 'location',
latitude: 54.310173,
longitude: 10.066642
}
},
t: 0
}, {
origin: {
type: 'station',
id: '3491419',
name: undefined, // <----
location: {
type: 'location',
latitude: 54.225557,
longitude: 10.012491
}
},
destination: {
type: 'station',
id: '3491418',
name: undefined, // <----
location: {
type: 'location',
latitude: 54.310173,
longitude: 10.066642
}
},
t: 10000
}, {
origin: {
type: 'station',
id: '3491419',
name: undefined, // <----
location: {
type: 'location',
latitude: 54.225557,
longitude: 10.012491
}
},
destination: {
type: 'station',
id: '3491418',
name: undefined,
location: {
type: 'location',
latitude: 54.310173,
longitude: 10.066642
}
},
t: 20000
}, {
origin: {
type: 'station',
id: '3491419',
name: undefined, // <----
location: {
type: 'location',
latitude: 54.225557,
longitude: 10.012491
}
},
destination: {
type: 'station',
id: '3491418',
name: undefined, // <----
location: {
type: 'location',
latitude: 54.310173,
longitude: 10.066642
}
},
t: 30000
} ]
}
Somebody has used in react native?
I get following error:
The development server returned response error code: 500
URL: http://localhost:8081/index.delta?platform=android&dev=true&minify=false&deltaBundleId=9083ef9957029468
Body:
{"originModulePath":"/home/t/ws/react/pendler/node_modules/hafas-client/lib/request.js","targetModuleName":"crypto","message":"Unable to resolve module `crypto` from `/home/t/ws/react/pendler/node_modules/hafas-client/lib/request.js`: Module `crypto` does not exist in the Haste module map\n\nThis might be related to https://github.com/facebook/react-native/issues/4968\nTo resolve try the following:\n 1. Clear watchman watches: `watchman watch-del-all`.\n 2. Delete the `node_modules` folder: `rm -rf node_modules && npm install`.\n 3. Reset Metro Bundler cache: `rm -rf /tmp/metro-bundler-cache-*` or `npm start -- --reset-cache`. 4. Remove haste cache: `rm -rf /tmp/haste-map-react-native-packager-*`.","errors":[{"description":"Unable to resolve module `crypto` from `/home/t/ws/react/pendler/node_modules/hafas-client/lib/request.js`: Module `crypto` does not exist in the Haste module map\n\nThis might be related to https://github.com/facebook/react-native/issues/4968\nTo resolve try the following:\n 1. Clear watchman watches: `watchman watch-del-all`.\n 2. Delete the `node_modules` folder: `rm -rf node_modules && npm install`.\n 3. Reset Metro Bundler cache: `rm -rf /tmp/metro-bundler-cache-*` or `npm start -- --reset-cache`. 4. Remove haste cache: `rm -rf /tmp/haste-map-react-native-packager-*`."}],"name":"Error","stack":"Error: Unable to resolve module `crypto` from `/home/t/ws/react/pendler/node_modules/hafas-client/lib/request.js`: Module `crypto` does not exist in the Haste module map\n\nThis might be related to https://github.com/facebook/react-native/issues/4968\nTo resolve try the following:\n 1. Clear watchman watches: `watchman watch-del-all`.\n 2. Delete the `node_modules` folder: `rm -rf node_modules && npm install`.\n 3. Reset Metro Bundler cache: `rm -rf /tmp/metro-bundler-cache-*` or `npm start -- --reset-cache`. 4. Remove haste cache: `rm -rf /tmp/haste-map-react-native-packager-*`.\n at ModuleResolver.resolveDependency (/home/t/ws/react/pendler/node_modules/metro/src/node-haste/DependencyGraph/ModuleResolution.js:161:1460)\n at ResolutionRequest.resolveDependency (/home/t/ws/react/pendler/node_modules/metro/src/node-haste/DependencyGraph/ResolutionRequest.js:91:16)\n at DependencyGraph.resolveDependency (/home/t/ws/react/pendler/node_modules/metro/src/node-haste/DependencyGraph.js:272:4579)\n at dependencies.map.relativePath (/home/t/ws/react/pendler/node_modules/metro/src/DeltaBundler/traverseDependencies.js:376:19)\n at Array.map (native)\n at resolveDependencies (/home/t/ws/react/pendler/node_modules/metro/src/DeltaBundler/traverseDependencies.js:374:16)\n at /home/t/ws/react/pendler/node_modules/metro/src/DeltaBundler/traverseDependencies.js:212:33\n at Generator.next (<anonymous>)\n at step (/home/t/ws/react/pendler/node_modules/metro/src/DeltaBundler/traverseDependencies.js:297:313)\n at /home/t/ws/react/pendler/node_modules/metro/src/DeltaBundler/traverseDependencies.js:297:473"}
processBundleResult
BundleDownloader.java:266
access$200
BundleDownloader.java:35
onResponse
BundleDownloader.java:153
execute
RealCall.java:135
run
NamedRunnable.java:32
runWorker
ThreadPoolExecutor.java:1133
run
ThreadPoolExecutor.java:607
run
Thread.java:762
hafas-client
already parses the frequency of alternatives of a journey
leg (if returned by HAFAS) and exposes them as journeyLeg.cycle.min
& journeyLeg.cycle.max
. If HAFAS has also returned a list of alternative trips via .freq.jnyL
, it will parse & expose them via journeyLeg.alternatives
.
Missing pieces not parsed yet:
.freq
.freq.numC
minC
is the minimum frequency for the coming time, maxC
the max. freq.Some example data (just search for "freq"
):
So far, I have these:
bf: 'barrier-free'
b_: 'likely not barrier-free'
rO: 'escalator' // todo: does this always mean "upwards"?
Au: 'elevator'
FB: 'bicycles conveyance'
FR: 'bicycles conveyance reservations'
EH: 'on-board access ramp'
RT: 'trip cancelled' // todo: does `RT` always mean cancelled?
BT: 'on-board bistro'
BR: 'on-board restaurant'
EV: 'replacement service'
KG: 'no food or beverages'
WV: 'WiFi available'
KL: 'air-conditioned'
SN: 'snacks available'
LS: 'on-board sockets'
The radar
method returns data that apps use to move a vehicle on a map. It looks like this:
{
delta: true,
dim: 2,
crdEncYX: 'kbq_IkkzpA??????',
crdEncZ: '',
crdEncS: 'NNNN'
}
I'm pretty sure it's either just a polyline or a time-aware/time-based polyline.
Some JS libraries that may use the same encoding:
time-aware-polyline
polyline
from MapboxThere are atm to properties representing a canceled trip. (one spelled canceled one cancelled)
Are really both required? 😄
So far a great project.
At the moment I try to add support for the S-Bahn München.
Problem is the mac parameter...
I extracted the following part of the app but I don't get the valid mac parameter. 😞
https://gist.github.com/flori-uni/b51a37ba7f84d702846da22f7fc72d4c
https://fpa.invg.de/bin/mgate.exe
uses HCI. Versions above 1.13 would likely need a mic/mac salt, otherwise an AUTH error is raised. The iOS app should have that, but I haven't got an iOS device. For details see schildbach/public-transport-enabler@dc390eb.
The current markup is a mess, spread over two places and with lots of explicitly or implicitly redundant values.
Let's make a new one. It might look like this:
// products.js
module.exports = [
{
id: 'subway',
mode: 'train',
name: 'U-Bahn',
short: 'U',
bitmasks: [64, 128], // some endpoints assign several digits to one product
default: true
}
// ...
]
There is a mechanism to get subsequent/preceeding journeys, given a string that identifies/describes the last request.
Find out how this works, in order to solve #23 (comment) .
Some examples:
{
lid: 'A=1@O=Magdeburg, Bodestr.@U=80@L=7511@',
type: 'S',
name: 'Magdeburg, Bodestr.',
icoX: 2,
extId: '7511',
state: 'F',
pCls: 64
}
{
lid: 'A=1@O=Magdeburg, Blankenburger Str.@U=80@L=7513@',
type: 'S',
name: 'Magdeburg, Blankenburger Str.',
icoX: 2,
extId: '7513',
state: 'F',
pCls: 64
}
{
lid: 'A=1@O=Magdeburg, Hansa-Park@U=80@L=7451@',
type: 'S',
name: 'Magdeburg, Hansa-Park',
icoX: 2,
extId: '7451',
state: 'F',
pCls: 64
}
{
lid: 'A=1@O=Magdeburg, IKEA@U=80@L=7498@',
type: 'S',
name: 'Magdeburg, IKEA',
icoX: 3,
extId: '7498',
state: 'F',
pCls: 96
}
{
lid: 'A=1@O=Sohlen, Unter der Wiesche@U=80@L=3005@',
type: 'S',
name: 'Sohlen, Unter der Wiesche',
icoX: 2,
extId: '3005',
state: 'F',
pCls: 64
}
{
lid: 'A=1@O=Hohenwarsleben, Berliner Allee@U=80@L=1106@',
type: 'S',
name: 'Hohenwarsleben, Berliner Allee',
icoX: 2,
extId: '1106',
state: 'F',
pCls: 64
}
{
lid: 'A=1@O=Irxleben, Rathaus Hohe Börde@U=80@L=22404@',
type: 'S',
name: 'Irxleben, Rathaus Hohe Börde',
icoX: 2,
extId: '22404',
state: 'F',
pCls: 64
}
{
lid: 'A=1@O=Magdeburg, Maybachstr.@U=80@L=20221@',
type: 'S',
name: 'Magdeburg, Maybachstr.',
icoX: 2,
extId: '20221',
state: 'F',
pCls: 64
}
{
lid: 'A=1@O=Magdeburg, Am Pfahlberg@U=80@L=10464@',
type: 'S',
name: 'Magdeburg, Am Pfahlberg',
icoX: 2,
extId: '10464',
state: 'F',
pCls: 64
}
{
lid: 'A=1@O=Barleben, Rothenseer Str.@U=80@L=1111@',
type: 'S',
name: 'Barleben, Rothenseer Str.',
icoX: 2,
extId: '1111',
state: 'F',
pCls: 64
}
{
lid: 'A=1@O=Magdeburg SKET Industriepark@U=80@L=8013485@',
type: 'S',
name: 'Magdeburg SKET Industriepark',
icoX: 0,
extId: '8013485',
state: 'F',
pCls: 88
}
{
lid: 'A=1@O=Magdeburg, Am Katharinenturm@U=80@L=13519@',
type: 'S',
name: 'Magdeburg, Am Katharinenturm',
icoX: 3,
extId: '13519',
state: 'F',
pCls: 32
}
{
lid: 'A=1@O=Magdeburg, Alter Markt@U=80@L=7333@',
type: 'S',
name: 'Magdeburg, Alter Markt',
icoX: 3,
extId: '7333',
state: 'F',
pCls: 96
}
{
lid: 'A=1@O=Magdeburg, City Carré/Hauptbahnhof@U=80@L=3846@',
type: 'S',
name: 'Magdeburg, City Carré/Hauptbahnhof',
icoX: 3,
extId: '3846',
state: 'F',
pCls: 32
}
prodL[].prodCtx.admin
seems to be similar to the operator. I found the following values so far:
800154
800158
800161
BEHDT-
BRB---
BRT---
BVB--- # afaik BVG buses
BVT--- # afaik BVG trams
BVU--- # afaik BVG U-Bahn trains
DBS--- # afaik S-Bahn Berlin
HVG---
N80---
ODEN__
ODRE2_ # ODEG?
ODRE4_ # ODEG?
RPM---
SEV--- # rail replacement service a.k.a. SchienenErsatzVerkehr ?
VIB---
VIT---
VTF---
Apparently the VBB API will only return a certain number of stations. Throw if the passed value is above.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.