前几天没事干买了块 ESP8266 芯片玩,偶然发现 8266 可以通过刷固件接入 HomeKit,于是便做了这么个东西。

前言

最开始我是看到 B 站有刷固件接入 HomeKit 的视频,我了解了一下之后觉得有些问题,他们都用的是统一的一个 Sonoff 固件,刷入之后可以直接通过 NodeMCU D6(GPIO 12) 引脚输出高低电平,但是我甚至没找到这个固件的来源,所有视频都是草草地丢一个下载链接,告诉你下载刷进去就行了...而且这个输出引脚没法修改,后期接线的话会有一些问题。

后来我在 GitHub 上找到一个项目 RavenSystem/esp-homekit-devices,该固件可以刷入采用 8266 芯片的设备,接入 HomeKit 并提供丰富的自定义选项,而我之前在 B 站看到的固件,应该就是基于该项目修改,原本用于 Sonoff 开关的一个固件(查了一下 Sonoff 是深圳一家公司的物联网产品,主打 WiFi 继电器)。那么就可以通过该项目,很轻松地实现我们的目标。

准备

我们需要这些东西:

ESP-01
ESP-01
继电器
继电器
200V 转 5V
200V 转 5V

材料价格
ESP-016.02 元
继电器模块8 元
220V 转 5V 降压模块6.25 元
总计20.45 元

除了这些以外,还需要杜邦线若干,ESP-01 USB 转串口下载器一个。

杜邦线
杜邦线
USB 转串口
USB 转串口
NodeMCU
NodeMCU

为什么不用 NodeMCU 呢,因为开发板体积太大了,不必要的引脚和模块浪费空间,而且 ESP-01 有配套的继电器模块,8 个引脚一一对应,可以直接插在上面,由继电器给 ESP-01 供电,并通过 GPIO 0 引脚控制继电器,避免了复杂的接线。

刷机

首先给 ESP-01 刷入固件。

下载这三个文件 haaboot.bin rboot.bin blank_config.bin

6 月 5 日 更新:

今天发现 HAA 更新了他们的安装方式,之前的三个文件变成了一个 fullhaabot.bin。现在只需要下载这一个文件就可以了。

通过下载器让 ESP-01 连接电脑并进入烧录模式(flash-mode)。

下载

根据下载器所使用的 USB 转串口芯片安装对应的驱动程序。完成之后在 设备管理器 - 端口 中应该能看到对应设备,记录下设备名之后所对应的串口号。

设备管理器

鼠标右键点击 属性 - 端口设置,在 位/秒(B) 选项中修改当前的波特率,默认应该为 9600,为了下面脚本方便这里改为 115200

波特率

这里我们采用 esptool.py 来刷入固件,电脑需要有 Python 环境。

安装 esptool.py:

pip install esptool

然后抹除 ESP-01 的闪存:

esptool.py -p /dev/<your_ESPPort> erase_flash

这里的 /dev/<your_ESPPort> 对应刚才在设备管理器中看到的端口号 COMx。

最后刷入刚才下载的三个文件:

esptool.py -p /dev/<your_ESPPort> --baud 115200 write_flash -fs 1MB -fm dout -ff 40m 0x0 rboot.bin 0x1000 blank_config.bin 0x2000 haaboot.bin # 更新之后用下面的方式刷入新文件

现在只需要刷入这一个文件:

esptool.py -p /dev/<your_ESPPort> --baud 115200 write_flash -fs 1MB -fm dout -ff 40m 0x0 fullhaaboot.bin

配置

完成之后,ESP-01 会建立一个 SSID 为 HAA-XXXXXX 的开放 2.4GHz WiFi 热点,连接它,等待几秒钟,就会跳转到 Home Accessory Architect 的配置页面。

Home Accessory Architect

这里我们需要写一个 JSON 来配置 ESP-01 的功能,HAA 提供了相当丰富的物联网设备类型供我们选择,这里我们选择相对简单的的开关(Switch)来配置。

将 wiki 中提供的范例 JSON 稍加修改:

{
  "c": { "l": 1, "b": [{ "g": 2, "t": 5 }] },
  "a": [{
    "t": 1,
    "s": 1,
    "0": { "r": [{ "g": 0, "v": 1 }] },
    "1": { "r": [{ "g": 0, "v": 0 }] },
    "b": [{ "g": 2 }]
  }]
}

这里表示了一个基本类型的开关("t": 1),通过 GPIO 0 控制继电器,因为这个继电器模块是 GPIO 0 低电平时闭合,所以在下面的 "0" 表示开关关闭的选项中 "v": 1 表示高电平,而 "1" 与之相反。LED 指示灯定义为 GPIO 1,按钮定义为 GPIO 2,"s": 1 表示通电后默认为开关打开状态。

详细的配置规则可以参阅原项目的 Wiki

将 JSON 填入配置页面,并在下方连接 WiFi,注意 ESP-01 仅能连接 2.4GHz 的 WiFi。

之后点击保存并等待 7 分钟左右,完成后 LED 会亮起几秒钟。

在设备安装或者更新的时候,可以在 macOS 或 GNU/Linux 设备上通过下面的命令检测日志获取设备状态:

nc -kulnw0 45678

接线

将 220V 的火线与零线接到 220V 转 5V 降压模块上。

降压模块输出 5V 电接入继电器的 VCC 与 GND。将 ESP-01 插在继电器上,因为该继电器自带一个 5V 转 3.3V,所以可以直接给 ESP-01 供电。

将继电器的常开端(NO)与通用端(COM)与灯泡和 220V 连接,当继电器闭合时即形成回路点亮灯泡。

接线

添加 HomeKit 设备

在 iOS 设备中打开「家庭」App,通过下方的设置代码,按照正常步骤添加新配件。大约等待 30 秒即可添加完成。

QR-Code
QR-Code
Normal Code
Normal Code

现在我们就可以在 iOS 设备上通过 HomeKit 控制灯泡了。

添加配件
添加配件
设置配件
设置配件

家庭
家庭
Siri
Siri

If you think my article is useful to you, please feel free to appreciate