跳转到内容

常见问题

我们一直被问到这个问题。与所有工程问题一样,“视情况而定”。ESP32 是大多数新开发发生的主要平台。根据 ESPHome 内硬件支持的当前状态,以下是我们建议:

  • ESP32(原版,非变体)

    • 支持最好/最成熟。
    • 包含一组出色的内置硬件外设,因此功能非常强大且非常灵活。
    • 有线以太网连接的最佳选择,因为它内置了以太网 MAC,可直接连接到 PHY 芯片。其他变体需要基于 SPI 的以太网控制器,增加了延迟。
  • ESP32-S3

    • 原版 ESP32 的更新版本,硬件外设略有修改。
    • 具有内置 USB 外设/接口(而不是依赖外部 USB 转串行芯片)。
    • 具有指令集扩展,使其更适合需要某种形式机器学习的应用程序(例如 Micro Wake Word)。
    • 如果您需要原始计算能力,这是最佳选择,具有更好的整体性能和更低的延迟。
  • ESP32-C3

    • 通常旨在(根据 Espressif)取代著名的 ESP8266。
    • 更简单项目的好选择:单核 RISC-V,GPIO 引脚较少,但比双核 ESP32(-Sx) 变体成本更低、功耗更低。
  • ESP32-C6

    • 与 ESP32-C3 类似,具有额外的连接选项,包括 Thread(通过 OpenThread)。
    • 新项目的好选择。
  • ESP8266

    对于新项目,我们推荐 ESP32-C3,价格相似。与 ESP8266 相比,所有 ESP32 变体具有:

    • 大约 5 倍的 RAM。某些组件(如大型显示器和某些传感器)可能在 ESP8266 上运行不佳。
    • 显著更多的闪存。大多数 ESP8266 开发板有 1-2 MB,而大多数 ESP32 变体有 4 MB 或更多。
    • 更多 GPIO 引脚和更好的硬件外设集。

    ESP8266 不符合 Made for ESPHome 的要求。

    原版 NodeMCU、D1-Mini 和 ESP-01 是使用 ESP8266 的开发板示例。请注意,这些开发板有引脚兼容版本可用,使用更现代的 ESP32 变体。

    也就是说,现有的 ESP8266 设备运行良好,并将继续支持多年。 最近的内存优化显著改善了 ESP8266 上的可用堆,使以前不可靠的设备现在变得稳定。如果您的 ESP8266 设备正在工作,则无需更换。

如果您有一个带有 Beken、Realtek 或 Lightning Semi 芯片的现成智能家居设备,LibreTiny 使在其上运行 ESPHome 成为可能。这些芯片通常不是直接购买的。相反,用户刷写包含它们的现有设备。

LibreTiny 支持已显著成熟,这些设备通常运行良好。然而,LibreTiny 不如 ESP8266 或 ESP32 支持成熟。

对 ESP32-H2、RP2040 和其他较新芯片的支持不太成熟,因此您更有可能遇到这些问题。我们推荐上面列出的芯片以获得最佳 ESPHome 体验。

随着较新微控制器支持的成熟,我们将在此更新我们的建议。

如何将 ESPHome 安装到我的设备上?

Section titled “如何将 ESPHome 安装到我的设备上?”

您可以直接使用 ESPHome Device Builder;将设备配置编辑到您满意的程度后,点击 “INSTALL” 并按照提示操作。请注意,第一次将 ESPHome 安装到(新)设备上时,您需要使用(USB)线缆连接它;此安装方法需要支持 WebSerial 的浏览器,如 Google Chrome 或 Microsoft Edge。

