自动化电器!宅男舒适区的一小步
最近搬家之后,公寓附带的空调事很老的型号。据说新型号的空调会更加省电,但对我来说老型号反而有一个便利之处:它终于可以接入 HomeKit 了。现在实现了这样的效果:
- 从起床开始,到凌晨一点为止
- 当温度太低时就自动开启空调
- 升高到指定温度后自动关闭空调
- 工作区的顶灯会在日落的时间自动开启
- 在我出门之后所有顶灯和空调都会关闭
- 在我回家之后空调和灯都会根据室内的温度和光照自动开启
这种自动化虽然相当简陋,但却意外地便利。比如在此之前,往往感觉到要开关空调的时候温度已经很低或过高了(更不要说还要找遥控器)。应该要开灯的时候也常常因为懒得去按开关而放弃,回过神来已经在黑暗的房间中对着屏幕流泪了。如今几乎不需要再操心这些事情,正所谓:
一切都是最好的安排。
而需要手动控制的时候,因为这些电器都在Apple Home系统中,所以完全可以交给 Siri 大姐。尽管一直以来很多人都觉得声控 Siri 有些尴尬,但对于独居的自己来说,早已经习惯和 Siri 对话了。她的智能程度说不上多高,但是帮我按一下开关记一下备忘是绰绰有余了。我必须强调一句,习惯声控之后真的会便利很多。
上面所说的效果虽然简单,却还是需要一些基本的设备。作为生活在 Apple 生态中的人,必须有一个可以作为 Home Hub 的设备(iPad/HomePod/Apple TV)。接下来只需要准备温度传感器、光照传感器,和支持接入苹果生态的智能家电就可以了……虽然话是这么说,但对于我这种穷人来说当然优先考虑直接用手头的非智能家电。于是就轮到我数年前购买的树莓派登场了。
树莓派可以很方便地扩展,我图方便购入了一块传感器扩展包(BME280),包括了温度/湿度/气压/照度的传感器,以及一个红外线的收发器。如此一来,我就可以通过树莓派发射 顶灯/电视/空调 的红外信号来控制家电了。
在这个系统中,正常的智能家电可以直接通过 Home.app 接入,而那些老家电则可以通过 Homebridge 桥接到 Homekit 中。搞定之后,用户可以通过 Siri 和语音来直接控制电器,也可以通过各种苹果设备上的 Home.app 来直接控制。而一些自动化的操作则可以通过 Home.app 和 快捷指令 可以实现。
其中树莓派对红外线的控制依赖于cgir,它提供了两个工具
cli.py
(旧版本为cgritool.py
):可以解析并记录红外信号infrared.py
(旧版本为cgir.py
): 提供了Infrared
类,可以读取并重放cli.py
记录下的信号
具体来说,在执行
./cli.py rec <SIG>
之后,对着树莓派按下遥控器的按键,对应的信号就回被记录在一个 名为codes.json
的 json
文件中,其中的 key
为 <SIG>
,而 value
则是一个数组,即信号的数值序列。
通过
./cli.py send <SIG>
则可以播放 codes.json
中 <SIG>
信号。
而 Infrared
类则提供了编程接口,可以加载 codes.json
中的信号名和信号数值序列,进而播放信号。
下面是一个简单的示例:
class AirCon:
def __init__(self, codes_path: str):
"""
Load recorded signals
"""
self.ir = Infrared(codes_path=codes_path)
self.ir.load_codes()
self.codes = self.ir.codes
def on(self):
"""
Turn on the aircon
"""
self.ir.send(self.codes['ON'])
self.sleep()
def off(self):
"""
Turn off the aircon
"""
self.ir.send(self.codes['OFF'])
self.sleep()
一般的红外线遥控器的信号都能用上述方法进行处理,但是有一些空调的信号则比较复杂。比如 DAIKIN 品牌的空调信号会有比较复杂的编码方式,直接记录的信号序列并不能直接使用。这种情况也许可以通过 lircd 处理。这种信号的录入和解析要更复杂,一般需要通过连续随机地录入多个随机的按键信号来解析其中的编码关系,解析的结果也相当复杂(这里有一个信号的例子),而具体的效果却很难预测,似乎和具体的空调型号有关。我之前的空调一直没办法成功的录入信号,因此直到我这次搬家才终于能补全了自动温度控制的部分。
于是距离赛博朋克的世界又近了一步。