aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2022-05-20 18:40:25 +0200
committerMartin Polden <mpolden@mpolden.no>2022-05-20 18:41:49 +0200
commit40eec373cde0b08a32dc59bb5e23eb3ed2291ec6 (patch)
tree7f6935de3442ca3e14cd37dcffa7104d88e724a4
parentde20e5af703c8b62f63e3c4445133c798ea6e1ad (diff)
nsb: Use Entur API
-rw-r--r--docs/WIDGETS.md12
-rw-r--r--jarvis/jobs/nsb.py63
-rw-r--r--jarvis/test_data/nsb.json1061
-rwxr-xr-xjarvis/tests.py14
4 files changed, 93 insertions, 1057 deletions
diff --git a/docs/WIDGETS.md b/docs/WIDGETS.md
index 282d6b2..eb066a8 100644
--- a/docs/WIDGETS.md
+++ b/docs/WIDGETS.md
@@ -148,20 +148,20 @@ JOBS["imap"] = {
nsb
---
-Displays upcoming train departures from a configured location. Scrapes data
-directly from https://www.nsb.no.
+Displays upcoming train departures from a configured location. Data is retrieved
+from the [Entur API](https://developer.entur.org).
+
+Use https://stoppested.entur.org to find valid stop IDs.
```python
JOBS["nsb"] = {
"enabled": True,
"interval": 900,
- "from": "Lillehammer",
- "to": "Oslo S",
+ "from": (420, "Lillehammer"),
+ "to": (59872, "Oslo S"),
}
```
-The `from` and `to` fields are the same location names as used on the website.
-
ping
----
Displays a graph of response times to the given hosts. The `hosts` field is
diff --git a/jarvis/jobs/nsb.py b/jarvis/jobs/nsb.py
index b2a333d..07e12f8 100644
--- a/jarvis/jobs/nsb.py
+++ b/jarvis/jobs/nsb.py
@@ -7,18 +7,22 @@ from jobs import AbstractJob
class Nsb(AbstractJob):
def __init__(self, conf):
- self.from_location = conf["from"]
- self.to_location = conf["to"]
+ self.from_stop_id, self.from_location = conf["from"]
+ self.to_stop_id, self.to_location = conf["to"]
self.interval = conf["interval"]
self.timeout = conf.get("timeout")
def _parse(self, json):
- date_format = "%Y-%m-%dT%H:%M:%S"
departures = []
- for itinerary in json["itineraries"]:
- departure = datetime.strptime(itinerary["departureScheduled"], date_format)
- arrival = datetime.strptime(itinerary["arrivalScheduled"], date_format)
- duration = abs((arrival - departure).total_seconds())
+ for tp in json["data"]["trip"]["tripPatterns"]:
+ legs = tp["legs"]
+ if len(legs) == 0:
+ continue
+ elif len(legs) > 1:
+ raise ValueError("found {} legs, but expected 1".format(len(legs)))
+ departure = datetime.fromisoformat(legs[0]["expectedStartTime"])
+ arrival = datetime.fromisoformat(legs[0]["expectedEndTime"])
+ duration = tp["duration"]
departures.append(
{
"departure": departure.isoformat(),
@@ -34,19 +38,40 @@ class Nsb(AbstractJob):
}
def get(self):
- now = datetime.now()
- data = {
- "from": self.from_location,
- "to": self.to_location,
- "time": now.strftime("%Y-%m-%dT%H:%M"),
- }
- url = "https://booking.cloud.nsb.no/api/itineraries/search"
- headers = {
- "User-Agent": (
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; "
- "rv:93.0) Gecko/20100101 Firefox/93.0"
- )
+ query = """
+{
+ trip(
+ from: {
+ place: "NSR:StopPlace:%d"
+ },
+ to: {
+ place: "NSR:StopPlace:%d"
+ },
+ modes: {
+ transportModes: {
+ transportMode: rail
+ }
+ },
+ searchWindow: 720,
+ maximumTransfers: 1
+ ) {
+ tripPatterns {
+ duration
+ legs {
+ expectedStartTime
+ expectedEndTime
+ line {
+ id
+ publicCode
}
+ }
+ }
+ }
+}
+"""
+ data = {"query": query % (self.from_stop_id, self.to_stop_id)}
+ url = "https://api.entur.io/journey-planner/v3/graphql"
+ headers = {"ET-Client-Name": "github_mpolden-jarvis2"}
r = requests.post(url, timeout=self.timeout, json=data, headers=headers)
r.raise_for_status()
return self._parse(r.json())
diff --git a/jarvis/test_data/nsb.json b/jarvis/test_data/nsb.json
index b3a08d9..b304823 100644
--- a/jarvis/test_data/nsb.json
+++ b/jarvis/test_data/nsb.json
@@ -1,1038 +1,47 @@
{
- "resultSetId": "fd529a63-68ae-41aa-b587-f86e256103af",
- "itineraries": [
- {
- "id": "4da742d9-cbdb-4d2f-a0b6-0c8f7b52d313",
- "from": "Skansen",
- "to": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T17:03:00",
- "departureRealTime": "2018-05-31T17:07:00",
- "arrivalScheduled": "2018-05-31T17:42:00",
- "arrivalRealTime": null,
- "duration": {
- "days": 0,
- "hours": 0,
- "minutes": 39
- },
- "priceOptions": null,
- "tripStatus": null,
- "legs": [
+ "data": {
+ "trip": {
+ "tripPatterns": [
{
- "id": "4da742d9-cbdb-4d2f-a0b6-0c8f7b52d313-0",
- "from": "Skansen",
- "to": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T17:03:00",
- "departureRealTime": "2018-05-31T17:07:00",
- "arrivalScheduled": "2018-05-31T17:42:00",
- "arrivalRealTime": null,
- "duration": {
- "days": 0,
- "hours": 0,
- "minutes": 39
- },
- "durationUntilNextLeg": null,
- "finalDestinationOfLine": "Steinkjer",
- "transportMode": "NSB Lokaltog",
- "transportType": "TRAIN",
- "line": {
- "name": "Lokal",
- "colors": {
- "background": "FFFFFF",
- "border": "333333",
- "text": "333333"
- }
- },
- "departureTrack": "1",
- "arrivalTrack": "1",
- "transitionRulingToNextLeg": null,
- "cancelled": false,
- "partiallyCancelled": false,
- "cancellationType": null,
- "cancellationConclusionText": null,
- "serviceCode": "Lt",
- "trainJourney": {
- "departureStation": {
- "name": "Skansen",
- "country": "76",
- "code": "1125000"
- },
- "arrivalStation": {
- "name": "Værnes (Trondheim Lufthavn)",
- "country": "76",
- "code": "1299000"
- },
- "departureTime": "2018-05-31T17:03:00",
- "arrivalTime": "2018-05-31T17:42:00",
- "train": {
- "number": 445
- },
- "identifier": "445.76.1125000.31.05.2018.76.1299000.31.05.2018",
- "alternativeTransport": null
- },
- "messages": [
- {
- "text": "Trondheim S-Lademoen: Du må regne med forsinkelser. Årsak: Problemer med signalanlegget.",
- "type": "INFO"
- }
- ],
- "stops": [
- {
- "name": "Skansen",
- "departureScheduled": "2018-05-31T17:03:00",
- "departureRealTime": "2018-05-31T17:07:00",
- "arrivalScheduled": "2018-05-31T17:02:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "Kun av- og påstigning på signal",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Trondheim",
- "departureScheduled": "2018-05-31T17:10:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T17:08:00",
- "arrivalRealTime": "2018-05-31T17:11:00",
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Lademoen",
- "departureScheduled": "2018-05-31T17:11:00",
- "departureRealTime": "2018-05-31T17:14:00",
- "arrivalScheduled": "2018-05-31T17:10:00",
- "arrivalRealTime": "2018-05-31T17:14:00",
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Lilleby (Lademoen)",
- "departureScheduled": "2018-05-31T17:12:00",
- "departureRealTime": "2018-05-31T17:15:00",
- "arrivalScheduled": "2018-05-31T17:11:00",
- "arrivalRealTime": "2018-05-31T17:15:00",
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Leangen",
- "departureScheduled": "2018-05-31T17:16:00",
- "departureRealTime": "2018-05-31T17:18:00",
- "arrivalScheduled": "2018-05-31T17:15:00",
- "arrivalRealTime": "2018-05-31T17:18:00",
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Rotvoll",
- "departureScheduled": "2018-05-31T17:17:00",
- "departureRealTime": "2018-05-31T17:19:00",
- "arrivalScheduled": "2018-05-31T17:16:00",
- "arrivalRealTime": "2018-05-31T17:19:00",
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Vikhamar",
- "departureScheduled": "2018-05-31T17:25:00",
- "departureRealTime": "2018-05-31T17:27:00",
- "arrivalScheduled": "2018-05-31T17:24:00",
- "arrivalRealTime": "2018-05-31T17:27:00",
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Hommelvik",
- "departureScheduled": "2018-05-31T17:35:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T17:34:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Hell",
- "departureScheduled": "2018-05-31T17:41:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T17:40:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T17:43:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T17:42:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "Kun av- og påstigning på signal",
- "cancelled": false,
- "track": "1"
- }
- ],
- "attributes": [],
- "deviation": {
- "severity": "MINOR_DEVIATION",
- "message": "Beregnet 4 min forsinket"
- },
- "realtimeTextSummary": "Beregnet 4 min forsinket"
- }
- ],
- "messages": [
- {
- "text": "Dette er en lokalbillett som må hentes ut i NSB-appen",
- "type": "INFO"
- }
- ],
- "mainMessage": null,
- "cancellationText": null,
- "modified": false,
- "tripId": "T$A=1@O=Skansen@L=7601125@a=128@$A=1@O=Trondheim Lufthavn@L=7601299@a=128@$201805311703$201805311742$ 445$",
- "cancellationPresent": false
- },
- {
- "id": "1211f988-2a7b-4fcf-a369-0d3369b61987",
- "from": "Skansen",
- "to": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T18:03:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T18:42:00",
- "arrivalRealTime": null,
- "duration": {
- "days": 0,
- "hours": 0,
- "minutes": 39
- },
- "priceOptions": null,
- "tripStatus": null,
- "legs": [
- {
- "id": "1211f988-2a7b-4fcf-a369-0d3369b61987-0",
- "from": "Skansen",
- "to": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T18:03:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T18:42:00",
- "arrivalRealTime": null,
- "duration": {
- "days": 0,
- "hours": 0,
- "minutes": 39
- },
- "durationUntilNextLeg": null,
- "finalDestinationOfLine": "Steinkjer",
- "transportMode": "NSB Lokaltog",
- "transportType": "TRAIN",
- "line": {
- "name": "Lokal",
- "colors": {
- "background": "FFFFFF",
- "border": "333333",
- "text": "333333"
- }
- },
- "departureTrack": "1",
- "arrivalTrack": "1",
- "transitionRulingToNextLeg": null,
- "cancelled": false,
- "partiallyCancelled": false,
- "cancellationType": null,
- "cancellationConclusionText": null,
- "serviceCode": "Lt",
- "trainJourney": {
- "departureStation": {
- "name": "Skansen",
- "country": "76",
- "code": "1125000"
- },
- "arrivalStation": {
- "name": "Værnes (Trondheim Lufthavn)",
- "country": "76",
- "code": "1299000"
- },
- "departureTime": "2018-05-31T18:03:00",
- "arrivalTime": "2018-05-31T18:42:00",
- "train": {
- "number": 447
- },
- "identifier": "447.76.1125000.31.05.2018.76.1299000.31.05.2018",
- "alternativeTransport": null
- },
- "messages": [],
- "stops": [
- {
- "name": "Skansen",
- "departureScheduled": "2018-05-31T18:03:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T18:02:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "Kun av- og påstigning på signal",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Trondheim",
- "departureScheduled": "2018-05-31T18:10:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T18:07:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Lademoen",
- "departureScheduled": "2018-05-31T18:11:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T18:10:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Lilleby (Lademoen)",
- "departureScheduled": "2018-05-31T18:12:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T18:11:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Leangen",
- "departureScheduled": "2018-05-31T18:16:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T18:15:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Rotvoll",
- "departureScheduled": "2018-05-31T18:17:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T18:16:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Vikhamar",
- "departureScheduled": "2018-05-31T18:25:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T18:24:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Hommelvik",
- "departureScheduled": "2018-05-31T18:35:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T18:34:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Hell",
- "departureScheduled": "2018-05-31T18:41:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T18:40:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T18:43:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T18:42:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "Kun av- og påstigning på signal",
- "cancelled": false,
- "track": "1"
- }
- ],
- "attributes": [],
- "deviation": {
- "severity": "UNKNOWN",
- "message": "Ikke startet"
- },
- "realtimeTextSummary": "Ikke startet"
- }
- ],
- "messages": [
- {
- "text": "Dette er en lokalbillett som må hentes ut i NSB-appen",
- "type": "INFO"
- }
- ],
- "mainMessage": null,
- "cancellationText": null,
- "modified": false,
- "tripId": "T$A=1@O=Skansen@L=7601125@a=128@$A=1@O=Trondheim Lufthavn@L=7601299@a=128@$201805311803$201805311842$ 447$",
- "cancellationPresent": false
- },
- {
- "id": "abf01458-c258-4c9e-9cbe-5fa45096d6b4",
- "from": "Skansen",
- "to": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T19:02:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T19:44:00",
- "arrivalRealTime": null,
- "duration": {
- "days": 0,
- "hours": 0,
- "minutes": 42
- },
- "priceOptions": null,
- "tripStatus": null,
- "legs": [
- {
- "id": "abf01458-c258-4c9e-9cbe-5fa45096d6b4-0",
- "from": "Skansen",
- "to": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T19:02:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T19:44:00",
- "arrivalRealTime": null,
- "duration": {
- "days": 0,
- "hours": 0,
- "minutes": 42
- },
- "durationUntilNextLeg": null,
- "finalDestinationOfLine": "Steinkjer",
- "transportMode": "NSB Lokaltog",
- "transportType": "TRAIN",
- "line": {
- "name": "Lokal",
- "colors": {
- "background": "FFFFFF",
- "border": "333333",
- "text": "333333"
- }
- },
- "departureTrack": "1",
- "arrivalTrack": "1",
- "transitionRulingToNextLeg": null,
- "cancelled": false,
- "partiallyCancelled": false,
- "cancellationType": null,
- "cancellationConclusionText": null,
- "serviceCode": "Lt",
- "trainJourney": {
- "departureStation": {
- "name": "Skansen",
- "country": "76",
- "code": "1125000"
- },
- "arrivalStation": {
- "name": "Værnes (Trondheim Lufthavn)",
- "country": "76",
- "code": "1299000"
- },
- "departureTime": "2018-05-31T19:02:00",
- "arrivalTime": "2018-05-31T19:44:00",
- "train": {
- "number": 449
- },
- "identifier": "449.76.1125000.31.05.2018.76.1299000.31.05.2018",
- "alternativeTransport": null
- },
- "messages": [],
- "stops": [
- {
- "name": "Skansen",
- "departureScheduled": "2018-05-31T19:02:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T19:01:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "Kun av- og påstigning på signal",
- "cancelled": false,
- "track": "1"
- },
+ "duration": 2460,
+ "legs": [
{
- "name": "Trondheim",
- "departureScheduled": "2018-05-31T19:10:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T19:07:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Lademoen",
- "departureScheduled": "2018-05-31T19:11:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T19:10:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Lilleby (Lademoen)",
- "departureScheduled": "2018-05-31T19:12:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T19:11:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Leangen",
- "departureScheduled": "2018-05-31T19:16:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T19:15:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Rotvoll",
- "departureScheduled": "2018-05-31T19:17:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T19:16:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Vikhamar",
- "departureScheduled": "2018-05-31T19:25:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T19:24:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Hommelvik",
- "departureScheduled": "2018-05-31T19:37:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T19:34:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Hell",
- "departureScheduled": "2018-05-31T19:43:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T19:42:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T19:45:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T19:44:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "Kun av- og påstigning på signal",
- "cancelled": false,
- "track": "1"
+ "expectedStartTime": "2022-05-20T19:11:00+02:00",
+ "expectedEndTime": "2022-05-20T19:52:00+02:00",
+ "line": {
+ "id": "SJN:Line:26",
+ "publicCode": "26"
+ }
}
- ],
- "attributes": [],
- "deviation": {
- "severity": "UNKNOWN",
- "message": "Ikke startet"
- },
- "realtimeTextSummary": "Ikke startet"
- }
- ],
- "messages": [
+ ]
+ },
{
- "text": "Dette er en lokalbillett som må hentes ut i NSB-appen",
- "type": "INFO"
- }
- ],
- "mainMessage": null,
- "cancellationText": null,
- "modified": false,
- "tripId": "T$A=1@O=Skansen@L=7601125@a=128@$A=1@O=Trondheim Lufthavn@L=7601299@a=128@$201805311902$201805311944$ 449$",
- "cancellationPresent": false
- },
- {
- "id": "b829de1d-c3cb-4985-9352-314c4d0d16c4",
- "from": "Skansen",
- "to": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T21:02:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T21:42:00",
- "arrivalRealTime": null,
- "duration": {
- "days": 0,
- "hours": 0,
- "minutes": 40
- },
- "priceOptions": null,
- "tripStatus": null,
- "legs": [
- {
- "id": "b829de1d-c3cb-4985-9352-314c4d0d16c4-0",
- "from": "Skansen",
- "to": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T21:02:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T21:42:00",
- "arrivalRealTime": null,
- "duration": {
- "days": 0,
- "hours": 0,
- "minutes": 40
- },
- "durationUntilNextLeg": null,
- "finalDestinationOfLine": "Steinkjer",
- "transportMode": "NSB Lokaltog",
- "transportType": "TRAIN",
- "line": {
- "name": "Lokal",
- "colors": {
- "background": "FFFFFF",
- "border": "333333",
- "text": "333333"
- }
- },
- "departureTrack": "1",
- "arrivalTrack": "1",
- "transitionRulingToNextLeg": null,
- "cancelled": false,
- "partiallyCancelled": false,
- "cancellationType": null,
- "cancellationConclusionText": null,
- "serviceCode": "Lt",
- "trainJourney": {
- "departureStation": {
- "name": "Skansen",
- "country": "76",
- "code": "1125000"
- },
- "arrivalStation": {
- "name": "Værnes (Trondheim Lufthavn)",
- "country": "76",
- "code": "1299000"
- },
- "departureTime": "2018-05-31T21:02:00",
- "arrivalTime": "2018-05-31T21:42:00",
- "train": {
- "number": 453
- },
- "identifier": "453.76.1125000.31.05.2018.76.1299000.31.05.2018",
- "alternativeTransport": null
- },
- "messages": [],
- "stops": [
- {
- "name": "Skansen",
- "departureScheduled": "2018-05-31T21:02:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T21:01:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "Kun av- og påstigning på signal",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Trondheim",
- "departureScheduled": "2018-05-31T21:10:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T21:07:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Lademoen",
- "departureScheduled": "2018-05-31T21:11:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T21:10:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Lilleby (Lademoen)",
- "departureScheduled": "2018-05-31T21:12:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T21:11:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Leangen",
- "departureScheduled": "2018-05-31T21:16:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T21:15:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Rotvoll",
- "departureScheduled": "2018-05-31T21:17:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T21:16:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
+ "duration": 2520,
+ "legs": [
{
- "name": "Vikhamar",
- "departureScheduled": "2018-05-31T21:25:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T21:24:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Hommelvik",
- "departureScheduled": "2018-05-31T21:35:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T21:34:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Hell",
- "departureScheduled": "2018-05-31T21:41:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T21:40:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T21:43:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T21:42:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "Kun av- og påstigning på signal",
- "cancelled": false,
- "track": "1"
+ "expectedStartTime": "2022-05-20T20:11:00+02:00",
+ "expectedEndTime": "2022-05-20T20:53:00+02:00",
+ "line": {
+ "id": "SJN:Line:26",
+ "publicCode": "26"
+ }
}
- ],
- "attributes": [],
- "deviation": {
- "severity": "UNKNOWN",
- "message": "Ikke startet"
- },
- "realtimeTextSummary": "Ikke startet"
- }
- ],
- "messages": [
+ ]
+ },
{
- "text": "Dette er en lokalbillett som må hentes ut i NSB-appen",
- "type": "INFO"
- }
- ],
- "mainMessage": null,
- "cancellationText": null,
- "modified": false,
- "tripId": "T$A=1@O=Skansen@L=7601125@a=128@$A=1@O=Trondheim Lufthavn@L=7601299@a=128@$201805312102$201805312142$ 453$",
- "cancellationPresent": false
- },
- {
- "id": "5265b390-659e-4d6d-995e-65b6cb23d45c",
- "from": "Skansen",
- "to": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T23:02:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T23:42:00",
- "arrivalRealTime": null,
- "duration": {
- "days": 0,
- "hours": 0,
- "minutes": 40
- },
- "priceOptions": null,
- "tripStatus": null,
- "legs": [
- {
- "id": "5265b390-659e-4d6d-995e-65b6cb23d45c-0",
- "from": "Skansen",
- "to": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T23:02:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T23:42:00",
- "arrivalRealTime": null,
- "duration": {
- "days": 0,
- "hours": 0,
- "minutes": 40
- },
- "durationUntilNextLeg": null,
- "finalDestinationOfLine": "Steinkjer",
- "transportMode": "NSB Lokaltog",
- "transportType": "TRAIN",
- "line": {
- "name": "Lokal",
- "colors": {
- "background": "FFFFFF",
- "border": "333333",
- "text": "333333"
- }
- },
- "departureTrack": "1",
- "arrivalTrack": "1",
- "transitionRulingToNextLeg": null,
- "cancelled": false,
- "partiallyCancelled": false,
- "cancellationType": null,
- "cancellationConclusionText": null,
- "serviceCode": "Lt",
- "trainJourney": {
- "departureStation": {
- "name": "Skansen",
- "country": "76",
- "code": "1125000"
- },
- "arrivalStation": {
- "name": "Værnes (Trondheim Lufthavn)",
- "country": "76",
- "code": "1299000"
- },
- "departureTime": "2018-05-31T23:02:00",
- "arrivalTime": "2018-05-31T23:42:00",
- "train": {
- "number": 457
- },
- "identifier": "457.76.1125000.31.05.2018.76.1299000.31.05.2018",
- "alternativeTransport": null
- },
- "messages": [],
- "stops": [
- {
- "name": "Skansen",
- "departureScheduled": "2018-05-31T23:02:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T23:01:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "Kun av- og påstigning på signal",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Trondheim",
- "departureScheduled": "2018-05-31T23:10:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T23:07:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
+ "duration": 2400,
+ "legs": [
{
- "name": "Lademoen",
- "departureScheduled": "2018-05-31T23:11:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T23:10:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Lilleby (Lademoen)",
- "departureScheduled": "2018-05-31T23:12:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T23:11:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Leangen",
- "departureScheduled": "2018-05-31T23:16:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T23:15:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Rotvoll",
- "departureScheduled": "2018-05-31T23:17:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T23:16:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Vikhamar",
- "departureScheduled": "2018-05-31T23:25:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T23:24:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Hommelvik",
- "departureScheduled": "2018-05-31T23:35:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T23:34:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "2"
- },
- {
- "name": "Hell",
- "departureScheduled": "2018-05-31T23:41:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T23:40:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "",
- "cancelled": false,
- "track": "1"
- },
- {
- "name": "Trondheim Lufthavn",
- "departureScheduled": "2018-05-31T23:43:00",
- "departureRealTime": null,
- "arrivalScheduled": "2018-05-31T23:42:00",
- "arrivalRealTime": null,
- "boardingRuleDescription": "Kun av- og påstigning på signal",
- "cancelled": false,
- "track": "1"
+ "expectedStartTime": "2022-05-20T21:12:00+02:00",
+ "expectedEndTime": "2022-05-20T21:52:00+02:00",
+ "line": {
+ "id": "SJN:Line:26",
+ "publicCode": "26"
+ }
}
- ],
- "attributes": [],
- "deviation": {
- "severity": "UNKNOWN",
- "message": "Ikke startet"
- },
- "realtimeTextSummary": "Ikke startet"
- }
- ],
- "messages": [
- {
- "text": "Dette er en lokalbillett som må hentes ut i NSB-appen",
- "type": "INFO"
+ ]
}
- ],
- "mainMessage": null,
- "cancellationText": null,
- "modified": false,
- "tripId": "T$A=1@O=Skansen@L=7601125@a=128@$A=1@O=Trondheim Lufthavn@L=7601299@a=128@$201805312302$201805312342$ 457$",
- "cancellationPresent": false
+ ]
}
- ],
- "passengerInformation": {
- "availableCategories": [
- {
- "id": 1,
- "type": "ADULT",
- "categoryName": "Voksen",
- "categoryNamePlural": "Voksne",
- "description": "Ordinær billett for reisende over 16 år.",
- "discount": "CUSTOMER_CARD",
- "prioritized": true
- },
- {
- "id": 1,
- "type": "ADULT",
- "categoryName": "Voksen",
- "categoryNamePlural": "Voksne",
- "description": "Ordinær billett for reisende over 16 år.",
- "discount": null,
- "prioritized": true
- },
- {
- "id": 4,
- "type": "STUDENT",
- "categoryName": "Student",
- "categoryNamePlural": "Studenter",
- "description": "Studenter med legitimasjon og bekreftelse for betalt semesteravgift får 25 % rabatt på ordinære priser på alle avganger. Studentrabatten har samme vilkår som ordinær billett.",
- "discount": null,
- "prioritized": true
- },
- {
- "id": 3,
- "type": "SENIOR_CITIZEN",
- "categoryName": "Honnør",
- "categoryNamePlural": "Honnør",
- "description": "Er du over 67 år, uføretrygdet eller ledsager for blind får du 50 % rabatt ved kjøp av ordinære billetter.",
- "discount": null,
- "prioritized": true
- },
- {
- "id": 5,
- "type": "MILITARY",
- "categoryName": "Vernepliktig",
- "categoryNamePlural": "Vernepliktige",
- "description": "Vernepliktige får 90% rabatt ved fremvisning av gyldig vernepliktskort ved billettkontroll.",
- "discount": null,
- "prioritized": false
- },
- {
- "id": 2,
- "type": "CHILD",
- "categoryName": "Barn 4-15 år",
- "categoryNamePlural": "Barn 4-15 år",
- "description": "Barn under 16 år, barn under 4 år reiser gratis. Barnebilletten har samme vilkår som ordinær billett. Voksen med fullprisbillett eller billett med kundekortrabatt kan ta med ett barn gratis på alle avganger.",
- "discount": null,
- "prioritized": false
- },
- {
- "id": 8,
- "type": "INFANT",
- "categoryName": "Barn under 4 år",
- "categoryNamePlural": "Barn under 4 år",
- "description": "Barn under 4 år reiser gratis.",
- "discount": null,
- "prioritized": false
- }
- ],
- "passengers": null,
- "modified": false,
- "modificationReason": null
- },
- "hasEarlierItineraries": true,
- "hasLaterItineraries": true,
- "useNewApi": false
-}
+ }
+} \ No newline at end of file
diff --git a/jarvis/tests.py b/jarvis/tests.py
index 16b4901..d27a2f5 100755
--- a/jarvis/tests.py
+++ b/jarvis/tests.py
@@ -303,8 +303,8 @@ class Nsb(unittest.TestCase):
self.nsb = nsb.Nsb(
{
"interval": None,
- "from": "Skansen",
- "to": "V\xc3\xa6rnes (Trondheim Lufthavn)",
+ "from": (144, "Skansen"),
+ "to": (456, "V\xc3\xa6rnes (Trondheim Lufthavn)"),
}
)
@@ -313,10 +313,12 @@ class Nsb(unittest.TestCase):
self.assertEqual("V\xc3\xa6rnes (Trondheim Lufthavn)", data["to"])
self.assertEqual("Skansen", data["from"])
- self.assertEqual(5, len(data["departures"]))
- self.assertEqual("2018-05-31T17:03:00", data["departures"][0]["departure"])
- self.assertEqual("2018-05-31T17:42:00", data["departures"][0]["arrival"])
- self.assertEqual(2340, data["departures"][0]["duration"])
+ self.assertEqual(3, len(data["departures"]))
+ self.assertEqual(
+ "2022-05-20T19:11:00+02:00", data["departures"][0]["departure"]
+ )
+ self.assertEqual("2022-05-20T19:52:00+02:00", data["departures"][0]["arrival"])
+ self.assertEqual(2460, data["departures"][0]["duration"])
class Ping(unittest.TestCase):