Improved departure sending

This commit is contained in:
Filip Znachor 2022-12-14 14:41:39 +01:00
parent 3b2f463253
commit 0ad5e0056e
4 changed files with 43 additions and 36 deletions

View file

@ -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():

View file

@ -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}"

View file

@ -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)

View file

@ -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)