如何使用 ESP32 创建一个 MQTT 传感器
在本教程中,我们将了解如何使用 ESP32 和 Toit 平台为 Home Assistant 创建一个 MQTT 传感器。Home Assistant 是目前最大的开源智能家居平台之一,在物联网设备管理方面非常流行。而 Toit 则提供了一个极简的平台,便于轻松构建和部署物联网应用。Toit 最近已支持 MQTT 协议,我们将利用这一功能,将来自 SHT31-D 传感器的温湿度值发送到 Home Assistant。这些数据将以图形化交互式卡片的形式在 Home Assistant 中显示。最后,我们还将通过 Home Assistant 的手机应用程序发送高温警报通知。
先决条件
- 一台 Home Assistant 服务器
- 安装在安卓/iOS 手机上的 Home Assistant 伴侣应用
准备所需组件
- ESP32-WROOM 开发板
- Adafruit 的 SHT31-D 温湿度传感器
- 连接 ESP32 至电脑的微型 USB 数据线
- 面包板和连接线
连接线路
由于我们使用 I2C 通信与传感器,只需四根线即可完成连接。ESP32 开发板上的通用输入输出引脚 21 连接到 SHT31-D 传感器的 SDA 引脚,GPIO 22 连接到 SCL 引脚。另外两根线为 3.3V 和 GND 引脚,用于给传感器供电,不过你也可以使用 5V 输入电源。
设置 Home Assistant 使用 MQTT
第一步是安装 Mosquitto MQTT 代理服务器。前往 Supervisor > 插件商店,搜索 Mosquitto MQTT。安装完成后,启用看门狗并启动代理。
在配置 MQTT 代理之前,我们需要先创建一个专门用于 MQTT 的新用户。该用户将用于对代理进行身份验证。你也可以将此用户与其他服务器上的用户关联,但建议创建一个新用户。前往 Configuration > Users,点击“添加用户”,输入凭据后点击“创建”。最后,重启你的 Home Assistant 服务器。
接下来,进入 Configuration > Integrations,点击 Mosquitto 代理下方的“配置”选项,然后点击“重新配置 MQTT”。将代理和端口设置为默认值,并将用户名和密码修改为上一步创建的账户。进入下一步,保持所有设置不变,然后点击“提交”。
现在测试代理是否正常工作,在发布和监听字段中添加任意示例主题(确保两个字段中的主题相同)。点击“开始监听”。在“消息体”字段中输入任意一条消息,然后点击“发布”。系统应立即接收到该消息,并显示在页面底部。这表明我们的MQTT代理已成功配置。
接下来是创建一个MQTT传感器,通过编辑configuration.yaml文件来完成。我已安装了Visual Studio Code的集成工具,但你也可以使用其他任何编辑器。在configuration.yaml文件末尾粘贴以下代码:
“state_topic”参数定义了用于订阅获取数据的MQTT主题。本教程中,我们设置了主题名为/sensor/sht31。温度和湿度值将以JSON格式发送,随后通过value_template提取其值。最后,确保文件已保存,然后重新启动 Home Assistant 服务器。
最后一步是创建用于显示传感器数据的卡片。进入“概览”标签页,在右上角点击“编辑仪表板”>“添加新卡片”,选择你喜欢的卡片,我将选择“传感器”卡片。接着,在实体下拉菜单中选择“温度(sensor.temperature)”,然后点击“保存”。同样地,为湿度卡片重复此操作,并关闭仪表板编辑。
首次打开时,卡片会显示为空,无需担心。至此,Home Assistant 的部分已设置完成,可接收温度和湿度读数。
使用 Toit 编程与部署应用
如果你是 Toit 的新手,可以使用 Web 串行接口快速设置你的 ESP32 设备。在 Toit 上注册后,仅在 Chrome 或 Edge 浏览器中访问“Web 串行接口”。通过 USB 数据线将 ESP32 连接到电脑,然后点击“开始”。你的设备应该出现在串口端口列表中,选中它,点击“配置”,输入 Wi-Fi 密码,等待配置过程完成。完成后,转到“设备”标签页,你应该能看到设备名称。确保状态为“健康”,表示您的设备已连接并可正常使用。
接下来,你需要安装 Toit CLI,用于运行和部署应用程序。为了便于开发,建议按照安装链接中的说明安装 VS Code 和 Toit 的语言扩展。本教程中我们将使用它。完成这些设置后,Toit 就已准备就绪,我们可以开始编程了。
首先,从 pkg.toit.io 安装 SHT31-D 传感器的驱动程序和 MQTT 包。在工作目录的终端中执行以下命令:
SHT31-D 和 MQTT 包(或库)现在已本地安装到 Toit 的工作目录中。其他所有包均随固件一起提供。在项目文件夹中创建一个名为“sht31-mqtt.toit”的新 .toit 文件。
然后导入 SHT31-D 传感器的 GPIO 和 I2C 通信库,以及 MQTT 库和用于向 Home Assistant 发送数据的 JSON 库。
接下来,我们为 MQTT 定义一些全局参数:主机应为你的 Home Assistant 服务器在网络中的 IP 地址,端口应为 1883,这是我们在设置 MQTT 代理时指定的端口。主题名称可自行设定,但必须与 Home Assistant 中 MQTT 传感器配置中设置的一致。
进入主函数,我们将GPIO引脚21和22配置为I2C通信。SHT31-D的默认地址为0x44,该地址也印在传感器底部。接下来,我们使用MQTT客户端连接到MQTT代理服务器,并设置用户名和密码。客户端将建立连接,同时为了调试目的,我们打印连接信息。
然后,我们创建一个函数,用于将温度和湿度读数发布到MQTT主题上。浮点型读数保留两位小数,数据以JSON格式发布。
在主函数的最后部分,我们创建一个无限循环,每10秒发布一次传感器读数。
要测试所有功能是否正常运行,请点击VS Code中Toit扩展与您的设备关联的运行按钮来执行程序。
输出应如下所示,并每隔10秒重复一次。
与此同时,Home Assistant服务器应该已接收到MQTT消息,温度和湿度值现在会显示在传感器卡片中。
当所有功能均按预期运行后,即可部署该应用程序。在工作目录中,创建一个与.toit文件同名的.yaml文件,并将以下内容复制到其中:
确保以我们上一步部署应用前所使用的相同方式结束运行命令(即在Toit控制台的“应用”部分卸载该应用)。最后,点击与您设备关联的“部署”按钮。如果系统提示打开.yaml文件,请选择刚刚创建的那个。输出应显示应用程序已成功部署。
本教程中使用的所有程序均可在该GitHub仓库中找到。
向手机发送高温警报
最后一节介绍了如何配置Home Assistant通过其配套应用程序发送警报。这部分完全可选,如果您不需要,可以跳过。
下载应用程序后,您的手机实体(如电池状态、充电状态等)应在Home Assistant的界面中显示。现在,要测试手机通知服务,请进入开发者工具 > 服务,开始输入“notification”。该服务应出现,并显示您的手机名称(我的手机名为Redmi 5)。请记录下Home Assistant中显示的手机名称。在这种情况下,是 mobile_app_redmi_5。
点击后,会显示一个字段列表。在“消息”栏中输入您的通知内容,然后点击“调用服务”按钮。您的手机上应该会弹出一条通知。
确认无误后,我们现在可以设置自动提醒。打开 configuration.yaml 文件,并将以下代码行复制进去:
`The line states.sensor.temperature.state | float > 30.00` 定义了温度阈值,本例中为 30 度,您可以根据需要自行调整。此外,您还需要将最后一行修改为您之前提到的手机名称。参数 `repeat: 1` 表示每隔几分钟后再次出现通知。最后,保存配置文件并重启 Home Assistant 服务器。
重启后,请确保 ESP32 正常运行,当手机温度过高时,您应该会收到通知。
本文编译 自hackster.io





