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

 找回密码
 立即注册
查看: 10972|回复: 29

【完整方案】利用实测(体感)温度更加准确地控制空调

[复制链接]

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11443
金钱
8512
HASS币
460

教程狂人突出贡献

发表于 2021-5-26 10:14:09 | 显示全部楼层 |阅读模式
之前零零碎碎的发过几个相关的帖子,更多的是探讨思路。这几天看论坛里好像没有一个完整的描述,干脆整理一下发出来一个完整的可实施的方案,供大家参考。

1. 配置温控器/完成空调接入
  这个是用于直接控制空调的,这里称之为A温控器。
  比如我用的SmartIR。之前发帖说过,这个插件只是实现了向空调机发出红外指令,并没有控温的作用(控温还是由空调自己完成)。虽然在配置里可以指定一个传感器,但也只用于显示,并不参与温控过程。

  之前我说过直接修改smartir代码的方法,显然不是一个好的方案,不够直观,并且每次版本升级都要修改,太麻烦。

2. 配置另一个温控器
  这里称之为B温控器,推荐使用HA自带的“Generic Thermostat”,或者不嫌简陋的话就用一个“Input Number”来代替。
  这个温控器是用于控制上面那个A温控器的,配置一个传感器(可以用体感温度)。这里传感器将真正发挥作用。
therm.png
这是我实际使用的两个温控器,左边的A是临时挪用的冬季用于控制地暖,配置的传感器为计算出来的体感温度(参见之前的帖子)。
右边的B温控器(SmartIR)直接用于控制空调,温度传感器只是摆设。

3. 设置自动化
  在实测温度变化或者调整B温控器的目标温度时,HA将触发B温控器的“state_changed”的事件,这个事件就是这个自动化的触发条件。
  如果实测温度高于目标温度(B),降低A温控器的目标温度;否则升高A温控器的目标温度。
  为了更好的适应实际需要,这个自动化还需要进一步的完善。
  可以用Node-Red实现,不过凡是HA自身能解决的,我还是倾向于在HA里完成。

4. 完整配置代码
4.1 A温控器用于直接控制空调
smartir:

remote:
  - platform: xiaomi_miio
    host: x.x.x.x
    token: xxxxxxxxxx
    name: xiaomi

climate:
  - platform: smartir
    name: Haier AC
    unique_id: haierac
    device_code: 1001
    controller_data: remote.xiaomi
    temperature_sensor: sensor.bttemp
    humidity_sensor: sensor.bthumi
参考插件文档配置,这里不展开。
设备代码如果没有现成的可用就自己定义,我使用的是现学习的raw格式。根据经验,只学习了26-30度这几个,感觉夏天用足够了。
温湿度传感器只是摆设,并不实际参与温控。

4.2 B温控器
climate:
  - platform: generic_thermostat
    name: HAtherm
    heater: switch.heater
    target_sensor: sensor.apptempbt
    target_temp: 30
    cold_tolerance: 0
    hot_tolerance: 0
    precision: 0.1
    initial_hvac_mode: "off"
    min_temp: 27
    max_temp: 33

这里我使用的是体感温度,数值比原始温度要高,所以可调范围、目标温度都设置的高一些,另外可以进行0.1度颗粒的精细调整。这个温控器不用开启,只是利用它的界面,所以可以简单地用input_number替代。

4.3 自动化
4.3.1 触发条件很简单:
  trigger:
  - platform: state
    entity_id: climate.hatherm
如果温度传感器更新比较频繁,可能会出现温度设置过高或过低的问题,只需要在后面再增加一行:
for: '00:30:00'
这样每次调整之后半小时就不再调整,当然,这个间隔可以随便调。

4.3.2 先说动作,也比较好理解,就是调用服务。
为了实现一个自动化条目完成升温和降温,使用了模板进行判断:
service: climate.set_temperature
target:
  entity_id: climate.haier_ac
data:
  temperature: >
    {% if state_attr('climate.hatherm','current_temperature')>state_attr('climate.hatherm','temperature') %}
       {{state_attr('climate.haier_ac','temperature')-1}}
    {% else %}
       {{state_attr('climate.haier_ac','temperature')+1}}
    {% endif%}

