esp32c3 刷入 ESPHome 固件并联动 Home Assistant

发布时间 2023-05-23 17:05:27作者: LiuChengloong

在物联网里有一个很有名的固件叫做 ESPHome,它是一个通过简单而强大的配置文件控制 ESP8266/ESP32 并通过家庭自动化系统远程控制。

目标

这里通过一个简单的案例场景来开始讲述整个过程,目标是通过温湿度传感器上传室内温度并在墨水屏上展示温度变化曲线。

先决条件

既然是 esp32c3 刷入 ESPHome 固件并联动 Home Assistant 那么就需要

  • 一个 esp32c3,我这里使用的是自己制作的墨水屏开发板(可以在小黄鱼上面搜索到)- ESPHome 和 Home Assistant 环境。
  • 当然还需要一定的软件开发基础,需要懂一些 C++ 和 Docker 的基础命令
  • 还有能够畅通访问 GitHub 的网络,否则下载相应固件时会很难下载下载。
  • flash_download_tool 乐鑫官网提供的固件写入软件 flash_download_tool

安装 ESPHome 和 Home Assistant

这里我就不过多赘述 Docker 相关的知识了

sudo docker run -d \
  --name homeassistant \
  --privileged \
  --restart=unless-stopped \
  -e TZ=Asia/Shanghai \
  -v /root/homeassistant:/config \
  --network=host \
  homeassistant/home-assistant
  
sudo docker run -d \
 --name="ESPHome" \
 -e TZ=Asia/Shanghai \
 --hostname="esphome" \
 -v /root/esphome:/config \
 -v /run/udev:/run/udev \
 --privileged \
 --restart unless-stopped \
 --net=host \
 esphome/esphome

有几个注意点:

  • TZ=Asia/Shanghai
  • --network=host
  • --privileged
  • -v /run/udev:/run/udev

TZ=Asia/Shanghai 时区是必要的,否则界面上的时间会出现问题。--network=host 为了不必要的麻烦,请设置网络为 host。
--privileged-v /run/udev:/run/udev 是可以直接链接容器所在电脑刷入固件准备的,非必要。

硬件相关

一共三个硬件,esp32c3(这里选择的是合宙 12.9 版本),温湿度传感器 AHT21(其他的也可以,AHT10,AHT20,AHT25,DHT10,DHT20 都是可以的),墨水屏可以选择微雪的几款 Waveshare E-Paper Display

接线请看 GitHub 中的配置文件。

ESPHome 相关

Docker 的 ESPHome 容器起来以后,就可以通过 http://xxx::6052 来访问 ESPHome 的 Web 页面了,界面非常的简单,啥也没有。

依次点击 右下角NEW DEVICE -> CONTINUE -> 输入名称,如 esp32c3 NEXT -> 选择 esp32c3 -> 最后点击 SKIP

点击卡片的 EDIT 打开刚刚创建好的 esp32c3.yaml,这个是 ESPHome 的灵魂,我们可以同过编辑这个配置文件来实现各种各样的功能,即使不会编程也没有关系,通过查阅文档,参考着配置即可实现功能。

全部的配置文件访问我的 GitHub

这里稍微讲解一下配置文件的一些配置内容:

wifi:
  ssid: 'xxx'
  password: 'xxx'

这里的 wifi 要选择 2.4G 且必须链接,否则后面就没有办法和 Home Assistant 联动,并且要和 Home Assistant 服务处于同一个网络中。

i2c:
  sda: 18
  scl: 19
  scan: true
  id: bus_a

我这里定义的 i2c 引脚,scan 建议就直接设置为 true,省事。这里也可以写传感器的地址。

sensor:
  - platform: aht10
    temperature:
      id: "temperature"
      name: "temperature"
      filters:
      - offset: -1.0
    humidity:
      name: "humidity"
      filters:
      - offset: 10.0
    update_interval: 10s

这里是定义传感器的,温度和湿度
update_interval 采集间隔
filters offset 偏移量,这里根据自己购买的温湿度传感器来自行校准,ESPHome 也提供了函数式的方式来校准,我这里简单的使用偏移量来进行校准。

font:
  - file: "gfonts://Roboto Mono"
    id: roboto
    size: 10

定义显示的字体,后面墨水屏上面展示文字需要。

graph:
  # Show bare-minimum auto-ranged graph
  - id: single_temperature_graph
    sensor: temperature
    duration: 12h
    width: 276
    height: 101
    x_grid: 120min

