从 0 到 1 搭建新能源电池 AI 云平台:EMQX + ThingsBoard + FastAPI 实战教程
面向新能源、电池管理、储能、无人机、电动汽车场景的第一代 AI 云平台 MVP
技术栈:EMQX + ThingsBoard + FastAPI + Docker + MQTT + Python
一、项目背景
随着新能源汽车、储能系统、无人机、电动飞行器等行业快速发展,电池已经从"单纯的能量载体"逐渐演变为"智能能源单元"。
传统 BMS(Battery Management System)主要关注:
- 电压采集
- 电流采集
- 温度采集
- SOC 估计
- 基础保护
但在真实工程场景中,仅靠传统 BMS 已经无法满足:
- 电池健康状态(SOH)在线评估
- 电池寿命预测(RUL)
- 电池一致性分析
- 热失控预警
- 云端远程监控
- AI 智能诊断
因此,越来越多企业开始构建:
"云端电池 AI 平台"
本文基于一周的实际开发过程,完整记录如何从 0 到 1 搭建:
text
EMQX + ThingsBoard + AI 服务
实现:
text
本地模拟器
→ MQTT
→ EMQX
→ ThingsBoard
→ AI 分析
→ Dashboard
→ 告警
最终得到一个真正可运行的新能源 AI 云平台 MVP。
二、整体系统架构
最终系统架构如下:
text
┌────────────────────┐
│ Battery Device │
│ Python Simulator │
└─────────┬──────────┘
│ MQTT
▼
┌────────────────────┐
│ EMQX │
│ MQTT Broker + Rule │
└──────┬───────┬─────┘
│ │
│ │ HTTP
│ ▼
│ ┌──────────────┐
│ │ AI Service │
│ │ FastAPI │
│ └──────┬───────┘
│ │
└────────▶│
▼
┌────────────────┐
│ ThingsBoard │
│ Dashboard │
│ Telemetry │
│ Alarm │
└────────────────┘
其中:
| 模块 | 作用 |
|---|---|
| EMQX | MQTT Broker,负责设备接入 |
| ThingsBoard | 设备管理与 Dashboard |
| FastAPI | AI 算法服务 |
| Docker | 容器化部署 |
| Python | 模拟 BMS 数据 |
三、服务器环境准备
1. 云服务器要求
推荐配置:
| 配置 | 推荐 |
|---|---|
| CPU | 4 Core |
| 内存 | 8 GB |
| 系统 | Ubuntu 22.04 |
开放端口:
| 端口 | 用途 |
|---|---|
| 22 | SSH |
| 1883 | MQTT |
| 18083 | EMQX Dashboard |
| 8080 | ThingsBoard |
| 9000 | AI 服务 |
四、安装 Docker
服务器执行:
bash
sudo apt update
sudo apt install docker.io docker-compose -y
检查版本:
bash
docker -v
docker-compose -v
创建项目目录:
bash
mkdir -p ~/battery-platform
cd ~/battery-platform
五、部署 EMQX
1. docker-compose.yml
为了避免 Docker 重启或容器升级后 EMQX 配置丢失,建议增加 volumes 数据持久化。
创建数据目录:
bash
mkdir -p ./emqx/data
mkdir -p ./emqx/log
sudo chmod -R 777 ./emqx
创建:
bash
vim docker-compose.yml
写入:
yaml
version: '3.8'
services:
emqx:
image: emqx/emqx:5.6
container_name: emqx
restart: always
ports:
- "1883:1883"
- "18083:18083"
volumes:
- ./emqx/data:/opt/emqx/data
- ./emqx/log:/opt/emqx/log
启动:
bash
docker-compose up -d emqx
查看日志:
bash
docker logs -f emqx
其中:
text
./emqx/data
用于持久化:
- Dashboard 配置
- Rule Engine
- Connector
- 用户密码
- Topic 数据
而:
text
./emqx/log
用于持久化日志。
这样即使 Docker 重启或服务器重启,EMQX 配置也不会丢失。
2. 登录 EMQX Dashboard
浏览器打开:
text
http://服务器IP:18083
默认账号:
text
admin
public
六、部署 ThingsBoard
1. 修改 docker-compose.yml
追加:
yaml
tb:
image: thingsboard/tb-postgres:latest
container_name: tb
restart: always
ports:
- "8080:9090"
environment:
TB_QUEUE_TYPE: in-memory
volumes:
- ./tb-data:/data
- ./tb-logs:/var/log/thingsboard
创建目录:
bash
mkdir -p tb-data tb-logs
sudo chmod -R 777 tb-data tb-logs
启动:
bash
docker-compose up -d tb
2. 登录 ThingsBoard
浏览器:
text
http://服务器IP:8080
默认账号:
text
tenant@thingsboard.org
tenant
七、本地模拟电池数据
1. 安装依赖
本地电脑:
bash
pip install paho-mqtt
2. 创建 battery_simulator.py
python
import json
import random
import time
import paho.mqtt.client as mqtt
SERVER_IP = "服务器IP"
TOPIC = "battery/demo/pack001/telemetry"
client = mqtt.Client(client_id="pack001-simulator")
client.connect(SERVER_IP, 1883, 60)
client.loop_start()
while True:
cell_v_max = round(random.uniform(3.35, 3.45), 3)
cell_v_min = round(cell_v_max - random.uniform(0.005, 0.060), 3)
temp_max = round(random.uniform(28, 45), 1)
temp_min = round(temp_max - random.uniform(1, 9), 1)
payload = {
"device_id": "pack001",
"voltage": round(random.uniform(320, 360), 2),
"current": round(random.uniform(-50, 50), 2),
"soc": round(random.uniform(20, 90), 2),
"cell_voltage_max": cell_v_max,
"cell_voltage_min": cell_v_min,
"temperature_max": temp_max,
"temperature_min": temp_min
}
client.publish(TOPIC, json.dumps(payload), qos=0)
print(payload)
time.sleep(2)
运行:
bash
python battery_simulator.py
八、EMQX 转发到 ThingsBoard
1. ThingsBoard 创建设备
进入:
text
Devices
→ Add device
设备名:
text
pack001
然后进入:
text
Credentials
复制:
text
Access Token
2. 创建 Connector
EMQX:
text
Data Integration
→ Connectors
创建 HTTP Connector:
text
Name:
TB Connector
URL:
http://服务器IP:8080
3. 创建 Rule
SQL:
sql
SELECT
payload.voltage as voltage,
payload.current as current,
payload.soc as soc,
payload.cell_voltage_max as cell_voltage_max,
payload.cell_voltage_min as cell_voltage_min,
payload.temperature_max as temperature_max,
payload.temperature_min as temperature_min
FROM
"battery/+/+/telemetry"
Action:
text
POST
/api/v1/TOKEN/telemetry
Body:
json
{
"voltage": ${voltage},
"current": ${current},
"soc": ${soc},
"cell_voltage_max": ${cell_voltage_max},
"cell_voltage_min": ${cell_voltage_min},
"temperature_max": ${temperature_max},
"temperature_min": ${temperature_min}
}
Headers:
text
Content-Type: application/json
九、部署 AI 服务
1. 创建目录
bash
mkdir -p ~/battery-platform/ai_service
cd ~/battery-platform/ai_service
2. requirements.txt
text
fastapi
uvicorn
requests
pydantic
3. Dockerfile
dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \
-r requirements.txt
COPY . .
EXPOSE 9000
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "9000"]
4. app.py
python
from fastapi import FastAPI
from pydantic import BaseModel
import requests
app = FastAPI()
TB_HOST = "http://服务器公网IP:8080"
TB_TOKEN = "ThingsBoard Token"
class BatteryData(BaseModel):
voltage: float
current: float
soc: float
cell_voltage_max: float
cell_voltage_min: float
temperature_max: float
temperature_min: float
@app.post("/analyze")
def analyze(data: BatteryData):
voltage_diff_mv = (
data.cell_voltage_max -
data.cell_voltage_min
) * 1000
temperature_diff = (
data.temperature_max -
data.temperature_min
)
soh = 96.0
soh -= max(0, data.temperature_max - 35) * 0.15
soh -= max(0, voltage_diff_mv - 30) * 0.02
soh = max(60, min(100, soh))
risk_level_code = 0
if (
data.temperature_max > 45
or voltage_diff_mv > 80
or temperature_diff > 10
):
risk_level_code = 2
elif (
data.temperature_max > 40
or voltage_diff_mv > 50
or temperature_diff > 8
):
risk_level_code = 1
health_score = soh
if risk_level_code == 1:
health_score -= 5
elif risk_level_code == 2:
health_score -= 12
result = {
"soh": round(soh, 2),
"health_score": round(health_score, 2),
"risk_level_code": risk_level_code,
"voltage_diff_mv": round(voltage_diff_mv, 2),
"temperature_diff": round(temperature_diff, 2)
}
requests.post(
f"{TB_HOST}/api/v1/{TB_TOKEN}/telemetry",
json=result,
timeout=3
)
return result
5. docker-compose.yml 追加
yaml
ai_service:
build: ./ai_service
container_name: ai_service
restart: always
ports:
- "9000:9000"
启动:
bash
docker-compose up -d --build ai_service
查看日志:
bash
docker logs -f ai_service
十、EMQX 转发到 AI
新增第二条 Rule:
text
battery_to_ai
SQL:
sql
SELECT
payload.voltage as voltage,
payload.current as current,
payload.soc as soc,
payload.cell_voltage_max as cell_voltage_max,
payload.cell_voltage_min as cell_voltage_min,
payload.temperature_max as temperature_max,
payload.temperature_min as temperature_min
FROM
"battery/+/+/telemetry"
Connector:
text
http://ai_service:9000
URL Path:
text
/analyze
Body:
json
{
"voltage": ${voltage},
"current": ${current},
"soc": ${soc},
"cell_voltage_max": ${cell_voltage_max},
"cell_voltage_min": ${cell_voltage_min},
"temperature_max": ${temperature_max},
"temperature_min": ${temperature_min}
}
十一、ThingsBoard Dashboard
创建:
text
Battery Pack Monitoring
建议组件:
1. 实时曲线
展示:
- voltage
- current
- soc
- temperature_max
2. SOH Gauge
展示:
- soh
- health_score
3. AI 风险等级
展示:
- risk_level_code
4. 一致性分析
展示:
- voltage_diff_mv
- temperature_diff
十二、最终效果
至此,一个真正可运行的:
text
新能源电池 AI 云平台 MVP

