Initial server
This commit is contained in:
60
src/api/node.py
Normal file
60
src/api/node.py
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
from flask import abort, request
|
||||||
|
from time import time
|
||||||
|
|
||||||
|
class Node:
|
||||||
|
def __init__(self, id: int, name: str):
|
||||||
|
self.id = id
|
||||||
|
self.name = name
|
||||||
|
self.temperature_readings = []
|
||||||
|
self.humidity_readings = []
|
||||||
|
|
||||||
|
def add_temperature_reading(self, temperature: float):
|
||||||
|
self.temperature_readings.append((temperature, time()))
|
||||||
|
|
||||||
|
def add_humidity_reading(self, humidity: float):
|
||||||
|
self.humidity_readings.append((humidity, time()))
|
||||||
|
|
||||||
|
def get_temperature_readings(self) -> list[tuple[float, float]]:
|
||||||
|
return self.temperature_readings
|
||||||
|
|
||||||
|
def get_humidity_readings(self)-> list[tuple[float, float]]:
|
||||||
|
return self.humidity_readings
|
||||||
|
|
||||||
|
def get_name(self) -> str:
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
def set_name(self, name: str):
|
||||||
|
self.name = name
|
||||||
|
|
||||||
|
def node_register(request: request, state: dict) -> str:
|
||||||
|
state["max_id"] += 1
|
||||||
|
id = state["max_id"]
|
||||||
|
|
||||||
|
name = request.form.get("name")
|
||||||
|
if name is None:
|
||||||
|
name = request.remote_addr
|
||||||
|
|
||||||
|
state["nodes"][f"{id}"] = Node(id, name)
|
||||||
|
|
||||||
|
return f"{id}"
|
||||||
|
|
||||||
|
def node_reading(id: int, request: request, state: dict) -> str:
|
||||||
|
node = state["nodes"].get(f"{id}")
|
||||||
|
if node is None:
|
||||||
|
abort(403)
|
||||||
|
|
||||||
|
request_json = request.get_json()
|
||||||
|
|
||||||
|
temperature = request_json.get("temperature")
|
||||||
|
humidity = request_json.get("humidity")
|
||||||
|
|
||||||
|
if temperature is None and humidity is None:
|
||||||
|
abort(400)
|
||||||
|
|
||||||
|
if temperature is not None:
|
||||||
|
node.add_temperature_reading(temperature)
|
||||||
|
|
||||||
|
if humidity is not None:
|
||||||
|
node.add_humidity_reading(humidity)
|
||||||
|
|
||||||
|
return "OK"
|
||||||
38
src/main.py
Normal file
38
src/main.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
from re import L
|
||||||
|
from flask import Flask, request
|
||||||
|
|
||||||
|
from api.node import node_reading, node_register
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
state = {
|
||||||
|
"nodes": {},
|
||||||
|
"max_id": 0
|
||||||
|
}
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def test():
|
||||||
|
out = ""
|
||||||
|
for node in state["nodes"].values():
|
||||||
|
most_recent_temperature = node.get_temperature_readings()[-1]
|
||||||
|
most_recent_humidity = node.get_humidity_readings()[-1]
|
||||||
|
|
||||||
|
out += f"<h2>{node.get_name()}</h2>\n"
|
||||||
|
out += f"Temperature: {most_recent_temperature[0]}C Humidity: {most_recent_humidity[0]}%\n"
|
||||||
|
out += "<h3>Temperature Readings</h3>\n"
|
||||||
|
out += f"{json.dumps(node.get_temperature_readings())}\n"
|
||||||
|
out += "<h3>Humidity Readings</h3>\n"
|
||||||
|
out += f"{json.dumps(node.get_humidity_readings())}\n"
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
# API functions
|
||||||
|
@app.route("/api/register", methods=["POST"])
|
||||||
|
def route_api_register():
|
||||||
|
return node_register(request, state)
|
||||||
|
|
||||||
|
@app.route("/api/<int:node_id>/reading", methods=["POST"])
|
||||||
|
def route_api_reading(node_id: int):
|
||||||
|
return node_reading(node_id, request, state)
|
||||||
Reference in New Issue
Block a user