Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dd28b7c32a | ||
|
|
83bf38b530 | ||
|
|
b33329b523 | ||
|
|
81e0d96b06 | ||
|
|
58585b5a10 | ||
|
|
3cc257cdec | ||
|
|
d82914deaf | ||
|
|
04761568d7 | ||
|
|
c3e7d86a47 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -113,3 +113,6 @@ dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# VSCode workspace
|
||||
*.code-workspace
|
||||
|
||||
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@@ -0,0 +1 @@
|
||||
Flask==2.2.1
|
||||
93
src/api/node.py
Normal file
93
src/api/node.py
Normal file
@@ -0,0 +1,93 @@
|
||||
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 = []
|
||||
|
||||
self.temperature_minimum = 1000
|
||||
self.temperature_maximum = -1000
|
||||
|
||||
self.humidity_minimum = 100
|
||||
self.humidity_maximum = 0
|
||||
|
||||
def add_temperature_reading(self, temperature: float):
|
||||
self.temperature_readings.append((temperature, time()))
|
||||
|
||||
if temperature > self.temperature_maximum:
|
||||
self.temperature_maximum = temperature
|
||||
|
||||
if temperature < self.temperature_minimum:
|
||||
self.temperature_minimum = temperature
|
||||
|
||||
def add_humidity_reading(self, humidity: float):
|
||||
self.humidity_readings.append((humidity, time()))
|
||||
|
||||
if humidity > self.humidity_maximum:
|
||||
self.humidity_maximum = humidity
|
||||
|
||||
if humidity < self.humidity_minimum:
|
||||
self.humidity_minimum = humidity
|
||||
|
||||
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 get_min_temperature(self) -> float:
|
||||
return self.temperature_minimum
|
||||
|
||||
def get_max_temperature(self) -> float:
|
||||
return self.temperature_maximum
|
||||
|
||||
def get_min_humidity(self) -> float:
|
||||
return self.humidity_minimum
|
||||
|
||||
def get_max_humidity(self) -> float:
|
||||
return self.humidity_maximum
|
||||
|
||||
|
||||
def node_register(request: request, state: dict) -> str:
|
||||
state["max_id"] += 1
|
||||
id = state["max_id"]
|
||||
|
||||
request_json = request.get_json()
|
||||
|
||||
name = request_json.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"
|
||||
35
src/main.py
Normal file
35
src/main.py
Normal file
@@ -0,0 +1,35 @@
|
||||
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 home():
|
||||
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 (Minimum: {node.get_min_temperature()}C, Maximum: {node.get_max_temperature()}C)<br>"
|
||||
out += f"Humidity: {most_recent_humidity[0]}% (Minimum: {node.get_min_humidity()}%, Maximum: {node.get_max_humidity()}%)<br>"
|
||||
|
||||
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