已经完成。
平台具备:
- MQTT 数据接入
- 云端实时监控
- Dashboard 可视化
- AI 健康评估
- 风险诊断
- 电池一致性分析
- 容器化部署
十三、项目中的关键问题与踩坑
1. EMQX Action Fail
原因:
- Body JSON 错误
- URL Path 拼接错误
- FastAPI 返回 422
解决:
- 正确配置 Body
- 检查 Connector URL
- 查看 docker logs
2. AI 服务无法写 TB
错误:
text
Failed to resolve 'tb'
原因:
Docker 内 DNS 解析失败。
解决:
使用公网 IP:
python
TB_HOST = "http://服务器IP:8080"
3. ThingsBoard 没有原始数据
原因:
AI 服务只回写 AI 数据。
解决:
采用:
text
EMQX → TB
EMQX → AI → TB
双通道架构。
十四、下一步升级方向
当前平台只是第一代 MVP。
后续可以升级:
1. 真正 AI 模型
替换规则算法:
- PyTorch
- ONNX
- Transformer
- Diffusion Model
2. 多设备管理
支持:
- EV
- ESS
- UAV
- eVTOL
3. AI 诊断报告
自动生成:
text
该电池包出现明显一致性恶化,
建议进行均衡维护。
4. 数字孪生
构建:
text
Battery Digital Twin
实现:
- 虚拟测试
- 退化预测
- 故障仿真
- 安全评估
十五、总结
本文基于真实开发过程,完整搭建了:
text
EMQX + ThingsBoard + AI 服务
新能源电池 AI 云平台。
虽然只是 MVP,但已经具备:
- 云端接入
- AI 分析
- Dashboard
- 实时告警
- 可扩展微服务
这类平台未来在:
- 新能源汽车
- 储能
- 无人机
- 机器人
- 电动飞行器
等领域具有非常广阔的应用前景。
未来,随着 AI 与能源深度融合:
text
Battery AI Agent
将成为下一代智能能源系统的重要基础设施。