设计一个智能设备,可检测淋浴声,当风扇关闭时通过Home Assistant发出警告
防霉淋浴哨兵是一款智能的机器学习设备,可检测淋浴运行时的声音,并立即识别抽油烟机未开启的情况。它会实时向Home Assistant发送警报,提醒用户在湿度上升前启动通风设备。其效果简单却高效:一种低成本、自动化的防霉方式,可保护浴室表面,让您的家居环境更健康——无需安装新传感器或改动现有线路。
问题陈述:
在英国,由于淋浴时小而封闭的浴室中会产生大量湿气,因此霉菌风险显著增加。当排风扇关闭时,相对湿度会迅速超过70%至80%,使表面接近露点,从而形成冷凝水。英国住宅通常隔热良好,但被动通风有限,导致这些湿气无法自然散失。高湿度、冰冷的外墙以及通风不良的组合,为霉菌快速滋生创造了理想条件,尤其在填缝剂、石膏板和硅胶密封条上更为明显。
解决方案:
当用户开始淋浴时,运行在Arduino Q上的Edge Impulse机器学习模型会识别出淋浴的声学特征。一旦确认有淋浴活动,系统就会检查排风扇是否正在运行,并继续监测接下来的20分钟,以确保淋浴后通风正常。
如果在淋浴过程中或之后未检测到风扇,Arduino Q 就会向运行在 Raspberry Pi 5 上的本地 Home Assistant 发送信号,从而触发手机通知,提醒用户打开风扇,以防止湿气积聚和霉菌滋生。
该系统还能处理相反的情况:如果用户忘记关闭风扇,Home Assistant 会发送通知提醒其关闭,有助于减少不必要的电力消耗。
要从零开始构建此项目,请按照以下步骤操作:
1.在树莓派5上设置Home Assistant服务器
安装 Home Assistant 操作系统或进行受监督的设置,使其作为中央自动化枢纽。
2.将您的 Home Assistant 移动应用连接到本地服务器
这可实现安全的本地通知,使您的手机能够接收系统发出的提醒。
3.训练 Edge Impulse 机器学习模型
收集淋浴声音样本,进行标注,并训练一个能够可靠检测淋浴活动的分类器。
4.将训练好的模型部署到Arduino Q上
导出 Edge Impulse 模型,并将其烧录到 Arduino Q 上,以便在边缘端本地运行推理。
5.将 Edge Impulse 模型与 Home Assistant 集成
将Arduino Q发送的淋浴检测和风扇状态事件传送到Home Assistant,实现自动提醒和节能提示。
步骤1:在树莓派5上设置Home Assistant服务器
请注意,在此配置中,Raspberry Pi 5 作为 Home Assistant 的服务器,而 Arduino Q 则作为运行机器学习模型的客户端。Arduino Q 可检测淋浴和抽风扇的声音,并根据检测结果向 Home Assistant 发送事件。Home Assistant 会触发移动通知,提醒用户何时需要通风,或风扇是否被无故长时间运行。
树莓派5设置的先决条件
•128 GB SD 卡 — 推荐使用 Class 10 或更高等级
•树莓派5 — 板子和保护壳(可选但建议使用)
•键盘和显示器 — HDMI兼容显示
•官方 Raspberry Pi 5 电源 — 27W USB-C PD 供电
首先,你需要将 Home Assistant 操作系统刷入 SD 卡,并启动树莓派。
如果您的树莓派5没有以太网连接,请在安装Home Assistant操作系统后,按照以下步骤连接Wi-Fi。
1. 打开 HA OS 终端
如果已将键盘/显示器连接到树莓派,请使用本地控制台。
2. 扫描可用的Wi-Fi网络
代码
这显示了你周围的SSID。
3. 连接到您的Wi-Fi网络
请将 YOUR_SSID 和 YOUR_PASSWORD 替换为您实际的 Wi-Fi 信息:
代码
如果成功,您将看到确认信息,Pi 将连接到您的 Wi-Fi。
步骤2:将您的 Home Assistant 移动应用连接到本地服务器
现在,您的树莓派5已完全配置好并成功连接到Wi-Fi网络,下一步是启用Home Assistant与Home Assistant移动应用之间的通信,以便系统能够向用户实时推送通知。
安装 Home Assistant 移动应用
您需要使用官方应用程序来启用安全的本地通知和设备追踪功能。
1.从 App Store(iOS)或 Play 商店(Android)下载 Home Assistant 应用程序
2.确保您的手机连接到与 Raspberry Pi 5 相同的 Wi-Fi 网络
3. 启动应用
4. 使用您的 Home Assistant 账户登录
这将把您的手机与 Home Assistant 用户配置文件关联起来。
登录后,应用将自动注册您的设备。您可以在“设置”→“设备与服务”→“设备”中看到您的手机。
启用通知
通知必须在应用和手机上都允许。在应用中:进入应用设置 → 通知,然后开启通知功能。
在手机上:在系统设置中允许 Home Assistant 应用的通知
测试通知
请按照以下步骤测试通知:
•验证您的手机能够接收来自 Home Assistant 的通知。
•在 Home Assistant 中,前往开发者工具 → 服务
•选择 notify.mobile_app_
•发送一条测试消息,例如:{"message": "Test notification"}
•确认通知已出现在您的手机上
在测试完整的通知流程——从Arduino Q到Home Assistant服务器,再到移动设备的通知时,我使用了一个简单的Python脚本来验证连接性。要启用此通信,您必须在Home Assistant配置中生成一个长期访问令牌;该令牌可安全地将Arduino Q与Home Assistant及您的移动设备连接起来。同时,请确保树莓派(服务器)、Arduino Q和手机都连接到同一个Wi-Fi网络,以实现可靠的本地通信。
您必须在 Home Assistant 中启用长期访问令牌:
个人资料 → 长期访问令牌 → 创建令牌
用于Arduino Q运行的Python代码:
要在Arduino Q上运行Python代码,您首先需要完成一些必要的设置步骤。以下工作流程详细说明了准备电路板、配置环境以及确保Python脚本可靠执行所需的所有内容。
运行Python脚本后,我收到了一条直接从Arduino Q发送到iPhone的通知。这证实了端到端通信路径正常工作。现在我们可以进入下一步,构建Edge Impulse的机器学习模型。
步骤3:训练Edge Impulse机器学习模型
在 Edge Impulse 中,我们将按照结构化的工作流程来构建模型。首先,我们创建一个数据集,并使用四个目标类别对音频样本进行标注:“淋浴开启-抽水器风扇关闭”、“淋浴开启-抽水器风扇开启”、“淋浴关闭-抽水器风扇关闭”和“淋浴关闭-抽水器风扇开启”。在准备并标注完数据集后,我们便开始在 Edge Impulse 中训练机器学习模型。
根据验证结果,我们可能需要调整训练参数或收集更多样本以提高分类准确率。当模型达到满意的性能水平后,我们将使用生成的Arduino库将其部署到Arduino Q上,从而实现设备上的实时推理。
Arduino Q 没有内置麦克风,因此我通过 USB 路由器连接了一个 USB Type-C 麦克风以提供音频输入。
安装固件后,打开命令窗口并输入以下守护进程命令:
edge-impulse-linux
设备连接后,进入数据采集部分。
通过Arduino Q开始采集音频数据,记录淋浴声、抽风机声以及两者组合的声音,并使用edge impulse工具进行标注,分别标记为“淋浴开启-抽风机关闭”、“淋浴开启-抽风机开启”、“淋浴关闭-抽风机关闭”和“淋浴关闭-抽风机开启”。
在 Edge Impulse 中进行模型训练
在“创建脉冲”部分,请将预处理模块设置为MFE,并选择“分类”作为学习模块。
然后生成特征并进行可视化,以获取每个标签的高层次概览。
神经网络设置:
在神经网络设置中,将训练周期配置为100,学习率设置为0.005。在神经网络部分,按指示配置层数。
我使用了重塑层将音频数据转换为一维数组,并应用了一维卷积层进行模型训练。为了提高准确率,我还加入了丢弃层。
该模型在训练阶段达到了100%的准确率,足以进入下一步。
模型测试
在测试阶段,模型使用了未包含在训练过程中的新数据集进行评估。该模型达到了100%,足以支持硬件部署。
步骤4:将训练好的模型部署到Arduino Q
验证模型后,在终端中运行以下命令以继续。
首先我们需要在本地机器上下载训练好的EIM文件。
接下来,请按照以下步骤在您的Arduino Q上安装Linux SDK。这些步骤也包含在链接的文档中,为方便起见,我已标出关键操作。
安装 Linux SDK 的步骤
安装最新版本的 Python 3(>=3.7)。
安装 SDK
克隆此仓库以获取示例:
(可选)如果您想使用摄像头或麦克风示例,请安装依赖项:
位于 linux-sdk-python/examples/audio 目录下的 classify.py 示例程序无法直接与 Arduino Q 兼容,因为它无法以所需频率读取音频数据。我已修改了该脚本,并将更新后的版本上传至我的 Git 仓库。修订后的代码基于时间采样加载音频缓冲区,并重新采样以匹配模型预期的采样率。
下载并保存 classify_EI.py 和模型文件 EIM,位于 inux-sdk-python/examples/audio 目录下,然后运行以下命令在本地执行模型分类。
步骤5:将Edge Impulse模型与Home Assistant集成
音频分类流水线
系统接收连续的音频数据,这些数据被缓冲后传入自定义的 EI_classify.py 脚本进行处理。该脚本使用嵌入式 EIM 模型,为每个音频窗口生成分类结果。
EI_classify.py 中的分类标签计数器会追踪每个标签连续出现的次数。当标签为“ShowerONExtractorFanOff”或“ShowerONExtractorFanOn”,且计数超过 DETECTION_COUNT_SHOWER_ON(15秒)时,系统判断淋浴正在运行。
当此条件成立时,系统将启用一个定时器,该定时器将在5分钟后(可配置的时长)验证提取风扇是否仍处于开启状态。
如果未满足排风扇开启条件,系统将发送通知,提示用户打开排风扇。
当标签为“ShowerOffExtractorFanON”或“ShowerONExtractorFanOn”,且计数超过 DETECTION_COUNT_FAN_ON(1 分钟)时,系统将判定排风扇应被视为处于开启状态。
当此条件成立时,系统将启用第二个计时器,该计时器将在20分钟后检查提取器风扇是否仍然处于开启状态(也可进行配置)。
淋浴主动计时器回调函数调用
•当淋浴激活计时器到期后,系统会检查“淋浴关闭-抽油烟机风扇开启”标签的数量是否为零。
如果计数为零,系统将判断在淋浴开启期间抽湿风扇未运行。
•当此条件成立时,系统会向Home Assistant发送通知,提示其开启排风扇15至20分钟。
•Home Assistant 然后将此通知转发到用户的智能手表或首选设备
风扇主动计时回调
•当风扇活动计时器到期后,系统会检查“淋浴关闭排风扇开启”标签的数量是否大于7(一个可配置的阈值)。
•如果此条件为真,系统将判断抽湿风扇已运行足够长时间,以降低湿度。
•系统随后向Home Assistant发送通知,指示其关闭排风扇。
•Home Assistant 将此消息发送到用户的智能手表,确认湿度已降低,风扇可以关闭。
硬件设置
在这个原型中,我使用了防风雨外壳,Arduino Q 通过便携式移动电源供电。然而,对于长期部署,应通过专用的有线电源连接提供5伏电压,而不是使用便携电源。
未来增强功能:
该项目可通过添加Home Assistant自动化功能,根据淋浴检测事件自动开启或关闭抽风扇,从而进一步实现完全自主运行。
本文编译自hackster.io





