ESPHome 电磁阀 YAML 配置实战:15分钟搭好一个智能阀门控制器
【免费下载链接】esphomeESPHome is a system to control your ESP32, ESP8266, BK72xx, RP2040 by simple yet powerful configuration files and control them remotely through Home Automation systems.项目地址: https://gitcode.com/GitHub_Trending/es/esphome
周末出差三天,阳台的浇花定时器没人管,回来发现土都板结了。如果你手边有一块 ESP32 和一个 12V 直流电磁阀,用 ESPHome 一份 YAML 配置就能让阀门接进 Home Assistant:远程开关、定时浇水、状态反馈,全程不写一行 C 代码。读完这篇文章,你会拿到三样东西:一份可直接烧录的完整配置文件、一张继电器接线表、两个可运行的自动化场景(自动浇水和阀门互锁)。
先看懂 5 行核心配置
整套方案的本质就一句话:ESPHome 把 ESP32 的一个 GPIO 引脚包装成 Home Assistant 里的 switch 实体,继电器接在这个引脚上,阀门就跟着开合。
switch: - platform: gpio # 用 GPIO 引脚驱动开关,这是全部硬件控制的起点 name: "Water Valve" pin: GPIO2 # 继电器 IN 接的引脚,引脚号后面会对照接线图就这三行实体配置(加上设备基础信息)就能让阀门上线。下面从硬件讲起。
备齐材料并接好继电器
ESP32 的 GPIO 只能输出 3.3V、几十毫安,直接驱动阀门既点不动也会烧引脚。所以中间必须加一个继电器模块做电气隔离:ESP32 只负责给继电器一个"通/断"信号,真正流过线圈和阀门的电流走继电器自己的回路。
| 名称 | 规格 | 数量 | 作用 |
|---|---|---|---|
| 开发板 | ESP32 DevKit(如 Wemos D1 Mini) | 1 | 运行 ESPHome,提供 GPIO 和 WiFi |
| 继电器模块 | SRD-05VDC-SL-C(5V 驱动) | 1 | 用低电压信号切换阀门回路 |
| 电磁阀 | 12V 直流,常闭型 | 1 | 执行通断,常闭型断电自动关阀更安全 |
| 电源 | 12V/2A 直流适配器(阀门)+ 5V(继电器/ESP32) | 各 1 | 两套电源分开供电,避免电流冲击 |
| 杜邦线 | 公对母若干 | 1 包 | 接线 |
接线示意(注意继电器是两组独立的回路):
ESP32 侧(控制回路) 继电器模块 阀门侧(负载回路) GPIO2 ──────────────► IN 5V ──────────────► VCC GND ──────────────► GND COM ──► 12V 适配器正极 NO ──────────────────────► 阀门正极 12V 适配器负极 ─────────────► 阀门负极这里的关键是 COM 和 NO 接在 12V 电源和阀门之间,而不是接在 ESP32 上——继电器触点额定电流远高于 GPIO,负载回路必须绕开 MCU 走自己的电源。
配好核心骨架配置
下面这份配置能让设备完整上线:设备连上 WiFi、出现在 Home Assistant 里、断电重启后阀门状态不跑飞。逐行看:
esphome: name: solenoid-valve # 设备在局域网和 HA 里的名字 platform: ESP32 board: nodemcu-32s # 按你的板子选,选错会导致引脚映射错误 wifi: ssid: "<你的WiFi名>" password: "<你的WiFi密码>" api: # 接入 Home Assistant,同时负责把开关状态存到 flash ota: # 后续 OTA 升级固件用,不写就只能每次插 USB 烧录 switch: - platform: gpio name: "Water Valve" pin: GPIO2 # 对应接线图里接继电器 IN 的引脚 id: water_valve # 给实体起 id,自动化脚本里靠它引用 restore_mode: RESTORE_DEFAULT_OFF # 重启后恢复断电前状态,且兜底为关阀—— # 阀门类设备宁可漏一次水,不可默认常开烧录命令在仓库里用esphome config solenoid_valve.yaml校验、esphome compile编译即可,仓库获取方式:git clone https://gitcode.com/GitHub_Trending/es/esphome。骨架里restore_mode值得多说一句:默认是ALWAYS_OFF(每次重启强制关阀),RESTORE_DEFAULT_OFF则会记住断电前的状态,状态持久化的实现依赖api组件,见 esphome/components/switch/init.py 里的RESTORE_MODES定义。
扩展层:按功能加模块
骨架跑通后,按需叠加下面的片段,每段独立生效,互不干扰。
定时浇水脚本
手动开关解决不了"开 30 秒自动关",用script组件把动作串成一次原子操作:
script: - id: water_30s mode: single # 同一时间只允许跑一份,防止重复触发叠加延时 then: - switch.turn_on: water_valve - delay: 30s # 浇够水量即关,防止干烧水泵 - switch.turn_off: water_valve阀门互锁
水阀和气阀共用一套水路时,必须防止误操作让两个阀同时开。GPIO switch 自带interlock字段,互锁逻辑的实现在 esphome/components/gpio/switch/init.py:
switch: - platform: gpio name: "Gas Valve" pin: GPIO4 id: gas_valve interlock: [water_valve] # 引用对方实体 id,二者互斥 interlock_wait_time: 500ms # 开一个前先等 500ms, # 确保上一个阀真正落座再反向动作状态反馈回读
想确认阀门"真的动了",用一路 GPIO binary_sensor 读反馈触点:
binary_sensor: - platform: gpio name: "Valve Feedback" pin: GPIO14 device_class: moving # 让 HA 按"运动"语义展示开合状态反馈触点的另一脚接在继电器反馈端子(或阀门到位开关)与 GND 之间,阀门动作时引脚拉高即上报状态变化。
实战场景
场景一:土壤湿度联动自动浇水
🌱 触发条件:土壤湿度数字模块输出低电平(干燥)时,binary_sensor 上报off状态。
binary_sensor: - platform: gpio name: "Soil Dry" pin: GPIO27 on_press: # 模块输出翻转(土变干)时触发 then: - script.execute: water_30s🕐 执行动作:直接调用上面定义好的water_30s脚本,开阀 30 秒后自动关闭。
🛡 安全兜底:mode: single保证湿度传感器抖动也不会叠加多个浇水任务;restore_mode保证重启后阀门不会莫名处于开启态。
场景二:气体报警一键关阀并通知
🚨 触发条件:气体报警探头输出报警信号(device_class 设为 gas,HA 里按气体告警语义展示):
binary_sensor: - platform: gpio name: "Gas Alarm" pin: GPIO12 device_class: gas on_press: then: - switch.turn_off: gas_valve # 先执行最要紧的:断气 - logger.log: "Gas alarm, valve forced off"🛡 安全兜底:关阀动作不依赖任何网络请求,本地 GPIO 中断直接执行,断网也生效;若需要手机推送,在then末尾追加homeassistant.service调用notify服务即可,通知失败不影响已执行的关阀动作。
排障速查表
| 现象 | 排查步骤 |
|---|---|
| 开关显示"开"但继电器不动作 | 看继电器指示灯:不亮则核对pin与inverted;亮则查 COM/NO 是否接反 |
| 阀门有动作但 HA 里状态反了 | 给 switch 加inverted: true后重新编译烧录 |
| 重启后阀门状态丢失或异常 | 确认api:已启用且restore_mode不是DISABLED |
| 阀门偶尔不吸合、动作发涩 | 检查 12V 电源功率是否够、继电器与阀门是否混用 5V 电源 |
| 设备编译时报引脚错误 | 核对board是否与实际板型一致,引脚号是否超出该板范围 |
边界与下一步
这套方案适合 5V/12V 低压直流阀门的单板控制,不适合直接切换 220V 市电负载——那需要接触器或智能空开级别的硬件,ESPHome 的 GPIO 层面不提供保护。下一步如果你想从一两个阀扩展到十几个阀,可以上sn74hc595移位寄存器组件,用 3 个引脚级联多个 595 芯片扩展输出,仓库里现成可用:esphome/components/sn74hc595/。
【免费下载链接】esphomeESPHome is a system to control your ESP32, ESP8266, BK72xx, RP2040 by simple yet powerful configuration files and control them remotely through Home Automation systems.项目地址: https://gitcode.com/GitHub_Trending/es/esphome
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考