『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 12540|回复: 25

热水循环自动化方案

[复制链接]

10

主题

181

帖子

2580

积分

金牌会员

Rank: 6Rank: 6

积分
2580
金钱
2394
HASS币
60
发表于 2020-11-1 11:31:11 | 显示全部楼层 |阅读模式
本帖最后由 lyfff 于 2021-1-17 23:47 编辑

几经尝试,都没能避免文中的>自动转义成>,<自动转义成<,请使用人脑转义。

效果

不废话,先放一张图,让你们决定,后面这堆字值不值得花时间看:(这是暗色模式,所以很黑)
效果.png

效果图2

效果图2

方案

我家的结构图如下图,使用然气热水器,而且全屋共用一个,位置是在厨房(图中红点),这就导致离主卧里的卫生间很远。因此装修的时候使用了循环水管(红色箭头),这样主卧就可以在洗澡前,先用水泵推动水在循环管道中循环流动,这样热水器就会预先加热好管道中的水,洗澡的时候一打开淋浴器就能立即获得热水(其实就是目前很多热水器的“零冷水”方案)。
水路图.png
我的水泵是华帝的,使用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用于记录时间戳:

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: &gt;
            {% if (now()|as_timestamp() - states('input_datetime.water_pump_last_turned_on_timestamp')|as_timestamp()) | int &gt; 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() }}'

弄一个数值(input_number),用于记录水泵开启了多长时间:

一开始我想到了官方的传感器插件:history_stats,这是一个自动统计某个实体停留在某个状态持续了多长时间的插件——在这可以用来自动统计我的水泵开启了多长时间。但实际用过的人就知道,官方的这个插件统计时间的单位用的是小时(h),而且传感器状态的更新间隔很久,无法满足这种要求精确到秒的状态统计。于是我改动了官方这个传感器插件的代码,让它统计精确到秒,帖子在这里。但是,HA升级过后,这个插件居然又失效了!!
没办法,我本来使用魔改插件的方案的,现在官方的升级逼我用回了传统的方案(发过魔改插件的原贴中我也在6楼给出了相应的替代方案)。
使用传统的方案,要添加1个数值(input_number),和1个自动化,设置分别如下(其中的计时逻辑有点绕,无法描述,自己看了):
首先是数值(input_number),这个现在(108.4)可以直接在UI界面中设置,当然你也可以编辑yaml,区别就是yaml设置的目前(108.4)是无法在UI中编辑的:


1.png