4.3.3 环境条件也必须考虑,主要是避免不必要的动作和错误提示:
  condition:
  - condition: state
    entity_id: climate.haier_ac
    state: cool
  - condition: template
    value_template: "{{ not((state_attr('climate.hatherm','current_temperature')>state_attr('climate.hatherm','temperature')\
      \ and state_attr('climate.haier_ac','min_temp')==state_attr('climate.haier_ac','temperature')\n\
      \    or\n    state_attr('climate.hatherm','current_temperature')<=state_attr('climate.hatherm','temperature')\
      \ and state_attr('climate.haier_ac','max_temp')==state_attr('climate.haier_ac','temperature')))\
      \ }}"
即只有空调处于开启状态、非够凉且温控器已达最高值或者挺热且温控器已达最低值时才会执行后面的动作。

5. 后续优化调整
可能需要调整两个温控器的最高最低温度以及B温控器的目标温度。

评分

参与人数 2金钱 +25 HASS币 +10 收起 理由
+ 20 + 10 我来瀚思就为看你!
gsdv + 5 膜拜大神!

查看全部评分

回复

使用道具 举报

19

主题

686

帖子

3440

积分

论坛元老

Rank: 8Rank: 8

积分
3440
金钱
2749
HASS币
20
发表于 2021-5-26 10:53:40 | 显示全部楼层
正常空调自己不就是这样工作的吗?
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11443
金钱
8512
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-5-26 11:00:21 | 显示全部楼层
ms2 发表于 2021-5-26 10:53
正常空调自己不就是这样工作的吗?

好像很多空调还真不是,反正我家里的老爷机不是。

空调自己的控温逻辑是达到门限就停止制冷(非变频)或者随着温度降低逐步降低制冷功率并最终停止制冷(变频)。

更主要的问题是空调只能通过自有的传感器测量室内温度,有些新型号在遥控器上也设置了传感器可以更准确一点。

我要的效果是利用HA里其他的传感器实现更进一步的精准控制。
回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2021-5-26 15:43:22 | 显示全部楼层
空调控制最大的问题就是温度传感器是在空调上,虽然现在有几款空调温度传感器做到在遥控器上,比较好了~

老一辈的空调制冷都很难受,要么太冷,要么太热,变频现在的好一些,变频输出控温比以前的就舒服多,据说也更省电~

emmm 所以我现在家里用变频,基本就没管它控温了,因为只需要开机设定温度就什么都不用管~也就没折腾

家里一大堆 irmqtt没用过哈
Nero
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11443
金钱
8512
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-5-26 16:57:55 | 显示全部楼层
neroxps 发表于 2021-5-26 15:43
空调控制最大的问题就是温度传感器是在空调上,虽然现在有几款空调温度传感器做到在遥控器上,比较好了~

...

哈哈,不妨折腾起来
回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2021-5-26 22:31:32 | 显示全部楼层
XCray 发表于 2021-5-26 16:57
哈哈,不妨折腾起来

要折腾就拆开找物联网接口直接8266怼进去。据说美的都有。
Nero
回复

使用道具 举报

98

主题

2866

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11443
金钱
8512
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-5-26 22:59:14 来自手机 | 显示全部楼层
neroxps 发表于 2021-5-26 22:31
要折腾就拆开找物联网接口直接8266怼进去。据说美的都有。

我怀疑没物联网接口的机型也大都可以怼8266,毕竟大多数都是单片机控制的,只是太折腾了
回复

使用道具 举报

76

主题

1356

帖子

1万

积分

元老级技术达人

积分
18272
金钱
16876
HASS币
290
发表于 2021-6-11 16:30:32 | 显示全部楼层

利用实测(体感)温度更加准确地控制空调的优化方案

在本帖子指导下,花了几天时间优化自动化,几十次的调试及测试,分享一下自动化给有需要的朋友。

目前只用于制冷模式:
空调要先接入ha
一个温控器

当自动化开启时,显示温控器的界面,否则显示空调控制界面。

01.jpg
02.jpg


cards:
  - type: conditional
    conditions:
      - entity: automation.kong_diao_jing_zhun_kong_zhi
        state: 'off'
    card:
      type: thermostat
      entity: climate.wo_shi_kong_diao
  - type: conditional
    conditions:
      - entity: automation.kong_diao_jing_zhun_kong_zhi
        state: 'on'
    card:
      type: thermostat
      entity: climate.heng_wen_qi_zhi_leng
      name: 卧室空调体感温度恒温控制
  - type: entities
    entities:
      - entity: automation.kong_diao_jing_zhun_kong_zhi
        secondary_info: last-triggered
        show_name: false

