HOOOS

Home Assistant 智能灌溉:ESPHome 控制电磁阀实现分区精准自动化

0 2 极客生活家 ESPHome智能灌溉
Apple

你好!很高兴你对智能灌溉系统感兴趣。将现有电磁阀接入 Home Assistant 并通过 ESPHome 进行控制,是一个非常棒且实用的项目。这个方案不仅开源、灵活,而且成本可控,能让你精准控制每一个灌溉区域。我最近也成功搭建了一套类似的系统,下面就来详细分享一下我的经验。

一、 核心思路与优势

我们的目标是利用 ESP32 或 ESP8266 开发板作为桥梁,通过 ESPHome 固件将其连接到 Home Assistant。ESP 板将接收 Home Assistant 发送的指令,进而通过继电器模块控制电磁阀的通断,实现对水路的精确管理。

这个方案的优势在于:

  1. 高度自定义: 你可以根据自己的需求,增减灌溉区域,调整控制逻辑。
  2. 本地控制: 即使外部网络中断,Home Assistant 也能在本地网络环境下继续控制。
  3. 强大的自动化: 结合 Home Assistant 的自动化功能,可以实现定时灌溉、根据天气(雨雪)、土壤湿度、日出日落等条件智能浇水。
  4. 成本效益: 相较于商业化的智能灌溉控制器,DIY 方案在功能不减的情况下,成本大大降低。

二、 所需材料清单

在开始之前,我们需要准备以下硬件:

  1. ESP32 或 ESP8266 开发板:推荐 ESP32,因为它有更多的 GPIO 引脚,可以控制更多的电磁阀,同时性能也更强。
  2. 继电器模块:根据你需要控制的电磁阀数量选择,例如控制2个阀门就用2路继电器模块。重要提示:确保继电器线圈的工作电压(通常是5V或3.3V)与你的 ESP 板的 VCC 输出兼容。
  3. 电磁阀:你需要连接的现有电磁阀。通常有12V DC、24V DC 或 24V AC 类型。确认你的电磁阀是常闭型 (Normally Closed, NC),即无电时关闭,通电时打开。这是最常见的类型,也是智能灌溉的首选。
  4. 适配电源
    • 电磁阀电源:根据你的电磁阀工作电压和数量选择合适的电源。例如,如果你的电磁阀是12V DC,单个电流0.5A,那么控制2个阀门就需要12V 1A或2A的电源。
    • ESP板和继电器电源:通常可以通过 USB 为 ESP 板供电,或者使用独立的5V/3.3V电源模块。
  5. 降压模块 (可选但推荐):如果你的电磁阀电源电压较高(如12V或24V),你需要一个降压模块(如 AMS1117 3.3V 或 Buck 降压模块)为 ESP 板提供稳定的5V或3.3V电源,而不是直接使用 USB 供电,以提高系统稳定性。
  6. 连接导线、接线端子、防水盒:用于电路连接和户外防护。

三、 接线详解:确保可靠与安全

安全第一:在进行任何接线操作之前,请务必断开所有电源!

我们以控制一个12V直流常闭电磁阀为例,使用 ESP32 和一个单路5V继电器模块。

3.1 电磁阀工作原理简述

常闭电磁阀在没有电流通过线圈时,阀门处于关闭状态。当线圈通电后,会产生磁场,吸引阀芯打开,水流通过。我们需要做的就是控制这个“通电”过程。

3.2 接线图(示意)

                  +---------------------+
                  |     12V DC 电源     |
                  |  +             -    |
                  +--|-------------|----+
                     |             |
                     |             |
                     V             |
           +---------+-----------+ |
           | 继电器模块 (5V)     | |
  ESP32 ---| IN1    COM    NO    NC |----- 电磁阀 (12V) ----- 接电源负极
    GPIO --| VCC    GND              |
    5V --- | GND                     |
    GND -- +-------------------------+

3.3 具体接线步骤

  1. 电磁阀与电源、继电器连接

    • 12V DC 电源的正极 连接到继电器模块的 COM (公共端)
    • 将继电器模块的 NO (常开端) 连接到 电磁阀的一根线
    • 电磁阀的另一根线 连接到 12V DC 电源的负极
    • 解释: 这样当继电器线圈通电时,COM 和 NO 闭合,形成一个完整的12V回路,为电磁阀供电使其打开。
  2. ESP32 与继电器模块连接

    • 将 ESP32 的任意一个 GPIO 引脚 (例如 GPIO16) 连接到继电器模块的 IN1 (控制信号输入端)
    • 将 ESP32 的 5V 输出 (通常在开发板上标有 5VVCC) 连接到继电器模块的 VCC
    • 将 ESP32 的 GND 连接到继电器模块的 GND
    • 解释: ESP32 通过 GPIO 引脚输出高/低电平来控制继电器线圈的通断,进而控制12V回路。
  3. ESP32 供电

    • 通过 USB 数据线 连接电脑为 ESP32 供电(用于编程和测试)。
    • 若用于长期运行,推荐使用独立的 5V 2A 或以上电源 通过 USB 口或专用的5V引脚供电,确保稳定。如果使用降压模块,则从电磁阀的电源(例如12V)降压到5V或3.3V给ESP32和继电器供电。

