
鸿蒙智能插座用电统计系统开发指南 原创
鸿蒙智能插座用电统计系统开发指南
一、系统架构设计
基于HarmonyOS的分布式能力和硬件加速特性,我们设计了一套智能插座用电统计系统,主要功能包括:
硬件加速电流检测:利用芯片专用模块实现高精度测量
用电模式学习:AI算法分析用户用电习惯
批量数据上传:优化网络传输减少功耗
跨设备同步:多终端实时查看用电数据
用电异常告警:实时监测异常用电情况
!https://example.com/harmony-smart-outlet-arch.png
二、核心代码实现
硬件加速电流检测服务
// CurrentDetectionService.ets
import driver from ‘@ohos.driver’;
import power from ‘@ohos.power’;
class CurrentDetectionService {
private static instance: CurrentDetectionService;
private adcController: driver.AdcController | null = null;
private samplingInterval: number = 1000; // 默认1秒采样一次
private calibrationFactor: number = 1.0;
private currentReadings: number[] = [];
private powerMode: power.Mode = power.Mode.NORMAL;
private constructor() {
this.initAdcController();
this.initPowerListener();
private initAdcController(): void {
try {
this.adcController = driver.createAdcController();
this.adcController.init({
channel: 0, // 使用ADC通道0
samplingRate: 1000, // 1kHz采样率
precision: 12 // 12位精度
});
// 加载校准数据
this.loadCalibration();
catch (error) {
console.error('ADC controller initialization failed:', error);
}
private initPowerListener(): void {
power.on(‘powerModeChange’, (mode) => {
this.powerMode = mode;
this.adjustSamplingRate();
});
private adjustSamplingRate(): void {
switch (this.powerMode) {
case power.Mode.POWER_SAVE:
this.samplingInterval = 5000; // 5秒采样一次
break;
case power.Mode.PERFORMANCE:
this.samplingInterval = 200; // 0.2秒采样一次
break;
default:
this.samplingInterval = 1000; // 1秒采样一次
this.startSampling();
private loadCalibration(): void {
// 从持久化存储加载校准因子
const calibration = storageService.get('currentCalibration');
if (calibration) {
this.calibrationFactor = calibration.factor;
}
public static getInstance(): CurrentDetectionService {
if (!CurrentDetectionService.instance) {
CurrentDetectionService.instance = new CurrentDetectionService();
return CurrentDetectionService.instance;
public startSampling(): void {
setInterval(() => {
this.takeSample();
}, this.samplingInterval);
private takeSample(): void {
if (!this.adcController) return;
try {
// 使用硬件加速读取ADC值
const rawValue = this.adcController.read();
const current = this.convertToAmperes(rawValue);
// 保存读数
this.currentReadings.push(current);
// 计算功率
const voltage = 220; // 假设电压220V
const power = current * voltage;
// 更新用电统计
powerStatsService.updatePowerUsage(current, power);
// 检查异常
if (this.checkAbnormalCurrent(current)) {
alertService.triggerCurrentAlert(current);
} catch (error) {
console.error('Failed to read current:', error);
}
private convertToAmperes(rawValue: number): number {
// 转换为实际电流值(安培)
// 公式: (rawValue / 4095) 3.3V / 0.185V/A calibrationFactor
return (rawValue / 4095) 3.3 / 0.185 this.calibrationFactor;
private checkAbnormalCurrent(current: number): boolean {
// 简单异常检测: 电流超过10A或比平均值高3倍标准差
const avg = this.currentReadings.reduce((a, b) => a + b, 0) / this.currentReadings.length;
const stddev = Math.sqrt(
this.currentReadings.reduce((sq, n) => sq + Math.pow(n - avg, 2), 0) /
this.currentReadings.length
);
return current > 10 || current > avg + 3 * stddev;
public calibrate(knownCurrent: number): void {
if (!this.adcController || this.currentReadings.length === 0) return;
const rawValue = this.adcController.read();
const measuredCurrent = (rawValue / 4095) * 3.3 / 0.185;
this.calibrationFactor = knownCurrent / measuredCurrent;
// 保存校准数据
storageService.set('currentCalibration', { factor: this.calibrationFactor });
public getCurrentReadings(count: number = 10): number[] {
return this.currentReadings.slice(-count);
}
export const currentDetection = CurrentDetectionService.getInstance();
用电模式学习服务
// PowerPatternService.ets
import neuralNetwork from ‘@ohos.ai.neuralNetwork’;
import power from ‘@ohos.power’;
class PowerPatternService {
private static instance: PowerPatternService;
private model: neuralNetwork.Model | null = null;
private powerPatterns: PowerPattern[] = [];
private powerMode: power.Mode = power.Mode.NORMAL;
private constructor() {
this.initModel();
this.initPowerListener();
private async initModel(): Promise<void> {
try {
// 加载轻量级LSTM模型
this.model = await neuralNetwork.loadModel({
modelPath: 'models/power_pattern_lstm.nn',
quantization: true
});
// 加载已有模式
this.loadPatterns();
catch (error) {
console.error('Failed to load power pattern model:', error);
}
private initPowerListener(): void {
power.on(‘powerModeChange’, (mode) => {
this.powerMode = mode;
});
private async loadPatterns(): Promise<void> {
const patterns = await storageService.get('powerPatterns');
if (patterns) {
this.powerPatterns = patterns;
}
public static getInstance(): PowerPatternService {
if (!PowerPatternService.instance) {
PowerPatternService.instance = new PowerPatternService();
return PowerPatternService.instance;
public async analyzeUsage(data: PowerData[]): Promise<PowerPattern | null> {
if (!this.model || data.length < 24) return null; // 至少需要24小时数据
try {
// 准备输入数据
const input: neuralNetwork.Tensor = {
data: this.normalizeData(data),
shape: [1, data.length, 2] // [批次, 时间步, 特征(功率,时间)]
};
// 运行模型
const output = await this.model.run(input);
// 解析输出
const pattern = this.parsePattern(output);
// 保存新模式
if (this.isNewPattern(pattern)) {
this.powerPatterns.push(pattern);
await storageService.set('powerPatterns', this.powerPatterns);
return pattern;
catch (error) {
console.error('Power pattern analysis failed:', error);
return null;
}
private normalizeData(data: PowerData[]): number[] {
// 简单归一化: 功率除以最大值, 时间转换为0-1
const maxPower = Math.max(…data.map(d => d.power));
return data.flatMap(d => [
d.power / maxPower,
(d.timestamp % 86400000) / 86400000 // 一天中的时间
]);
private parsePattern(output: neuralNetwork.Tensor): PowerPattern {
// 解析模型输出为用电模式
const data = output.data as number[];
return {
id: generateId(),
typicalPower: data[0] * 1000, // 转换为瓦
peakHours: data.slice(1, 25).map((v, i) => ({
hour: i,
intensity: v
})),
createdAt: Date.now()
};
private isNewPattern(pattern: PowerPattern): boolean {
if (this.powerPatterns.length === 0) return true;
// 检查是否与现有模式相似
const similar = this.powerPatterns.some(p =>
Math.abs(p.typicalPower - pattern.typicalPower) < 100 && // 功率差小于100W
this.comparePeakHours(p.peakHours, pattern.peakHours) < 0.2 // 峰值时间相似度
);
return !similar;
private comparePeakHours(a: PeakHour[], b: PeakHour[]): number {
// 计算两个峰值时间分布的差异
const diff = a.reduce((sum, hour, i) =>
sum + Math.abs(hour.intensity - b[i].intensity), 0);
return diff / a.length;
public async predictUsage(): Promise<PowerPrediction> {
if (!this.model || this.powerPatterns.length === 0) {
return { predictedPower: 0, confidence: 0 };
// 获取最近24小时数据
const recentData = powerStatsService.getHourlyData(24);
if (recentData.length < 24) return { predictedPower: 0, confidence: 0 };
// 找到最匹配的模式
const bestMatch = this.findBestMatch(recentData);
// 基于模式预测
return {
predictedPower: bestMatch.pattern.typicalPower,
confidence: bestMatch.similarity,
patternId: bestMatch.pattern.id
};
private findBestMatch(data: HourlyPowerData[]): { pattern: PowerPattern, similarity: number } {
// 计算当前数据与各模式的相似度
const currentPeakHours = this.calculateCurrentPeaks(data);
const matches = this.powerPatterns.map(pattern => ({
pattern,
similarity: 1 - this.comparePeakHours(currentPeakHours, pattern.peakHours)
}));
// 返回最相似的模式
return matches.reduce((best, current) =>
current.similarity > best.similarity ? current : best
);
private calculateCurrentPeaks(data: HourlyPowerData[]): PeakHour[] {
// 计算当前数据的峰值时间分布
const maxPower = Math.max(...data.map(d => d.power));
return data.map(d => ({
hour: d.hour,
intensity: d.power / maxPower
}));
public getPowerPatterns(): PowerPattern[] {
return [...this.powerPatterns];
}
export const powerPattern = PowerPatternService.getInstance();
批量数据上传服务
// DataUploadService.ets
import http from ‘@ohos.net.http’;
import power from ‘@ohos.power’;
class DataUploadService {
private static instance: DataUploadService;
private uploadQueue: PowerData[] = [];
private isUploading: boolean = false;
private lastUploadTime: number = 0;
private powerMode: power.Mode = power.Mode.NORMAL;
private constructor() {
this.initPowerListener();
this.startUploadTimer();
private initPowerListener(): void {
power.on('powerModeChange', (mode) => {
this.powerMode = mode;
this.adjustUploadStrategy();
});
private adjustUploadStrategy(): void {
// 根据电源模式调整上传策略
switch (this.powerMode) {
case power.Mode.POWER_SAVE:
// 省电模式下延长上传间隔
this.startUploadTimer(3600000); // 1小时
break;
case power.Mode.PERFORMANCE:
// 高性能模式下缩短上传间隔
this.startUploadTimer(300000); // 5分钟
break;
default:
// 正常模式
this.startUploadTimer(900000); // 15分钟
}
private startUploadTimer(interval: number = 900000): void {
// 先清除现有定时器
if (this.uploadTimer) {
clearInterval(this.uploadTimer);
// 设置新定时器
this.uploadTimer = setInterval(() => {
this.processUploadQueue();
}, interval);
public static getInstance(): DataUploadService {
if (!DataUploadService.instance) {
DataUploadService.instance = new DataUploadService();
return DataUploadService.instance;
public addToUploadQueue(data: PowerData): void {
this.uploadQueue.push(data);
// 高性能模式下立即上传
if (this.powerMode === power.Mode.PERFORMANCE && this.uploadQueue.length > 10) {
this.processUploadQueue();
}
private async processUploadQueue(): Promise<void> {
if (this.isUploading || this.uploadQueue.length === 0) return;
this.isUploading = true;
try {
// 准备批量数据
const batch = this.prepareBatch();
// 上传数据
const response = await this.uploadData(batch);
if (response.responseCode === 200) {
// 上传成功,清空已上传数据
this.uploadQueue = this.uploadQueue.slice(batch.length);
this.lastUploadTime = Date.now();
} catch (error) {
console.error('Upload failed:', error);
finally {
this.isUploading = false;
}
private prepareBatch(): PowerData[] {
// 准备要上传的批次数据
const batchSize = this.getOptimalBatchSize();
return this.uploadQueue.slice(0, batchSize);
private getOptimalBatchSize(): number {
switch (this.powerMode) {
case power.Mode.POWER_SAVE: return 100; // 大批次减少上传频率
case power.Mode.PERFORMANCE: return 10; // 小批次快速上传
default: return 50; // 中等批次
}
private async uploadData(data: PowerData[]): Promise<http.HttpResponse> {
const httpRequest = http.createHttp();
const url = ‘https://api.example.com/power/upload’;
// 准备请求数据
const requestData = {
deviceId: deviceManager.getLocalDevice().id,
timestamp: Date.now(),
data
};
// 发送请求
return await httpRequest.request(url, {
method: 'POST',
header: { 'Content-Type': 'application/json' },
extraData: JSON.stringify(requestData)
});
public async forceUpload(): Promise<void> {
await this.processUploadQueue();
public getQueueSize(): number {
return this.uploadQueue.length;
public getLastUploadTime(): number {
return this.lastUploadTime;
}
export const dataUpload = DataUploadService.getInstance();
三、主界面实现
用电统计主界面
// PowerStatsView.ets
@Component
struct PowerStatsView {
@State currentPower: number = 0;
@State dailyUsage: number = 0;
@State patterns: PowerPattern[] = [];
@State uploadStatus: string = ‘已同步’;
@State alertCount: number = 0;
aboutToAppear() {
this.loadData();
EventBus.on(‘powerUpdate’, (data) => this.updatePower(data));
EventBus.on(‘alertTriggered’, () => this.alertCount++);
build() {
Column() {
// 当前功率
Text(当前功率: ${this.currentPower.toFixed(1)}W)
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ top: 16, bottom: 8 })
// 今日用电
Text(今日用电: ${this.dailyUsage.toFixed(2)}kWh)
.fontSize(18)
.margin({ bottom: 24 })
// 用电趋势图
PowerChartView()
.height(200)
.margin({ bottom: 24 })
// 用电模式
Text('用电模式')
.fontSize(18)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 8 })
PatternList({ patterns: this.patterns })
.margin({ bottom: 16 })
// 状态栏
Row() {
Text(this.uploadStatus)
.fontSize(14)
.layoutWeight(1)
if (this.alertCount > 0) {
Badge({ count: this.alertCount })
.margin({ right: 16 })
}
.padding(16)
private loadData(): void {
this.currentPower = powerStats.getCurrentPower();
this.dailyUsage = powerStats.getDailyUsage();
this.patterns = powerPattern.getPowerPatterns();
this.updateUploadStatus();
private updatePower(data: PowerUpdate): void {
this.currentPower = data.power;
this.dailyUsage = data.dailyUsage;
private updateUploadStatus(): void {
const lastUpload = dataUpload.getLastUploadTime();
const queueSize = dataUpload.getQueueSize();
if (queueSize === 0) {
this.uploadStatus = 已同步 ${this.formatTime(lastUpload)};
else {
this.uploadStatus = 待同步 ${queueSize}条;
}
private formatTime(timestamp: number): string {
if (!timestamp) return ‘’;
const date = new Date(timestamp);
return {date.getHours().toString().padStart(2, '0')}:{date.getMinutes().toString().padStart(2, '0')};
}
@Component
struct PowerChartView {
@State powerData: HourlyPowerData[] = [];
aboutToAppear() {
this.loadData();
build() {
Canvas({ context: this.getContext() })
.width('100%')
.height('100%')
.onReady(() => this.drawChart())
private getContext(): CanvasRenderingContext2D {
// 创建并返回Canvas上下文
return new CanvasRenderingContext2D();
private loadData(): void {
this.powerData = powerStats.getHourlyData(24);
private drawChart(): void {
// 实现绘制用电曲线图的逻辑
// 实际项目中可以使用第三方图表库
}
@Component
struct PatternList {
private patterns: PowerPattern[];
build() {
Column() {
ForEach(this.patterns, (pattern) => {
PatternItem({ pattern })
.margin({ bottom: 8 })
})
}
@Component
struct PatternItem {
private pattern: PowerPattern;
build() {
Row() {
Column() {
Text(典型功率: ${pattern.typicalPower.toFixed(0)}W)
.fontSize(14)
Text(峰值时段: ${this.getPeakHours()})
.fontSize(12)
.fontColor('#666666')
.layoutWeight(1)
Button('详情')
.width(60)
.padding(8)
.backgroundColor('#FFFFFF')
.borderRadius(4)
private getPeakHours(): string {
const peak = this.pattern.peakHours.reduce((max, hour) =>
hour.intensity > max.intensity ? hour : max
);
return {peak.hour}:00-{peak.hour + 1}:00;
}
设置界面
// SettingsView.ets
@Component
struct SettingsView {
@State uploadInterval: number = 15;
@State currentCalibration: number = 1.0;
@State powerMode: string = ‘normal’;
@State isLearning: boolean = true;
build() {
Column() {
// 上传间隔
Text(数据上传间隔: ${this.uploadInterval}分钟)
.fontSize(16)
.margin({ top: 16, bottom: 8 })
Slider({
value: this.uploadInterval,
min: 5,
max: 120,
step: 5
})
.onChange((value: number) => {
this.changeUploadInterval(value);
})
.margin({ bottom: 24 })
// 电流校准
Text(电流校准因子: ${this.currentCalibration.toFixed(2)})
.fontSize(16)
.margin({ bottom: 8 })
Slider({
value: this.currentCalibration,
min: 0.8,
max: 1.2,
step: 0.01
})
.onChange((value: number) => {
this.changeCalibration(value);
})
.margin({ bottom: 24 })
// 电源模式
Text('电源模式')
.fontSize(16)
.margin({ bottom: 8 })
RadioGroup({ initial: this.powerMode })
.onChange((value: string) => {
this.changePowerMode(value);
})
.margin({ bottom: 24 })
Radio({ value: ‘power_save’ }).text(‘省电模式’)
Radio({ value: 'normal' }).text('普通模式')
Radio({ value: 'performance' }).text('高性能模式')
// 学习模式
Row() {
Text('用电模式学习')
.fontSize(16)
.layoutWeight(1)
Toggle({ type: ToggleType.Switch, isOn: this.isLearning })
.onChange((isOn: boolean) => {
this.toggleLearning(isOn);
})
.margin({ bottom: 24 })
// 校准按钮
Button('校准电流')
.onClick(() => this.startCalibration())
.width('90%')
.margin({ bottom: 16 })
// 手动上传
Button('立即上传数据')
.onClick(() => this.forceUpload())
.width('90%')
.padding(16)
private changeUploadInterval(minutes: number): void {
this.uploadInterval = minutes;
dataUpload.setUploadInterval(minutes * 60000);
private changeCalibration(factor: number): void {
this.currentCalibration = factor;
currentDetection.setCalibrationFactor(factor);
private changePowerMode(mode: string): void {
this.powerMode = mode;
powerOptimization.setPowerMode(mode);
private toggleLearning(enabled: boolean): void {
this.isLearning = enabled;
powerPattern.setLearningEnabled(enabled);
private startCalibration(): void {
// 提示用户连接已知负载
prompt.showDialog({
message: '请连接已知电流的负载后点击确定',
buttons: [{ text: '确定' }, { text: '取消' }]
}).then((result) => {
if (result.index === 0) {
const knownCurrent = 5.0; // 应从用户输入获取实际值
currentDetection.calibrate(knownCurrent);
this.currentCalibration = currentDetection.getCalibrationFactor();
});
private forceUpload(): void {
dataUpload.forceUpload();
prompt.showToast({ message: '开始上传数据' });
}
四、高级功能实现
用电统计服务
// PowerStatsService.ets
import { currentDetection } from ‘./CurrentDetectionService’;
class PowerStatsService {
private static instance: PowerStatsService;
private currentPower: number = 0;
private dailyUsage: number = 0;
private hourlyData: HourlyPowerData[] = [];
private lastUpdateTime: number = 0;
private constructor() {
this.initEventListeners();
private initEventListeners(): void {
currentDetection.onCurrentUpdate((current) => {
this.updatePower(current);
});
public static getInstance(): PowerStatsService {
if (!PowerStatsService.instance) {
PowerStatsService.instance = new PowerStatsService();
return PowerStatsService.instance;
private updatePower(current: number): void {
const voltage = 220; // 假设电压220V
this.currentPower = current * voltage;
// 计算用电量
const now = Date.now();
if (this.lastUpdateTime > 0) {
const hours = (now - this.lastUpdateTime) / 3600000;
this.dailyUsage += this.currentPower * hours / 1000; // 转换为kWh
this.lastUpdateTime = now;
// 更新小时数据
this.updateHourlyData();
// 触发事件
EventBus.emit('powerUpdate', {
power: this.currentPower,
dailyUsage: this.dailyUsage
});
private updateHourlyData(): void {
const now = new Date();
const currentHour = now.getHours();
if (this.hourlyData.length === 0 ||
this.hourlyData[this.hourlyData.length - 1].hour !== currentHour) {
// 新小时开始
this.hourlyData.push({
hour: currentHour,
power: this.currentPower,
timestamp: now.getTime()
});
else {
// 更新当前小时数据
const lastHour = this.hourlyData[this.hourlyData.length - 1];
lastHour.power = (lastHour.power + this.currentPower) / 2; // 平均功率
// 保留最近7天数据
if (this.hourlyData.length > 168) { // 24*7
this.hourlyData.shift();
}
public getCurrentPower(): number {
return this.currentPower;
public getDailyUsage(): number {
return this.dailyUsage;
public getHourlyData(hours: number = 24): HourlyPowerData[] {
return this.hourlyData.slice(-hours);
public resetDailyUsage(): void {
this.dailyUsage = 0;
this.lastUpdateTime = Date.now();
}
export const powerStats = PowerStatsService.getInstance();
告警服务
// AlertService.ets
import { currentDetection } from ‘./CurrentDetectionService’;
import { notificationService } from ‘./NotificationService’;
class AlertService {
private static instance: AlertService;
private alertThreshold: number = 10; // 默认10A告警阈值
private alertCount: number = 0;
private constructor() {
this.initEventListeners();
private initEventListeners(): void {
currentDetection.onAbnormalCurrent((current) => {
this.handleAbnormalCurrent(current);
});
public static getInstance(): AlertService {
if (!AlertService.instance) {
AlertService.instance = new AlertService();
return AlertService.instance;
private handleAbnormalCurrent(current: number): void {
this.alertCount++;
// 本地通知
EventBus.emit('alertTriggered', {
type: 'highCurrent',
current,
timestamp: Date.now()
});
// 发送到其他设备
notificationService.sendAlert({
type: 'highCurrent',
message: 异常电流: ${current.toFixed(2)}A,
severity: 'high'
});
public setAlertThreshold(threshold: number): void {
this.alertThreshold = threshold;
currentDetection.setAlertThreshold(threshold);
public getAlertCount(): number {
return this.alertCount;
public resetAlertCount(): void {
this.alertCount = 0;
}
export const alertService = AlertService.getInstance();
电源优化服务
// PowerOptimizationService.ets
import power from ‘@ohos.power’;
import { currentDetection } from ‘./CurrentDetectionService’;
import { dataUpload } from ‘./DataUploadService’;
import { powerPattern } from ‘./PowerPatternService’;
class PowerOptimizationService {
private static instance: PowerOptimizationService;
private currentMode: power.Mode = power.Mode.NORMAL;
private constructor() {
this.initPowerListener();
private initPowerListener(): void {
power.on('powerModeChange', (mode) => {
this.handlePowerModeChange(mode);
});
public static getInstance(): PowerOptimizationService {
if (!PowerOptimizationService.instance) {
PowerOptimizationService.instance = new PowerOptimizationService();
return PowerOptimizationService.instance;
public setPowerMode(mode: string): void {
let powerMode: power.Mode;
switch (mode) {
case 'power_save': powerMode = power.Mode.POWER_SAVE; break;
case 'performance': powerMode = power.Mode.PERFORMANCE; break;
default: powerMode = power.Mode.NORMAL;
power.setMode(powerMode);
private handlePowerModeChange(mode: power.Mode): void {
this.currentMode = mode;
// 调整各服务参数
switch (mode) {
case power.Mode.POWER_SAVE:
this.enablePowerSaveMode();
break;
case power.Mode.PERFORMANCE:
this.enablePerformanceMode();
break;
default:
this.enableNormalMode();
}
private enablePowerSaveMode(): void {
// 降低电流检测频率
currentDetection.setSamplingInterval(5000); // 5秒
// 减少数据上传频率
dataUpload.setUploadInterval(3600000); // 1小时
// 禁用模式学习
powerPattern.setLearningEnabled(false);
private enablePerformanceMode(): void {
// 提高电流检测频率
currentDetection.setSamplingInterval(200); // 0.2秒
// 增加数据上传频率
dataUpload.setUploadInterval(300000); // 5分钟
// 启用模式学习
powerPattern.setLearningEnabled(true);
private enableNormalMode(): void {
// 恢复默认设置
currentDetection.setSamplingInterval(1000); // 1秒
dataUpload.setUploadInterval(900000); // 15分钟
powerPattern.setLearningEnabled(true);
public getCurrentMode(): power.Mode {
return this.currentMode;
}
export const powerOptimization = PowerOptimizationService.getInstance();
五、总结
本智能插座用电统计系统实现了以下核心价值:
高精度电流检测:硬件加速ADC采样实现精确测量
智能用电分析:LSTM模型学习用户用电模式
高效数据传输:批量上传和自适应间隔优化网络使用
实时异常告警:电流异常即时通知多设备
自适应电源管理:根据场景动态调整性能与功耗
扩展方向:
增加电能质量分析功能
开发用电预测和节能建议
集成到智能家居能源管理系统
支持太阳能发电监测
添加电价计算和电费预估
注意事项:
需要校准电流检测电路以获得准确测量
用电模式学习需要至少一周数据
省电模式可能影响数据实时性
异常告警阈值需根据实际负载调整
首次使用建议进行完整校准
