夏天最头疼的账单是什么?十有八九是电费。去年七月,我家空调开得勤,电费直接冲到700多,当时我就琢磨着能不能做个小工具,自动把温度调到最合理的区间,还能实时看着它到底耗了多少电。陆陆续续折腾了一个月,终于把“空调省电助手”这玩意儿跑起来了:采集室内外温湿度和房间人数,算法推荐最佳设定温度和运行模式,再通过红外模块自动控制空调,同时用带功率计量的插座实时监测耗电,最后生成一份省电报告。这套系统跑完一个夏季,实测省电大概在18%~25%左右,关键是每天回家不用再纠结空调到底开多少度合适。
1. 项目思路:为什么空调省电助手不能只靠“调高温度”
1.1 省电的核心不是温度本身
很多人一提到空调省电,第一反应是“把温度调高一点,26度以上”。这个说法方向对,但太粗糙。空调的耗电水平不是由设定温度一个变量决定的,而是由“当前室内外温差”“房间热负荷”“运行模式”“压缩机工作状态”共同决定的。设定温度调高2度,在某些工况下能省不少,在另一些工况下反而会让压缩机频繁启停,更费电。
我这套系统的核心思路,是把“体感舒适”和“省电”当成一个多目标优化问题来处理。目标函数有两个:一个是预测平均热感指标尽量落在舒适区间,另一个是空调压缩机能耗尽量低。说白了,就是找一个“让人体感觉舒服的前提下,压缩机负荷最小”的温度和模式组合。这个思路和单纯把温度锁死在26度完全不一样,它会在不同天气、不同人数、不同时段给出不同的建议,而不是一个固定值。
1.2 系统组成与我的选型方案
整体分成三层:
- 数据采集层:室内温湿度传感器用DHT22/AM2302,室外温度接天气预报API,人数检测用红外人体传感器加简单计数逻辑。
- 决策控制层:树莓派跑Python脚本,负责拉取数据、套用推荐算法、生成控制指令。
- 执行与反馈层:空调伴侣或红外发射模块,加上一个带功率计量的智能插座,既能发指令又能读空调实时功率。
选型上最终用了树莓派4B + DHT22 + 空调伴侣 + WiFi功率计量插座。为什么不直接买一个现成的节能插座?因为市售产品基本只做“定时关”或“远程开关”,没有一个能根据室内外温度、人数动态调整运行策略,自己写才能真正做到动态推荐。如果你手头没有树莓派,用一台常开的旧电脑或者ESP32也能跑,后面我会说哪些部分可以降级。
2. 温度与模式推荐算法:把体感舒适度变成可计算的公式
2.1 室内外温差、人数如何影响最佳设定温度
先说结论公式,这是我根据多个热舒适研究资料和实测数据拟合出来的经验模型,适合普通家庭卧室和客厅:
制冷模式推荐设定温度 T_cool:
T_cool = 25.5 + 0.15 × (T_out - 30) + 0.5 × min(N, 4) - 0.3 × (T_room - T_set_prev)
其中 T_out 是室外温度,N 是房间人数,T_room 是当前室内温度,T_set_prev 是上一次设定温度。
逐项解释一下含义:
- 0.15 × (T_out - 30):室外温度越高,室内外热量交换越强,如果一味提高设定温度,空调会长时间降不下来,压缩机一直高负载运转,反而不省电。所以室外越热,设定温度略微上调,但幅度很小,防止过拟合。
- 0.5 × min(N, 4):人多时人体散热量大,每多一个人,制冷设定温度可以适当抬一点,因为人体本身就是热源,抬高温度不会让体感明显变差。
- -0.3 × (T_room - T_set_prev):这是一个反馈修正项,防止设定温度与当前室温差距过大导致空调持续满负荷,也让系统更容易收敛。
举个例子:室外32度,室内28度,两个人,上次设定26度。那么:
T_cool = 25.5 + 0.15×2 + 0.5×2 - 0.3×(28-26) = 25.5 + 0.3 + 1.0 - 0.6 = 26.2度
推荐26度。这个结果和很多人直觉上“开26度就行”差不多,但它是根据实际参数算出来的。当室外达到35度时,推荐值会变成26.7度左右。这时候你会发现开27度比开26度更省电,因为压缩机不用频繁在高负载区间震荡。
2.2 制冷、制热、除湿三种模式怎么自动切换
模式切换的逻辑分两块:一是判断该制冷还是制热,直接看室内温度和室外温度的差,以及日历季节;二是判断是否该切除湿模式。
我实际使用的除湿判断条件:
- 室内温度大于26℃;
- 室内相对湿度大于65%;
- 室内外温差小于4℃;
- 压缩机已经连续运行超过30分钟。
为什么满足这些条件才切除湿?因为除湿模式下,压缩机运行在低频状态,风扇也弱,除湿效果好且耗电量低。但如果室内外温差很大,比如刚开空调、室外38度室内30度,这时直接用除湿模式降温速度太慢,反而让空调长时间低效运行。所以除湿模式只在“温度已经降得差不多、但体感黏糊糊”的时候用。
体感闷热并不是温度高,而是相对湿度大。回南天、梅雨季这种天气,制冷模式虽然能降温,但会导致蒸发器凝露,吹出来很多冷凝水,人体感觉仍然不舒服。切到除湿模式后,出风温度稍微高一点,但湿度降下来,汗液蒸发散热恢复,体感反而更清爽,同时也更省电。我实测过,同样设置为26℃,除湿模式的功率比制冷模式低15%~20%。
2.3 推荐算法的实际运行逻辑
每2分钟执行一次决策,步骤如下:
- 读取室内温湿度、当前空调设定温度和模式、智能插座实时功率。
- 调用天气API获取室外温度。
- 判断室内人数,如果无人,进入“节能空转”模式:温度上调1度,风速调低。
- 套用上面的公式算出目标设定温度,四舍五入到0.5度。
- 计算目标模式,满足除湿条件就切除湿,否则维持在制冷或制热。
- 如果新目标温度与当前设定差超过1度才下发指令,避免频繁发送。
这里有个细节:为什么决策周期是2分钟?周期太短,压缩机和风机状态还没稳定,读数也不可靠;太长的话,人数和室外温度变化响应不过来。实践下来2分钟是一个比较均衡的值。
另外一个不写进公式但很关键的细节:空调压缩机不能在短时间内频繁启停。我在逻辑里加了“压缩机保护锁”,如果功率曲线显示压缩机刚启动,运行功率从待机跳到800W以上,那么至少15分钟内不改变设定温度,防止为了省电反而伤机器。
3. 实时耗电量监控:硬件改造与数据采集方案
3.1 功率数据从哪来:智能插座还是电流互感器
我一开始用的是自己接的电流互感器方案,用SCT-013钳形电流互感器夹在空调电源线上,配合ZMPT101B电压模块,用ESP32读取后自己算功率。这个方案便宜,但有一个绕不开的坑:强电侧的信号采集需要非常小心,校验麻烦,算出来的功率误差也比较大,尤其是在空调这种非线性负载下。
后来我换成了带功率计量的智能插座,比如一些成熟品牌支持本地接口的型号,内部有计量芯片,直接输出有功功率和累计电量,精度在2%以内,几十块钱就能买到,比自己搭强电方案安全太多。如果你是新手,真的不建议自己搞电流互感器接220V,安全第一。功率计量插座完全够用,而且省下来的时间精力远超那点差价。
3.2 采集程序怎么写:轮询、入库、异常识别
数据采集我用Python写了一个常驻进程,每10秒轮询一次智能插座的MQTT或本地HTTP接口,拿到实时功率P和累计电量E,写进SQLite数据库。表结构大概是这样:
CREATE TABLE power_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, ts DATETIME DEFAULT CURRENT_TIMESTAMP, power_w REAL, energy_kwh REAL, room_temp REAL, room_humi REAL, outdoor_temp REAL, set_temp REAL, mode TEXT );字段不复杂,但关键的都记录了:实时功率、累计电量、室内温湿度、室外温度、当时设定温度和模式。为什么要同时存这些?因为后面生成省电报告时,需要按温度区间和模式去对比耗电情况。如果没有这些上下文数据,只能拿到一个总电量,什么都分析不出来。
异常识别我做了两个规则:
- 如果功率大于0但小于30W,且持续超过30分钟,认为空调进入了“待机或送风循环”异常状态,触发提醒。
- 如果连续5次采集的功率差超过300W,说明空调在频繁启停,需要检查设定温度和模式是否来回变化。
这些规则不复杂,但能发现很多真实问题。我遇到过一台空调因为滤网脏堵,功率比正常多了15%,就是靠功率曲线长时间偏高才发现的。所以数据入库这事,别嫌麻烦,时间维度拉得越长,报告越有参考价值。
4. 自动控制与执行层:让空调听懂你的指令
4.1 红外控制方案:空调伴侣或者ESP32+红外发射管
决策逻辑跑完了,怎么把“调到26度、制冷模式”这条指令真正发给空调?有两条路:买一个空调伴侣,或者自己用ESP32接红外发射管自己写红外码库。
我建议普通用户直接用空调伴侣,市面上的主流产品能学习原装遥控器的红外码,然后通过APP或开放接口调取。自己DIY的话,坑在于不同品牌的空调红外编码格式不一样,有的用NEC协议,有的用Philips RC5,你需要先用红外接收管录码,然后在库里管理每个按键对应的raw码,挺折腾的。但如果你手头正好有ESP32,这倒是个有意思的周末项目。
控制下发我有两个原则:一是每次下发间隔至少3秒,防止红外发射过于密集导致空调响应异常;二是下发后要用功率曲线确认。如果空调是制热,刚开机时功率会爬到1500W以上;如果是制冷,功率会在600W到1200W之间波动。如果功率曲线没有任何变化,大概率是红外码没被识别,需要重新学习。
4.2 控制策略:温控回差、波动限制、强制暂停
这部分是我踩坑最多的地方。最初版本让系统每2分钟就根据最新温度推荐值直接调空调,结果一天下来空调频繁启停,耗电没省下来,还多了“咔哒咔哒”的压缩机启停声。
后来加了三重限制:
- 回差限制:只有目标温度与当前设定温度相差超过1度时才下发。
- 时间锁:连续两次指令间隔最少15分钟。
- 波动限制:如果当前室内温度在30分钟内波动小于0.5度,并且目标温度与当前设定温度只差0.5度,干脆不改,因为这点差异对体感和耗电影响都很小,没必要折腾。
还有一个容易被忽略的场景:空调刚开机的瞬间,功率会冲得很高,几分钟后会慢慢降下来。如果在启动期按稳态逻辑去推荐温度,很容易给出“调高温度”的指令,但此时压缩机其实已经在高速运转。所以我加了一条强制暂停规则:每次空调开机后的前20分钟内不执行任何调温指令,只记录数据,让系统先跑完启动期。
代码里维护了一个空调状态机,状态包括OFF、STARTING、RUNNING、STABILIZED,每个状态对应不同的控制策略。写了状态机之后,系统的决策明显稳定多了,不再像之前那样“东一下西一下”。
5. 省电报告生成:让每一度电都有据可查
5.1 报告里应该有哪些指标
省电报告是这个项目从“自嗨工具”变成“能给别人看的产品”的关键。我的报告分日报和周报两个维度。
日报指标:
- 当日总耗电量,单位kWh;
- 平均功率、峰值功率、功率曲线;
- 空调运行时长、压缩机启停次数;
- 当日推荐设定温度和实际运行温度的对比;
- 估算省电量,按历史同室外温度工况下未使用智能策略的耗电做基准。
周报指标:
- 每天耗电量的变化趋势;
- 不同模式(制冷、除湿、制热)的耗电占比;
- 室外温度区间与耗电量的相关性;
- 人数与耗电量的相关性。
这套指标看着多,但数据其实全都有。核心难点是“估算省电量”怎么计算,下面单独说。
5.2 用Python生成可视化报告
我用了matplotlib和HTML模板两种方式生成报告。日报用matplotlib生成几张图,拼到HTML里;周报直接导出一个完整的HTML文件,方便在手机上查看。
生成图片的核心代码逻辑:
import matplotlib.pyplot as plt import sqlite3 import pandas as pd conn = sqlite3.connect("ac_power.db") df = pd.read_sql_query( "SELECT ts, power_w, room_temp, set_temp, mode FROM power_log WHERE ts >= ?", conn, params=(start_time,) ) df["ts"] = pd.to_datetime(df["ts"]) df.set_index("ts", inplace=True) df = df.sort_index() # 这一步必须做 fig, ax = plt.subplots(figsize=(12, 4)) ax.plot(df["power_w"], color="#2f6fb3", linewidth=1) ax.set_ylabel("功率(W)") ax.set_title("空调实时功率曲线") plt.tight_layout() plt.savefig("daily_power.png", dpi=150)这段代码对新手没难度,但有一点要注意:SQLite查出来的数据默认不保证有序,如果不对ts做排序和去重,你会看到一条乱七八糟的折线。我在实际跑的时候第一版就踩了这个坑,还以为是数据采集有问题。
省电量的核心计算用的是“基准线对比法”:
E_saved = E_baseline - E_actual
基准E_baseline是“室外温度相近、运行时长相近”的历史数据,取未开启智能策略时的平均每小时耗电量,再乘以本次运行小时数。比如上周六室外平均34℃,空调开了8小时,总耗电7.2度,平均每小时0.9度;这周六同样34℃,智能策略运行8小时,总耗电5.8度,平均每小时0.725度,那节省就是:
(0.9 - 0.725) × 8 = 1.4度
节省比例约15.5%。
这个口径虽然不是最严格的控制变量实验,但在家庭场景下足够说明问题。我每个月初会把上个月的所有运行日志导出,生成月度报告,看整体趋势。连续记录三个月后,那份趋势图比任何教程都有说服力。
6. 实测效果、常见问题与避坑指南
6.1 实测数据:一个夏天的省电结果
我在客厅跑了一整个夏天,大约25平米,每天大约开8小时。整理结果如下:
| 月份 | 平均室外温度 | 总耗电(kWh) | 去年同期(kWh) | 省电比例 |
|---|---|---|---|---|
| 6月 | 29℃ | 142 | 170 | 16.5% |
| 7月 | 33℃ | 198 | 245 | 19.2% |
| 8月 | 34℃ | 226 | 283 | 20.1% |
| 9月 | 28℃ | 118 | 143 | 17.5% |
整体来看,最热的那段时间省电比例反而更高,因为系统在高温期间更有效地限制了无意义的低温设定和频繁启停。按当地电价来算,三个月省了大概160多元,硬件成本基本回本了。
说明一下,这个对比不是严格的双盲实验,去年有些天开窗习惯不同,但曲线趋势是可信的。最明显的提升是压缩机启停次数降了大概40%,这对电费和压缩机寿命都是好事。
6.2 常见问题排查速查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 空调没反应 | 红外码过期或发射被遮挡 | 重新学习遥控器码,调整红外发射位置 |
| 空调频繁启停 | 决策周期太短或回差太小 | 把采样周期调到2分钟以上,回差调到1度 |
| 推荐温度忽高忽低 | 人数传感器误判 | 给人数检测加滤波,或改为手动人数输入 |
| 功率曲线明显偏高 | 滤网脏、冷媒不足、设定温度过低 | 清洗滤网,检查设定温度与实际值差距 |
| 报告显示省电量为0 | 基准线数据太少 | 先人工记录一周的基准能耗 |
| DHT22读数飘忽不定 | 传感器离出风口太近 | 把传感器移到空调斜对面,至少远离0.5米 |
有几个点我特别想强调。DHT22这种传感器在出风口附近读数能差4~5度。我第一次就把传感器绑在空调旁边的管道上,结果室内29度它测出来25度,系统以为很凉快了就疯狂上调温度,实际客厅热得要死。后来把传感器放在茶几上,离空调有2米多远,数据才正常。
人数检测也是个大坑。一开始用红外人体传感器,结果风扇一吹窗帘就能误触。后来换成ToF激光测距传感器放门口,数进出的人头,配合一个简单的队列过滤,效果才勉强能用。如果你不想折腾,直接手机手动输入人数也完全可行,毕竟智能家居要的是稳定,不是炫技。
6.3 我没写进代码里、但很重要的几个判断
第一,不要为了省电牺牲健康。我在设计推荐温度时,最低不会推荐低于24度,最高制热不会超过22度,并且每个小时至少有一次自然通风提醒。省电助手的价值是帮你省掉空调浪费掉的那部分电,不是让你和家人在28度的客厅里汗流浃背。
第二,空调能效等级不同,同样的设定温度实际耗电差异非常大。我家那台老空调是三级能效,制冷设定26度时功率能到1100W,朋友家新一级能效同工况只要650W。在这种前提下,与其依赖算法把温度调到26.3度,不如提醒你换一台更合适的空调。所以每月的省电报告里,我会附带一条“平均每小时耗电量”的对比,帮你判断这台空调是否还值得继续用。
第三,红外控制天然有盲区,尤其是空调伴侣放在电视柜后面,红外线被挡住,空调根本没收到指令,你这边还以为控制成功了。我的经验是,装好后至少做一次“指令下发后的功率变化校验”,也就是每隔一段时间比对一下功率曲线有没有实际响应。这条真实场景里的经验,比任何代码技巧都有用。
最后再分享一个小技巧:这套系统其实不需要多高配的硬件。一个树莓派Zero、一个十块钱的温湿度传感器、一个几十块的WiFi功率计量插座,加上你手头已有的手机或者电脑,就能把整个流程跑通。算法部分我后来还尝试过更复杂的机器学习模型,但实测下来,这种先验知识简单的场景,经验公式反而比黑盒模型更稳,因为你能解释每一个推荐温度的理由,出了问题也方便排查。
对我来说,这个项目最大的收获不是省了那160块钱,而是让我真正理解了一台空调在什么工况下费电、什么工况下省电。以后不管换什么样的空调,我都会先看看它的功率曲线再决定怎么开。