多路电磁阀的接线原理相同,只需将每个电磁阀分别连接到继电器模块的不同通路(COM-NO),然后每个继电器的 IN 端连接到 ESP32 不同的 GPIO 引脚即可。

四、 ESPHome 配置 (YAML 文件)

接下来是软件配置。你需要通过 ESPHome Dashboard 或命令行工具创建并编辑 ESPHome 的 YAML 配置文件。

# 基础配置
esp32:
  board: esp32dev # 根据你的ESP32型号调整,如果是ESP8266请改为esp8266
  framework:
    type: arduino

# 设备名称,会在Home Assistant中显示
# 请修改为独一无二的名称
substitutions:
  device_name: smart_irrigation_controller
  friendly_name: 智能灌溉控制器

# Wi-Fi 配置
wifi:
  ssid: "你的Wi-Fi名称"
  password: "你的Wi-Fi密码"
  # 可选:设置静态IP,推荐
  # manual_ip:
  #   static_ip: 192.168.1.xxx
  #   gateway: 192.168.1.1
  #   subnet: 255.255.255.0

# Home Assistant API 发现,允许HA自动发现设备
api:
  password: "一个安全的API密码,用于HA连接" # 设置一个安全的密码

# OTA(空中固件升级)
ota:

# 日志输出,方便调试
logger:
  level: DEBUG

# ==================== 核心功能:控制电磁阀 ====================

# 定义GPIO输出引脚
# 假设我们有2个灌溉区域,分别连接到GPIO16和GPIO17
output:
  - platform: gpio
    pin: GPIO16 # 第一个电磁阀连接的GPIO引脚
    id: valve_1_output # 给这个输出一个ID,方便引用
    # 由于继电器模块通常是低电平触发(即GPIO输出低电平时继电器闭合),
    # 而我们希望GPIO高电平时阀门关闭(初始状态),低电平时阀门打开,
    # 但ESPHome的switch组件默认是高电平“开”,低电平“关”。
    # 所以这里需要反转逻辑,或者直接在switch中使用inverted: true
    # 如果你的继电器是高电平触发,则不需要inverted
    # 这里我们假设继电器是低电平触发,所以pin的默认值是HIGH,即默认关闭
    # 这会导致继电器在GPIO为HIGH时是断开状态(阀门关闭)
    # 当switch开启时,GPIO变为LOW,继电器吸合,阀门打开。
    # 这一部分根据你继电器模块的实际触发逻辑(高电平触发/低电平触发)来调整
    # 常见的低电平触发继电器:GPIO拉低时继电器吸合,阀门开启
    # 此时pin的默认状态应该让继电器处于断开状态
    # 在ESPHome中,switch的`output`平台会默认发送HIGH来“开启”并LOW来“关闭”
    # 如果继电器是低电平触发,那么为了让“开启”指令实际打开阀门,需要invert
    inverted: true # 如果你的继电器是低电平触发,请设置为true

  - platform: gpio
    pin: GPIO17 # 第二个电磁阀连接的GPIO引脚
    id: valve_2_output
    inverted: true # 同上

# 定义开关(switch)实体,用于在Home Assistant中控制
switch:
  - platform: output
    name: "灌溉区1阀门" # 在HA中显示的名称
    id: irrigation_zone_1
    output: valve_1_output # 关联到上面定义的输出
    icon: mdi:valve
    # 重要的互锁功能:确保多个阀门不会同时开启
    # 这可以防止水压过低或水资源浪费
    interlock: # 互锁,当这个开关开启时,列表中的其他开关会被强制关闭
      - irrigation_zone_2
    restore_mode: ALWAYS_OFF # 设备断电重启后,此开关总是处于关闭状态,防止意外开启

  - platform: output
    name: "灌溉区2阀门"
    id: irrigation_zone_2
    output: valve_2_output
    icon: mdi:valve
    interlock:
      - irrigation_zone_1
    restore_mode: ALWAYS_OFF

# 可选:增加一个总电源开关,方便调试和维护
# - platform: template
#   name: "灌溉总开关"
#   id: master_irrigation_switch
#   optimistic: true # 假设操作总是成功
#   turn_on_action:
#     - switch.turn_on: irrigation_zone_1
#     - switch.turn_on: irrigation_zone_2
#   turn_off_action:
#     - switch.turn_off: irrigation_zone_1
#     - switch.turn_off: irrigation_zone_2

