joeni

Add more information regarding bus system

I've found a new URL that allows for as much oncoming buses as one prefers, and with the via-destinations and all other required information included. However, it's not an urgent thing to do right now, so I'm leaving it as a comment for further inclusion.

Author
Maarten Vangeneugden
Date
Aug. 24, 2018, 4:54 a.m.
Hash
2aa408b31be741dd19435e1f102d1cec1553461a
Parent
4eb90f67da7223f6368adb2eca5073fdbdbe5a47
Modified files
administration/bus.py
docs/thesis/bussen.org

administration/bus.py

12 additions and 1 deletion.

View changes Hide changes
1
1
import json
2
2
import requests
3
3
from datetime import datetime, tzinfo
4
4
from django.core.cache import caches
5
5
6
6
7
7
def departures(stop, amount=0):
8
8
    pass
9
9
    """ Returns the remaining departures of buses from the given stop for this day.
10
10
    If amount is given, a maximum amount of departures will be returned.
11
11
    Departures in the past are never returned."""
12
12
    #today = datetime.now().strftime("%d-%m-%Y")
13
13
    #cache = caches["departures"]
14
14
    #cached_data = cache.get(stop)
15
15
    #if cached_data is None:
16
16
        ####received_json_data = requests.get('https://www.delijn.be/rise-api-core/dienstregeling/halteDienstregeling/'+stop+'/'+today+'/nl').json()
17
17
        #buses = list()
18
18
        #for bus_json in received_json_data['halteDoorkomsten']:
19
19
            #bus = dict()
20
20
        ## Some destinations should be a little bit more descriptive, they're handled here hardcoded
21
21
        #destination = bus_json["bestemming"]
22
22
        #bus["time"] = bus_json["lijn"]["tijdstip"]
23
23
24
24
# TODO: I've opted not to use the caching system for a complete day timetable, because it wouldn't load
25
25
# via destinations and give a rather hard time to work with. So I'm gonna stick with the simple
26
26
# realtime thingy, which does the job well enough.
27
27
28
28
+
29
# Where the "40" can be any number. That one does show the via.
+
30
+
31
29
32
30
33
def arrivals(stops):
31
34
    """ Returns the a list of buses that stop at the given stops.
32
35
    The buses are in a list, with dicts with the following keys:
33
36
    - number :: The line number of the bus
34
37
    - color :: The hex color to display for this bus line
35
38
    - destination :: The name of the destination (already formatted properly)
36
39
    - time :: The datetime of the departure
37
40
    - via :: If the bus does a detour, the name is stored here
38
41
    The list can have a maximum of 20 entries.
39
42
    The subroutine throws an exception if no stops were given.
40
43
    """
41
44
    stops_string = stops.pop(0)  # This returns an error in an empty list, which is supposed to happen if no stops are sent
42
45
    while len(stops) != 0:
43
46
        stops_string = stops_string + "+" + stops.pop(0)
44
47
    received_json_data = requests.get('https://www.delijn.be/rise-api-core/haltes/Multivertrekken/'+stops_string+'/20').json()
45
48
    buses = list()
46
49
    for bus_json in received_json_data["lijnen"]:
47
50
        bus = dict()
48
51
        # Some destinations should be a little bit more descriptive, they're handled here hardcoded
49
52
        destination = bus_json["bestemming"]
50
53
        if destination in ["Hasselt", "Genk", "Neerpelt", "Tongeren", "Maastricht", "Bilzen", "Diepenbeek"]:
51
54
            destination += " Station"
52
55
        bus["destination"] = destination
+
56
            destination = "Kiewit Kinderboerderij"
+
57
        elif destination == "Beringen":
+
58
            destination = "Beringen Bogaersveld"
+
59
        elif destination == "Maaseik":
+
60
            destination = "Maaseik Van Eycklaan"
+
61
        bus["destination"] = destination
53
62
        bus["number"] = bus_json["lijnNummerPubliek"]
54
63
        bus["color"] = bus_json["kleurAchterGrond"]
55
64
        unix_time = str(bus_json["vertrekCalendar"])[:10]  # De Lijn API returns too many trailing zeros
56
65
        bus["time"] = datetime.fromtimestamp(int(unix_time))
57
66
        # About via:
58
67
        # The viaBestemming has an annoying tendency to uppercase all destinations.
59
68
        # Some can be hardcoded to the right destination, others just need to be
60
69
        # properly capitalized.
61
70
        via = bus_json["viaBestemming"]
62
71
        if via is not None:
63
72
            if via == "GENK":
64
73
                via = "Genk Station"
65
74
            elif via == "MM VILL & GENK":
66
-
                via = "Genk Station en Maasmechelen Village"
+
75
                via = "Genk Station en Maasmechelen Village"
