You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.2 KiB
113 lines
3.2 KiB
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)
|