利用 M5 Paper S3 创建一个电子纸面板,用于实时监控 Home Assistant 的温度和湿度数据
M5Stack 推出的 M5 Paper S3 是一款功能多样且实用的设备,非常适合打造各类信息显示项目。凭借其大尺寸的电子纸屏幕和 WiFi 连接功能,它可作为数据展示面板,从不同来源获取并显示信息。
在之前的文章中,我分享了一个将励志名言显示在 Paper S3 屏幕上的项目。这些名言通过访问 Zen Quotes 网站的 REST API 获取。在同一篇文章中,我们还介绍了什么是 REST API、其基本功能,并给出了除 Zen Quotes 之外的几个示例。
这一次,我们将回归类似的想法,但应用领域聚焦于家庭自动化。不再从外部网站获取信息,而是直接连接到 Home Assistant 安装系统,请求其管理的某些传感器的数据。
目标是构建一个简单的面板,用于显示房间的温度和湿度,充分利用 M5 Paper S3 的电子纸显示屏,以清晰、低功耗的界面让用户一目了然地查看数据。
环境监测面板
家里安装了Home Assistant,我用它来监控各种传感器,并通过仪表盘和自动化功能控制灯光。
其中一个传感器是SONOFF SNZB-02P,用于测量房间的温度和湿度。虽然我可以通过电脑或手机上的Home Assistant仪表盘轻松查看这些数据,但本项目的核心想法是利用M5 Paper S3屏幕作为辅助面板,让这些信息始终可见。
这样的面板并不能替代Home Assistant的仪表盘,而是作为其补充,提供更快速地查看特定信息的方式。此外,由于Paper S3屏幕功耗极低,且环境数据无需频繁更新,该面板可依靠电池独立运行数天,无需充电。得益于这种自主性,面板可以随意移动到不同位置,使环境信息随时随地可用。
下图展示了已完成并正在运行的面板。在接下来的部分中,我将用非常简单的方式解释其工作原理,并介绍如何使用 UIFlow 2 进行编程。核心理念是,你可以自行设计并根据自己的 Home Assistant 安装环境进行调整,以监控家中的不同传感器。
M5 Paper S3
几个月前,我发表了一篇分析 M5Stack 这款优雅且实用的电子纸面板功能和潜在应用的文章。如果你错过了,这里简要总结一下。如果你已经了解过该设备,可以跳过本节,直接进入下一章节,学习如何连接到 Home Assistant。
M5 Paper S3 是一款紧凑且多功能的设备,搭载 4.7 英寸 ePaper 显示屏,分辨率为 540 × 960 像素,支持 16 级灰度显示,并配备电容式触摸面板。这些特性使其非常适合需要清晰、易读且低功耗显示信息的项目。
内部配置包括 ESP32-S3R8 模块、Wi-Fi 和蓝牙连接功能、8 MB 的 PSRAM 内存、16 MB 的闪存以及一个 microSD 卡插槽。它还配备了BMI270惯性测量单元、BM8563实时时钟、被动蜂鸣器以及1800毫安时的锂聚合物电池,从而能够开发出便携甚至可穿戴的应用程序。
另一个有趣的特点是其易于安装的设计:设备配有后置磁铁、螺丝孔和挂钩。背面还设有扩展接口,可通过两个可用的GPIO引脚连接外部传感器或模块。
得益于电子纸显示屏、无线连接、内置电池以及多种安装方式的组合,Paper S3非常适合用于构建信息面板、电子标签、智能标牌和数字标示系统,以及智能家居或物联网系统的控制面板、排队号码显示、日历、笔记记录设备,甚至电子书阅读器。
接入Home Assistant
Home Assistant通过多种方法和集成从家庭传感器中收集数据,然后将这些信息显示在仪表板上,或用于自动化操作以触发特定动作。例如,当室内温度过低时,它可以通过智能插座开启加热器;当达到舒适温度时,则自动关闭加热器。
以我的SONOFF传感器为例,它通过Zigbee与Home Assistant进行通信。然而,无论数据如何传送到Home Assistant,系统内部都会将信息组织成设备和实体。
设备与实体
连接到Home Assistant的每个传感器都是一种设备。但一个设备可以测量多个变量。例如,我的SONOFF SNZB-02P传感器同时测量温度和湿度。因此,它是一个单一设备,但有两个关联的实体:一个对应温度值,另一个对应湿度值。
对于该传感器,这些实体在Home Assistant中的标识符如下:
随后,纸板S3显示面板需要向Home Assistant“请求”这两个实体的数值。当Home Assistant返回响应后,面板需取用这些数据并在屏幕上显示。
REST API
有多种机制可让外部设备向Home Assistant请求信息:REST API、WebSocket API、MQTT、ESPHome以及Webhooks。每种方式都有其自身的特点、优势和不足。对于本项目,我选择使用 REST API,因为它实现简单、易于理解,同时功能强大,足以满足大多数应用的需求。
要访问 Home Assistant 的 REST API,我们需要知道其端点,即请求必须发送的地址或 URL。如果查看具体的 REST API 文档,可以发现该端点格式如下:
其中 IP_ADDRESS 是用于访问您 Home Assistant 安装主仪表板的相同 IP 地址。
可以通过 GET 方法向该端点发送 HTTP 请求以查询实体的值;通过 POST 方法设置实体的值;通过 DELETE 方法删除实体。
为了确保对REST API的访问安全,并防止他人滥用,我们必须在每次请求中包含一个令牌。该令牌类似于一种密钥,用于身份验证。
这个名为“长期访问令牌”的令牌必须通过Home Assistant管理面板中的用户配置页面生成:ttp://IP_ADDRESS:8123/profile/security
以这种方式生成的令牌必须与HTTP请求一起发送到Authorization标头中,并在前面加上Bearer标识符,以表明这是一个访问令牌。
GET请求
根据Home Assistant文档,获取实体值的GET请求通用格式如下:
其中,是所关注实体的名称。
IP地址(此处表示为IP_ADDRESS)可从Home Assistant管理面板获取,该地址仅限于Home Assistant运行的本地网络,因此无法从外部网络访问。
下面我们来看一个完整的GET请求示例,用于获取某个实体的值。测试请求格式的一个简单方法是使用Windows系统的curl命令,当然也可以在Linux系统上使用。
例如,获取传感器实体的值。ewelink_snzb_02p_temperature,请求应具有以下格式。请记得将 ---token--- 替换为您从 Home Assistant 面板获取的长期访问令牌。
Home Assistant 使用 JSON 格式响应 HTTP 请求,这种格式在物联网和家庭自动化应用中广泛用于信息传输。
对于之前的请求,响应内容如下:
更清晰地表示,响应的格式如下:
该响应包含大量分布在不同字段中的信息,例如实体名称、其值、计量单位、最后一次更改时间等。在本项目中,我们仅使用“状态”字段,它包含实体的最新值,也就是我们将在面板上显示的数值。
程序
程序使用 UIFlow2 编写,这是 M5Stack 最新版本的基于积木的编程环境。学习非常简单,非常适合此类简单的应用,如本面板。
这是完整的程序。接下来的各个部分,我将逐步为您解释。
界面
用户界面简洁,因为面板仅显示从Home Assistant接收到的数据,没有其他交互功能。
它由四个元素组成:
•background:背景图像,为显示的信息提供视觉框架。
•label0:温度值。
•label1:湿度值。
•label2:显示数值的更新时间。
背景图像使用ChatGPT生成,然后我用经典的Paint应用程序将其转换为16色BMP格式,为进一步减小文件大小,又将其保存为PNG格式。
相应的文件必须通过UIFlow中的“项目文件”部分上传到面板内存中。
对于显示温度和湿度值的标签,我创建了一个字号为100的新字体,并将该字体也作为项目文件保存在面板内存中。
附加模块
除了UIFlow2默认包含的模块外,我还添加了HTTP软件模块以进行网络请求,以及RTC硬件模块以正确处理日期和时间信息。
设置功能
请注意,此功能仅在程序启动时运行一次。首先,包括硬件初始化、实时时钟初始化以及时区定义。在我的情况下,时区为GMT-3,但您应根据所在国家进行相应更改。
接下来,配置电子纸显示屏的亮度以及标签的前景色和背景色。
然后,初始化Wi-Fi,并尝试使用对应的SSID和密码连接网络。
如果连接成功,程序会向各个实体的端点发送HTTP请求:先获取温度值,再获取湿度值。每个请求的头部都包含授权令牌。
如果请求返回的状态码为200,表示请求成功,则将JSON响应转换为Map对象。接着,在该Map中查找状态键以获取传感器数值,并将该数值赋值给屏幕上的对应标签。
更新标签后,调用printTime函数,在屏幕底部显示更新时间。在完成两个请求并更新了两个标签后,连接到服务器将被关闭,系统会延迟10秒,随后面板进入低功耗模式15分钟。这种延迟在需要重新控制板子以修改代码、防止其再次进入低功耗模式时非常有用。
当然,您可以根据需要调整此数值。在我的测试中,使用这个更新间隔,面板连续工作了一整周而无需重新充电。
printTime函数
该函数会在屏幕底部显示传感器值更新的时间,以便我们了解最后一次更新的时间。
首先,它从本地时间获取小时和分钟的值。get local time模块返回一个元组,顺序为:年、月、日、当日、小时、分钟、秒以及星期几。
接着,对分钟值进行轻微调整:如果分钟小于10,则在左侧添加一个零,避免只显示一位数字。例如,将显示12:08而不是12:8。
最后,将这两个值用冒号“:”连接成一个字符串,并将该字符串用于设置label2的值。
循环函数
设置函数完成后,循环函数开始反复运行。但在此情况下,没有其他操作可进行,因此该函数中不包含任何代码块。
结论
在本文中,我们了解了如何使用M5 Paper S3作为接口,编写程序以显示连接到Home Assistant的SONOFF SNZB-02P传感器所测量的温度和湿度值。
M5Stack设备非常适合此类应用,因为它将构建自主面板所需的一切功能集成于单一设备中:低功耗电子纸显示屏、Wi-Fi连接以及电池供电,使其能够长时间运行,而无需永久依赖外部电源。
在搭建面板之前,我们回顾了一些Home Assistant的重要概念,例如设备与实体的区别,并分析了从外部应用程序获取信息的不同方式。接着,我们重点探讨了REST API,学习如何使用GET方法发送HTTP请求,以获取与传感器关联的实体的值。
最后,我们分析了在UIFlow2中开发的代码,逐块查看其运行流程,以及各个部分如何协同工作,从而从Home Assistant获取数据并在M5 Paper S3屏幕上进行显示。
通过这种方式,该项目不仅让我们能够构建一个用于监测房间温度和湿度的实用面板,也为创建其他类似界面提供了起点,这些界面可以显示Home Assistant中不同传感器或实体的信息。
本文编译自hackster.io





