本帖最后由 lyfff 于 2021-1-17 23:47 编辑
几经尝试,都没能避免文中的>自动转义成>,<自动转义成<,请使用人脑转义。
效果
不废话,先放一张图,让你们决定,后面这堆字值不值得花时间看:(这是暗色模式,所以很黑)
效果图2
方案
我家的结构图如下图,使用然气热水器,而且全屋共用一个,位置是在厨房(图中红点),这就导致离主卧里的卫生间很远。因此装修的时候使用了循环水管(红色箭头),这样主卧就可以在洗澡前,先用水泵推动水在循环管道中循环流动,这样热水器就会预先加热好管道中的水,洗澡的时候一打开淋浴器就能立即获得热水(其实就是目前很多热水器的“零冷水”方案)。
我的水泵是华帝的,使用443射频遥控,所以我选择了博联RM Pro +学码,接入HA控制,原来的遥控器放进小黑盒吃灰。使用米家无线开关触发。自动化是这样的:
- > 米家无线开关单击→博联RM Pro +发射射频信号→水泵开/关。
但是还有更复杂的问题:
- 如何让热水在管道中推送到的位置得到实时反馈?
- 如何让热水循环完一圈时水泵自动关闭,避免热水被反复加热?
由于管道中没有使用任何传感器,所以只能通过水泵的开启时间来推算热水到了哪。为此我用秒表做了N次测量计算,得出热水在水泵的推动下,完成一个循环的时间为102秒。此外,还要测出中途各个“站点”的位置:
- > 次卫淋浴(15%)→主卫盥洗(45%)→主卫淋浴(63%)→次卫盥洗(74%)→通过剩余管道直至全循环(其实还有一段厨房的管路没画出来,100%)。
获得上述数据后,下面配置开始。
(以下配置适用于0.116.2,不同版本的HA可能略有不同。)
将博联RM Pro +接入HA:
在UI界面的集成中添加,这里官方博联集成可能会出现一点问题,就是不支持添加RM Pro +设备,我的另一个帖子有解决方法这里。
添加一个基于博联的switch,来控制水泵:
先用博联RM Pro +学习遥控器的射频码,由于官方的博联学码方式改成了反人类的“学完码要到.storage文件夹里面查找,还不能随便删除学过的码”的方式,个人建议使用Broadlink Manager来学码(下载),学码方式见gexing147的帖子。
开关的配置:
switch:
# 热水循环泵
- platform: broadlink
mac: 'XX:XX:XX:XX:XX:XX'
switches:
- name: Water Pump (RF)
command_off: '???????=='
command_on: '???????=='
为了计算水泵开了多长时间,我们需要记录每次开启/关闭水泵的时间:
input_datetime:
# 最近一次 打开 热水循环泵 的时间戳
water_pump_last_turned_on_timestamp:
name: Water Pump Last Turned On Timestamp
has_date: true
has_time: true
# 最近一次 关闭 热水循环泵 的时间戳
water_pump_last_turned_off_timestamp:
name: Water Pump Last Turned Off Timestamp
has_date: true
has_time: true
添加一个switch,确保每次开/关都会记录对应时间戳:
- 注意1:这里我认为,水泵开启后,热水推送中途短暂关闭水泵时,由于水管中的水还没凉得那么快,所以再次开启水泵时,还是从之前热水推送到的位置继续计。这个“短暂”我设置为5分钟(300秒),如果过了这个“短暂”时间,还不打开水泵继续推送的话,那么就认为水凉了,热水推送的位置就要从0开始计。
- 注意2:我怕HA记录时间反应不够快,中间加了delay,让它有100毫秒的反应时间,用来记录好时间戳。
这样我就可以用这个switch来控制水泵了,见代码:
switch:
- platform: template
switches:
water_pump_template:
friendly_name: Water Pump Template
value_template: "{{ is_state('switch.water_pump_rf', 'on') }}"
turn_on:
- service: input_datetime.set_datetime
entity_id: input_datetime.water_pump_last_turned_on_timestamp
data_template:
datetime: >
{% if (now()|as_timestamp() - states('input_datetime.water_pump_last_turned_on_timestamp')|as_timestamp()) | int > 300 %}
{{ now() }}
{% else %}
{{ states('input_datetime.water_pump_last_turned_on_timestamp') }}
{% endif %}
- delay:
milliseconds: 100
- service: switch.turn_on
data:
entity_id: switch.water_pump_rf
turn_off:
- service: switch.turn_off
data:
entity_id: switch.water_pump_rf
- delay:
milliseconds: 100
- service: input_datetime.set_datetime
entity_id: input_datetime.water_pump_last_turned_off_timestamp
data_template:
datetime: '{{ now() }}'
一开始我想到了官方的传感器插件:history_stats,这是一个自动统计某个实体停留在某个状态持续了多长时间的插件——在这可以用来自动统计我的水泵开启了多长时间。但实际用过的人就知道,官方的这个插件统计时间的单位用的是小时(h),而且传感器状态的更新间隔很久,无法满足这种要求精确到秒的状态统计。于是我改动了官方这个传感器插件的代码,让它统计精确到秒,帖子在这里。但是,HA升级过后,这个插件居然又失效了!!
没办法,我本来使用魔改插件的方案的,现在官方的升级逼我用回了传统的方案(发过魔改插件的原贴中我也在6楼给出了相应的替代方案)。
使用传统的方案,要添加1个数值(input_number),和1个自动化,设置分别如下(其中的计时逻辑有点绕,无法描述,自己看了):
首先是数值(input_number),这个现在(108.4)可以直接在UI界面中设置,当然你也可以编辑yaml,区别就是yaml设置的目前(108.4)是无法在UI中编辑的:
然后是自动化(也可以UI编辑,但是截图困难,所以这里还是给yaml,逻辑有点绕,看的明白的就看,看不明白就复制吧):
alias: Water Pump Work Second Counter
trigger:
- platform: time_pattern
seconds: /1
condition:
- condition: or
conditions:
- condition: and
conditions:
- condition: state
entity_id: switch.water_pump_rf
state: 'off'
- condition: template
value_template: >-
{% if ((now()|as_timestamp() -
states('input_datetime.water_pump_last_turned_off_timestamp')|as_timestamp())|int()
<=305) %}
true
{% endif %}
- condition: state
entity_id: switch.water_pump_rf
state: 'on'
action:
- service: input_number.set_value
data:
value: >
{% if ((states('input_number.water_pump_work_second_counter')|int() <
102) and is_state("switch.water_pump_rf", "on")) %}
{{ states('input_number.water_pump_work_second_counter')|int() + 1 }}
{% elif ((now()|as_timestamp() -
states('input_datetime.water_pump_last_turned_off_timestamp')|as_timestamp())|int()
> 300) and is_state("switch.water_pump_rf", "off") %}
0
{% else %}
{{ states('input_number.water_pump_work_second_counter') }}
{% endif %}
entity_id: input_number.water_pump_work_second_counter
mode: single
把水泵开启时间信息,转化成热水推送的位置:
sensor:
# 循环热水进度(位置)传感器
- platform: template
sensors:
hot_water_cycle_progress:
friendly_name: "Hot Water Cycle Progress"
unit_of_measurement: '%'
value_template: >-
{% set progress = (states('input_number.water_pump_work_second_counter') | int / 102 * 100) | int %}
{% if progress < 100 %}
{{ progress }}
{% else %}
100
{% endif %}
icon_template: >/-
{% if is_state("switch.water_pump_rf", "off") %}
mdi:power-standby
{% elif states('sensor.hot_water_cycle_progress') | int < 12.5 %}
mdi:circle-outline
{% elif states('sensor.hot_water_cycle_progress') | int < 25 %}
mdi:circle-slice-1
{% elif states('sensor.hot_water_cycle_progress') | int < 37.5 %}
mdi:circle-slice-2
{% elif states('sensor.hot_water_cycle_progress') | int < 50 %}
mdi:circle-slice-3
{% elif states('sensor.hot_water_cycle_progress') | int < 62.5 %}
mdi:circle-slice-4
{% elif states('sensor.hot_water_cycle_progress') | int < 75 %}
mdi:circle-slice-5
{% elif states('sensor.hot_water_cycle_progress') | int < 87.5 %}
mdi:circle-slice-6
{% elif states('sensor.hot_water_cycle_progress') | int < 100 %}
mdi:circle-slice-7
{% else %}
mdi:circle-slice-8
{% endif %}
把上述热水位置进度用文字表述:
sensor:
- platform: template
sensors:
hot_water_cycle_progress_text:
friendly_name: "Hot Water Cycle Progress (Text)"
value_template: >-
{% if states('sensor.hot_water_cycle_progress')|int() < 1 %}
未启动水泵
{% elif states('sensor.hot_water_cycle_progress')|int() < 15 %}
推送中...
{% elif states('sensor.hot_water_cycle_progress')|int() < 45 %}
次卫-浴室
{% elif states('sensor.hot_water_cycle_progress')|int() < 63 %}
主卫-盥洗池
{% elif states('sensor.hot_water_cycle_progress')|int() < 74 %}
主卫-浴室
{% elif states('sensor.hot_water_cycle_progress')|int() < 100 %}
洗手间-盥洗池
{% else %}
全循环
{% endif %}
这个时候,热水推送进度反馈功能的建设,就达成了。
使用以下自动化,就能实现自动关停:
- 传感器sensor.hot_water_cycle_progress数值型状态到达100%→关闭水泵。
有了进度反馈,不在UI界面体现哪里行?
为了更好地在UI界面显示,要再弄出判断“推送中途各个‘站点’是否已获得热水”的二元传感器:
binary_sensor:
# 水循环系统各个节点传感器
# 次卫浴室
- platform: template
sensors:
hot_water_reached_guest_bathroom:
friendly_name: "Hot Water Reached Guest Bathroom"
value_template: >-
{{ states('sensor.hot_water_cycle_progress')|int >= 15 }}
icon_template: >-
{% if is_state("binary_sensor.hot_water_reached_guest_bathroom", "on") %}
mdi:progress-check
{% elif is_state("switch.water_pump_rf", "on") %}
mdi:timer-sand
{% else %}
mdi:progress-alert
{% endif %}
# 主卫盥洗池
- platform: template
sensors:
hot_water_reached_master_washbasin:
friendly_name: "Hot Water Reached Master Washbasin"
value_template: >-
{{ states('sensor.hot_water_cycle_progress')|int >= 45 }}
icon_template: >-
{% if is_state("binary_sensor.hot_water_reached_master_washbasin", "on") %}
mdi:progress-check
{% elif is_state("switch.water_pump_rf", "on") %}
mdi:timer-sand
{% else %}
mdi:progress-alert
{% endif %}
# 主卫浴室
- platform: template
sensors:
hot_water_reached_master_bathroom:
friendly_name: "Hot Water Reached Master Bathroom"
value_template: >-
{{ states('sensor.hot_water_cycle_progress')|int >= 63 }}
icon_template: >-
{% if is_state("binary_sensor.hot_water_reached_master_bathroom", "on") %}
mdi:progress-check
{% elif is_state("switch.water_pump_rf", "on") %}
mdi:timer-sand
{% else %}
mdi:progress-alert
{% endif %}
# 洗手间盥洗池
- platform: template
sensors:
hot_water_reached_washingroom_washbasin:
friendly_name: "Hot Water Reached Washingroom Washbasin"
value_template: >-
{{ states('sensor.hot_water_cycle_progress')|int >= 74 }}
icon_template: >-
{% if is_state("binary_sensor.hot_water_reached_washingroom_washbasin", "on") %}
mdi:progress-check
{% elif is_state("switch.water_pump_rf", "on") %}
mdi:timer-sand
{% else %}
mdi:progress-alert
{% endif %}
# 全循环
- platform: template
sensors:
hot_water_full_cycling:
friendly_name: "Hot Water Full Cycling"
value_template: >-
{{ states('sensor.hot_water_cycle_progress')|int >= 100 }}
icon_template: >-
{% if is_state("binary_sensor.hot_water_full_cycling", "on") %}
mdi:autorenew
{% elif is_state("switch.water_pump_rf", "on") %}
mdi:timer-sand
{% else %}
mdi:progress-alert
{% endif %}
配置UI卡片:
使用矢量作图软件(AI、Inscape等),画出漂亮的水路图。然后保存为svg格式,放到HA目录中的www文件夹,作为卡片可调用的资源。
素材可以到网上搜索,搜矢量的免费图标下载,拼凑起来即可,当然自己能画也不是不行。每个人的房子不同,画出来也不同。我就把我的卡片配置发上来吧,连里面的svg也发上来,尽管拿去用:
elements:
- entity: binary_sensor.hot_water_reached_guest_bathroom
hold_action:
action: more-info
state_color: true
style:
left: 47%
top: 39%
tap_action:
action: more-info
type: state-icon
- entity: binary_sensor.hot_water_reached_master_washbasin
hold_action:
action: more-info
state_color: true
style:
left: 68%
top: 70%
tap_action:
action: more-info
type: state-icon
- entity: binary_sensor.hot_water_reached_master_bathroom
hold_action:
action: more-info
state_color: true
style:
left: 26%
top: 50%
tap_action:
action: more-info
type: state-icon
- entity: binary_sensor.hot_water_reached_washingroom_washbasin
hold_action:
action: more-info
state_color: true
style:
left: 48%
top: 86%
tap_action:
action: more-info
type: state-icon
- entity: binary_sensor.hot_water_full_cycling
hold_action:
action: more-info
state_color: true
style:
left: 8%
top: 78%
tap_action:
action: more-info
type: state-icon
- entity: switch.water_pump_template
hold_action:
action: more-info
icon: 'mdi:engine'
state_color: true
style:
left: 83%
top: 34%
tap_action:
action: toggle
type: state-icon
- entity: sensor.hot_water_cycle_progress_text
hold_action:
action: more-info
prefix: 位置:
state_color: true
style:
left: 75%
top: 15%
tap_action:
action: more-info
type: state-label
- entity: sensor.hot_water_cycle_progress
hold_action:
action: more-info
state_color: true
style:
left: 83%
top: 25%
tap_action:
action: more-info
type: state-icon
- conditions:
- entity: binary_sensor.hot_water_reached_guest_bathroom
state: 'off'
- entity: switch.water_pump_rf
state: 'on'
elements:
- image: /local/water_pump/arrow_up_left.svg
style:
left: 61%
top: 47%
width: 50px
type: image
type: conditional
- conditions:
- entity: binary_sensor.hot_water_reached_master_washbasin
state: 'off'
- entity: binary_sensor.hot_water_reached_guest_bathroom
state: 'on'
- entity: switch.water_pump_rf
state: 'on'
elements:
- image: /local/water_pump/arrow_down_right.svg
style:
left: 59%
top: 59%
width: 25px
type: image
type: conditional
- conditions:
- entity: binary_sensor.hot_water_reached_master_bathroom
state: 'off'
- entity: binary_sensor.hot_water_reached_master_washbasin
state: 'on'
- entity: switch.water_pump_rf
state: 'on'
elements:
- image: /local/water_pump/arrow_up_left.svg
style:
left: 40%
top: 59%
width: 50px
type: image
type: conditional
- conditions:
- entity: binary_sensor.hot_water_reached_washingroom_washbasin
state: 'off'
- entity: binary_sensor.hot_water_reached_master_bathroom
state: 'on'
- entity: switch.water_pump_rf
state: 'on'
elements:
- image: /local/water_pump/arrow_down_right.svg
style:
left: 38%
top: 71%
width: 25px
type: image
type: conditional
- conditions:
- entity: binary_sensor.hot_water_full_cycling
state: 'off'
- entity: binary_sensor.hot_water_reached_washingroom_washbasin
state: 'on'
- entity: switch.water_pump_rf
state: 'on'
elements:
- image: /local/water_pump/arrow_straight_down_left.svg
style:
left: 20%
top: 73%
width: 30px
type: image
type: conditional
image: /local/water_pump/water_cycle_nobackground.svg
type: picture-elements
完。
water_pump.zip
(195.24 KB, 下载次数: 8)
|