Updated server

This commit is contained in:
Filip Znachor 2022-11-16 14:51:20 +01:00
parent 549792e2b6
commit 7f6cb1b950
4 changed files with 134 additions and 35 deletions

3
.gitignore vendored
View file

@ -1 +1,2 @@
config.py
config.py
*.pyc

View file

@ -3,24 +3,36 @@
from requests.structures import CaseInsensitiveDict
import json
import requests
from time import sleep
from dateutil import parser
from datetime import datetime
from lora import DeviceController
from math import floor
class Departure:
id_pool = []
storage = dict()
@staticmethod
def get_id():
i = 0
while True:
i += 1
if i not in Departure.id_pool:
Departure.id_pool.append(i)
return i
@staticmethod
def clear():
remove = []
for did in Departure.storage:
d = Departure.storage[did]
if -(datetime.now().timestamp() - (d.departure + d.delay*60))/60 <= -1:
if d.get_departure() < -35:
Departure.id_pool.remove(d.id)
remove.append(did)
for did in remove:
Departure.storage.pop(did)
@staticmethod
def fetch(stop_id, limit):
@ -49,49 +61,35 @@ class Departure:
c["Line"]["Name"],
c["LastStopName"],
c["DepartureTime"],
c["DelayMin"]
0 if not c["DelayMin"] else c["DelayMin"]
)
else:
Departure.storage[did].update(
c["DelayMin"]
0 if not c["DelayMin"] else c["DelayMin"]
)
def __init__(self, id, line, last_stop, departure, delay):
Departure.storage[id] = self
self.id = id
def __init__(self, did, line, last_stop, departure, delay):
departure = (parser.parse(departure)).timestamp()
if -(datetime.now().timestamp() - (departure + delay*60))/60 <= -1:
return
Departure.storage[did] = self
self.did = did
self.id = Departure.get_id()
self.line = line
self.last_stop = last_stop
self.departure = (parser.parse(departure)).timestamp()
self.departure = departure
self.update(delay)
DeviceController.data(self)
def update(self, delay):
if not delay:
delay = 0
self.delay = delay
#DeviceController.data(self)
def get_departure(self):
departure = -round(((datetime.now().timestamp() - (self.departure + self.delay*60))/60)*10)
return departure
def __repr__(self):
departure = -round((datetime.now().timestamp() - (self.departure + self.delay*60))/60)
return f"{self.id:<15} {self.line:<2} {self.last_stop:<30} {departure if departure > 0 else '<1':>3}"
refetch = 0
while True:
print("")
for did in Departure.storage:
print(Departure.storage[did])
sleep(1)
if refetch == 0:
Departure.fetch("40", 5)
refetch = (refetch + 1) % 10
sleep(1)
Departure.clear()
sleep(1)
return f"{self.id}|{self.line}|{self.last_stop}|{floor(self.get_departure()/10)}"
# {'ConnectionId': {'ConnectionId': -302285, 'InTraffic': True, 'BoardingStopIndex': None, 'GettingOffStopIndex': None}, 'Line': {'Name': '30', 'Number': 445030, 'TractionType': 3, 'IsBarrierFree': True, 'IsNightConnection': False}, 'DepartureTime': '2022-11-14T21:55:00+01:00', 'LastStopName': 'Sídliště Košutka', 'DelayMin': 0, 'LeavingInMin': 0, 'Stops': None, 'QuickMessageIds': []}

74
server/lora.py Normal file
View file

@ -0,0 +1,74 @@
import requests
from requests.structures import CaseInsensitiveDict
import config
import json
from time import sleep
from base64 import b64encode
class LoraDevice:
@staticmethod
def generate_token():
url = f"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
}
data = requests.post(url, verify=False, headers=headers, data=json.dumps(data)).json()
config.lora_api_token = data["token"]
def __init__(self, deveui: int):
self.id = deveui
def send(self, msg: str):
url = f"https://lora.plzen.eu/api/v2/nodes/{self.id:0>16x}/queue"
print(f"Sending {msg}")
headers = CaseInsensitiveDict()
headers["Content-Type"] = "application/json"
headers["Authorization"] = f"Bearer {config.lora_api_token}"
data = {
"confirmed": True,
"data": b64encode(msg.encode("utf-8")).decode("ascii"),
"fPort": 1,
"reference": "string"
}
data = requests.post(url, verify=False, headers=headers, data=json.dumps(data))
sleep(3)
dev = LoraDevice(0xbdea85badeedf1)
class DeviceController:
storage = dict()
@staticmethod
def data(data):
send = False
if data.id in DeviceController.storage:
d = DeviceController.storage[data.id]
if data.line != d["line"] or data.last_stop != d["last_stop"] or data.delay != d["delay"]:
send = True
else:
send = True
DeviceController.storage[data.id] = {
'line': data.line,
'last_stop': data.last_stop,
'delay': data.delay
}
if not send:
return
string = f"{data.id}|{data.line}|{data.last_stop}|{data.get_departure()}"
dev.send(f"{string}\n")

26
server/main.py Normal file
View file

@ -0,0 +1,26 @@
from departures import Departure
from time import sleep
from lora import LoraDevice
refetch = 0
LoraDevice.generate_token()
while True:
if refetch == 0:
Departure.fetch("40", 10)
refetch = (refetch + 1) % 10
sleep(.1)
Departure.clear()
sleep(.1)
print("")
for did in Departure.storage:
print(Departure.storage[did])
sleep(3)