如果您喜欢更手动的方式:

  1. 您需要获取要安装的固件文件:

    • 使用 ESPHome CLI

      构建完成后,文件位于 <CONFIG_DIR>/<NODE_NAME>/.pioenvs/<NODE_NAME>/firmware.bin 目录中。

    • 使用 ESPHome Dashboard

      1. 点击设备的三点菜单
      2. 选择 “Install”
      3. 选择 “Manual download”
  2. 在某些开发板上,您可能需要强制微控制器进入其编程模式。这在大多数现代开发板/设备上通常不需要,但如果您遇到困难,值得一试。

  3. 最后,要安装固件文件,您可以使用:

    • ESPHome Web,我们的基于 web 的安装程序。这是最简单的方法,但需要支持 WebSerial 的浏览器,如 Google Chrome 或 Microsoft Edge。

      1. 将开发板连接到计算机,确保它被检测为串行端口并点击 Connect

      2. 如果提示,在出现的弹窗框中允许您的浏览器请求权限。

      3. 选择与您的开发板关联的串行设备

      4. 点击 Install 并浏览/选择您之前下载的二进制文件(如上所述)。

      请注意,文件在本地处理,不会上传到任何云服务。

    • esptool 来自 GitHub 存储库。它可能作为您的操作系统的包可用,或者您可以尝试使用 pip install esptool 安装(如果是 Linux)。

esptool 是一个命令行/终端应用程序,可用于在 Espressif 微控制器上执行各种任务。它不是最友好的方法,但相当强大,如果您遇到困难可能会有用。

NOTE

在使用 esptool 之前,请确保您知道您的开发板/串行适配器连接到哪个串行端口!

  • 在 Linux 中,您可以在将设备插入 USB 端口后使用 dmesg 命令查看(新)串行端口的名称。

  • 在 Windows 中,查看设备管理器,看看插入时是否出现新串行端口,并记下(新)端口的 COM 编号。

这将擦除您的微控制器闪存 — 不会保留任何内容(设置、数据等)!

Terminal window
esptool --port /dev/ttyUSB0 erase_flash

这将把您的二进制文件(ESPHome)安装(“刷写”)到您的微控制器上。

Terminal window
esptool --port /dev/ttyUSB0 write_flash 0x0 your_node_firmware.bin

这可能有许多原因。

  • 没有使用 USB 数据线。为了降低成本,许多 USB 线缆设计为仅用于电池充电,它们无法建立与您的开发板通信所需的数据连接。

  • ESPHome 依赖于您的计算机操作系统来使编程工具(例如 esptool.py)能够与您的微控制器开发板通信;您可能需要安装适当的驱动程序

  • 如果您尝试从 Docker 容器内将 ESPHome 安装到设备上,请确保使用 --device=/dev/ttyUSB0 将设备挂载到容器中。

