Browse Source

api server WIP

master
Jakub Škrabánek 3 weeks ago
parent
commit
5ba2ea7d7f
  1. 3
      14_api_server/poznamky.txt
  2. 113
      14_api_server/server.py

3
14_api_server/poznamky.txt

@ -0,0 +1,3 @@
python -m venv .venv
.venv\Scripts\activate
pip install flask

113
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)
Loading…
Cancel
Save