如何用手机控制空调 ——简单实用的智能家居教程 - 知乎
【首发少数派: 如何用手机控制空调 ——简单实用的智能家居教程】
我家有三个单体空调,型号比较老,每次要在各自的控制面板上调节开关和温度,也没有定时控温功能。如果想实现远程操控(比如在手机上),最简单的方案就是 Nest Thermostat。然而抠门如我一看每个售价$169,三个要五百多美元,便萌生自己改装的念头。
可行吗?根据电路常识推测,空调各部分工作应该是由相应 IO(Input / Output)的高低电位触发,那么只要找到控制面板所连结的 IO,就可以取而代之。换个角度,即使空调结构是黑盒子,既然 Nest Thermostat 能用于大部分空调型号,这说明:1,空调的 API(操控界面)是高度统一的;2,只要能模拟 Nest 的行为,就可以实现从空调 API 到 Nest API 的转换;3,网上一定有许多通用的 DIY 开源项目。
在这个课题上,我花了一半时间找合适的开源项目。你需要综合评价:对方解决的问题是否和你一致,交互界面你是否喜欢,配件是否经济实惠,软硬件系统是否强健,是否有后续开放性,可否融合到更广的智能家居平台等等。由于是第一次改装家电,后两个因素暂时不考虑。因为我手头有多余的树莓派 Zero,在定制的 Linux 系统下可以轻松安装 Web App,通过 ssh 编程也极为简便,于是就以 thermostat + raspberry pi + web 为关键词搜索,最终选中了 这个方案:PyStat。
PyStat 的用户界面是一个网页:
用户界面非常直观:第一行显示室温和目标温度。第二行的三个圆圈表明相应部件是否工作。比如,在制热时,制热和风扇同时工作,所以第1、3个圆圈是亮的,中间代表制冷的不亮。第三行的三个方块是用户选择的工作模块,最多可选一个。注意无论选制冷还是制热,风扇始终是工作的。第四行是温度选择。选好模式和温度后点击 Submit Changes 即可传送指令。最下方是由 WeatherAPI 提供的天气预报。
因为是 Web App ,就可以在家里任何浏览器上操作,比如手机和 Tablet 上:
(打折时淘的 Fire Tablet 重获生机,可以嵌到墙里)
因为是内网页面,你只能在联入家里 Wifi 的设备上操控,即不能在回家路上事先打开空调——这是这个方案的缺点之一。我会在以后的系统智能家居方案中探索这个需求。
如果你喜欢这个界面,就可以下载 代码库,撸起袖子干了:
购买配件
树莓派 Zero W$10 + shipping
Micro SD 卡(至少8G) $8
一个4.7k~10k欧姆的电阻
导线若干、Micro USB 充电线一根
总价:$31+。除了树莓派以外的配件在 AliExpress 上买便宜得多,只是要等2-3周。
此外,你可能还需要用于测试的 LED 灯若干、面包版、电焊工具、micro HDMI 线、micro USB hub、USB 鼠标键盘等辅助配件,以上都不算在耗材里。
预备树莓派
1,在树莓派上安装 Rasbian 系统, 参考这里。建议安装 这个带图形桌面的版本。
2,通过 Micro HDMI 连显示器,在图形界面里连上家里的 Wifi。
3,如果选择 ssh 联入,记得在 raspi-config 设置里 enable ssh。
4,下载代码: https://github.com/zhaozhichen/PyStat
设置温度探头
我先扯开一点,讲一下空调是怎么控制温度的。
纠正一个许多人都有的错误印象:(以制热为例)温度调得越高,空调功率越大,室温升温越快。事实上,对大部分普通空调,制热制冷功率是恒定的,和所调温度无关。比如室温是10度,制热目标温度设为20度,在制热过程中室温逐渐升高,当到达目标温度加容错值(比如2度),也就是22度时,空调停止工作。此后,室温逐渐回落,当落到目标温度减去容错值,也就是18度时,制热再次开启,如此往复保证室温在设定温度周围(18~22度)震荡。所以,设定温度高低只能决定最终稳定的室温,而不能改变初始升温的速度。
说这个原理,是因为我们要在程序里复现以上逻辑,也就是说除了控制制热/制冷/风扇的输出信号,我们还需要测量室温的输入信号。
温度是模拟量。不同于 Arduino,树莓派只支持数字输入,于是需要 DS18B20 这样的 1-Wire 设备将模拟信号转换为脉冲数字信号,然后解码为模拟量,保存在 /sys/bus/w1/devices 中。请参考 这个 教程,并将你的温度探头序列号复制到 这里。注意:我们用4号接口。
安装 Web App
我自己不会做网站,尤其不懂前端,对 LAMP 结构的 web server 敬而远之。直到发现基于 python 的 flask,三行代码写 Hello World,真是找到了救命稻草,一见钟情。Flask 的 web server 教程请 参考这里。
这个系统的主代码是 ThermostatMain.py,初次运行时开启三个线程,分别是 :
- ThermostatService
- 从 current.set 读取指令(模式:制热/制冷/风扇,目标温度);
- 通过温度探头读取室温;
- 通过 GPIO 输出制热/制冷/风扇的开关。
- ThermostatWeb
- web server,通过温度探头读取室温显示在网页上;
- (可选)从指定的天气信息服务商 API 读取所在地气候、天气预报等信息。推荐 Weather提供的 API;
- 将用户在网页上做的指令保存于 current.set。
- ThermostatScheduler
- 定时开关,这个没有用户界面,我也没有用上。
然后循环运行以下任务:
- 记录室温、指令、天气情况等信息,通过 sqlite3 保存到数据库中;
- 检测各进程,及时报错。
运行主程序:
$ Python3 ThermostatMain.py
然后在其他设备上访问:192.168.X.X:5000(填写树莓派的 IP 地址),应该可以看到用户界面。
这是 web app 的单元测试(unit test)。
树莓派电路
如果你没有在树莓派上用过 python 的 GPIO 库,可以参考 这个教程。我们用的树莓派的 GPIO 针脚排布在 这里,此外可以在 这里看到更详细的参数。我们用到了4个接口,除了用于前文提到的用于温度探头的4号口,其他三个输出口分别是:
- 制热开关:17
- 制冷开关:27
- 风扇开关:22
除此之外,还需要用到3.3伏电位和地线(ground)。所以,焊接后的电路如下(温度探头的焊接方式在前文提到的 教程里):
(由于我用的是树莓派 Zero,不带 Wifi 功能,所以需要外接 USB Wifi 模块。如果你买的是我推荐的树莓派 Zero W,就可以忽略这个模块。)
在接空调之前,建议用 LED 灯模拟空调,检测制热/制冷/风扇在网页提供的指令下是否工作正常。比如,在17口和地线之间串联进一个 LED 灯加一个大于1k的电阻(防止 LED 灯电流过载而烧毁),如果空调应该处于制热模式,灯应该亮。
这是树莓派的单元测试。
注意:由于我们用到的 Relay 的开关和树莓派 GPIO 的输出是相反的,所以你在用 LED 灯测试时需要在 这里将输出指令掉转过来。)
空调电路
尽量获得空调的手册(至少是比较接近的型号),了解遥控模式的使用方式。比如,这个是和我家空调型号比较接近的控制板布局(摘自 手册):
注意 C、E、F 区。E 区中的 Remote 必须调至 ON,这意味着你将通过 C 区针脚操控空调,同时也意味着你放弃了控制面板的操作权。C 区的针脚布局如下:
每个空调的布局不尽相同,但一般都至少含有 R、G、W、Y、C 五个接口。含义如下:
- R:24伏高电位
- C:地线 Ground
- G:风扇
- W:制热
- Y:制冷
当 W 和 R 相连,W 就获得了高电位,制热模式开启。风扇和制冷同理。
这种通用接口称为 Thermostats C Wire,可以参考 这篇介绍。
在连入空调前,建议你先测试遥控模式下针脚是否工作正常。拿一根导线,将 R 和 G 连上,应该可以触发风扇工作。如果不行,将空调电源拔掉再接上试试。
这是空调遥控模块的单元测试。
注意,我们在树莓派上也连出五根线,分别对应以上五个接口。但是,树莓派的电位是3.3伏,而空调面板使用24伏,不能直接对接,需要用转换电压的 Relay,电路示意图如下(摘自 这里):
(空调地线不用接,因为它们最终连到同一个 Ground:地面——字面意思,非冷笑话。)
实物图(我用的是8通道 Relay,其实只用了其中三个通道):
最后,连入空调电路:
最后运行主程序,进行端到端成品测试(End to end test)。
祝你成功!
后续
1,设置静态IP:
sudo vi /etc/dhcpcd.conf
加上(第二行自选IP):
interface wlan0
static ip_address=192.168.X.X/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
2,开机启动程序:
sudo crontab -e
加上:
@reboot sh /home/pi/PyStat/launch.sh >/home/pi/logs/cronlog 2>&1
3,我在做这个的过程中发现一个很棒的全栈方案,是下一个探索方向:
- NodeMcu:客户端硬件;
- MQTT:通讯协议;
- Home Assistant:服务端控制平台。