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