TeddieM8/grid-monitor

GitHub: TeddieM8/grid-monitor

结合 ESP32 嵌入式硬件与数字孪生引擎的安全低压直流电力监控平台,提供实时数据采集、故障检测和能源预测功能。

Stars: 0 | Forks: 0

# Grid Monitor - 安全低压过流保护继电器 一个完整的赛博物理系统,在安全的低压直流环境中演示实时监控、故障检测和保护逻辑。作为面向可再生能源和电力系统工程职位的作品集项目而构建。 ## 概述 **Grid Monitor** 是一个 SCADA 风格的监控平台,它将小型的物理太阳能装置或直流电路连接到数字孪生引擎,持续比较预期与实际性能,并在发生故障时发出警报。该系统演示了: - **电气工程:** 传感器设计、电路保护、功率计算 - **嵌入式系统:** 具备本地缓冲和 MQTT 通信的 ESP32 固件 - **物联网与实时数据:** 传感器采集、WiFi 流传输、时序记录 - **数据工程:** ETL pipeline、时序数据库、查询优化 - **后端开发:** FastAPI、PostgreSQL、身份验证、RESTful API - **故障检测:** 基于规则和统计的异常检测 - **机器学习:** 能源预测(可选:LSTM、XGBoost) - **数字孪生:** 虚拟电力模型与实测真实情况的比较 - **仪表板:** 带有实时图表和警报的专业 Web UI ## 快速开始 ### 硬件组装 1. 从[购物清单](docs/BOM.md)中**订购组件**(约 70–120 英镑) 2. 按照[硬件指南](docs/HARDWARE.md)**连接传感器节点** 3. 将**固件刷入** ESP32(参见[固件设置](docs/FIRMWARE.md)) 4. 在 Raspberry Pi 或本地机器上**运行后端**(参见[后端设置](docs/BACKEND.md)) 5. 在 `http://localhost:5000` **打开仪表板** ### 面向开发(无硬件) ``` # Clone 仓库 git clone https://github.com/TeddieM8/grid-monitor cd grid-monitor # 安装依赖 pip install -r requirements.txt # 运行模拟器 python simulator.py # 在另一个终端中,启动 collector python collector.py # 在第三个终端中,启动 dashboard python dashboard.py # 在浏览器中打开 http://localhost:5000 ``` **模拟器** 生成带有故障注入的真实电压、电流和温度读数,因此您可以在没有硬件的情况下开发和测试整个系统。 ## 架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ Physical Layer │ ├─────────────────────────────────────────────────────────────┤ │ Solar Panels / DC Circuit → INA219 + DS18B20 Sensors │ │ ↓ │ │ ESP32 Microcontroller │ │ (MQTT Publisher) │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ Data Pipeline │ ├─────────────────────────────────────────────────────────────┤ │ MQTT Broker (Mosquitto) → Collector → PostgreSQL / SQLite │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ Backend & Digital Twin │ ├─────────────────────────────────────────────────────────────┤ │ FastAPI Server │ │ ├─ REST API (/readings, /alerts, /forecast) │ │ ├─ Digital Twin Engine (expected vs actual) │ │ ├─ Fault Detection (rule-based + ML) │ │ └─ Forecasting (persistence, linear regression, LSTM) │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ Dashboard (React / HTML) │ ├─────────────────────────────────────────────────────────────┤ │ Live gauges, charts, alerts, forecast, system health │ └─────────────────────────────────────────────────────────────┘ ``` ## 项目结构 ``` grid-monitor/ ├── README.md # This file ├── HANDOFF.md # Project state & roadmap ├── requirements.txt # Python dependencies ├── shopping_list.html # Component shopping list │ ├── firmware/ # ESP32 firmware (MicroPython or C++) │ ├── main.py # Main firmware loop │ ├── sensors.py # Sensor reading functions │ ├── mqtt.py # MQTT communication │ ├── rtc.py # RTC (DS3231) for accurate timestamps │ └── sdcard.py # SD card local buffering │ ├── backend/ # Python backend │ ├── config.py # Shared configuration │ ├── simulator.py # Synthetic sensor data generator │ ├── collector.py # MQTT subscriber & DB writer │ ├── dashboard.py # Flask web server │ ├── twin.py # Digital twin engine │ ├── forecast.py # Energy forecasting models │ ├── fault_detection.py # Anomaly & fault detection │ └── database.py # DB schema & helpers │ ├── templates/ # Web UI │ └── dashboard.html # Dashboard (industrial SCADA style) │ ├── tests/ # Unit tests │ ├── test_twin.py # Digital twin tests │ ├── test_forecast.py # Forecasting tests │ └── test_fault_detection.py # Fault detection tests │ ├── docker/ # Docker deployment │ ├── Dockerfile # Backend container │ ├── docker-compose.yml # Full stack (API, DB, MQTT) │ └── mosquitto.conf # MQTT broker config │ ├── docs/ # Documentation │ ├── HARDWARE.md # Sensor node assembly guide │ ├── FIRMWARE.md # Firmware development & flashing │ ├── DATABASE.md # Schema, indexing, optimization │ ├── API.md # REST API specification │ ├── DIGITAL_TWIN.md # Twin engine algorithms │ ├── FORECASTING.md # ML models & training │ ├── DEPLOYMENT.md # Docker, cloud, systemd │ └── SHOPPING_LIST.md # Components & suppliers │ └── cad/ # CAD models (Fusion, AutoCAD) ├── enclosure.f3d # Sensor node housing (Fusion) ├── sld.dwg # Substation single-line diagram (AutoCAD) └── pcb/ └── overcurrent_relay.kicad # Protection relay PCB design ``` ## 核心功能 ### 实时监控 - 持续测量电压、电流和温度 - 1 秒采样率,延迟 < 100ms - 具有专业工业美感的实时仪表板 - 历史数据保留和时序查询 ### 故障检测 - **基于规则:** 过流持续时间逻辑(反时限保护) - **基于统计:** 对效率比率的 z-score 异常检测 - **基于机器学习:** 孤立森林或单分类 SVM(可选) - 自动生成警报,支持 email/SMS 钩子(可扩展) ### 数字孪生 - 基于以下因素计算预期功率输出: - 面板规格(Pmpp、Voc、Isc、温度系数) - 辐照度(lux → W/m²) - 温度降额(在 STC 以上,效率损失约 0.4% / °C) - 组件串拓扑和逆变器损耗 - 与实测输出进行对比 - 生成性能比、容量系数、健康评分 ### 预测 - **持续性模型:** 朴素基线(重复之前的值) - **线性回归:** 辐照度到功率的映射 - **随机森林:** 处理多个特征(温度、湿度、一天中的时间) - **XGBoost:** 优化的梯度提升(如果已安装) - **LSTM:** 用于多步提前预测的可选深度学习 - 1 小时、24 小时、7 天的预测范围及误差指标 ### 本地弹性 - WiFi 不可用时的 SD 卡缓冲 - RTC (DS3231) 确保即使在断电后也能提供准确的时间戳 - 重新连接时自动刷新至后端 - 消息去重可防止重复计算 ### 专业仪表板 - **深色 SCADA 主题** - 工业美学(而非 Web 2.0 气泡风格) - **实时仪表:** 电压、电流、温度及颜色编码的状态 - **趋势图:** 滚动显示 2 小时历史记录,支持缩放/平移 - **警报面板:** 按时间排序的故障日志,带有严重程度标签 - **预测视图:** 7 天能源预测与实际对比 - **系统健康:** 性能比、累计能量、正常运行时间 ## 固件设置 (ESP32) ### 前置条件 - 用于您的 ESP32 开发板的 USB 数据线 - Esptool 或 Arduino IDE - MicroPython 或 Arduino C++(任选其一) ### 状态:设计完成,硬件测试待定 ⚠️ **重要:** `firmware/` 中的固件代码已完全设计、编写文档并准备好刷入 ESP32。但是,它**尚未经过**真实硬件组件(INA219 传感器、DS18B20 温度探头、DS3231 RTC 或 SD 卡模块)的**测试**。 **当前状态:** - ✓ 代码已编写并记录 - ✓ 已确定 MicroPython 库 - ✓ 引脚分配已敲定 - ⏳ 等待硬件组装和真实传感器测试 **后续步骤(原型组装完成后):** 1. 将固件刷入 ESP32 2. 针对实际的 INA219 和 DS18B20 模块进行测试 3. 调试传感器读数和 MQTT 发布 4. 验证 SD 卡的本地缓冲功能 5. 根据实际性能进行优化 ### MicroPython(推荐用于学习) ``` # 下载适用于 ESP32-WROOM-32 的 MicroPython firmware # https://micropython.org/download/esp32/ # 刷入 firmware(使用 esptool) esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 esp32-20250131-v1.24.bin # 复制 firmware 文件到 ESP32(使用 ampy) ampy --port /dev/ttyUSB0 put firmware/main.py ampy --port /dev/ttyUSB0 put firmware/sensors.py ampy --port /dev/ttyUSB0 put firmware/mqtt.py ampy --port /dev/ttyUSB0 put firmware/rtc.py ampy --port /dev/ttyUSB0 put firmware/sdcard.py # 通过 serial monitor 连接并重启 ``` 有关详细说明,请参阅 [docs/FIRMWARE.md](docs/FIRMWARE.md)。 ## 后端设置 (Linux / Raspberry Pi) ### 前置条件 - Python 3.9+ - PostgreSQL 12+(或用于开发的 SQLite) - Mosquitto MQTT broker - Git ### 安装 ``` # Clone 仓库 git clone https://github.com/TeddieM8/grid-monitor cd grid-monitor # 创建虚拟环境 python3 -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate # 安装 Python 依赖 pip install -r requirements.txt # 安装 Mosquitto(Linux) sudo apt-get install mosquitto mosquitto-clients # 启动 Mosquitto mosquitto -d # daemon mode # 设置数据库(PostgreSQL) psql -U postgres -f docs/schema.sql # 或者使用 SQLite(无需设置,基于文件) sqlite3 grid_monitor.db < docs/schema.sql ``` ### 运行系统 **终端 1:Collector(订阅 MQTT,写入数据库)** ``` python collector.py ``` **终端 2:Simulator(生成合成传感器数据)** ``` python simulator.py ``` **终端 3:Dashboard(Flask Web 服务器)** ``` python dashboard.py # 打开 http://localhost:5000 ``` 或者使用 Docker 一次性运行所有服务: ``` docker-compose up ``` ## 配置 编辑 `backend/config.py` 进行自定义: ``` # MQTT MQTT_BROKER = "localhost" MQTT_PORT = 1883 MQTT_TOPIC = "gridmon/site1/readings" # 数据库 DATABASE_URL = "sqlite:///grid_monitor.db" # or PostgreSQL # 警报阈值 OVERCURRENT_A = 5.0 # Amps OVERCURRENT_HOLD = 3 # Consecutive samples UNDERVOLTAGE_V = 10.8 # Volts (10% below nominal 12V) OVERVOLTAGE_V = 13.2 # Volts (10% above nominal) OVERTEMP_C = 70.0 # Degrees C # 面板参数(用于 digital twin) PANEL_PMPP = 10.0 # Watts at STC PANEL_VMAX = 18.0 # Volts at MPPT PANEL_TEMP_COEFFICIENT = -0.004 # %/°C (efficiency loss) ``` ## API 参考 所有 endpoint 均返回 JSON。完整规范请参见 [docs/API.md](docs/API.md)。 ### 健康与状态 ``` GET /health GET /api/latest ``` ### 历史数据 ``` GET /api/readings?hours=2 GET /api/alerts?limit=20 GET /api/forecast?horizon=24h ``` ### 配置 ``` GET /api/config POST /api/config (admin only) ``` ### 预测 ``` GET /api/forecast/1h GET /api/forecast/24h GET /api/forecast/7d ``` ## 测试 ``` # 运行所有测试 pytest # 运行特定测试套件 pytest tests/test_twin.py -v # 运行覆盖率测试 pytest --cov=backend tests/ ``` ### 测试状态 - **单元测试:** ✓ 完成(所有 40 多个测试均通过) - **集成测试:** 待定(需要真实硬件) - **现场验证:** 待定(在原型部署之后) **当前覆盖率:** - 数字孪生物理模型:100% ✓ - 预测 pipeline:95% ✓ - 故障检测规则:100% ✓ **下一阶段(硬件组装):** 一旦原型构建并部署完成,这些测试将: 1. 根据真实传感器数据进行验证 2. 扩展集成测试 3. 对真实故障进行性能基准测试 ## 部署 ### 本地机器 / Raspberry Pi ``` # 使用 systemd(推荐) sudo cp deployment/grid-monitor.service /etc/systemd/system/ sudo systemctl start grid-monitor sudo systemctl enable grid-monitor # Auto-start on boot ``` ### Docker ``` docker-compose up -d docker-compose logs -f dashboard ``` ### 云端 (AWS / DigitalOcean) 有关容器化、环境变量和托管数据库的指导,请参阅 [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md)。 ## 许可证 MIT 许可证 — 详情请参阅 [LICENSE](LICENSE)。 ## 联系与延伸阅读 - **硬件组装:** [docs/HARDWARE.md](docs/HARDWARE.md) - **固件开发:** [docs/FIRMWARE.md](docs/FIRMWARE.md) - **数据库设计:** [docs/DATABASE.md](docs/DATABASE.md) - **API 规范:** [docs/API.md](docs/API.md) - **数字孪生理论:** [docs/DIGITAL_TWIN.md](docs/DIGITAL_TWIN.md) - **机器学习预测:** [docs/FORECASTING.md](docs/FORECASTING.md) - **部署与 DevOps:** [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md) 如有任何问题或疑问,请提交 GitHub issue。 **旨在展示真实的工程思维:从第一性原理的电路设计到生产环境的部署。**
标签:AV绕过, ESP32, FastAPI, SCADA监控, 嵌入式系统, 数字孪生, 测试用例, 物联网, 电力系统, 请求拦截, 逆向工具