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

使用 ESP32 的电容触摸 GPIO,使用 ESPHome 构建水泄漏检测器相对容易。 M5StickC 被选为平台,因为它集成了 Grove 连接器,便于连接,并且包装良好。内置显示屏是一个加分项,但并非必需。 通知通过 HomeAssistant 的 ‘alert’ 和 ’notify’ 功能执行,通过 Pushover 发送到 iOS & Android。

需要的物品

Image
Image
Image
  • USB 电源和 USB-C 线 (M5StickC 配有图片中看到的短黑色 USB 线)

探头连接

由于探头带有集成的 3.5mm 公头,Grove 端口连接了一个 3.5mm 母座,以便将来轻松更换探头。橙色连接到橙色,蓝色连接到蓝色。探头另一侧的触点与前端内部连接相同。3.5mm 母座的两个中间环未使用。没有极性——只需将一个端子(橙色或蓝色)连接到 Grove GND,另一个连接到 Grove G33。

Image
Image

组装组件

Image

ℹ️ Note

尽管 M5StickC 内置了电池(可能足以覆盖短时间的停电),但您需要 24/7 连接 USB 电源。

显示字体

您需要将 OpenSans-Regular 字体(或您选择的任何其他字体)与您的 ESPHome yaml 文件一起放置。参见 - Display Component

校准和测试

一旦所有连接和烧录完成,启用 esp32_touch: setup_mode: true 并继续调整触摸敏感二进制传感器的阈值设置(GPIO33),以找到适合您的湿度传感器和布线情况的适当值。拿一杯水进行测试,另一杯给自己,边测试边查看日志。 您的目标是找到一个阈值值,该值足以在水中触发二进制传感器,但在其他情况下不触发。ESP32 触摸板 了解更多信息。


正常状态

Image

湿状态

Image

安装项目

Image

未显示:探头放置在房间的角落,不碍事,在房间的最低处


ESPHome 配置

substitutions:
  devicename: basement_leak_detector
  friendly_name: Basement Leak Detector
  device_description: 地下室工具房中的泄漏检测器

esphome:
  name: $devicename
  comment: ${device_description}

esp32:
  board: m5stick-c

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # 在 Wi-Fi 连接失败时启用回退热点(捕获门户)
  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} Status"
  - platform: esp32_touch
    name: "${friendly_name} Sensor"
    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} Uptime"

    # AXP192 电源管理 - 必须存在以在 ESPHome >1.16.0 上初始化 TFT 电源
  - platform: axp192
    address: 0x34
    i2c_id: bus_a
    update_interval: 30s
    battery_level:
      name: "${friendly_name} Battery Level"
      id: "m5stick_batterylevel"

  - platform: wifi_signal
    name: "${friendly_name} Wi-Fi Signal"
    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");
      }      

HomeAssistant 配置

有两个部分:一个是警报标准,另一个是通过 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

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

Image

参见