Implement PTV data fetching
This commit is contained in:
parent
020873fc40
commit
f8cc9f213c
@ -55,7 +55,7 @@ pal_image.putpalette((0x00,0x00,0x00, 0xff,0xff,0xff, 0xff,0xff,0x00, 0xff,0x00,
|
|||||||
image_4color = image.quantize(palette=pal_image, dither=Image.NONE)
|
image_4color = image.quantize(palette=pal_image, dither=Image.NONE)
|
||||||
image_4color.save('test_after_palette.png')
|
image_4color.save('test_after_palette.png')
|
||||||
|
|
||||||
show_on_screen = True
|
show_on_screen = False
|
||||||
if show_on_screen:
|
if show_on_screen:
|
||||||
import epd7in3g as epd
|
import epd7in3g as epd
|
||||||
try:
|
try:
|
||||||
|
|||||||
3
cache.py
3
cache.py
@ -7,14 +7,13 @@ class Cache:
|
|||||||
self.db = db
|
self.db = db
|
||||||
|
|
||||||
def get(self, key, timeout, f):
|
def get(self, key, timeout, f):
|
||||||
now = datetime.datetime.now()
|
now = datetime.datetime.now(datetime.timezone.utc)
|
||||||
earliest_acceptable = now - timeout
|
earliest_acceptable = now - timeout
|
||||||
match self.db.execute(
|
match self.db.execute(
|
||||||
'SELECT value FROM cache WHERE key = ? AND timestamp >= ?',
|
'SELECT value FROM cache WHERE key = ? AND timestamp >= ?',
|
||||||
(key, earliest_acceptable.isoformat()),
|
(key, earliest_acceptable.isoformat()),
|
||||||
).fetchall():
|
).fetchall():
|
||||||
case [(value,)]:
|
case [(value,)]:
|
||||||
self.db.commit()
|
|
||||||
return value
|
return value
|
||||||
|
|
||||||
value = f()
|
value = f()
|
||||||
|
|||||||
65
ptv.py
65
ptv.py
@ -17,14 +17,7 @@ def sign(request):
|
|||||||
|
|
||||||
def fetch(path):
|
def fetch(path):
|
||||||
res = httpx.get(sign(path))
|
res = httpx.get(sign(path))
|
||||||
try:
|
res.raise_for_status()
|
||||||
res.raise_for_status()
|
|
||||||
except:
|
|
||||||
try:
|
|
||||||
print(res.json())
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
raise
|
|
||||||
return res.json()
|
return res.json()
|
||||||
|
|
||||||
# Lilydale route 9 (type 0) (dir 1 in, 8 out) (stop 1229)
|
# Lilydale route 9 (type 0) (dir 1 in, 8 out) (stop 1229)
|
||||||
@ -46,22 +39,50 @@ local_routes = [
|
|||||||
Route('Lilydale', 9 , 0, [(1, 'in'), (8, 'out')] , [1229] ),
|
Route('Lilydale', 9 , 0, [(1, 'in'), (8, 'out')] , [1229] ),
|
||||||
Route('Belgrave', 2 , 0, [(1, 'in'), (2, 'out')] , [1229] ),
|
Route('Belgrave', 2 , 0, [(1, 'in'), (2, 'out')] , [1229] ),
|
||||||
Route('109' , 722 , 1, [(2, 'E'), (3, 'W')] , [2415, 2460]),
|
Route('109' , 722 , 1, [(2, 'E'), (3, 'W')] , [2415, 2460]),
|
||||||
Route('70' , 940 , 1, [(28, 'E'), (29, 'W')] , [2415, 2460]),
|
Route('70' , 940 , 1, [(28, 'E'), (29, 'W')] , [2162, 2161]),
|
||||||
Route('766' , 15800, 2, [(13, 'N'), (207, 'S')] , [17861] ),
|
Route('766' , 15800, 2, [(13, 'N'), (188, 'S')] , [17861] ),
|
||||||
Route('612' , 13024, 2, [(13, 'N'), (158, 'S')] , [17861] ),
|
Route('612' , 13024, 2, [(13, 'N'), (139, 'S')] , [17861] ),
|
||||||
]
|
]
|
||||||
|
# exp 951624
|
||||||
|
# non-exp 951826
|
||||||
|
|
||||||
def fetch_departures(stop_id, route_type_id):
|
def fetch_departures(stop_id, route_type_id):
|
||||||
deps = fetch(f'/v3/departures/route_type/{route_type_id}/stop/{stop_id}')['departures']
|
return fetch(f'/v3/departures/route_type/{route_type_id}/stop/{stop_id}')['departures']
|
||||||
for dep in deps:
|
|
||||||
for key in ['estimated_departure_utc', 'scheduled_departure_utc']:
|
def fetch_run(run_ref):
|
||||||
if dep[key]:
|
return fetch(f'/v3/runs/{run_ref}')['runs']
|
||||||
dep[key] = datetime.fromisoformat(dep[key])
|
|
||||||
deps.sort(key=lambda dep: dep['estimated_departure_utc'] or dep['scheduled_departure_utc'])
|
def departure_time(dep):
|
||||||
return deps
|
return datetime.fromisoformat(dep['estimated_departure_utc'] or dep['scheduled_departure_utc'])
|
||||||
|
|
||||||
def get_departure_data():
|
def get_departure_data():
|
||||||
by_route_type = defaultdict(list)
|
bus = fetch_departures(17861, 2)
|
||||||
for route_type, stop in set((r.route_type_id, s) for r in local_routes for s in r.stops):
|
train = fetch_departures(1229, 0)
|
||||||
by_route_type[route_type] += fetch_departures(stop, route_type)
|
tram_109w = fetch_departures(2460, 1)
|
||||||
return by_route_type
|
tram_70w = fetch_departures(2161, 1)
|
||||||
|
|
||||||
|
next_express_dep = None
|
||||||
|
train.sort(key=departure_time)
|
||||||
|
for dep in train:
|
||||||
|
if dep['direction_id'] == 1:
|
||||||
|
match fetch_run(dep['run_ref']):
|
||||||
|
case [run]:
|
||||||
|
if run['express_stop_count'] > 1: # Ignore East Richmond
|
||||||
|
next_express_dep = dep
|
||||||
|
break
|
||||||
|
|
||||||
|
def earliest(deps):
|
||||||
|
return min((departure_time(dep) for dep in deps), default=None)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'612 S': earliest(dep for dep in bus if dep['route_id'] == 13024 and dep['direction_id'] == 139),
|
||||||
|
'612 N': earliest(dep for dep in bus if dep['route_id'] == 13024 and dep['direction_id'] == 13),
|
||||||
|
'766 N': earliest(dep for dep in bus if dep['route_id'] == 15800 and dep['direction_id'] == 13),
|
||||||
|
|
||||||
|
'Union W': earliest(dep for dep in train if dep['direction_id'] == 1 and dep is not next_express_dep),
|
||||||
|
'Union W Express': departure_time(next_express_dep) if next_express_dep else None,
|
||||||
|
'Union E': earliest(dep for dep in train if dep['direction_id'] in {2, 8}),
|
||||||
|
|
||||||
|
'109 W': earliest(tram_109w),
|
||||||
|
'70 W': earliest(tram_70w),
|
||||||
|
}
|
||||||
|
|||||||
@ -1,5 +1,13 @@
|
|||||||
|
anyio==4.9.0
|
||||||
|
certifi==2025.4.26
|
||||||
colorzero==2.0
|
colorzero==2.0
|
||||||
gpiozero==2.0.1
|
gpiozero==2.0.1
|
||||||
|
h11==0.16.0
|
||||||
|
httpcore==1.0.9
|
||||||
|
httpx==0.28.1
|
||||||
|
idna==3.10
|
||||||
lgpio==0.2.2.0
|
lgpio==0.2.2.0
|
||||||
pillow==11.2.1
|
pillow==11.2.1
|
||||||
|
sniffio==1.3.1
|
||||||
spidev==3.6
|
spidev==3.6
|
||||||
|
typing_extensions==4.13.2
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 10 KiB |
Loading…
Reference in New Issue
Block a user