跳转到内容

ESP32 水泄漏检测器(带通知)

使用 ESP32 的电容触摸 GPIO,使用 ESPHome 构建水泄漏检测器相对容易。 选择 M5StickC 作为平台是因为其集成的 Grove 连接器可以实现整洁的连接,而且它有良好的外壳。内置显示屏是一个加分项,但并非必需。通知通过 HomeAssistant 的”alert”和”notify”功能执行,通过 Pushover 发送到 iOS 和 Android。

  • USB 电源适配器和 USB-C 线缆 (M5StickC 附带图片中看到的短黑色 USB 线缆)

由于探针带有集成的 3.5mm 公头插头,已将 3.5mm 母头插孔连接到 Grove 端口,以便将来轻松更换探针。橙色连接橙色,蓝色连接蓝色。探针背面的焊盘与正面内部连接相同。3.5mm 插孔上的两个中间环未使用。没有极性——只需将一个端子(橙色或蓝色)连接到 Grove GND,另一个连接到 Grove G33。

NOTE

尽管 M5StickC 内部有电池(可能足以应对短暂停电),您仍需要让设备 24/7 连接 USB 电源。

您需要将 OpenSans-Regular 字体(或您选择的其他字体)放在 ESPHome yaml 文件旁边。参见 - 显示屏

一切连接好并刷入后,启用 esp32_touch: setup_mode: true 并继续调整触摸敏感二进制传感器(GPIO33)上的阈值设置,以找到适合您特定湿度传感器和布线情况的正确值。准备一杯水用于测试,另一杯给自己,一边观察日志一边测试。您的目标是找到一个足以在水中触发二进制传感器但不会在其他情况下触发的阈值。有关更多信息,请参阅 ESP32 触摸板


未显示:探针放置在角落地板上,不挡路,位于房间最低处


substitutions:
devicename: basement_leak_detector
friendly_name: 地下室泄漏检测器
device_description: 地下室设备间的泄漏检测器
esphome:
name: $devicename
comment: ${device_description}
esp32:
board: m5stick-c
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# 在 wifi 连接失败时启用回退热点(captive portal)
ap:
password: !secret fallback_ap_password
captive_portal:
logger:
# 启用 Home Assistant API 和 OTA 更新
api:
ota:
platform: esphome
status_led:
pin:
number: GPIO10
inverted: true
spi:
clk_pin: GPIO13
mosi_pin: GPIO15
i2c:
- id: bus_a
sda: GPIO21
scl: GPIO22
scan: true
esp32_touch:
#setup_mode: true
iir_filter: 10ms
binary_sensor:
- platform: gpio
pin:
number: GPIO37
inverted: true
id: button_a
on_press:
then:
- switch.toggle: led1
- platform: gpio
pin:
number: GPIO39
inverted: true
id: button_b
on_press:
then:
- switch.toggle: led1
- platform: status
name: "${friendly_name} 状态"
- platform: esp32_touch
name: "${friendly_name} 传感器"
device_class: moisture
id: leak
pin: GPIO33
threshold: 30
on_press:
- while:
condition:
binary_sensor.is_on: leak
then:
- switch.turn_on: led1
- delay: 200ms
- switch.turn_off: led1
- delay: 100ms
- switch.turn_on: led1
- delay: 200ms
- switch.turn_off: led1
- delay: 400ms
on_release:
then:
- switch.turn_off: led1
sensor:
- platform: uptime
name: "${friendly_name} 运行时间"
# AXP192 电源管理 - 必须存在以初始化 TFT 电源
- platform: axp192
address: 0x34
i2c_id: bus_a
update_interval: 30s
battery_level:
name: "${friendly_name} 电池电量"
id: "m5stick_batterylevel"
- platform: wifi_signal
name: "${friendly_name} WiFi 信号"
update_interval: 60s
text_sensor:
- platform: version
name: "${friendly_name} ESPHome 版本"
switch:
- platform: gpio
pin:
number: GPIO10
inverted: true
id: led1
font:
- file: 'OpenSans-Regular.ttf'
id: font1
size: 66
color:
- id: color_wet
red: 100%
green: 0%
blue: 0%
- id: color_dry
red: 0%
green: 100%
blue: 0%
# 内置 80x160 TFT
display:
- platform: st7735
model: "INITR_MINI160X80"
device_height: 160
device_width: 82
col_start: 0
row_start: 0
eight_bit_color: false
cs_pin: GPIO5
dc_pin: GPIO23
reset_pin: GPIO18
invert_colors: true
use_bgr: true
lambda: |-
if (id(leak).state) {
it.fill(COLOR_OFF);
it.print(42, -24, id(font1), id(color_wet), TextAlign::TOP_CENTER, "W");
it.print(42, 32, id(font1), id(color_wet), TextAlign::TOP_CENTER, "E");
it.print(42, 85, id(font1), id(color_wet), TextAlign::TOP_CENTER, "T");
} else {
it.fill(COLOR_OFF);
it.print(42, -24, id(font1), id(color_dry), TextAlign::TOP_CENTER, "D");
it.print(42, 32, id(font1), id(color_dry), TextAlign::TOP_CENTER, "R");
it.print(42, 85, id(font1), id(color_dry), TextAlign::TOP_CENTER, "Y");
}

有两个部分:一个用于警报标准,另一个用于通过 Pushover 发送通知。 有关更多详细信息,请参阅 HomeAssistant 的 Pushover 集成文档

alert:
basement_water_leak:
name: 地下室检测到水
entity_id: binary_sensor.basement_leak_detector_sensor
state: 'on'
repeat: 30
can_acknowledge: true
notifiers:
- water_leak_notification_group
notify:
- name: pushover
platform: pushover
api_key: !secret pushover_api_key
user_key: !secret pushover_user_key
- name: water_leak_notification_group
platform: group
services:
- service: pushover
data:
data:
# Pushover 提供的音效 (https://pushover.net/api#sounds)
sound: alien

享受您本地控制的带推送通知的泄漏检测器!