如果您只看到屏幕上的 Connecting....____.... 并且安装(“刷写”)失败:

  • 验证设备的端口名称是否已更改;如果您断开连接后重新连接太快,可能会发生这种情况(例如,它可能从 /dev/ttyUSB0 变为 /dev/ttyUSB1)。

  • 如果您使用外部 USB 转串行适配器,请确认导线连接正确。适配器的接收 (RX) 线应连接到开发板的发送 (TX) 线(反之亦然)。

  • 某些设备可能需要您至少在刷写开始之前保持 GPIO0GND 连接。

  • 某些设备可能需要您重新上电以在擦除闪存后重新启动编程模式;它们不会自动重置。

  • 最后但同样重要的是,这可能是您的微控制器有缺陷、损坏或无法编程的迹象。:(

如果您处于嘈杂的电气/RF 环境中或使用异常长的线缆/导线,安装可能在传输过程中失败。不用担心 — 只需重试,也许使用较低的波特率以进行更安全的传输:

Terminal window
esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash 0x0 your_node_firmware.bin

如果您仍然无法使其工作,您可能需要重新访问上面的我无法通过 USB 安装

  • ESPHome 支持(大多数)Home Assistant 的 YAML 配置指令,如 !include!secret。 这允许您将机密(例如 WiFi 密码和 API 密钥)存储在名为 secrets.yaml 的文件中,只要此文件与您的 ESPHome 配置文件在同一目录中。

    我们增强了 ESPHome 的 !include 指令,使其接受可在包含文件中替换的变量列表。例如:

binary_sensor:
- platform: gpio
id: button1
pin: GPIOXX
on_multi_click: !include { file: on-multi-click.yaml, vars: { id: 1 } } # 内联语法
- platform: gpio
id: button2
pin: GPIOXX
on_multi_click: !include
# 多行语法
file: on-multi-click.yaml
vars:
id: 2

on-multi-click.yaml

- timing: !include click-single.yaml
then:
- mqtt.publish:
topic: ${device_name}/button${id}/status
payload: single
- timing: !include click-double.yaml
then:
- mqtt.publish:
topic: ${device_name}/button${id}/status
payload: double
  • 您可以使用替换基于上面的示例构建并减少配置文件中的重复。

  • 如果您想查看 ESPHome 如何解释您的配置,请运行:

Terminal window
esphome config livingroom.yaml
  • 要在不上传的情况下查看 ESPHome 节点的日志,请运行:
Terminal window
esphome logs livingroom.yaml
  • 您始终可以在 <NODE_NAME>/src/ 目录中找到 ESPHome 生成的源代码。

  • 您可以在以下位置查看完整的命令行界面选项列表:CLI

这不好。以下是一些解决某些问题的步骤:

ESPHome 是一个大项目,许多方面都在普遍使用且已知工作良好。也就是说,有些部分使用较少,因此测试较少。我们尽力测试尽可能多的内容,但我们根本没有 ESPHome 支持/实现的每一件硬件。我们严重依赖社区和贡献者完成的测试。当我们进行更改时,某处可能会出现问题。问题报告是我们跟踪并(希望/最终)修复问题的好方法。

提交问题时,尽可能描述详细很重要 — 但要避免过多无关信息。如果您希望您遇到的问题尽快修复:

  • 只写 “X 不工作” 或 “X 有 bug” 是没有帮助的!!! 说真的,仅凭这些信息您期望得到什么帮助?

  • 提供触发问题的代码/配置片段;我们可能想尝试复现它。请阅读如何创建最小、完整和可验证的示例

  • 如果是硬件通信问题(例如 I²C 或 SPI 设备),尝试将日志级别设置为 VERY_VERBOSE,因为它可能提供更好的洞察。

  • 请描述您已经尝试过的故障排除步骤,这也可能帮助我们追踪问题。

您可以在 GitHub 上找到我们的 issue tracker。

在 Home Assistant 中,当有可用更新时会显示更新通知(与所有插件一样)。

如果您独立于 Home Assistant 运行 Docker 容器,请运行:

Terminal window
pip3 install -U esphome
# 从 docker:
docker pull ghcr.io/esphome/esphome:stable

ESPHome 有一个 beta 发布周期,以便在更改部署到稳定通道之前轻松测试新版本。您可以通过安装 beta 来帮助测试 ESPHome(并使用新功能):

  • 对于 Home Assistant 监督安装,在 Add-on Store 中搜索 “ESPHome”。请注意,插件相应命名;对于 beta 版本,您需要 “ESPHome Device Builder (beta)”。

  • 如果您独立于 Home Assistant 在 Docker 中运行容器:

Terminal window
# 对于基于 pip 的安装
pip3 install --pre -U esphome
# 对于基于 docker 的安装
docker run [...] -it ghcr.io/esphome/esphome:beta run livingroom.yaml

Beta 文档可在 beta.esphome.io 获取。

首先,公平警告,最新的前沿版本并不总是稳定的。您可能会遇到异常问题和/或未记录/意外的更改。我们通常不支持运行 ESPHome dev — 通常只有开发人员使用。

除此之外,如果您想安装 ESPHome 的 dev 版本:

  • 对于 Home Assistant 监督安装,在 Add-on Store 中搜索 “ESPHome”。请注意,插件相应命名;对于 dev 版本,您需要 “ESPHome Device Builder (dev)”。

  • pip

Terminal window
pip3 install https://github.com/esphome/esphome/archive/dev.zip
Terminal window
docker run [...] -it ghcr.io/esphome/esphome:dev livingroom.yaml compile

Dev 文档可在 next.esphome.io 获取。

如何使用我的 Home Assistant secrets.yaml 文件?

Section titled “如何使用我的 Home Assistant secrets.yaml 文件?”

如果您想将所有机密集中在一个地方,请在您的 esphome 目录中创建一个 secrets.yaml 文件,内容如下:

<<: !include ../secrets.yaml

这将”引入”父目录中 Home Assistant secrets.yaml 文件的内容。

如果它不在组件索引中,它(官方)不受支持。但是,我们总是在添加对新功能的支持。

在某些情况下,社区提供的外部组件可用;请记住,这些不受 ESPHome 官方支持,因此如果您遇到问题,您需要联系您使用的外部组件的开发人员寻求帮助。

您还可以在我们的 ESPHome 功能请求 tracker 中创建功能请求。

当然!我们很乐意帮助 :) 您可以在这里联系我们:

