电池 AI 云平台搭建

从 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

将成为下一代智能能源系统的重要基础设施。

相关推荐
humors22118 小时前
从数据到决策:汽车使用成本的精细计算指南
大数据·程序人生
郝学胜-神的一滴1 天前
Qt 高级开发 010: 从跨界面传值到自定义信号
开发语言·c++·qt·程序人生·用户界面
婷婷_1721 天前
JTAG (IEEE 1149.1)学习记录
学习·程序人生·debug·芯片·jtag·phy·eth/pcie
humors2211 天前
听劝和辨劝
大数据·程序人生
这个DBA有点耶2 天前
COUNT进阶:超大表的近似计数与HyperLogLog
数据库·sql·程序人生·学习方法·dba·改行学it
humors2212 天前
不借外力,内力自生:提升竞赛水平的四种内功心法
大数据·程序人生
婷婷_1723 天前
【PCIe 验证每日学习・Day36】PCIe 存储器寻址空间与 BAR 底层原理
网络·学习·程序人生·芯片·pcie
空中湖3 天前
MBTI:程序员的自我认知工具
程序人生
南浦别a4 天前
第102天--时隔多日的书写
学习·程序人生