本帖最后由 tangyali 于 2023-2-8 22:52 编辑
家里的即热饮水机是3升的,每次加水,都需要把水箱取下来,放到净水机龙头去装水,对于懒人来说,简直是折磨。终于有一天,懒人受不了了,决定把水路改造了一下,实现了水箱水位低到设定位置,净水器通过管道自动向水箱供水,当水位达到设定高度自动关闭净水器,另外,为了不至于水漫金山,设定了保护性定时关水。
净水机是小米600g,放在橱柜里,之前由配套的龙头出水。
原水路图,600G有4根信号线控制净水器制水,需要挑出红黑色并接继电器。
改造原理图,如果是压力村水桶式的,可以不需要继电器2,只需购买单路继电器模块
此次改造主要材料如下:
控制核心:8266
非接触水位传感器,我买的是3mm精度的,根据水箱材质厚度选择,注意,金属材质的水箱无法检测!!!
两路继电器模块,如果是压力桶或已经有水盒子可以不用。
电磁阀供电电压12V,水位传感器电压为3.3V,8266和继电器模块电压5V,所以需要多路电源模块
12V2分电磁阀及电源插头,其实插头可以不用,直接焊接电源线也可。
杜邦线若干
防水盒子,电路板和电磁阀都可以放下,注意在盒底开溢水孔,避免漏水引起短路
4芯防水对接插头,原先有xh2.54接插件,后来发现有点接触不良,担心接线不可靠,所以另买了一副
2分水管及水路接头,根据自家情况购买。。。
把三块电路板用热熔胶固定在防水盒上盖
上盖用M8钻孔,可以插入12V电源插头到后面的电源模块,旁边引出传感器和净水器开关线
多路电源和继电器接线
esp8266引脚接线
电磁阀固定在防水盒底盒,并在底盒上钻孔,确保万一漏水不至于烧电路。
水管连接
把两路传感器电源分正负极合并在一起焊接,再单独焊接两路信号线,最后焊接到防水插头的4根接线
焊接完成后用胶布缠好,并用胶布固定传感器和信号线。
2分水管通过橱柜安装直插面板,拆掉饮水机提把,用两个直角穿过连接,这样,水管就不打孔接入水箱了
另一边的孔用M8的硅胶塞堵住,避免灰尘和杂质进入水箱。
在hass里安装esphome集成,操作方法参考论坛里的XCray大神的帖子:可能是史上最简单、最适合小白的 初次 ESPHome固件烧写过程
代码如下:
esphome代码常规设置
esphome:
name: water-control
platform: ESP8266
board: nodemcuv2
name_add_mac_suffix: true
esp8266_restore_from_flash: true
logger:
# Enable Home Assistant API
api:
ota:
# password: "fb19ca689eef7e976752bf5898c1b28e"
wifi:
networks:
- ssid: !secret wifi_ssid
password: !secret wifi_password
- ssid: !secret wifi_ssid2 #如需不同的ssid可选
password: !secret wifi_password
manual_ip:
static_ip: 192.168.123.122
gateway: 192.168.123.1
subnet: 255.255.255.0
# dns1: 1.1.1.1
# dns2: 1.2.2.1
# use_address: 192.168.123.121
# 指定烧录固件时候目标设备IP,优先级高于静态IP
reboot_timeout: 1h
# 超时1小时重启设备
ap:
ssid: "Water-Control Fallback Hotspot"
password: !secret wifi_password
# password: "kM1HEMDk8cQF"
# 原ap密码
# Enable fallback hotspot (captive portal) in case wifi connection fails
web_server:
port: 80 # web端口
substitutions:
config_version: 'v2022.01.23.001'
#设备名称
device_name: water control
#如果SSID是隐藏的,设置为true
captive_portal:
板载灯光:
output:
- platform: esp8266_pwm
pin: GPIO2
frequency: 2000Hz
id: led_onboard
inverted: True
########################---------灯---------############################
light:
- platform: monochromatic
name: "LED On Board"
output: led_onboard
sensor:
- platform: wifi_signal
name: "WiFi Signal Sensor"
update_interval: 60s
高低水位传感器:
########################-------传感器-------############################
binary_sensor:
- platform: gpio #水位传感器---低
pin:
number: D5
mode: INPUT_PULLUP
inverted: True
id: water_low
name: "${device_name} Low"
device_class: moisture
on_release:
then:
- logger.log:
format: "传感器-低,step:1---检测到水位低,供水前自检开始..."
level: INFO
- if:
condition:
not:
- switch.is_on: valve_switch
- binary_sensor.is_on: water_high
then:
- logger.log:
format: "传感器-低,step:End---设备状态通过自检,打开电磁阀..."
level: INFO
- switch.turn_on: valve_switch
else:
- logger.log:
format: "传感器-低,检测到故障,脚本无法继续,请检查水位传感器..."
level: ERROR
#----------------------------------------------------------------------#
- platform: gpio #水位传感器-高
pin:
number: D6
mode: INPUT_PULLUP
inverted: true
id: water_high
name: "${device_name} High"
device_class: moisture
on_press:
then:
- logger.log:
format: "传感器-高:---到达最高水位,启动断水脚本..."
level: INFO
- script.execute: water_close
两路gpio继电器开关,分别控制净水器和电磁阀,
另一路虚拟开关,交互hass人员状态,作为每天早上自动为水箱注水的执行条件,有人在家才启动供水,避免任何可能的干扰造成误动
########################-------开关-------##############################
switch:
- platform: gpio #开关1-电磁阀
name: "${device_name} Valve"
id: valve_switch
pin:
number: D1
inverted: yes
on_turn_on:
then:
- logger.log:
format: "电磁阀,step:1---电磁阀已打开,检测水箱是否缺水..."
level: INFO
- if:
condition:
- binary_sensor.is_off: water_high
then:
- logger.log: "电磁阀:step:2---检测到水箱缺水,延时1s打开净水器..."
- if:
condition:
script.is_running: water_protect
then:
- script.stop: water_protect
- delay: 2s #延时1s打开净水器开关,减少水压冲击
- logger.log: "电磁阀:step:3---打开净水器供水..."
- switch.turn_on: water_switch
- delay: 10s #延时10s,检查低位传感器是否感应到水,如没有水则可能停水,启动断水脚本
- if:
condition:
binary_sensor.is_off: water_low
then:
script.execute: water_close
else:
- logger.log:
format: "电磁阀:step:End-----传感器检测到水箱不缺水,关闭电磁阀..."
level: WARN
- switch.turn_off: valve_switch
#----------------------------------------------------------------------#
- platform: gpio #开关2-净水器
name: "${device_name} Water"
id: water_switch
pin:
number: D2
inverted: yes
on_turn_on:
then:
- logger.log:
format: 净水器,step:1---净水器开始供水,检测电磁阀状态...
level: INFO
- if:
condition:
not:
- switch.is_on: valve_switch
then:
- logger.log:
format: "净水器:step:End---检测到电磁阀未打开,关闭净水器..."
level: WARN
- switch.turn_off: valve_switch
else:
- logger.log: "净水器:step:2-净水器工作,启动保护脚本..."
- script.execute: water_protect
- logger.log:
format: "净水器:step:3---保护脚本已启动,%.2f秒后启动保护断水脚本..."
args: [ 'id(close_timer).state' ]
- delay: !lambda "return id(cd_timer);"
- script.execute: water_close
- platform: template #HA交互开关,获取HASS人员是否在家
id: person_home
name: "${device_name} person"
turn_on_action:
- switch.turn_on: person_home
turn_off_action:
- switch.turn_on: person_home
执行脚本:
######################-------脚本:------################################
script:
- id: water_close #关闭阀门脚本
then:
- logger.log:
format: "断水脚本:step:1---脚本启动,关闭净水器"
level: INFO
- switch.turn_off: water_switch
- logger.log: "断水脚本:step:2---净水器已关闭,延时2s关闭电磁阀..."
- delay: 2s #延时2s关闭电磁阀,释放水路压力.
- switch.turn_off: valve_switch
- logger.log: "断水脚本:step:4----电磁阀已关闭,关闭保护脚本"
- script.stop: water_protect
- logger.log: "断水脚本:step:End---保护脚本已关闭,供水完成!"
#----------------------------------------------------------------------#
- id: water_protect #保护脚本
then:
- logger.log:
format: "保护脚本:step:1---保护开始,%.2f秒后验证净水器是否关闭..."
args: [ 'id(cd_protect)/1000' ]
level: INFO
tag: main
- delay: !lambda "return id(cd_protect);"
# 按设定保护延时
- logger.log:
format: 保护脚本:step:2---设定时间到,开始超时保护处理...
level: WARN
tag: main
- if: # 判断开关是否关闭,如打开...
condition:
or: # 任意一个开关打开
- switch.is_on: valve_switch
- switch.is_on: water_switch
then: # 调用关闭脚本
- logger.log:
format: 保护脚本:step:3---有设备超时未关闭,关闭供水脚本...
level: WARN
tag: main
- switch.turn_off: water_switch
- logger.log:
format: 保护脚本:step:4---关闭净水器,延时1s关闭电磁阀...
level: WARN
tag: main
- delay: 2s
- switch.turn_off: valve_switch
#-------------------------全局变量---------------------------------------------#
globals:
- id: cd_timer
type: int
restore_value: yes
# initial_value: '0'
# 倒计时
- id: cd_protect
type: int
restore_value: yes
# initial_value: '0'
# 保护时间
- id: cd_temp
type: int
restore_value: yes
#hass交互设定定时关闭倒计时
number:
- platform: template
name: "${device_name} Close Timer"
id: close_timer
icon: mdi:timer
optimistic: true
restore_value: true
min_value: 80
max_value: 120
step: 2
on_value:
then:
- globals.set:
id: cd_timer
value: !lambda "return x * 1000;"
- globals.set:
id: cd_temp
value: !lambda "return x * 1000;"
- globals.set:
id: cd_protect
value: !lambda "return x * 1000 + 20000;"
- logger.log:
format: "供水延时: %.2f 秒"
args: [ 'id(close_timer).state' ]
- logger.log:
format: "保护关闭延时: %.2f 秒"
args: [ 'id(close_timer).state + 20' ]
附件代码
water.zip
(2.66 KB, 下载次数: 35)
,自己导入esphome根据自己情况调整、编译,原则是在本地完成,避免因为网络原因造成控制失败的情况。刷好固件后,可以在hass里看到设备状态
本人是小白,esp8266及esphome纯是现学现用,东借西抄,有些代码自己都觉得有点笨,但水平不够无法做到更好,希望真正的大神批评指正。
|