技术选型与架构设计

后端技术栈

  • Java框架:Spring Boot(快速开发)+ Spring Data JPA(ORM)
  • 数据库:MySQL 8.0(存储设备能耗数据)+ Redis(缓存实时数据)
  • 通信协议:MQTT(设备接入)+ WebSocket(前端实时推送)

前端技术栈

  • Vue.js + ECharts(数据可视化)
  • Element UI(管理后台界面)

数据库设计

核心表结构

  • device:设备表(设备ID、名称、类型、位置)
  • energy_consumption:能耗记录表(记录ID、设备ID、功率、时间戳)
  • user_behavior:用户行为表(操作类型、设备ID、触发时间)
CREATE TABLE `energy_consumption` (
  `id` BIGINT AUTO_INCREMENT PRIMARY KEY,
  `device_id` VARCHAR(32) NOT NULL,
  `power` DECIMAL(10,2) COMMENT '瞬时功率(瓦)',
  `timestamp` DATETIME DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`device_id`) REFERENCES `device`(`id`)
) ENGINE=InnoDB;

数据采集与处理

MQTT设备接入
通过EMQX Broker接收设备上报的JSON数据:

{
  "deviceId": "AC-001", 
  "power": 1500.50,
  "voltage": 220
}

Java消费消息
使用Paho客户端订阅主题并持久化数据:

@Bean
public MqttPahoMessageDrivenChannelAdapter adapter() {
    return new MqttPahoMessageDrivenChannelAdapter(
        "tcp://broker.emqx.io:1883", 
        "subscriberClient",
        "home/energy"
    );
}

用电分析算法

峰谷时段识别
基于时间序列聚类(K-means)划分用电高峰:

public List<TimeSegment> detectPeakHours(List<EnergyRecord> records) {
    // 按小时聚合数据后聚类
    double[][] features = records.stream()
        .map(r -> new double[]{r.getHour(), r.getPower()})
        .toArray(double[][]::new);
    KMeansModel model = new KMeans().setK(3).fit(features);
    return model.predict(features);
}

设备能效评估
计算设备单位时间能耗效率:
[ \eta = \frac{\sum_{i=1}^{n} P_i \times T_i}{\text{RatedPower} \times \text{TotalTime}} ]

节能建议生成

规则引擎实现

  • 高耗能设备:空调连续运行>2小时触发提醒
  • 异常功耗:夜间待机设备功率>阈值发送告警
@Scheduled(fixedRate = 3600000)
public void checkAbnormal() {
    List<Device> devices = deviceRepo.findByPowerGreaterThan(
        thresholdService.getDynamicThreshold()
    );
    devices.forEach(d -> alertService.send(d, "AbnormalPower"));
}

可视化与API开发

RESTful接口

  • GET /api/energy/daily?date=2024-03-01(按日统计)
  • POST /api/advice/generate(生成建议)

ECharts配置示例

option = {
    xAxis: { type: 'category', data: ['00:00', '06:00', '12:00', '18:00'] },
    yAxis: { type: 'value' },
    series: [{ data: [1200, 3500, 2800, 4000], type: 'line' }]
};

部署优化

性能调优

  • MySQL索引:为timestampdevice_id添加联合索引
  • 批量插入:使用JPA的saveAll()替代单条插入
  • 连接池:配置HikariCP参数
spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      connection-timeout: 30000

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