Java+MySQL实战 搭建智能家居能耗监控系统(用电分析+节能建议)
【代码】Java+MySQL实战 搭建智能家居能耗监控系统(用电分析+节能建议)
·
技术选型与架构设计
后端技术栈
- 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索引:为
timestamp和device_id添加联合索引 - 批量插入:使用JPA的
saveAll()替代单条插入 - 连接池:配置HikariCP参数
spring:
datasource:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
更多推荐
所有评论(0)