这是一个已知问题,但似乎是非常底层的(换句话说,不是 ESPHome 特有的问题),我们真的不知道如何解决它。我们正在尝试确定问题的解决方法,但目前没有单一、特定的解决方案。

以下是一些可能有助于缓解问题的步骤:

  • 如果您使用隐藏的 Wi-Fi 网络,请确保在设备的 Wi-Fi 配置中启用 fast_connect 模式。请注意,这也可能有助于非隐藏网络。

  • 给您的 ESPHome 设备一个静态 IP

  • 在您的 wifi: 配置中将 power_save_mode 设置为 light。但是,请注意,这可能会在某些情况下加剧问题。请参阅省电模式

  • 这个问题似乎更频繁地发生在”廉价”开发板上 — 特别是 eBay 上的”廉价” NodeMCU 开发板,有时天线不好。

  • ESPHome 在特定情况下有意在配置的持续时间后重启,例如当无法建立 Wi-Fi 连接API 连接丢失MQTT 连接丢失 时。要禁用此行为,您需要在相关组件上显式将 reboot_timeout 选项设置为 0s

  • 如果您在日志中看到 Error: Disconnecting <NODE_NAME>,ESPHome 正在主动关闭原生 API 客户端连接。您需要与设备建立串行连接以确定原因。如果您在断开连接之前立即看到 ack timeout 4,这可能是 AsyncTCP 库中的 bug,ESPHome 版本 1.18.0 中包含了修复。如果您运行的是 1.18.0 之前的 ESPHome 版本,您应该升级 ESPHome 并为您的设备构建新固件。

  • 我们看到在日志级别设置为 VERY_VERBOSE 时断开连接增加,特别是在单核设备上,日志代码可能会干扰网络代码的操作。因此,我们建议在生产环境中使用较低的日志级别。

  • 同时连接到设备上原生 API 服务器的客户端太多也可能导致此行为。例如,Home Assistant ESPHome 集成和 ESPHome Device Builder 上的日志查看器各自建立与设备的连接。在生产中,您可能只有来自 Home Assistant 的单个连接,使这不是问题。但请注意,附加日志查看器可能会产生影响。

  • 在 Wi-Fi 接入点中减少 Delivery Traffic Indication Message (DTIM) 间隔可能有助于提高 Wi-Fi 可靠性和响应性。这将导致处于省电模式的 Wi-Fi 设备更频繁地唤醒。这可能会以增加其他同样使用省电模式的设备的功耗(可能还有电池使用)为代价来缓解断开连接。

此消息意味着您的 ESP32 电压降至安全水平以下,通常发生在 WiFi 发射脉冲期间,电流可能飙升至 300-500mA。最常见的原因:

  • 电源供应不足 — USB 端口、细线缆或廉价适配器可能无法提供足够的电流。
  • 长或细的布线 — 电压随距离下降,特别是细 USB 线缆。
  • 其他外设消耗电力 — 传感器、LED 或继电器共享同一电源。
  1. 降低 WiFi 发射功率 — 这是单个最有效的更改:
wifi:
output_power: 13dB # 默认为 20dB
  1. 使用优质电源 — 带有短、粗 USB 线缆的专用 5V/2A 电源。

  2. 添加电容器 — 在 3.3V 和 GND 引脚之间添加一个 100-1000µF 电解电容器可以吸收短暂的电流脉冲。

某些组件(如 climateswitch 组件)能够在微控制器重启/重新上电后恢复其状态。如果您已为某个组件配置了此功能,但发现其状态未按预期恢复,或者在设备日志中出现周期性的 ESP_ERR_NVS_NOT_ENOUGH_SPACE 错误,可能是闪存的 NVS 部分已满。这可能由多种原因引起,但无论如何,您可以尝试使用以下命令擦除 NVS 分区:

Terminal window
dd if=/dev/zero of=nvs_zero bs=1 count=20480
esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash 0x009000 nvs_zero

