From 5ba2ea7d7f09b6920cc2d8d733f043b2b0e23120 Mon Sep 17 00:00:00 2001 From: KubMakCZ Date: Wed, 25 Mar 2026 09:46:57 +0100 Subject: [PATCH] api server WIP --- 14_api_server/poznamky.txt | 3 + 14_api_server/server.py | 113 +++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 14_api_server/poznamky.txt create mode 100644 14_api_server/server.py diff --git a/14_api_server/poznamky.txt b/14_api_server/poznamky.txt new file mode 100644 index 0000000..9833659 --- /dev/null +++ b/14_api_server/poznamky.txt @@ -0,0 +1,3 @@ +python -m venv .venv +.venv\Scripts\activate +pip install flask \ No newline at end of file diff --git a/14_api_server/server.py b/14_api_server/server.py new file mode 100644 index 0000000..d6563ab --- /dev/null +++ b/14_api_server/server.py @@ -0,0 +1,113 @@ +from flask import Flask, jsonify, request +from datetime import datetime, timedelta +import random + +app = Flask(__name__) + +# "Databáze" v paměti +mereni_db = [] +next_id = 1 + +def generuj_mereni(cas=None): + global next_id + mereni = { + "id": next_id, + "cas": cas or datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "teplota": round(random.uniform(19.0,30.0),1), + "vlhkost": round(random.uniform(35.0,75.0),1) + } + next_id += 1 + mereni_db.append(mereni) + return mereni + +def naplnit_historii(pocet=50): + ted = datetime.now() + for i in range(pocet, 0, -1): + cas = (ted - timedelta(seconds=i*5)).strftime("%Y-%m-%d %H:%M:%S") + generuj_mereni(cas) + +naplnit_historii(50) + +# API Endpointy + +@app.route("/") +def index(): + """Hlavní stránka - info o API""" + return jsonify({ + "nazev":"Fake IoT API Server", + "popis": "Simulace IoT zařízení", + "endpointy":{ + "GET /api/mereni": "Poslední měření (+ ?novy=true pro generovani noveho)", + "GET /api/mereni/historie": "Historie meření (?pocet=50)", + "GET /api/stats": "Statistiky", + "POST /api/mereni": "Příjem nového měření (JSON: teplota, vlhkost)" + } + }) + +@app.route("/api/mereni", methods=["GET"]) +def get_mereni(): + """ + Vrátí poslední měření + ?novy=true -> vygeneruje nové nahodné měření + """ + if request.args.get("novy") == "true": + nove = generuj_mereni() + return jsonify(nove),201 + + if mereni_db: + return jsonify(mereni_db[-1]) + return jsonify({"chyba":"Zadna data"}),404 + +@app.route("/api/mereni/historie",methods=["GET"]) +def get_historie(): + """Vrátí posledních N měření. Default = 50""" + pocet = request.args.get("pocet",50,type=int) + data = mereni_db[-pocet:] + return jsonify({ + "pocet":len(data), + "mereni":data + }) + +@app.route("/api/stats",methods=["GET"]) +def get_stats(): + """Vrátí statistiky - prumer, min, max""" + if not mereni_db: + return jsonify({"chyba":"Zadne data"}), 404 + teploty = [m["teplota"] for m in mereni_db] + vlhkosti = [m["vlhkost"] for m in mereni_db] + + return jsonify({ + "pocet_mereni": len(mereni_db), + "teplota": { + "prumer": round(sum(teploty)/len(teploty),1), + "min": min(teploty), + "max": max(teploty), + }, + "vlhost": { + "prumer": round(sum(vlhkosti)/len(vlhkosti),1), + "min": min(vlhkosti), + "max": max(vlhkosti), + } + }) + +@app.route("/api/mereni",methods=["POST"]) +def post_mereni(): + data = request.get_json() + + return jsonify({"status":"ok","mereni":"(data)"}) + + +# SPUŠTĚTNÍ +if __name__ == "__main__": + print("-"*50) + print("Fake API Server") + print("http://localhost:5001") + print(" Data v paměti, po vypnutí data zmizí") + print("-"*50) + print("Endpointy:") + print("GET /api/mereni - posledni mereni") + print("GET /api/mereni?novy=true - nove mereni") + print("GET /api/mereni/historie - historie(?pocet=50)") + print("GET /api/stats - Statistiky") + print("POST /api/mereni - příjem dat (JSON)") + app.run(host="0.0.0.0",port=5001,debug=True) \ No newline at end of file