Parcourir la source

show seconds until predicted departure time

> 2018-02-15 19:43:12
> 230 U6 SIEBENHIRTEN
> 410 U6 SIEBENHIRTEN
Fabian Peter Hammerle il y a 7 ans
Parent
commit
ba5cf5e5f7
1 fichiers modifiés avec 28 ajouts et 9 suppressions
  1. 28 9
      omegalines

+ 28 - 9
omegalines

@@ -2,6 +2,7 @@
 
 import datetime
 import dateutil.parser
+import dateutil.tz
 import json
 import os
 import time
@@ -9,12 +10,23 @@ import urllib2
 import yaml
 from OmegaExpansion import oledExp
 
+
+def datetime_now_local():
+    return datetime.datetime.now(dateutil.tz.tzlocal())
+
+
 class Departure:
+
     def __init__(self, line, towards, predicted_time):
         self.line = line
         self.towards = towards
         self.predicted_time = predicted_time
 
+    @property
+    def predicted_timedelta(self):
+        return self.predicted_time - datetime_now_local()
+
+
 def request_wiener_linien_departures(api_key, rbl):
     req = urllib2.Request(
         "https://www.wienerlinien.at/ogd_realtime/monitor?sender=%s&rbl=%s"
@@ -22,24 +34,31 @@ def request_wiener_linien_departures(api_key, rbl):
     )
     req.add_header("Accept", "application/json")
     req.add_header("Content-Type", "application/json")
+    req_time = datetime_now_local()
     resp = urllib2.urlopen(req)
     resp_data = json.loads(resp.read())
     # datetime.datetime.strptime:
     # ValueError: 'z' is a bad directive in format
     # '%Y-%m-%dT%H:%M:%S.%f%z'
-    server_time = dateutil.parser.parse(resp_data['message']['serverTime'])
+    server_time_delta = req_time - \
+        dateutil.parser.parse(resp_data['message']['serverTime'])
     monitors_data = resp_data['data']['monitors']
     assert 1 == len(monitors_data)
     departures = []
     for line_data in monitors_data[0]['lines']:
         assert 1 == len(line_data['departures'])
         for departure_data in line_data['departures']['departure']:
+            predicted_time_server = dateutil.parser.parse(
+                departure_data['departureTime']['timeReal'],
+            )
             departures.append(Departure(
-                line=departure_data['vehicle']['name'] if 'vehicle' in departure_data else line_data['name'],
-                towards=departure_data['vehicle']['towards'] if 'towards' in departure_data else line_data['towards'],
-                predicted_time=dateutil.parser.parse(departure_data['departureTime']['timeReal']),
+                line=departure_data['vehicle']['name']
+                    if 'vehicle' in departure_data else line_data['name'],
+                towards=departure_data['vehicle']['towards']
+                    if 'towards' in departure_data else line_data['towards'],
+                predicted_time=predicted_time_server - server_time_delta,
             ))
-    return server_time, departures
+    return departures
 
 
 def run(config_path):
@@ -52,9 +71,9 @@ def run(config_path):
     while True:
         oledExp.clear()
         oledExp.setCursor(0, 0)
-        oledExp.write(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
+        oledExp.write(datetime_now_local().strftime("%Y-%m-%d %H:%M:%S"))
         try:
-            server_time, departures = request_wiener_linien_departures(
+            departures = request_wiener_linien_departures(
                 api_key=wiener_linien_api_key,
                 rbl=4648,
             )
@@ -63,8 +82,8 @@ def run(config_path):
         if departures:
             for departure_idx, departure in enumerate(departures):
                 oledExp.setCursor(1 + departure_idx, 0)
-                oledExp.write("%s %s %s" % (
-                    departure.predicted_time.strftime('%H:%M:%S'),
+                oledExp.write("%03d %s %s" % (
+                    departure.predicted_timedelta.total_seconds(),
                     departure.line,
                     departure.towards,
                 ))