将上面的 /dev/ttyUSB0 更改为您的串行端口。如果您更改了分区布局,则需要相应调整上述偏移量和大小。

安装版本:

Terminal window
# 稳定版本
docker pull ghcr.io/esphome/esphome
# Beta
docker pull ghcr.io/esphome/esphome:beta
# Dev 版本
docker pull ghcr.io/esphome/esphome:dev

ESPHome 命令参考:

Terminal window
# 为文件 livingroom.yaml 启动新文件向导
docker run --rm -v "${PWD}":/config -it ghcr.io/esphome/esphome wizard livingroom.yaml
# 编译并上传 livingroom.yaml
docker run --rm -v "${PWD}":/config -it ghcr.io/esphome/esphome run livingroom.yaml
# 查看日志
docker run --rm -v "${PWD}":/config -it ghcr.io/esphome/esphome logs livingroom.yaml
# 将 /dev/ttyUSB0 映射到容器中
docker run --rm -v "${PWD}":/config --device=/dev/ttyUSB0 -it ghcr.io/esphome/esphome ...
# 在端口 6052 上启动仪表板(常规命令)
# 警告:此命令目前在 MacOS 上的 Docker 中无法工作。(见下方注释)
docker run --rm -v "${PWD}":/config --net=host -it ghcr.io/esphome/esphome
# 在端口 6052 上启动仪表板(MacOS 特定命令)
docker run --rm -p 6052:6052 -e ESPHOME_DASHBOARD_USE_PING=true -v "${PWD}":/config -it ghcr.io/esphome/esphome
# 设置 bash 别名:
alias esphome='docker run --rm -v "${PWD}":/config --net=host -it ghcr.io/esphome/esphome'

Docker Compose 示例:

version: '3'
services:
esphome:
image: ghcr.io/esphome/esphome
volumes:
- ./:/config:rw
# 使用本地时间作为日志时间戳
- /etc/localtime:/etc/localtime:ro
devices:
# 如果需要,像上面的命令行示例一样添加 esp 设备
- /dev/ttyUSB0:/dev/ttyUSB0
- /dev/ttyACM0:/dev/ttyACM0
# 主机网络驱动程序仅在 Linux 主机上工作,但在 Docker Desktop 版本 4.29 及更高版本上作为 Beta 功能可用。
network_mode: host
restart: always

NOTE

默认情况下,ESPHome 使用 mDNS 解析网络上的设备 IP;这用于确定 ESPHome Device Builder 中的在线/离线状态。为了使此功能工作,您必须使用 Docker 的主机网络模式。

主机网络驱动程序仅在 Linux 主机上工作;它在 Docker Desktop 版本 4.29 及更高版本上可用。

如果您不想使用主机网络驱动程序,您必须使用下面描述的替代方法。

请注意,如果您的 Home Assistant 服务器和 ESPHome 节点位于不同的子网和/或 VLAN,mDNS 可能无法工作。如果您的路由器支持 Avahi,您可以配置 mDNS 在不同子网间工作。例如,在 OpenWRT 或 pfSense 中:

  1. 在两个子网上启用 Avahi(在 OpenWRT 或 pfSense 上安装 Avahi 模块)。
  2. 启用从 ESPHome 设备子网到 224.0.0.251/32 端口 5353 的 UDP 流量。

或者,您可以通过设置 "status_use_ping": true 或使用 Docker:-e ESPHOME_DASHBOARD_USE_PING=true 配置 ESPHome Device Builder 使用 ICMP ping 检查设备状态。

另请参阅 https://github.com/esphome/issues/issues/641#issuecomment-534156628

ESPHome 的某些功能依赖于 mDNS,因此禁用它自然会导致这些功能停止工作。

一般而言,在不设置静态 IP 地址(或静态 DHCP 租约)的情况下禁用 mDNS 必然会导致问题 — mDNS 用于确定每个 ESPHome 节点的 IP 地址。

