Compare commits

9 Commits
main ... dev

Author SHA1 Message Date
James H
dd28b7c32a correct min max for humidity 2022-08-08 22:48:29 +01:00
James H
83bf38b530 Lazy use br instead of newline 2022-08-08 22:47:27 +01:00
James H
b33329b523 Show min max 2022-08-08 22:44:12 +01:00
James H
81e0d96b06 Don't show readings list 2022-08-08 22:08:38 +01:00
James H
58585b5a10 Read name properly 2022-08-08 22:06:51 +01:00
James H
3cc257cdec Rename home 2022-08-08 22:04:41 +01:00
James H
d82914deaf Initial server 2022-08-08 22:02:28 +01:00
James H
04761568d7 Add flask requirement 2022-08-08 19:23:03 +01:00
James H
c3e7d86a47 Update gitignore 2022-08-08 19:22:53 +01:00
4 changed files with 132 additions and 0 deletions

3
.gitignore vendored
View File

@@ -113,3 +113,6 @@ dmypy.json
# Pyre type checker # Pyre type checker
.pyre/ .pyre/
# VSCode workspace
*.code-workspace

1
requirements.txt Normal file
View File

@@ -0,0 +1 @@
Flask==2.2.1

93
src/api/node.py Normal file
View 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
View 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)