然后是自动化(也可以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: &gt;-
              {% if ((now()|as_timestamp() -
              states('input_datetime.water_pump_last_turned_off_timestamp')|as_timestamp())|int()
              &lt;=305) %}
                true
              {% endif %}
      - condition: state
        entity_id: switch.water_pump_rf
        state: 'on'
action:
  - service: input_number.set_value
    data:
      value: &gt;
        {% if ((states('input_number.water_pump_work_second_counter')|int() &lt;
        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()
        &gt; 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: &gt;-
        {% set progress = (states('input_number.water_pump_work_second_counter') | int / 102 * 100) | int %}
        {% if progress &lt; 100 %}
          {{ progress }}
        {% else %}
          100
        {% endif %}
      icon_template: &gt;/-
          {% if is_state("switch.water_pump_rf", "off") %}
            mdi:power-standby
          {% elif states('sensor.hot_water_cycle_progress') | int &lt; 12.5 %}
            mdi:circle-outline
          {% elif states('sensor.hot_water_cycle_progress') | int &lt; 25 %}
            mdi:circle-slice-1
          {% elif states('sensor.hot_water_cycle_progress') | int &lt; 37.5 %}
            mdi:circle-slice-2
          {% elif states('sensor.hot_water_cycle_progress') | int &lt; 50 %}
            mdi:circle-slice-3
          {% elif states('sensor.hot_water_cycle_progress') | int &lt; 62.5 %}
            mdi:circle-slice-4
          {% elif states('sensor.hot_water_cycle_progress') | int &lt; 75 %}
            mdi:circle-slice-5
          {% elif states('sensor.hot_water_cycle_progress') | int &lt; 87.5 %}
            mdi:circle-slice-6
          {% elif states('sensor.hot_water_cycle_progress') | int &lt; 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: &gt;-
        {% if states('sensor.hot_water_cycle_progress')|int() &lt; 1 %}
          未启动水泵
        {% elif states('sensor.hot_water_cycle_progress')|int() &lt; 15 %}
          推送中...
        {% elif states('sensor.hot_water_cycle_progress')|int() &lt; 45 %}
          次卫-浴室
        {% elif states('sensor.hot_water_cycle_progress')|int() &lt; 63 %}
          主卫-盥洗池
        {% elif states('sensor.hot_water_cycle_progress')|int() &lt; 74 %}
          主卫-浴室
        {% elif states('sensor.hot_water_cycle_progress')|int() &lt; 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: &gt;-
        {{ states('sensor.hot_water_cycle_progress')|int &gt;= 15 }}
      icon_template: &gt;-
        {% 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: &gt;-
        {{ states('sensor.hot_water_cycle_progress')|int &gt;= 45 }}
      icon_template: &gt;-
        {% 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: &gt;-
        {{ states('sensor.hot_water_cycle_progress')|int &gt;= 63 }}
      icon_template: &gt;-
        {% 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: &gt;-
        {{ states('sensor.hot_water_cycle_progress')|int &gt;= 74 }}
      icon_template: &gt;-
        {% 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: &gt;-
        {{ states('sensor.hot_water_cycle_progress')|int &gt;= 100 }}
      icon_template: &gt;-
        {% 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)












评分

参与人数 1金钱 +2 收起 理由
拍拉头 + 2

查看全部评分

大佬: 请勿咨询任何问题,所有问题都能 Google 到答案
回复

使用道具 举报

18

主题

593

帖子

4019

积分

版主

Rank: 7Rank: 7Rank: 7

积分
4019
金钱
3411
HASS币
40
发表于 2020-11-1 12:08:44 | 显示全部楼层
我是在相应节点加了个ds18b20传感器,测水温
回复

使用道具 举报

10

主题

181

帖子

2580

积分

金牌会员

Rank: 6Rank: 6

积分
2580
金钱
2394
HASS币
60
 楼主| 发表于 2020-11-1 12:25:10 | 显示全部楼层
whxciotw 发表于 2020-11-1 12:08
我是在相应节点加了个ds18b20传感器,测水温

加载水管里面吗?已经装修好了,太难了[手动笑cry]
大佬: 请勿咨询任何问题,所有问题都能 Google 到答案
回复

使用道具 举报

18

主题

593

帖子

4019

积分

版主

Rank: 7Rank: 7Rank: 7

积分
4019
金钱
3411
HASS币
40
发表于 2020-11-1 13:05:04 | 显示全部楼层
lyfff 发表于 2020-11-1 12:25
加载水管里面吗?已经装修好了,太难了[手动笑cry]

用个盲管,把传感器插进去
总归是有裸露在外的水管呀
回复

使用道具 举报

10

主题

181

帖子

2580

积分

金牌会员

Rank: 6Rank: 6

积分
2580
金钱
2394
HASS币
60
 楼主| 发表于 2020-11-1 14:15:03 | 显示全部楼层
whxciotw 发表于 2020-11-1 13:05
用个盲管,把传感器插进去
总归是有裸露在外的水管呀

还真没有,水管主路全都埋在墙里,只有支路有一个接头露出,而支路不开水的话,是不会有水流和温度反馈的。
如果插一个东西进到主路里面,不怕堵的么?
大佬: 请勿咨询任何问题,所有问题都能 Google 到答案
回复

使用道具 举报

2

主题

190

帖子

924

积分

论坛积极会员

积分
924
金钱
734
HASS币
0
发表于 2020-11-1 16:59:16 | 显示全部楼层
学习学习
回复

使用道具 举报

2

主题

53

帖子

810

积分

高级会员

Rank: 4

积分
810
金钱
757
HASS币
0
发表于 2020-11-1 21:35:52 | 显示全部楼层
学习学习
回复

使用道具 举报

18

主题

593

帖子

4019

积分

版主

Rank: 7Rank: 7Rank: 7

积分
4019
金钱
3411
HASS币
40
发表于 2020-11-2 08:48:13 | 显示全部楼层
lyfff 发表于 2020-11-1 14:15
还真没有,水管主路全都埋在墙里,只有支路有一个接头露出,而支路不开水的话,是不会有水流和温度反馈的 ...

吊顶、橱柜、洗手池啥的,也没有水管嘛?
插进去不会堵
回复

使用道具 举报

59

主题

731

帖子

4221

积分

论坛元老

Rank: 8Rank: 8

积分
4221
金钱
3485
HASS币
20
发表于 2020-11-2 10:30:31 | 显示全部楼层
每次反馈到手机里也麻烦啊,我也在想这个事,要么在台盆旁边弄个RGB小灯来反馈?
回复

使用道具 举报

10

主题

181

帖子

2580

积分

金牌会员

Rank: 6Rank: 6

积分
2580
金钱
2394
HASS币
60
 楼主| 发表于 2020-11-2 23:13:11 | 显示全部楼层
whxciotw 发表于 2020-11-2 08:48
吊顶、橱柜、洗手池啥的,也没有水管嘛?
插进去不会堵

反正循环水路部分全部埋起来
大佬: 请勿咨询任何问题,所有问题都能 Google 到答案
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-19 14:30 , Processed in 0.136937 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表