109 lines
2.8 KiB
Python
109 lines
2.8 KiB
Python
from fastapi.responses import HTMLResponse, JSONResponse
|
|
from fastapi import APIRouter
|
|
|
|
from datetime import datetime
|
|
import os
|
|
import csv
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
file_path = "bettwaage.csv"
|
|
|
|
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", encoding="UTF-8") as fp:
|
|
fp.write(line)
|
|
|
|
|
|
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("/file", tags=["file"])
|
|
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(tl, zero_values[1], scale_values[1])
|
|
bl = convert_to_weight(tl, zero_values[2], scale_values[2])
|
|
br = convert_to_weight(tl, zero_values[3], scale_values[3])
|
|
|
|
sum = tl + tr + bl + br
|
|
add_line_to_history(f"{str(datetime.now())};{tl};{tr};{bl};{br};{sum};")
|
|
|
|
|
|
@router.post("/latest")
|
|
async def get_latest():
|
|
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.post("/delete", tags=["file"])
|
|
async def delete_file():
|
|
os.remove(file_path)
|
|
|
|
|
|
@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
|
|
|
|
|
|
@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]
|
|
|
|
|
|
if not os.path.exists(file_path):
|
|
add_line_to_history("timestamp;tl;tr;bl;br;total;")
|