2 changed files with 116 additions and 0 deletions
@ -0,0 +1,3 @@ |
|||
python -m venv .venv |
|||
.venv\Scripts\activate |
|||
pip install flask |
|||
@ -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) |
|||
Loading…
Reference in new issue