4.1 YAML 配置说明

  • esp32 / esp8266: 指定你的开发板型号。
  • substitutions: 定义一些全局变量,方便修改设备名称和在 Home Assistant 中显示更友好的名称。
  • wifi: 配置你的无线网络信息,以便 ESP 板连接到你的局域网。
  • api: 这是 ESPHome 设备与 Home Assistant 通信的关键。设置一个密码,HA 需要这个密码才能连接。
  • output: 定义了具体的 GPIO 引脚作为输出。pin 指定了引脚号。id 是一个内部标识符,方便在 switch 中引用。inverted: true 是一个非常关键的设置,它取决于你使用的继电器模块的触发逻辑。大多数继电器模块是低电平触发的,意味着当 GPIO 输出低电平时,继电器会吸合(导通)。而 ESPHome 的 switch 平台默认在“开启”时发送高电平,所以为了让“开启”指令对应继电器吸合(阀门打开),我们需要将 inverted 设置为 true。请务必根据你的继电器模块手册确认。
  • switch: 基于 output 定义了一个 Home Assistant 可以识别的开关实体。
    • name: 在 Home Assistant 中显示的名字。
    • output: 关联到上面定义的 output ID。
    • interlock: 这是一个非常重要的安全和实用功能! 它确保了在任何给定时间只有一个灌溉区域的阀门是打开的。当你开启一个灌溉区时,列表中其他区域的阀门会自动关闭。这可以有效防止水压过低、水资源浪费甚至水管爆裂的风险。
    • restore_mode: ALWAYS_OFF: 确保在设备断电重启后,所有阀门都处于关闭状态,避免意外灌溉。

4.2 编译与上传

  1. 将上述 YAML 配置保存为 .yaml 文件(例如 irrigation_controller.yaml)。
  2. 打开 ESPHome Dashboard (在 Home Assistant 中安装 ESPHome 插件),点击右下角的 + 号添加新设备。
  3. 按照提示粘贴你的 YAML 内容,然后点击 Install,选择你的 ESP 板连接方式(USB 或无线 OTA)。首次通常需要通过 USB 线连接电脑进行烧录。
  4. 烧录成功后,ESP 设备将重启并连接到你的 Wi-Fi 网络。

五、 Home Assistant 集成与使用

一旦 ESPHome 设备成功上线并连接到你的 Wi-Fi,Home Assistant 会通过其 API 自动发现这个新设备。

  1. 在 Home Assistant 的 配置 -> 设备与服务 -> 集成 页面,你会看到一个名为 ESPHome 的新设备(例如 智能灌溉控制器)。
  2. 点击 配置,输入你在 ESPHome YAML 文件中设置的 api 密码。
  3. 成功添加后,你会在 实体 列表中看到名为 switch.灌溉区1阀门switch.灌溉区2阀门 的开关实体。
  4. 你可以在 Home Assistant 的仪表盘中添加这些开关实体,直接手动控制阀门的开闭。

5.1 自动化示例

现在,你可以利用 Home Assistant 强大的自动化功能了。

alias: 定时灌溉 - 每天早上7点开启灌溉区1 15分钟
description: ''
trigger:
  - platform: time
    at: '07:00:00'
condition: []
action:
  - service: switch.turn_on
    target:
      entity_id: switch.irrigation_zone_1 # 开启灌溉区1
  - delay:
      minutes: 15 # 等待15分钟
  - service: switch.turn_off
    target:
      entity_id: switch.irrigation_zone_1 # 关闭灌溉区1
mode: single

你可以创建更复杂的自动化,例如:

  • 根据天气预报跳过浇水: 如果天气预报有雨,则跳过当天的灌溉。
  • 根据土壤湿度浇水: 结合土壤湿度传感器(也可以通过 ESPHome 集成),只有当土壤干燥时才开启灌溉。
  • 循环灌溉: 例如每个区域浇水5分钟,休息10分钟,再浇水5分钟,以提高吸收效率。

六、 注意事项与进阶

  • 防水防护: 如果电磁阀和控制器在户外使用,务必使用 IP65 或更高等级的防水盒,对 ESP 板、继电器和所有接线进行严密防护,避免潮湿导致短路或设备损坏。
  • 功耗考虑: 电磁阀在开启时会有一定的电流消耗,确保你的电源适配器功率充足,尤其是多路阀门同时开启时。
  • 电源分离: 强烈建议将 ESP 板和继电器模块的控制电源(通常是5V或3.3V)与电磁阀的工作电源(12V/24V)分开,或者使用稳定可靠的降压模块供电,避免高电压或电磁干扰影响 ESP 板的稳定运行。
  • 流量计与湿度传感器: 你可以进一步集成脉冲式流量计来监测用水量,或者集成土壤湿度传感器来实现更智能、更节水的灌溉。ESPHome 同样支持这些传感器。

通过上述步骤,你就可以建立一个稳定、可靠且高度智能化的灌溉系统了。祝你享受 DIY 的乐趣!

点评评价

captcha
健康