mode: vertical
type: custom:stack-in-card



自动化:
1、温控器关则空调跟着关,制冷则跟着进入制冷模式。
2、执行条件:空调设定温度在空调可调节范围之间;体感温度高于目标温度且体感温度没有下降则空调设定减1度;体感温度低目标温度且体感温度没有上升则空调设定加1度;空调设定温度与目标温度差值大于5时设定空调温度等于差5度的值。
为了精准控制,0.1度的变化都会调整一下空调目标温度,导致会有频繁空调设定发出声音的问题。如果调整时间for变长一点,可能导致波动范围较大。最终还是要多试多调整,才能达到最合适的。


alias: 空调精准控制
description: 通过外部传感器增减调节空调设定温度达到目标温度精准控制
trigger:
  - platform: state
    entity_id: climate.heng_wen_qi_zhi_leng
condition: []
action:
  - choose:
      - conditions:
          - condition: template
            value_template: '{{trigger.to_state.state!=trigger.from_state.state}}'
        sequence:
          - service: climate.set_hvac_mode
            target:
              entity_id: climate.wo_shi_kong_diao
            data:
              hvac_mode: |
                {{trigger.to_state.state}}
      - conditions:
          - condition: state
            entity_id: climate.heng_wen_qi_zhi_leng
            state: cool
          - condition: state
            entity_id: climate.wo_shi_kong_diao
            state: cool
          - condition: template
            value_template: >-
              {{(state_attr('climate.heng_wen_qi_zhi_leng','current_temperature')>state_attr('climate.heng_wen_qi_zhi_leng','temperature')
              and
              state_attr('climate.wo_shi_kong_diao','min_temp')<state_attr('climate.wo_shi_kong_diao','temperature'))
              or
              (state_attr('climate.heng_wen_qi_zhi_leng','current_temperature')<state_attr('climate.heng_wen_qi_zhi_leng','temperature')
              and
              state_attr('climate.wo_shi_kong_diao','max_temp')>state_attr('climate.wo_shi_kong_diao','temperature'))}}
        sequence:
          - service: climate.set_temperature
            target:
              entity_id: climate.wo_shi_kong_diao
            data:
              temperature: >
                {% if
                state_attr('climate.wo_shi_kong_diao','temperature')<(state_attr('climate.heng_wen_qi_zhi_leng','temperature')|int
                -5) %}
                   {{state_attr('climate.heng_wen_qi_zhi_leng','temperature')|int -5}}
                {% elif
                (state_attr('climate.heng_wen_qi_zhi_leng','current_temperature')>state_attr('climate.heng_wen_qi_zhi_leng','temperature'))
                and ((trigger.from_state.attributes.current_temperature | float)
                <= (trigger.to_state.attributes.current_temperature | float) )
                %}
                   {{state_attr('climate.wo_shi_kong_diao','temperature')-1}}
                {% elif
                (state_attr('climate.heng_wen_qi_zhi_leng','current_temperature')<state_attr('climate.heng_wen_qi_zhi_leng','temperature'))
                and ((trigger.from_state.attributes.current_temperature | float)
                >= (trigger.to_state.attributes.current_temperature | float) ) 
                %}
                   {{state_attr('climate.wo_shi_kong_diao','temperature')+1}}
                {% else %}
                   {{state_attr('climate.wo_shi_kong_diao','temperature')}}
                {% endif%}
    default: []
mode: single




回复

使用道具 举报

1

主题

31

帖子

236

积分

中级会员

Rank: 3Rank: 3

积分
236
金钱
205
HASS币
0
发表于 2021-7-2 23:17:31 | 显示全部楼层
dscao 发表于 2021-6-11 16:30
在本帖子指导下,花了几天时间优化自动化,几十次的调试及测试,分享一下自动化给有需要的朋友。

目前只用 ...

climate.heng_wen_qi_zhi_leng 这个是虚拟设备?
回复

使用道具 举报

76

主题

1356

帖子

1万

积分

元老级技术达人

积分
18272
金钱
16876
HASS币
290
发表于 2021-7-3 01:17:11 | 显示全部楼层
dd102 发表于 2021-7-2 23:17
climate.heng_wen_qi_zhi_leng 这个是虚拟设备?

是的,参考楼主的帖子。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-24 19:06 , Processed in 0.063188 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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