LWN:使用ESPHome的简单IoT设备

关注了就能看到更多这么棒的文章哦~

Simple IoT devices using ESPHome

By John Coggeshall
June 18, 2020
原文来自:https://lwn.net/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.com/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深度文章以及开源社区的各种新近言论~

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值