在Part 1中,我们已经成功地搭建了Home Assistant平台。而在Part 2中,我们要来做一个最简单的智能插座,可以通过网页或手机来控制插座的通断电。这样就可以使插在这个插座上的电器被远程控制开关。
警告!本文的操作会涉及到交流220V强电,具有触电风险!操作者需有相关电工知识方可操作!本文及作者不承担任何操作或使用设备在当前及未来会带来的各种风险和责任!一切风险均由操作者自行判断和承担!!!
这时候有必要先来回顾一下整个系统的架构:
在Part 1中,已经在HomeAssistant中安装了ESPHome插件,如果还没安装,请在HomeAssistant的 Supervisor > 加载项商店 中安装。在这个架构中,我们让HomeAssistant通过ESPHome来和终端设备沟通,并控制终端设备。在进行下一步之前,先来了解下ESP系列芯片和ESPHome。
ESP系列芯片
ESP系列芯片,是由总部位于上海的乐鑫信息科技(ESPRESSIF)研发的高集成、低功耗、安全稳定、高性价比的无线通信 MCU。现已发布 ESP8266、ESP32、ESP32-S 、ESP32-C 和 ESP32-H 系列芯片、模组和开发板,是物联网应用开发的理想选择。
最具有代表性的ESP8266芯片的特性如下:
- 处理器:基于 Tensilica Xtensa Diamond Standard 106Micro 核心的 L106 32位 RISC 微处理器,运行频率 80 MHz
- 内存:
- 32 KB 指令RAM
- 32 KB 指令缓存RAM
- 80 KB 用户数据RAM
- 16 KB ETS 系统数据RAM
- 外部QSPI闪存:最大支持16 MB (一般为512 KB到 4 MB大小)
- IEEE 802.11 b/g/n Wi-Fi
- 17个 GPIO 引脚
- SPI 总线
- I²C (软件实现)
- I²S 带DMA的接口 (与GPIO共享引脚)
- 专用引脚上的UART,以及一个可在GPIO2引脚启用的仅用于发送数据的UART端口
- 10位 ADC (successive approximation ADC)
常见的开发板有基于ESP8266芯片的ESP-01系列模块、NodeMCU开发板和基于ESP32芯片的ESP-WROOM-32开发板等等,这些芯片除了自带Wifi功能外还是一个完整的MCU,功耗低功能强大,关键是价格还便宜。淘宝上一个NodeMCU开发板的价格只有十多元。单独的ESP8266模块只有5元左右。是物联网应用开发的最佳选择,在各种智能家电上都能看到他的身影。
一般而言,我们可以使用C语言或类似C语言的Arduino IDE,甚至MicroPython来为ESP系列芯片来编写固件,使之成为物联网服务的服务端或客户端设备。
ESPHome
ESPHome 是一个可以让你不用编写复杂的C语言代码,只需要通过简单而强大的配置文件就能生成对应的固件,从而控制你的ESP8266或ESP32芯片的开发系统。同时,ESPHome能够集成到HomeAssitant系统中,使HomeAssistant可以远程控制这些硬件。
ESPHome的原理是,它针对基于ESP8266或ESP32芯片的硬件,集成了很多功能模块,这些代码都已经准备就绪,并通过符合YAML标记语言标准的配置文件进行功能配置,编译时,将激活的相应的功能和参数进行编译链接,从而生成一个专有的固件,最终上传到指定的硬件中运行。由于只有要使用的模块会被编译并链接,因此固件的体积可以做得较小,空间较小的ESP-01模块也能够实现大部分想要的功能。
ESPHome支持绝大多数基于ESP8266或ESP32芯片的硬件。除了标准的模块和开发板外,一些商用的产品也能够直接支持,例如Sonoff的开关等等。如果硬件不在支持列表中,只要是基于ESP8266或ESP32芯片的,通过HACK,找到对应的UART引脚(用于刷入固件程序)以及理清控制设备的相应的GPIO端口,魔改后也可以通过ESPHome来编程控制。
在连接ESP芯片的传感器方面(用于感知环境,本节中不会涉及传感器),ESPHome也已经预支持了大多数常用的传感器,使用的时候只需要用配置文件配置端口等参数信息就可以直接使用了。对于不在支持列表中的传感器,则可以编写C语言代码的头文件,通过include操作引用支持。
在HomeAssistant集成方面,ESPHome可以直接在HomeAssistant界面中编辑代码并上传(初次上传使用有线连接,后续可以通过Wifi OTA更新代码)。对应的硬件成功运行代码后会生成一个实体,在HomeAssistant中可以发现并生成对应的控制面板。HomeAssistant可以直接控制这些硬件设备,也可以通过ESPHome直接读取返回的状态、环境等数值。当然ESPHome也可以使用MQTT组件(配置后编译时会将这部分功能做到固件中),使ESP芯片的设备直接发送MQTT数据,以便于网络中的其他MQTT Broker(或者HomeAssistant的MQTT模块)来直接订阅这些数据,从而实现物联网的数据共享和自动化联动功能。
硬件方案设计
智能插座的设计方案中最核心的部分就是使用ESP8266芯片来通过Wifi接受HomeAssistant通过ESPHome发出的指令。不过要让ESP8266正常工作,并控制电源插座的通断电,还需要一些外围部件来配合。看一下整个插座设计的面包板方案图。
在上图中,左侧的电源插头为220V交流电的输入端, 与AC-DC模块相连,将220V的交流电转化为5V直流电给NodeMCU (ESP8266)使用,同时电源输入的零线(N)直接接到输出插座的零线;火线(L)的部分则通过一个继电器模块连接到输出端的火线端口,由这个继电器来控制火线的通断。继电器的信号端与NodeMCU的D4 (GPIO 2)端口相连接。这样当ESP8266接收到控制信号时,只要改变D4 (GPIO 2)端口的输出电平就能通过继电器控制交流220V输出电源的通断了。
软件代码
编写ESPHome的代码非常简单,你根本就不需要编程经验。在首次为一个NodeMCU编程时,需要通过有线连接HomeAssistant服务器和NodeMCU。如果你用的是树莓派或者单独的电脑作为HomeAssistant的服务器,那就把NodeMCU直接用USB线缆连接到服务器的USB端口上。如果你和我一样,是用虚拟机运行HomeAssistant的,那就将NodeMCU通过USB连接到你正使用的电脑上,然后在电脑上打开虚拟服务器的管理端(我是VMWare ESXi)启动远程控制台,在远程控制台上将本机的USB连接的NodeMCU的设备(USB转TTL设备)映射到远程的虚拟服务器上,如下图所示。
连接完成后,打开HomeAssistant的主页,并在左侧点击ESPHome,进入到ESPHome的管理界面。如果不出意外,这时点击右上角的OTA(Over-The-Air)的下拉菜单就能看到刚才连接上的USB设备了,选中这个设备。
这时,点击页面右下角圆形绿色的“+”加号图标,可以通过向导工具创建一个要添加进来被管理的NodeMCU设备。
- Node Name:设备名称,便于你后期识别是哪个设备,建议自己设定一个规则,名称中包含类型和位置信息。
- Device Type:设备类型,根据你使用的模块选择相应的型号,如 NodeMCU、ESP32等等,如果是不明型号的ESP8266设备,就选择Generic ESP8266。
- Wifi & Updates:Wifi配置和OTA更新配置,在这里输入Wifi环境的SSID和密码,以及今后要通过OTA功能(无线更新代码,无需通过USB物理连接来进行代码更新)更新时使用的密钥。
- Finish:确认完成后提交。
点击提交后,系统会生成的一个新的被控结点,点击EDIT,就能看到自动生成的YAML语言模板。
YAML语言非常简单,其实就是一个配置文件。默认生成的这些我们都不用进行修改,都是刚才我们通过想到设定的最基础的配置。还记得上一段中我们的硬件设计方案吗?我们的目的是要让NodeMCU收到信号后,控制D4这个端口输出高电平或低电平,从而控制继电器动作。也就是说,我们要在这个配置文件中,把D4这个端口配置成可以被控制的一个输出数字端口。(数字端口只有0和1两种状态,分别对应低电平和高电平。)
第一次写配置文件时,建议大家去ESPHome的官方网站学习下,上面有很多案例,可以参考。打开ESPHome的官方网站,页面往下拉,找到Output Components (输出组件,我们是要向继电器输出信号)中的GPIO Output,点进去查看样例。
多简单的事,我们直接照抄,照着样例在我们的配置文件的最下方加上下面几行:
# Example configuration entry
output:
- platform: gpio
pin: D4
id: gpio_d4
这样就完成了,是不是很方便?别急还有一些工作要做,在编辑框下方点击“SAVE”将代码保存,在确保右上角连接的设备是我们的USB设备而不是OTA后,点击这个设备卡片中的“UPLOAD”将你的代码上传到NodeMCU上。第一次上传时间会较久,因为ESPHome会根据你的配置选择相应的组件进行编译,最后再链接后上传固件。系统会打开一个窗口显示编译和上传的进度,上传完成后,NodeMCU会自动重启,并运行设定的代码。
NodeMCU成功运行后,稍等一会HomeAssistant就会发出一个通知,发现了新设备。这时你的智能插座的控制板就已经在HomeAssitant中注册成功了,并可以接受控制啦。
打开发现的新设备,有一个ESPHome的标签卡,里面就是我们刚才编写的NodeMCU设备。点击这个设备,会显示“1个设备和1个实体”。简单地说,一个设备上可以有多个实体,比如一个设备控制多个开关,或者一个设备上有多个传感器,又或者一个设备上又有传感器又有开关等等。点击“1个设备”进行配置,会出现这个设备的信息界面,除了设备信息外,还有自动化、场景、脚本等等,这些先不用管,以后可以通过这些设计很多智能化场景,使家居真的自动运行起来。但在目前,我们只关心如何能通过HomeAssistant来遥控这个设备。因此,把目光聚焦到实体面板上,可以看到系统自动生成了一个滑动开关,点击这个滑动开关就会通过Wifi控制刚才配置的NodeMCU的D4端口输出高电平或者低电平了。如果要测试的话可以在面包板上给D4端口串联一个发光二极管和一个200欧姆左右的限流电阻接地。就能看到这个发光二极管会随着面板上的滑动开关的开关而亮灭。
在这个面板下方,有个链接“添加到LOVELACE”,点击它,这样在HomeAssistant的主页上就会添加上这个滑动开关,以后就能很方便的控制了。
成品组装
警告!执行以下操作会涉及到交流220V强电,具有触电风险!操作者需有相关电工知识方可操作!本文及作者不承担任何操作或使用设备在当前及未来会带来的各种风险和责任!一切风险均由操作者自行判断和承担!!!
智能插座不能停留在面包板上,得做成成品才能使用。接着就来看下如何组装。
AC-DC降压稳压模块:DC端输出5V 500mA的即可。基于安全起见还是要选择用料好的,如果舍得花钱建议买那种一体式的带黑色封装的模块,安全性能更佳。
继电器模块:没什么好说的,挑个体积小的。由于NodeMCU的高电平定义是3.3V,因此要买一个信号端3.3 V就能触发的模块。在被控端需要看下耐压和限流,一般250V 10A就足够使用了。
导线:别小看这个,这个也有安全隐患。交流电的导线,建议买外皮是耐热硅胶的那种。为了安全起见,避免瞬间电流冲击,规格建议买16AWG或至少18AWG的导线。直流电部分的导线电流较小,无所谓,好用好焊接就好。
外壳:淘宝上搜索智能插座外壳就能买到,记得安全第一,要找靠谱厂家生产的用料考究的。我就不推荐了,避免商业推广嫌疑。建议最后一个买,买稍大一点,便于散热。最好等其他的部件买到后,焊接前自己组合布局下,然后根据组合后的体积大小再买外壳,确保东西都能装进去。
买回来后,回顾一下我们硬件设计的图稿,按照图稿焊接完成,模块间用电工胶布做好绝缘。装进外壳前后一定都要检查绝缘,各焊接点千万不能有短路,尤其是交流电220V强电部分。建议装进外壳前先做下测试,确认工作正常后,再把模块塞到外壳里。
最后,看一下成品!我用它来控制电蚊香,就像题图那样插在墙上。一是可以远程控制,二是在HomeAssistant的“自动化”配置中,我写了脚本配置它晚上自动打开电蚊香,白天起床后自动关闭,就不用我操心啦。