admin管理员组文章数量:1658807
关注了就能看到更多这么棒的文章哦~
Simple IoT devices using ESPHome
By John Coggeshall
June 18, 2020
原文来自:https://lwn/Articles/823131/
主译:DeepL
围绕ESPHome这个项目,LWN已经撰写了两篇文章了:The open-source smart hub Home Assistant,以及Espressif ESP8266 microcontroller。利用这个项目就可以不用写任何一行代码,能快速创建和集成smart home device(智能家居设备)。
Introducing ESPHome
ESPHome是一个build and deploy系统,管理编译过程和部署过程。在整合定制的物联网(IoT)设备和Home Assistant时不再需要手写代码。它宣称不仅支持ESP8266,还支持它的前代ESP32,甚至支持Sonoff的各种基于ESP8266的现成消费设备。ESPHome通过实现Home Assistant所需的自动发现(auto-discovery)协议实现了无需代码即可集成。只需点击几下,就能将设备的功能拉到hub(智能网关,如Home Assistant)中。将ESP8266连接到目标硬件上,并在configuration时定义好该硬件的行为,就可以在hub中启用它。
要想将连接到ESP8266上的硬件用在ESPHome中,首先必须有ESPHome component支持。ESPHome项目的网站上列出了它所支持的各种硬件,从传感器到显示器的各种设备。虽然这个集合中的物联网设备组件并没有想象中的那么全面,但ESPHome确实已经涵盖了智能家居中许多常用组件。该项目最后一个版本是2019年11月发布的v1.14.0,其中包含了24个新组件。
Test driving ESPHome
为了评估使用ESPHome到底是如何工作的,我决定拿出我的面包板,看看建立一个与Home Assistant集成起来的传感器究竟是否容易。总的来说,创建一个新的传感器的整个过程只花了不到30分钟,这个数据对于第一次尝试者来说应该算是非常满意了。在实验中,我使用了我办公桌上放着的东西:一个Wemos D1 Mini ESP8266开发板,以及一个BME280温湿度压力传感器。
BME280传感器使用I2C进行通信,I2C是一种为微控制器等低速设备设计的串行协议。我用的这个传感器模块,有4个引脚可以用来连接到ESP8266上:3.3V供电、接地、SCL(I2C时钟)和SDA(I2C数据)。更详细的接线过程,有兴趣的读者可以参考这篇文章 https://lastminuteengineers/bme280-esp8266-weather-station/ (它使用的是同类的NodeMcu开发板而不是D1 Mini)。
ESPHome可以用pip命令从Python Package Index(PyPI)中安装。对于x8664系统来说,有一个Docker镜像esphome/esphome可用,其他架构则需要使用pip安装。esphome是一个独立的命令行工具,可以执行各种任务,如定义设备,构建项目,并将它们烧写到设备上。当初次使用esphome时,有一个很有帮助的界面,引导用户创建一个新的device firmware的过程。下列命令可以调出这个界面:
$ esphome tempsensor.yaml wizard
命令中的tempsensor.yaml是选择要生成配置的文件名。在接下来的过程中会收集基本信息(设备名称、微控制器,WiFi密码)将作为基础来生成这个初始YAML。完成向导后产生tempsensor.yaml设备定义文件,其中包含了ESPHome构建固件所需的所有基本要求。
esphome:
name: testbmp280
platform: ESP8266
board: d1_mini
wifi:
ssid: "my-ssid"
password: "my-password"
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Testbmp280 Fallback Hotspot"
password: "fallback-wpa-password"
captive_portal:
# Enable logging
logger:
# Enable Home Assistant API
api:
password: "password"
ota:
password: "password"
完成定义传感器的过程,需要对基础模板进行修改,添加传感器定义。由于我们使用的是BME280,这就需要查看该传感器的ESPHome文档进行指导。由于BME280使用I2C进行通信,所以首先必须添加I2C总线组件。
i2c:
sda: D1
scl: D2
scan: true
在I2C部分中需要注意一些地方,不注意的话可能会配错。在这部分中我们定义了sda和scl引脚的接线,作为ESP8266的I2C总线使用。在使ESPHome在测试中工作的过程中,这是一个很容易出错的地方,因为D1 Mini板上标注的I/O(GPIO)引脚与底层ESP8266芯片使用的编号方式不一致。幸好,就像使用Arduino Core for ESP8266直接对ESP8266芯片进行编程时一样,D1和D2这样的标识符与开发板上的标签是能匹配上的,可以用于ESPHome模板配置。
接下来,我们根据文档中BME280的传感器定义也写入下面的内容:
sensor:
- platform: bme280
address: 0x76
temperature:
name: "BME280 Temp"
oversampling: 16x
pressure:
name: "BME280 Pressure"
humidity:
name: "BME280 Humidity"
update_interval: 60s
address的值代表I2C总线上传感器的I2C地址。文档中指出,这是一个可选的字段,运行时会自动确定。然而,测试下来还是需要明确定义好address的。为了了解address应该怎么配,需要先把打开了I2C扫描的firmware烧入ESP8266。这样,启动log里面就可以看出I2C总线上BME280设备的地址。地址确定后,只要将其添加到上面传感器定义的address中就好。
每个物联网设备显然要根据设备的用途使用自己的component组合,因此每个YAML设备的配置文件都会有所不同。配置文件完成后,剩下的就是通过USB连接到D1 Mini,然后烧写firmware。可以通过esphome的如下命令来编译生成完整固件并将其烧写到设备上:
$ esphome tempsensor.yaml run(运行)
测试下来,编译和烧写到ESP8266的流程可以很好地完成。一句运行命令就完成了所有的繁重工作,编译并将生成的ROM烧写到芯片上的步骤就这么轻松结束了。烧写完成后,当ESP8266启动时,在shell中会显示一个彩色的日志,记录设备上发生的事情。这个日志对于了解设备是否正常工作,以及调试任何可能出现的问题都是非常重要的。对于通过WiFi连接的设备,也可以远程查看日志。
一旦设备启动ESPHome固件,Home Assistant会立即识别到本地网络上的设备,并提示用户在Home Assistant用户界面中进行一下简单的设置。该过程完成后,传感器数据就会传输给Home Assistant使用。测试下来这个流程完成的非常完美。
Advanced feature
ESPHome可以为各种平台搭建物联网传感器,与Home Assistant整合起来,但这并不是此项目的全部。在ESPHome中,还有一些高级功能,对实际应用中的物联网设备很有帮助。
首先,ESPHome实现了一种 "fallback "模式,用于无法成功连上配置好的WiFi连接的情况。在fallback模式下,设备会将自己激活为一个可以连接的热点,为用户提供一个调整WiFi设置或完全烧写新固件的途径。安全起见,提供的热点打开了WPA2认证。esphome工具的运行和上传命令都会自动提供一个选项,让用户可以通过无线方式(OTA)对设备进行重新烧写,因此ESPHome也让对现有firmware进行常规更新的步骤变得简单明了。这种OTA机制还可以通过密码保护来防止攻击者上传自己的ROM。
ESPHome的另一个比较有用的功能是内置的自动化功能。这个功能可以在不需要WiFi连接或网络服务的情况下,将基本逻辑和行为写入到设备中。例如,可以对一个物联网设备进行以下配置,该设备除了通过WiFi接受命令外,还有一个物理开关,可以打开/关闭它控制的某个功能。
switch:
- platform: gpio
pin: GPIO3
name: "Living Room Dehumidifier"
id: dehumidifier1
binary_sensor:
- platform: gpio
pin: GPIO4
name: "Living Room Dehumidifier Toggle Button"
on_press:
then:
- switch.toggle: dehumidifier1
在这个例子中,我们定义了两个硬件component:一个连接到GPIO4的简单按钮开关,和一个连接到GPIO3的控制除湿机电源的继电器。这个bianrysensor在这里代表了开关器件,是一个基于当前状态的进行各种触发器的组件。在本例中,当用户按下按钮时,触发onpress,设备将依次执行一个或多个动作。在提供的例子中,就会进行switch.toggle动作。这个动作可以是一个通过WiFi控制的设备,或者通过物理开关控制,这样即使在网络不可用的情况下也能正常工作。不同的组件有不同的触发器,每个组件的文档都可以在项目的网站(https://esphome.io/guides/automations.html?highlight=automation#all-triggers )上找到。
Comunity
ESPHome项目有一个健康的社区在支持它,其中有132个贡献者,至今已经发布了67个版本,最新的是v1.14.0版本。项目本身采用了双重许可模式,其中C++代码在GPLv3下发布,Python代码在MIT许可下发布。有兴趣贡献的人(无论是文档还是代码)可以查看贡献者指南(https://esphome.io/guides/contributing.html ),了解如何最好地参与其中。这个项目似乎没有使用邮件列表,但有一个Discord频道。
全文完
LWN文章遵循CC BY-SA 4.0许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~
版权声明:本文标题:LWN:使用ESPHome的简单IoT设备 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1729821272a1213973.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论