Improved departure sending
This commit is contained in:
parent
3b2f463253
commit
0ad5e0056e
|
@ -1,5 +1,6 @@
|
|||
import threading
|
||||
from wsgiref.simple_server import make_server, WSGIRequestHandler
|
||||
from operator import itemgetter
|
||||
from departures import Departure
|
||||
from bottle import route, error, run, get, ServerAdapter, static_file
|
||||
|
||||
|
@ -22,7 +23,11 @@ class API:
|
|||
|
||||
@route('/departures/<stop_id>')
|
||||
def departures(stop_id: int):
|
||||
return {'departures': Departure.get(stop_id)}
|
||||
resp = []
|
||||
for d in Departure.get(stop_id):
|
||||
resp.append(d.json())
|
||||
resp.sort(key=itemgetter("departure"))
|
||||
return {'departures': resp}
|
||||
|
||||
@route('/stops')
|
||||
def stop():
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
from math import floor
|
||||
from operator import itemgetter
|
||||
from datetime import datetime
|
||||
from dateutil import parser
|
||||
|
||||
class Departure:
|
||||
|
||||
id_pool = []
|
||||
id_pool = {}
|
||||
storage = dict()
|
||||
|
||||
@staticmethod
|
||||
|
@ -14,17 +13,18 @@ class Departure:
|
|||
for id in Departure.storage:
|
||||
d = Departure.storage[id]
|
||||
if d.stop_id == int(stop_id):
|
||||
resp.append(d.json())
|
||||
resp.sort(key=itemgetter("departure"))
|
||||
resp.append(d)
|
||||
return resp
|
||||
|
||||
@staticmethod
|
||||
def get_id():
|
||||
def get_id(stop_id: str):
|
||||
if stop_id not in Departure.id_pool:
|
||||
Departure.id_pool[stop_id] = []
|
||||
i = 0
|
||||
while True:
|
||||
i += 1
|
||||
if i not in Departure.id_pool:
|
||||
Departure.id_pool.append(i)
|
||||
if i not in Departure.id_pool[stop_id]:
|
||||
Departure.id_pool[stop_id].append(i)
|
||||
return i
|
||||
|
||||
@staticmethod
|
||||
|
@ -33,42 +33,44 @@ class Departure:
|
|||
for did in Departure.storage:
|
||||
d = Departure.storage[did]
|
||||
if d.get_departure() < -3.5:
|
||||
Departure.id_pool.remove(d.id)
|
||||
Departure.id_pool[d.stop_id].remove(d.id)
|
||||
remove.append(did)
|
||||
for did in remove:
|
||||
Departure.storage.pop(did)
|
||||
|
||||
def __init__(self, did, stop_id, type, line, last_stop, departure, delay, lora_controller):
|
||||
def __init__(self, did, stop_id, type, line, last_stop, departure, delay):
|
||||
departure = (parser.parse(departure)).timestamp()
|
||||
if -(datetime.now().timestamp() - (departure + delay*60))/60 <= -1:
|
||||
return
|
||||
if len(last_stop) >= 21:
|
||||
last_stop = last_stop[:20].strip() + "..."
|
||||
self.did = did
|
||||
self.sent = 0
|
||||
self.stop_id = stop_id
|
||||
self.id = Departure.get_id()
|
||||
self.id = Departure.get_id(stop_id)
|
||||
self.line = line
|
||||
self.type = type
|
||||
self.last_stop = last_stop
|
||||
self.departure = departure
|
||||
self.delay = delay
|
||||
self.controller = lora_controller
|
||||
self.send()
|
||||
self.updated = 1
|
||||
Departure.storage[did] = self
|
||||
|
||||
def update(self, delay):
|
||||
if delay != self.delay:
|
||||
self.send()
|
||||
self.updated += 1
|
||||
print(f"Updated | {self.id} | {self.delay} -> {delay}")
|
||||
self.delay = delay
|
||||
|
||||
def send(self):
|
||||
self.controller.data(self)
|
||||
self.sent += 1
|
||||
|
||||
def get_departure(self):
|
||||
return -(floor(((datetime.now().timestamp() - (self.departure + self.delay*60))/60)*10)/10)
|
||||
|
||||
def data(self):
|
||||
if self.updated != 0:
|
||||
self.updated = 0
|
||||
return f"{self}"
|
||||
else:
|
||||
return None
|
||||
|
||||
def __repr__(self):
|
||||
return f"{self.id}|{self.type}|{self.line}|{self.last_stop}|{(self.get_departure()*10):.0f}"
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ from base64 import b64encode
|
|||
from datetime import datetime
|
||||
from random import randint, shuffle
|
||||
from time import sleep
|
||||
from departures import Departure
|
||||
|
||||
import urllib3
|
||||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||
|
@ -37,15 +38,6 @@ class LoraController:
|
|||
def new(self, id: int, stop_id: int):
|
||||
self.devices.append(LoraDevice(self, id, stop_id))
|
||||
|
||||
def time(self):
|
||||
for d in self.devices:
|
||||
d.send(lambda: f"TIME|{(datetime.now() - datetime(1970, 1, 1)).total_seconds():.0f}")
|
||||
|
||||
def data(self, data):
|
||||
for d in self.devices:
|
||||
if d.stop_id == data.stop_id:
|
||||
d.send_departure(data)
|
||||
|
||||
class LoraDevice:
|
||||
|
||||
def __init__(self, controller: LoraController, deveui: int, stop_id: int):
|
||||
|
@ -57,9 +49,15 @@ class LoraDevice:
|
|||
self.port = 1
|
||||
self.send(lambda: "CLEAR")
|
||||
|
||||
def send_departure(self, departure):
|
||||
self.send(departure.__repr__)
|
||||
def get_updated_departures(self):
|
||||
self.send_time()
|
||||
for d in Departure.get(self.stop_id):
|
||||
if d.updated > 0:
|
||||
self.send(d.data)
|
||||
|
||||
def send_time(self):
|
||||
self.send(lambda: f"TIME|{(datetime.now() - datetime(1970, 1, 1)).total_seconds():.0f}")
|
||||
|
||||
def send(self, msg):
|
||||
self.message_pool.append(msg)
|
||||
if not self.thread or not self.thread.is_alive():
|
||||
|
@ -67,10 +65,12 @@ class LoraDevice:
|
|||
self.thread.start()
|
||||
|
||||
def thread_sending(self):
|
||||
while True:
|
||||
while not self.controller.main.ended:
|
||||
if len(self.message_pool) == 0:
|
||||
break
|
||||
message = self.message_pool.pop(0)()
|
||||
if not message:
|
||||
continue
|
||||
url = f"https://lora.plzen.eu/api/v2/nodes/{self.id:0>16x}/queue"
|
||||
headers = CaseInsensitiveDict()
|
||||
headers["Content-Type"] = "application/json"
|
||||
|
@ -84,7 +84,7 @@ class LoraDevice:
|
|||
print(f"{self.id:0>16x} > {message}")
|
||||
requests.post(url, verify=False, headers=headers, data=json.dumps(payload))
|
||||
self.port += 1
|
||||
if self.port == 11:
|
||||
if self.port == 4:
|
||||
self.port = 1
|
||||
sleep(15)
|
||||
sleep(5)
|
||||
|
||||
|
|
|
@ -57,8 +57,7 @@ class Main:
|
|||
c["Line"]["Name"],
|
||||
c["LastStopName"],
|
||||
c["DepartureTime"],
|
||||
0 if not c["DelayMin"] else c["DelayMin"],
|
||||
self.controller
|
||||
0 if not c["DelayMin"] else c["DelayMin"]
|
||||
)
|
||||
else:
|
||||
Departure.storage[did].update(
|
||||
|
@ -77,9 +76,10 @@ class Main:
|
|||
self.controller.generate_token()
|
||||
|
||||
if refetch == 0:
|
||||
self.controller.time()
|
||||
for s in self.config["stops"]:
|
||||
self.fetch(s["id"], 15)
|
||||
for d in self.controller.devices:
|
||||
d.get_updated_departures()
|
||||
|
||||
refetch = (refetch + 1) % 3
|
||||
regenerate = (regenerate + 1) % (6*30)
|
||||
|
|
Loading…
Reference in a new issue