如果您禁用 mDNS,预计会有以下影响:

  • 您将无法使用节点的主机名来 ping、查找其 IP 地址或以其他方式连接到它。

  • 使用原生 API 时,Home Assistant 中的自动发现依赖于 mDNS 广播消息来检测新 ESPHome 节点的存在。如果您需要在禁用 mDNS 的情况下使用原生 API,则需要使用静态 IP 地址并手动添加带有其(静态)IP 地址的 ESPHome 组件。

  • 由于 ESPHome Device Builder 中的状态检测默认使用 mDNS,禁用 mDNS 的节点将始终显示为”离线”。这不影响任何功能;但是,如果您想查看节点的在线/离线状态,可以配置 ESPHome Device Builder 改为 ping 每个节点。请参阅 Docker 参考部分的说明 获取更多信息。

可以从设备中恢复配置文件吗?

Section titled “可以从设备中恢复配置文件吗?”

ESPHome YAML 配置文件不存储在 ESPHome 设备上。如果您丢失了配置,无法从设备中恢复;如果您没有其他地方的备份,则需要从头重新创建。

始终备份您的文件!

为什么不应该在设备名称中使用下划线?

Section titled “为什么不应该在设备名称中使用下划线?”

.yaml 配置文件中的顶级 name: 字段定义本地网络上的节点名称(“hostname”)。根据 RFC1912,主机名中的下划线 (_) 字符无效。实际上,某些 DNS/DHCP 设置可能正确处理下划线,而其他则不会。如果您使用静态 IP 地址,您不太可能遇到任何问题。在某些情况下,初始设置可能有效,但当 Home Assistant 重启或您更换路由器硬件时,连接可能会失败。

我们建议使用连字符 (-) 代替下划线。

重要:重命名在线设备时,请遵循这些说明 使用 use_address 参数,因为在名称更改完成之前,与现有设备的连接仅能使用旧名称。

为什么我会收到关于 strapping 引脚的警告?

Section titled “为什么我会收到关于 strapping 引脚的警告?”

大多数微控制器都有特殊的 “strapping pins”,在启动过程中会被读取。引脚的状态决定启动过程的结果。微控制器实际上可以启动到两种”模式”:

  • 正常模式
  • “刷写”或”引导加载程序”模式

虽然这些引脚在软件中的使用本身不是问题,但如果连接到这些引脚之一的某个外部硬件组件/设备任意更改引脚状态,可能会发生启动失败或其他难以诊断的行为。

我们建议避免使用这些引脚,除非绝对必要且您完全理解启动时这些引脚的预期状态。

某些开发板将 GPIO 0 连接到按钮,通常标记为 “boot”。在 ESP 上电/复位时按住此按钮将使其进入引导加载程序模式。一旦 ESP 完全启动,此按钮可以安全地用作普通输入。

Strapping 引脚通常可以安全用作输出,只要它们连接到其他具有高阻抗输入且无上拉或下拉电阻的设备。请注意,I2C 时钟和数据线需要上拉电阻,因此在 strapping 引脚上不安全。

如果您绝对确定您使用 strapping 引脚的方式不会导致问题,您可以在相关引脚配置中添加 ignore_strapping_warning: true 来抑制警告。

通过利用外部组件功能,可以通过简单地在您的 YAML 中添加几行来测试大多数 pull request!您需要 pull request 的编号以及 pull request 添加或更改的组件(它们在 pull request 的 GitHub 页面上用 “integration:” 标签列出)。然后,如果您将类似下面显示的代码块添加到您的 YAML 配置中,重新编译并将 ESPHome 重新安装/更新到您的设备,pull request 中的代码将用于 pull request 更改的组件。

external_components:
# 将 1234 替换为 pull request 的编号
- source: github://pr#1234
components:
# 在此处列出此 pull request 更改的所有组件
- ccs811

请注意,这仅适用于仅更改 esphome/components/ 内文件的 pull request。如果添加或更改了 esphome/components/ 之外的任何文件,此方法将无法工作。这些 pull request 在 GitHub 上标有 “core” 标签。

为什么实体在深度睡眠期间显示为”不可用”?

Section titled “为什么实体在深度睡眠期间显示为”不可用”?”

首次将设备添加到 Home Assistant 时,设备的配置中需要存在 Deep Sleep 组件。为了防止实体显示为”不可用”,您可以在 Home Assistant 中删除并重新添加设备。

请参阅全面的安全最佳实践指南,了解有关 API 加密、OTA 密码、网络分段、物理安全等的详细建议。