Updated server
This commit is contained in:
parent
549792e2b6
commit
7f6cb1b950
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1 +1,2 @@
|
|||
config.py
|
||||
config.py
|
||||
*.pyc
|
||||
|
|
|
@ -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
74
server/lora.py
Normal 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
26
server/main.py
Normal 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)
|
Loading…
Reference in a new issue