mirror of
https://github.com/This-weiyuqing/mi-fitness-health.git
synced 2026-10-17 18:55:37 +08:00
47 lines
2.8 KiB
Python
47 lines
2.8 KiB
Python
"""本机界面验收用合成数据,不连接 NAS 或小米云。"""
|
|
import datetime as dt
|
|
import logging
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
root=Path(__file__).resolve().parents[2]
|
|
sys.path.insert(0,str(root/'work/mi-fitness-mcp-cn/src'))
|
|
from flask import jsonify,request
|
|
from mi_fitness_mcp.web import create_app
|
|
|
|
logging.getLogger('werkzeug').disabled=True
|
|
app=create_app(backend_url='http://127.0.0.1:1')
|
|
app.config['TEMPLATES_AUTO_RELOAD']=True
|
|
days=[dt.date(2026,9,18)+dt.timedelta(days=i) for i in range(30)]
|
|
fixtures={'summary':[],'sleep':[],'heart-rate':[],'spo2':[],'stress':[], 'workouts':[], 'body-measurements':[], 'abnormal-heart-beat':[]}
|
|
for i,day in enumerate(days):
|
|
key=day.isoformat()
|
|
fixtures['summary'].append({'date':key,'steps':3500+i*173%7000,'distance_m':3000+i*101,'active_kcal':300+i*11})
|
|
if i<29:
|
|
minutes=390+i*17%160
|
|
fixtures['sleep'].append({'start_at':f'{day-dt.timedelta(days=1)}T23:10:00+08:00','end_at':key+'T07:20:00+08:00','time_asleep_minutes':minutes,'duration_minutes':minutes,'time_awake_minutes':12,'sleep_score':80+i%9,'is_nap':False,'stages':[{'stage':'deep','minutes':120+i%25},{'stage':'light','minutes':minutes-210-i%25},{'stage':'rem','minutes':90}]})
|
|
fixtures['heart-rate'].append({'timestamp':key+'T08:00:00+08:00','bpm':55+i%17,'sample_type':'resting'})
|
|
for j in range(300):
|
|
time=(dt.datetime.combine(day,dt.time(9))+dt.timedelta(minutes=j)).isoformat()+'+08:00'
|
|
fixtures['heart-rate'].append({'timestamp':time,'bpm':60+(i+j)%35,'sample_type':'passive'})
|
|
if j%4==0:fixtures['spo2'].append({'timestamp':time,'spo2_pct':95+j%5})
|
|
if j%3==0:fixtures['stress'].append({'timestamp':time,'stress_score':j%60,'level':'low' if j%60<30 else 'medium'})
|
|
fixtures['body-measurements']=[{'timestamp':'2026-10-15T09:33:00+08:00','weight_kg':87.3,'bmi':28.2,'body_fat_pct':26.3,'muscle_mass_kg':69.8,'water_pct':51.7,'bone_mass_kg':3.4}]
|
|
|
|
@app.before_request
|
|
def fixture():
|
|
if request.path=='/api/proxy_status':return jsonify({'backend_reachable':True,'backend_latency_ms':2})
|
|
if request.path.startswith('/proxy/api/'):
|
|
rows=fixtures.get(request.path.rsplit('/',1)[-1],[])
|
|
lo,hi=request.args.get('start_date',''),request.args.get('end_date','9999')
|
|
rows=[r for r in rows if lo<=str(r.get('date') or r.get('timestamp') or r.get('end_at') or r.get('start_at'))[:10]<=hi]
|
|
sample=request.args.get('sample_type')
|
|
if sample:rows=[r for r in rows if r.get('sample_type')==sample]
|
|
level=request.args.get('level')
|
|
if level:rows=[r for r in rows if r.get('level')==level]
|
|
if request.args.get('latest_only')=='true':rows=rows[-1:]
|
|
if request.args.get('limit'):rows=rows[:int(request.args['limit'])]
|
|
return jsonify({'status':'ok','count':len(rows),'data':rows})
|
|
|
|
app.run(host='127.0.0.1',port=18364,debug=False,use_reloader=False)
|