67
76
            elif via == "UNIVERSITEIT":
68
77
                via = "Universiteit Hasselt"
69
78
            elif via == "HASSELT":
70
79
                via = "Hasselt station"
71
80
            elif via == "PATERSPLEIN":
72
81
                via = "Diepenbeek Patersplein"
73
82
            else:
+
83
                via = "Diepenbeek Station"
+
84
            else:
74
85
                via = via.title()  # If it's anything else just capitalize and hope for the best
75
86
            bus["via"] = via
76
87
        buses.append(bus)
77
88
    return buses
78
89

docs/thesis/bussen.org

1 addition and 36 deletions.

View changes Hide changes
1
1
De studenten willen graag snel te weten komen wanneer hun bus vertrekt van de
2
2
campus. Daarom heeft Joeni een aparte pagina waarop alle volgende twintig bussen
3
3
van elke campus opgelijst worden.
4
4
5
5
De lijst van bussen past zich automatisch aan aan de schermbreedte van het
6
6
gebruikte toestel. De verschillende bussen worden voorzien van de bestemming, de
7
7
lijn (en de omkaderingen in de lijnkleur), en natuurlijk het uur van vertrek.
8
8
Daarnaast wordt er ook weergegeven hoe lang het nog duurt tot het vertrek vanaf
9
9
nu (bijvoorbeeld "Over 25 minuten") en wordt er (indien van toepassing)
10
10
aangegeven of er een "via"-bestemming is.
11
11
12
12
Deze data wordt afgehaald van de website van De Lijn via hetzelfde systeem dat
13
13
op dit moment op de TV-schermen in de hoofdgang van de campus Diepenbeek
14
14
gebruikt wordt. Daardoor was het aangaan van een licentie met De Lijn voor het
15
15
gebruik van hun data niet nodig, en gebeurt alles rechtstreeks en real-time.
16
16
17
17
Dit dient dan als een vervanging voor de twee knoppen die op de pagina van
18
18
=uhasselt.be/studenten= staan, die ook minder informatie bieden dan wat op Joeni
19
19
te vinden is.
20
-
+
20
21
21
#+CAPTION: Afbeelding van hoe de bussen-pagina er op een doordeweekse dag uitziet.
22
22
#+NAME: fig:buses
23
23
[[./img/bus.png]]
24
24
25
-
*** Snelheid website De Lijn
26
-
Vergeleken met Joeni is de gebruikssnelheid van de website van De Lijn redelijk
27
-
lang: Het inladen van de eerstvolgende 20 bussen neemt _per request_ minstens
28
-
1000 milliseconden in beslag[fn:location], wat moeilijk te tolereren valt voor
29
-
een actie die technisch gezien gewoon een SQL-request op een databank is, en een
30
-
HTTP-antwoord terugsturen (van nog geen 5kB). Daarnaast zou dit ook betekenen
31
-
dat élke keer een student deze pagina opvraagt, hierop zou moeten wachten.
32
-
Bijkomend neveneffect is dat dit de servers van De Lijn misschien zwaar
33
-
beïnvloedt, maar dat doet niet veel ter zake.
34
-
35
-
De oplossing hiervoor is door gebruik te maken van Joeni's cachesysteem:
36
-
37
-
In plaats van voor elke keer dat een student de busregeling wilt controleren een
38
-
request naar De Lijn te sturen, wordt /de volledige dagregeling/ slechts één
39
-
keer opgeslagen op de servers. Dit is gepland om elke nacht om 3 uur te
40
-
gebeuren, een moment waarop er weinig hinder is van zowel technische als humane
41
-
kant.
42
-
43
-
Deze dienstregeling wordt dan in de cache opgeslagen van Joeni, en kan bij elke
44
-
aanvraag direct aangereikt worden.
45
-
46
-
Hier is slechts een klein nadeel aan verbonden: Het aanvragen van een
47
-
volledige dienstregeling duurt langer (om en bij 4 seconden), maar daarvan zal
48
-
niemand iets merken omdat het 's nachts gebeurt. De informatie is echter wel
49
-
niet meer /real time/, maar De Lijn houdt sowieso geen vertragingen en
50
-
afschaffingen van hun bussen bij, dus dat maakt geen verschil.
51
-
52
-
Een ander nadeel is dat het de code van Joeni wat complexer maakt; er moet met
53
-
een cache gehandeld worden, en in tegenstelling tot de /realtime/-optie, moet er
54
-
zelf gekeken worden welke bussen nog vertrekken die dag. Maar dat is geen groot
55
-
"offer" vergeleken met wat ervoor terugkomt.
56
-
57
-
[fn:location] Snelheden gerapporteerd tijdens testen met Firefox Developer
58
-
Edition op GNU/Linux.
59
-
Edition op GNU/Linux.