Moved config to yml file

This commit is contained in:
Filip Znachor 2022-12-08 20:59:11 +01:00
parent 1067333518
commit 883bb30fea
5 changed files with 90 additions and 84 deletions

2
.gitignore vendored
View file

@ -1,3 +1,3 @@
config.py
config.yml
*.pyc
assets

View file

@ -1,12 +1,12 @@
from bottle import route, template, error, run, get, ServerAdapter, static_file
from departures import Departure
from operator import itemgetter
import threading
from operator import itemgetter
from wsgiref.simple_server import make_server, WSGIRequestHandler
from departures import Departure
from bottle import route, error, run, get, ServerAdapter, static_file
class Server(ServerAdapter):
server = None
def run(self, handler):
from wsgiref.simple_server import make_server, WSGIRequestHandler
if self.quiet:
class QuietHandler(WSGIRequestHandler):
def log_request(self, *args, **kw):
@ -17,8 +17,6 @@ class Server(ServerAdapter):
def stop(self):
self.server.shutdown()
server = Server(host="0.0.0.0", port=8080)
@route('/departures')
def index():
resp = []
@ -29,14 +27,18 @@ def index():
@get("/")
def static():
return static_file("index.html", root="static")
return static_file("index.html", root="static")
@error(404)
def error404(error):
def error404(err):
return ''
def start():
run(quiet=True, server=server)
class API:
thread = threading.Thread(target=start)
thread.start()
def __init__(self, main):
self.server = Server(host=main.config["http"]["host"], port=main.config["http"]["port"])
self.thread = threading.Thread(target=self.start)
self.thread.start()
def start(self):
run(quiet=True, server=self.server)

View file

@ -1,13 +1,6 @@
from requests.structures import CaseInsensitiveDict
import json
import requests
from dateutil import parser
from datetime import datetime
from lora import lora_controller
from math import floor
from datetime import datetime
from dateutil import parser
class Departure:
@ -33,43 +26,8 @@ class Departure:
remove.append(did)
for did in remove:
Departure.storage.pop(did)
@staticmethod
def fetch(stop_id, limit):
url = "https://jizdnirady.pmdp.cz/odjezdy/vyhledat"
headers = CaseInsensitiveDict()
headers["Content-Type"] = "application/json"
data = {
"Stop": {
"StopId": stop_id
},
"DateAndTime": None,
"MaxResults": limit,
"FullResults": False
}
resp = requests.post(url, headers=headers, data=json.dumps(data), timeout=100).json()
for c in resp:
did = f"{stop_id}|{abs(c['ConnectionId']['ConnectionId'])}"
if did not in Departure.storage:
Departure(
did,
c["Line"]["TractionType"],
c["Line"]["Name"],
c["LastStopName"],
c["DepartureTime"],
0 if not c["DelayMin"] else c["DelayMin"]
)
else:
Departure.storage[did].update(
0 if not c["DelayMin"] else c["DelayMin"]
)
def __init__(self, did, type, line, last_stop, departure, delay):
def __init__(self, did, type, line, last_stop, departure, delay, lora_controller):
departure = (parser.parse(departure)).timestamp()
if -(datetime.now().timestamp() - (departure + delay*60))/60 <= -1:
return
@ -83,11 +41,12 @@ class Departure:
self.last_stop = last_stop
self.departure = departure
self.delay = delay
lora_controller.data(self)
self.controller = lora_controller
self.controller.data(self)
def update(self, delay):
if delay != self.delay:
lora_controller.data(self)
self.controller.data(self)
self.delay = delay
def get_departure(self):

View file

