| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #!/usr/bin/env python
- import datetime
- import dateutil.parser
- import dateutil.tz
- import json
- import os
- import time
- 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"
- % (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_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']:
- try:
- predicted_time_server = dateutil.parser.parse(
- departure_data['departureTime']['timeReal'],
- )
- except KeyError as e:
- print(e)
- predicted_time_server = None
- if predicted_time_server:
- departures.append(Departure(
- line=departure_data['vehicle']['name']
- if 'vehicle' in departure_data else line_data['name'],
- towards=departure_data['vehicle']['towards']
- if 'vehicle' in departure_data else line_data['towards'],
- predicted_time=predicted_time_server - server_time_delta,
- ))
- return departures
- def run(config_path):
- with open(config_path, 'r') as config_file:
- config = yaml.load(config_file.read())
- wiener_linien_api_key = config['wiener_linien_api_key']
- assert not oledExp.driverInit()
- assert not oledExp.setDisplayPower(1)
- while True:
- oledExp.clear()
- oledExp.setCursor(0, 0)
- oledExp.write(datetime_now_local().strftime("%Y-%m-%d %H:%M:%S"))
- try:
- departures = request_wiener_linien_departures(
- api_key=wiener_linien_api_key,
- rbl=4648,
- )
- except urllib2.HTTPError:
- departures = None
- if departures:
- for departure_idx, departure in enumerate(departures):
- oledExp.setCursor(1 + departure_idx, 0)
- oledExp.write("%03d %s %s" % (
- departure.predicted_timedelta.total_seconds(),
- departure.line,
- departure.towards,
- ))
- time.sleep(9.9)
- def _init_argparser():
- import argparse
- argparser = argparse.ArgumentParser()
- argparser.add_argument(
- '-c', '--config-path',
- dest='config_path',
- type=str,
- default=os.path.join(os.path.expanduser('~'), '.omegalines'),
- help='default: %(default)s',
- )
- return argparser
- def main(argv):
- argparser = _init_argparser()
- args = argparser.parse_args(argv)
- run(**vars(args))
- return 0
- if __name__ == "__main__":
- import sys
- sys.exit(main(sys.argv[1:]))
|