graph 图形,简单来说这个就是一个开箱即用的图形组件
sensor: temperature 使用的数据是 id 为 temperature 的传感器
duration 数据展示时间
x_grid X轴竖线间隔单位
还有很多的参数,具体的可以看这里 graph-component

spi:
  clk_pin: 4
  mosi_pin: 6
  
display:
  - platform: waveshare_epaper
    cs_pin: 7
    dc_pin: 10
    busy_pin: 2
    reset_pin: 3
    model: gdey029t94
    update_interval: 1200s
    rotation: 90

    lambda: |-
      it.printf(10, 0, id(roboto), "temperature: %.1f", id(temperature).state);
      it.graph(10, 20, id(single_temperature_graph));

clk_pin,mosi_pin,cs_pin,dc_pin,busy_pin,reset_pin 声明了和墨水屏 SPI 通信需要的引脚。

model: gdey029t94 这里需要根据自己的墨水屏的不同来选择不同的 model。具体的可以看这里Waveshare E-Paper Display

update_interval: 1200s 每 1200 秒更新一次
rotation: 90 屏幕旋转角度

it.printf(10, 0, id(roboto), "temperature: %.1f", id(temperature).state); 用 roboto 字体在 10,0 位置展示格式化后的温度

it.graph(10, 20, id(single_temperature_graph)); 在 10,20 位置展示 graph 信息,就是上面定义的温度曲线图形

首次刷入固件

不得不说,无法直接访问 GitHub 或者其他的国外源有时候真的是一件非常麻烦的事情。这里我推荐使用代理,不然一些依赖根本就没有办法下载下载。所以 ESPHome Web 端的一些操作基本上就一点用都没有,很多其他的文章都是在 Web 端操作的,反正我是不行,下载个依赖就要 2-3 个小时,我这里推荐使用命令行的方式去操作,因为命令行可以设置代理。

前提条件,要有一个代理,这里我没有办法多写,自己想办法吧。我用的客户端是 Clash,开启局域网共享

首先进入容器

sudo docker exec -it 84a4c3113132  /bin/bash

84a4c3113132 是 ESPHome 容器的 id

export http_proxy=192.168.2.9:7890
export https_proxy=192.168.2.9:7890
curl www.google.com

设置命令行代理,ip地址为开启局域网共享客户端的那台电脑的ip。访问下 google 看看能不能访问。
如果不能,建议排查开启局域网共享客户端的那台电脑的防火墙是否允许 Clash 出入,这里就不详细说明了。

cd /config

esphome esp32c3.yaml clean
esphome esp32c3.yaml compile

clean Delete all temporary build files.
compile Read the configuration and compile a program.

可能会输出错误,一般都是 yaml 配置的有问题,根据提示进行解决

运行后会下载依赖并进行编译,编译成功后应该会输出如下内容:

Building .pioenvs/esp32c3/firmware.bin
Creating esp32c3 image...
Successfully created esp32c3 image.
esp32_create_combined_bin([".pioenvs/esp32c3/firmware.bin"], [".pioenvs/esp32c3/firmware.elf"])
Wrote 0x114380 bytes to file /config/.esphome/build/esp32c3/.pioenvs/esp32c3/firmware-factory.bin, ready to flash to offset 0x0
============================================================================================ [SUCCESS] Took 56.03 seconds =========

/config/.esphome/build/esp32c3/.pioenvs/esp32c3/firmware-factory.bin 这个文件下载到 Windows 电脑上。

将 esp32c3 开发板通过 typec 链接到 Windows 电脑上,并打开 flash_download_tool 软件。
乐鑫官网提供的固件写入软件 flash_download_tool


点击 START 就开始烧录固件了。

烧录完成后,重新上电,ESPHome Web 就可以发现卡片右上方的文字就变成 ONLINE 了。点击 LOGS 就可以查看 esp32c3 中的日志信息了。

Home Assistant 接入

进入 Home Assistant Web 管理界面,就会发现有一个 ESPHome 的卡片(首次接入会提示需要 API key,在 esp32c3.yaml 中有)。点击卡片上的 【设备】 按钮,然后点击 【传感器】 卡片上的 【添加到仪表盘】 即可将温湿度信息添加到首页。

OTA 刷新固件

当刷入 ESPHome 固件后,后续的操作就不用那么麻烦了,不需要使用 flash_download_tool 软件进行写入,ESPHome 中有 OTA 升级功能,直接通过 wifi 即可在线升级。

操作也很简单,首先进入容器,然后设置代理。然后键入以下内容:

esphome esp32c3.yaml clean
esphome esp32c3.yaml compile
esphome esp32c3.yaml upload

upload 就会将编译好的固件通过 OTA 的方式热更新。