@ -1,6 +1,5 @@
import requests
from requests.structures import CaseInsensitiveDict
import config
import json
import threading
from time import sleep
@ -12,27 +11,29 @@ urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
class LoraController:
def __init__(self):
def __init__(self, main):
self.main = main
self.storage = dict()
self.devices = []
# TODO: create separated message pool for each device
self.message_pool = []
self.thread = None
self.token = ""
def generate_token(self):
url = f"https://lora.plzen.eu/api/v2/login"
url = "https://lora.plzen.eu/api/v2/login"
headers = CaseInsensitiveDict()
headers["Content-Type"] = "application/json"
data = {
"email": config.lora_api_username,
"password": config.lora_api_password
"email": self.main.config["lora_api"]["username"],
"password": self.main.config["lora_api"]["password"]
}
data = requests.post(url, verify=False, headers=headers, data=json.dumps(data)).json()
config.lora_api_token = data["token"]
self.token = data["token"]
def new(self, id):
self.devices.append(LoraDevice(self, id))
@ -55,14 +56,14 @@ class LoraController:
def thread_sending(self):
while True:
if not len(self.message_pool):
if len(self.message_pool) == 0:
break
data = self.message_pool.pop(0)
url = f"https://lora.plzen.eu/api/v2/nodes/{data[0]:0>16x}/queue"
string = data[2]()
headers = CaseInsensitiveDict()
headers["Content-Type"] = "application/json"
headers["Authorization"] = f"Bearer {config.lora_api_token}"
headers["Authorization"] = f"Bearer {self.token}"
payload = {
"confirmed": True,
"data": b64encode(string.encode("utf-8")).decode("ascii"),
@ -81,9 +82,4 @@ class LoraDevice:
def send(self, msg):
self.controller.send(self.id, self.port+1, msg)
self.port = (self.port + 1) % 15
lora_controller = LoraController()
lora_controller.new(0xbdea85badeedf1)
self.port = (self.port + 1) % 15

View file

@ -1,18 +1,67 @@
from departures import Departure
from requests.structures import CaseInsensitiveDict
import json
import requests
from time import sleep
from lora import lora_controller
from lora import LoraController
import threading
from api import server
from api import API
from pathlib import Path
import yaml
import sys
class MainLoop:
class Main:
def __init__(self, stop_id, controller):
def __init__(self, stop_id):
config = Path("config.yml")
try:
self.config = yaml.safe_load(config.read_text(encoding="utf-8-sig"))
except:
print("Invalid config file!")
sys.exit(-1)
self.ended = False
self.stop_id = stop_id
self.controller = controller
lora_controller = LoraController(self)
lora_controller.new(0xbdea85badeedf1)
self.controller = lora_controller
self.thread = threading.Thread(target=self.update_loop)
self.thread.start()
self.api = API(self)
def fetch(self, stop_id, limit):
url = "https://jizdnirady.pmdp.cz/odjezdy/vyhledat"
headers = CaseInsensitiveDict()
headers["Content-Type"] = "application/json"
data = {
"Stop": {
"StopId": stop_id
},
"DateAndTime": None,
"MaxResults": limit,
"FullResults": False
}
resp = requests.post(url, headers=headers, data=json.dumps(data), timeout=100).json()
for c in resp:
did = f"{stop_id}|{abs(c['ConnectionId']['ConnectionId'])}"
if did not in Departure.storage:
Departure(
did,
c["Line"]["TractionType"],
c["Line"]["Name"],
c["LastStopName"],
c["DepartureTime"],
0 if not c["DelayMin"] else c["DelayMin"],
self.controller
)
else:
Departure.storage[did].update(
0 if not c["DelayMin"] else c["DelayMin"]
)
def update_loop(self):
refetch = 0
@ -27,7 +76,7 @@ class MainLoop:
if refetch == 0:
self.controller.time()
Departure.fetch(self.stop_id, 20)
self.fetch(self.stop_id, 20)
refetch = (refetch + 1) % 3
regenerate = (regenerate + 1) % (6*30)
@ -36,14 +85,14 @@ class MainLoop:
Departure.clear()
for i in range(10):
for _ in range(10):
sleep(1)
if self.ended:
break
def stop(self):
print("Stopping...")
server.stop()
self.api.server.stop()
self.ended = True
self.controller.message_pool = []
@ -70,5 +119,5 @@ class MainLoop:
except KeyboardInterrupt:
self.stop()
main_loop = MainLoop("40", lora_controller)
main_loop.input_loop()
main = Main("40")
main.input_loop()