一个基于 Nightscout 的智能血糖监控系统,提供血糖数据可视化、AI 智能分析、血糖预测、治疗方案管理和风险预警功能。
- 实时血糖数据:从 Nightscout API 获取实时血糖数据
- 数据可视化:交互式血糖趋势图表和数据表格
- 历史数据:支持查看 1-90 天的历史数据
- 统计分析:平均血糖、目标范围内比例、变异系数、糖化血红蛋白估算
- 详细报表:包含餐前餐后血糖的完整分析报告
- 指尖血糖数据:支持同时显示CGM数值和指尖血糖数值对比
- 智能餐后计算:基于实际餐食时间计算餐后2小时血糖值
- 打印支持:优化的打印样式,方便保存和分享
- 实时预测:基于当前血糖值和趋势变化进行30分钟血糖预测
- 趋势分析:显示预测趋势(快速/慢速/上升/下降/平稳)和血糖变化范围
- 置信度评估:提供预测结果的置信度评分(0-100%)
- 风险预警:根据预测结果评估低血糖风险等级
- 算法优化:使用基于当前血糖值的趋势外推算法,提高预测准确性
- 自动更新:页面加载时自动执行预测,支持手动重新预测
- 药物治疗配置:支持添加和管理多种口服降糖药物
- 胰岛素治疗:支持胰岛素治疗方案配置,包括剂量和频次设置
- 餐食记录:自动同步和显示餐食数据,包含碳水化合物、蛋白质、脂肪分析
- 运动记录:自动识别和记录运动数据,支持运动类型和时长统计
- 营养分析:基于餐食记录提供营养成分摄入分析
- 治疗方案整合:AI分析时综合考虑用户的治疗方案提供个性化建议
- 实时风险评估:基于血糖预测结果进行低血糖风险评估
- 多级预警:支持高风险、中等风险、低风险三个预警级别
- 预警通知:在页面顶部显示醒目的预警横幅,支持邮件/短信/微信预警
- 智能分析:基于 AI 模型的深度血糖数据分析
- 个性化建议:结合治疗方案提供饮食、运动和生活建议
- AI咨询:支持用户与AI进行血糖管理相关的实时咨询
- 多模型支持:支持 OpenAI、Ollama 等多种AI服务
- 上下文感知:AI分析时综合考虑血糖数据、治疗方案、餐食记录等信息
- 专业指导:模拟专业内分泌科医生提供医学建议
- 统一收件箱:所有AI生成的分析报告和咨询建议自动归档
- 未读提醒:主页按钮显示未读消息数量,确保重要信息不遗漏
- 消息管理:支持标记已读、收藏、删除等管理功能
- 分类展示:消息按类型分类,方便查找和阅读
- 快速访问:一键直达消息中心,查看历史记录
- 浏览器通知:实时 Web Push 推送通知
- 邮件通知:定时发送血糖分析报告和预警信息
- PWA 支持:可安装为桌面/移动应用,支持离线使用
- 通知管理:用户可自定义通知方式和频率
- Web配置界面:直观友好的配置管理页面
- 治疗方案配置:完整的药物治疗和胰岛素治疗配置
- 预警配置:灵活的预警阈值和通知方式设置
- AI服务配置:支持多种AI服务的配置和测试
- 安全访问:支持为整个应用设置密码保护
- 定时任务:自动数据同步、分析和通知
- 基于当前血糖值:使用最新的实时血糖值作为预测起点
- 趋势外推:基于最近5-10个数据点的变化趋势进行预测
- 多时间点预测:生成未来30分钟内多个时间点的预测值(每5分钟一个)
- 置信度计算:基于数据点数量和趋势一致性计算预测置信度
- 数据要求优化:最少只需10个有效数据点,支持1-7天时间范围
- 多源数据同步:同时同步血糖数据、治疗数据、运动数据、指尖血糖数据
- 智能识别:从治疗数据中自动识别运动记录和指尖血糖测量
- 数据关联:将餐食记录与餐后血糖数据进行智能关联分析
- 冲突处理:处理数据冲突和重复记录,确保数据准确性
- 移动优先:完美适配手机、平板和桌面设备
- 现代化界面:使用Bootstrap 5和Chart.js构建现代化用户界面
- 无障碍支持:支持键盘导航和屏幕阅读器
- 性能优化:优化的加载速度和交互体验
- 克隆项目
git clone https://github.com/flyhunterl/glucose-buddy.git
cd glucose-buddy
- 配置应用
- 复制配置文件模板:
cp config.toml.example config.toml
- 编辑
config.toml
文件,配置 Nightscout 连接、AI 服务等信息
- 快速启动
# 使用快速启动脚本(推荐)
chmod +x quick-start.sh
./quick-start.sh
# 或手动启动所有服务
docker-compose up -d
注意:如果遇到 Docker Compose 版本问题,请查看 故障排除指南。
- 访问应用
- 打开浏览器访问:http://localhost:1338
- 首次访问会自动初始化数据库和配置
- 环境要求
- Python 3.9+
- pip
- aiohttp
- 安装依赖
pip install -r requirements.txt
- 启动应用
python app.py
- 访问应用
- 打开浏览器访问:http://localhost:1338
- API 地址:您的 Nightscout 网站地址(如:
https://yournightscout.herokuapp.com
) - API 密钥:如果需要认证(通常不需要)
- 时区偏移:相对于 UTC 的小时数(中国为+8)[硬编写了shanghai时区]
- API 地址:AI 服务的 API 地址
- OpenAI:
https://api.openai.com/v1/chat/completions
- Ollama:
http://localhost:11434/v1/chat/completions
- OpenAI:
- 模型名称:使用的 AI 模型(如:
gpt-4
,claude-3-sonnet-20240229
,llama3
) - API 密钥:认证密钥(OpenAI需要,Ollama不需要)
- 药物治疗:添加口服降糖药物信息,用于AI分析参考
- 胰岛素治疗:配置胰岛素使用情况,包括剂量和频次
- 支持预设频次:每日一次、每日两次、每日三次、每日四次
- 支持自定义频次设置
- 剂量单位:国际单位(IU)
- 高风险阈值:默认70 mg/dL (3.9 mmol/L)
- 中等风险阈值:默认80 mg/dL (4.4 mmol/L)
- 预警开关:可独立控制预警功能的启用状态
- 通知方式:支持浏览器通知和邮件通知
- SMTP 服务器:邮件服务器地址(如:
smtp.gmail.com
、smtp.exmail.qq.com
) - 端口:支持 587 (TLS) 或 465 (SSL),自动检测连接类型
- 认证信息:邮箱用户名和应用专用密码(推荐使用专用密码)
- 收发件人:发件人和接收通知的邮箱地址
WS配置参考(外部NGINX反代)
location / {
proxy_pass http://127.0.0.1:1338/;
rewrite ^/(.*)$ /$1 break;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade-Insecure-Requests 1;
proxy_set_header X-Forwarded-Proto https;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 300s;
# 添加WebSocket支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# Socket.IO特殊处理
location /socket.io/ {
proxy_pass http://127.0.0.1:1338;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 300s;
}
- 同步间隔:自动同步数据的间隔时间(分钟)
- 分析时间:每日自动分析的时间点
- 启用状态:可独立控制各项功能的启用状态
- 启用保护:在配置页面的"认证配置"中,打开"启用密码保护"开关
- 设置密码:启用保护后,输入新密码并确认。留空不会更改现有密码
- 登录:启用后,访问任何页面都需要先登录,支持"记住我"功能
Nightscout API → 数据同步 → 数据库存储 → 界面更新
当前血糖值 + 趋势分析 → 30分钟预测 → 风险评估 → 界面显示
血糖数据 + 治疗方案 + 餐食记录 + 运动数据 → AI分析 → 个性化建议
预测结果 + 阈值比较 → 风险评估 → 预警通知 → 用户确认
本应用支持 PWA(Progressive Web App),可以安装到桌面或移动设备:
-
桌面安装
- Chrome/Edge:地址栏右侧的安装图标
- Firefox:地址栏右侧的安装提示
-
移动设备安装
- iOS Safari:分享 → 添加到主屏幕
- Android Chrome:菜单 → 安装应用
# 基础服务(推荐)
docker-compose up -d nightscout-web
# 包含 AI 服务
docker-compose up -d nightscout-web ollama
# 完整服务(包含 Nginx)
docker-compose up -d
变量名 | 说明 | 默认值 |
---|---|---|
FLASK_ENV |
运行环境 | production |
DATABASE_PATH |
数据库路径 | /app/data/nightscout_data.db |
TZ |
时区 | Asia/Shanghai |
Docker 部署会自动创建以下持久化目录:
./config.toml
:配置文件./data/
:数据库文件./logs/
:日志文件
glucose-buddy/
├── app.py # 主应用文件
├── config.toml # 配置文件
├── config.toml.example # 配置文件模板
├── requirements.txt # Python 依赖
├── data/ # 数据库文件目录
│ └── nightscout_data.db
├── templates/ # HTML 模板
│ ├── base.html # 基础模板
│ ├── index.html # 主页面
│ ├── config.html # 配置页面
│ ├── messages.html # 消息中心页面
│ ├── login.html # 登录页面
│ └── report.html # 血糖报表页面
├── static/ # 静态文件
│ ├── ico.png # 图标文件
│ ├── sw.js # Service Worker
│ ├── manifest.json # PWA Manifest
│ └── ...
├── scripts/ # 工具脚本
│ ├── check_db.py # 数据库检查
│ ├── cleanup_duplicates.py # 数据清理
│ └── ...
├── specs/ # 功能规格文档
│ └── report-feature/ # 报表功能规格
│ ├── requirements.md
│ ├── design.md
│ └── tasks.md
├── Dockerfile # Docker 镜像
├── docker-compose.yml # Docker 编排(基础版)
├── docker-compose附带Ollma.yml # Docker 编排(含AI)
├── nginx.conf # Nginx 配置
├── quick-start.sh # 快速启动脚本
├── install.sh # 安装脚本
├── build-and-run.sh # 构建和运行脚本
├── manual_cleanup.sh # 手动清理脚本
└── README.md # 说明文档
export FLASK_ENV=development
python app.py
接口 | 方法 | 说明 |
---|---|---|
/api/glucose-data |
GET | 获取血糖数据 |
/api/treatment-data |
GET | 获取餐食/治疗数据 |
/api/activity-data |
GET | 获取运动数据 |
/api/meter-data |
GET | 获取指尖血糖数据 |
/api/statistics |
GET | 获取统计数据 |
/api/current-glucose |
GET | 获取当前血糖值 |
/api/sync |
POST | 同步数据 |
接口 | 方法 | 说明 |
---|---|---|
/api/predict |
GET | 血糖预测分析和风险评估 |
/api/analysis |
GET | 获取 AI 智能分析报告 |
/api/ai-consult |
POST | AI 咨询服务 |
/report |
GET | 血糖详细报表页面 |
/api/report-data |
GET | 获取报表数据 |
接口 | 方法 | 说明 |
---|---|---|
/api/config |
GET/POST | 获取/更新应用配置 |
/api/test-connection |
POST | 测试 Nightscout 连接 |
/api/test-email |
POST | 测试邮件配置 |
/api/validate-email-config |
POST | 🆕 邮件配置详细诊断和验证 |
接口 | 方法 | 说明 |
---|---|---|
/api/alerts/config |
GET/POST | 获取/更新预警配置 |
/api/alerts/history |
GET | 获取预警历史记录 |
/api/alerts/acknowledge |
POST | 确认预警 |
接口 | 方法 | 说明 |
---|---|---|
/messages |
GET | 消息中心页面 |
/api/messages |
GET | 获取所有消息 |
/api/messages/<id> |
PUT/DELETE | 更新或删除消息 |
/api/messages/unread-count |
GET | 获取未读消息数量 |
-
无法连接 Nightscout
- 检查 API 地址是否正确(确保包含
http://
或https://
) - 确认网络连接正常,可以访问 Nightscout 网站
- 验证 API 密钥(如果 Nightscout 启用了认证)
- 检查时区偏移设置是否正确(中国为+8)
- 检查 API 地址是否正确(确保包含
-
数据同步失败
- 检查 Nightscout API 是否正常工作
- 确认 API 地址格式正确
- 查看应用日志中的具体错误信息
-
AI 分析失败
- 检查 AI 服务是否运行(如 Ollama 是否已启动)
- 验证 API 地址和密钥是否正确
- 确认模型名称存在且可用
- 检查网络连接到 AI 服务是否正常
-
血糖预测不工作
- 确认有足够的血糖数据(至少10个数据点)
- 检查预测功能是否在配置中启用
- 查看应用日志中的预测相关错误信息
- 确认数据时间范围符合要求(1-7天)
-
餐食/运动数据不显示
- 检查 Nightscout 中是否有相关的治疗记录
- 确认治疗数据同步功能正常工作
- 查看应用日志中的数据处理信息
-
治疗方案配置不生效
- 确认配置已保存到数据库
- 检查配置页面的 JavaScript 是否正常加载
- 验证配置格式是否正确
-
风险预警不触发
- 检查预警功能是否在配置中启用
- 确认预警阈值设置合理
- 验证血糖预测功能正常工作
- 检查高风险和中等风险阈值的设置
-
预警通知不发送
- 检查邮件配置是否正确
- 验证 SMTP 服务器连接是否正常
- 确认收件人邮箱地址正确
- 检查浏览器通知权限是否已授权
已修复的问题:
- ✅ SMTP连接断开:端口465现在正确使用SMTP_SSL连接
- ✅ 登录成功但发送失败:修复代码结构问题,确保连接保持活动状态
- ✅ 配置格式错误:TOML配置文件格式已优化
- ✅ 错误信息不明确:提供详细的错误诊断和解决建议
如果仍有邮件问题:
- 使用诊断功能:访问配置页面,使用邮件测试功能获取详细诊断
- 检查密码:确认使用的是应用专用密码而非登录密码(特别是Gmail和腾讯企业邮箱)
- 查看日志:检查应用日志中的详细邮件发送过程信息
- 端口确认:
- 端口465:SSL连接(适用于大部分现代邮件服务器)
- 端口587:TLS连接(传统方式)
- 新增API测试:使用
/api/validate-email-config
接口获得详细配置分析
-
应用启动失败
- 检查 Python 版本是否符合要求(3.9+)
- 确认所有依赖已正确安装
- 查看详细的错误日志信息
- 检查端口 1338 是否被其他程序占用
-
数据库错误
- 检查数据库文件是否有正确的读写权限
- 确认数据库目录存在且可访问
- 使用
scripts/check_db.py
检查数据库状态 - 必要时可以删除数据库文件重新初始化
-
页面加载缓慢
- 检查网络连接到 Nightscout 的速度
- 考虑减少数据同步的时间范围
- 查看浏览器控制台是否有错误信息
- 确认服务器资源是否充足
-
图表不显示
- 检查浏览器是否支持 JavaScript
- 确认 Chart.js 库是否正确加载
- 查看浏览器控制台的错误信息
- 尝试清除浏览器缓存和 Cookie
# Docker 部署
docker-compose logs -f nightscout-web
# 本地部署
tail -f logs/app.log
欢迎提交 Issue 和 Pull Request!
- Fork 项目到您的 GitHub 账户
- 创建功能分支:
git checkout -b feature/your-feature-name
- 提交更改:
git commit -m 'Add some feature'
- 推送到分支:
git push origin feature/your-feature-name
- 创建 Pull Request:提交详细的变更说明
- 遵循 PEP 8 Python 代码风格
- 添加适当的注释和文档字符串
- 确保新功能包含相应的测试(如果有)
- 更新相关文档
- 使用 GitHub Issues 报告 Bug
- 提供详细的重现步骤和环境信息
- 包含相关的错误日志或截图
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
- Nightscout - 开源血糖监控系统
- Flask - Python Web 框架
- Chart.js - 交互式图表库
- Bootstrap - 前端 UI 框架
- aiohttp - 异步 HTTP 客户端/服务器
如有问题或建议,请按以下顺序寻求帮助:
- 查阅文档:查看 故障排除指南 和本 README
- 搜索 Issues:在 GitHub Issues 中搜索类似问题
- 提交新 Issue:如果问题未被解决,请创建新的 Issue 并提供详细信息
- 联系开发者:通过 个人网站 联系开发者
我们非常重视您的反馈!请随时告诉我们:
- 功能建议和改进意见
- 使用体验和界面优化
- Bug 报告和问题修复
- 文档改进和补充
如果这个项目对您有帮助,请给我们一个 ⭐️ Star on GitHub!
您的支持是我们持续开发的动力!
无论是代码贡献、问题反馈、文档改进,还是经济支持,都将帮助我们:
- 🔧 修复 Bug和改进功能
- 🚀 开发新特性和智能功能
- 📚 完善文档和用户指南
- 🎨 优化界面和用户体验
🔒 隐私保护:您的健康数据安全是我们的首要任务。所有数据都存储在本地,我们不会收集或分享您的个人信息。
Made with ❤️ for diabetes management community