from fastapi.responses import HTMLResponse, JSONResponse from fastapi import APIRouter from datetime import datetime import os import csv router = APIRouter() file_path = "bettwaage.csv" header = "timestamp;tl;tr;bl;br;total;" latest_values = [] zero_values = [0, 0, 0, 0] scale_values = [1, 1, 1, 1] def add_line_to_history(line: str) -> None: with open(file_path, "a") as fp: fp.write(line + "\n") def convert_to_weight(value: int, zero_value: int, scale: float) -> float: return (value - zero_value) * scale @router.get("/file", tags=["file"]) async def get_file(): with open(file_path, "r", encoding="UTF-8") as fp: return HTMLResponse("\n".join(fp.readlines())) @router.get("/history") async def get_history(count: int = None) -> []: points = [] with open(file_path, "r", encoding="UTF-8") as fp: reader = csv.DictReader(fp, delimiter=";") for row in reader: if not row: continue points.append( { "timestamp": row["timestamp"], "total": float(row["total"]), "tl": float(row["tl"]), "tr": float(row["tr"]), "bl": float(row["bl"]), "br": float(row["br"]), } ) if count: return points[-count] else: return points @router.post("/add") async def add_weight(tl: int, tr: int, bl: int, br: int): global latest_values latest_values = [tl, tr, bl, br] tl = convert_to_weight(tl, zero_values[0], scale_values[0]) tr = convert_to_weight(tr, zero_values[1], scale_values[1]) bl = convert_to_weight(bl, zero_values[2], scale_values[2]) br = convert_to_weight(br, zero_values[3], scale_values[3]) sum = tl + tr + bl + br add_line_to_history(f"{str(datetime.now())};{tl};{tr};{bl};{br};{sum};") return "Added data" @router.get("/latest") async def get_latest(): if not latest_values: return HTMLResponse(status_code=200, content="No data given yet") total = sum(latest_values) return JSONResponse( { "tl": latest_values[0], "tr": latest_values[1], "bl": latest_values[2], "br": latest_values[3], "total": total, } ) @router.delete("/delete", tags=["file"]) async def delete_file(): os.remove(file_path) add_line_to_history(header) return "Deleted file and created new file with headers" @router.post("/zero", tags=["calibration"]) async def set_zero(): if not latest_values: return HTMLResponse( status_code=400, content="Requiring data before setting zeros." ) global zero_values zero_values = latest_values return "Set zeroes to: " + " | ".join(str(v) for v in zero_values) @router.post("/scales", tags=["calibration"]) async def set_scales(tl: float, tr: float, bl: float, br: float): global scale_values scale_values = [tl, tr, bl, br] return "Set scales to: " + " | ".join(str(v) for v in scale_values) if not os.path.exists(file_path): add_line_to_history(header)