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

标题: 【完整方案】利用实测(体感)温度更加准确地控制空调 [打印本页]

作者: XCray    时间: 2021-5-26 10:14
标题: 【完整方案】利用实测(体感)温度更加准确地控制空调
之前零零碎碎的发过几个相关的帖子,更多的是探讨思路。这几天看论坛里好像没有一个完整的描述,干脆整理一下发出来一个完整的可实施的方案,供大家参考。

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

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

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

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

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

  2. remote:
  3.   - platform: xiaomi_miio
  4.     host: x.x.x.x
  5.     token: xxxxxxxxxx
  6.     name: xiaomi

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

4.2 B温控器
  1. climate:
  2.   - platform: generic_thermostat
  3.     name: HAtherm
  4.     heater: switch.heater
  5.     target_sensor: sensor.apptempbt
  6.     target_temp: 30
  7.     cold_tolerance: 0
  8.     hot_tolerance: 0
  9.     precision: 0.1
  10.     initial_hvac_mode: "off"
  11.     min_temp: 27
  12.     max_temp: 33
复制代码

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

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

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

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

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


作者: ms2    时间: 2021-5-26 10:53
正常空调自己不就是这样工作的吗?
作者: XCray    时间: 2021-5-26 11:00
ms2 发表于 2021-5-26 10:53
正常空调自己不就是这样工作的吗?

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

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

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

我要的效果是利用HA里其他的传感器实现更进一步的精准控制。
作者: neroxps    时间: 2021-5-26 15:43
空调控制最大的问题就是温度传感器是在空调上,虽然现在有几款空调温度传感器做到在遥控器上,比较好了~

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

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

家里一大堆 irmqtt没用过哈
作者: XCray    时间: 2021-5-26 16:57
neroxps 发表于 2021-5-26 15:43
空调控制最大的问题就是温度传感器是在空调上,虽然现在有几款空调温度传感器做到在遥控器上,比较好了~

...

哈哈,不妨折腾起来
作者: neroxps    时间: 2021-5-26 22:31
XCray 发表于 2021-5-26 16:57
哈哈,不妨折腾起来

要折腾就拆开找物联网接口直接8266怼进去。据说美的都有。
作者: XCray    时间: 2021-5-26 22:59
neroxps 发表于 2021-5-26 22:31
要折腾就拆开找物联网接口直接8266怼进去。据说美的都有。

我怀疑没物联网接口的机型也大都可以怼8266,毕竟大多数都是单片机控制的,只是太折腾了
作者: dscao    时间: 2021-6-11 16:30
标题: 利用实测(体感)温度更加准确地控制空调的优化方案
在本帖子指导下,花了几天时间优化自动化,几十次的调试及测试,分享一下自动化给有需要的朋友。

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

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

[attach]30071[/attach]
[attach]30072[/attach]


  1. cards:
  2.   - type: conditional
  3.     conditions:
  4.       - entity: automation.kong_diao_jing_zhun_kong_zhi
  5.         state: 'off'
  6.     card:
  7.       type: thermostat
  8.       entity: climate.wo_shi_kong_diao
  9.   - type: conditional
  10.     conditions:
  11.       - entity: automation.kong_diao_jing_zhun_kong_zhi
  12.         state: 'on'
  13.     card:
  14.       type: thermostat
  15.       entity: climate.heng_wen_qi_zhi_leng
  16.       name: 卧室空调体感温度恒温控制
  17.   - type: entities
  18.     entities:
  19.       - entity: automation.kong_diao_jing_zhun_kong_zhi
  20.         secondary_info: last-triggered
  21.         show_name: false

  22. mode: vertical
  23. type: custom:stack-in-card
复制代码



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


  1. alias: 空调精准控制
  2. description: 通过外部传感器增减调节空调设定温度达到目标温度精准控制
  3. trigger:
  4.   - platform: state
  5.     entity_id: climate.heng_wen_qi_zhi_leng
  6. condition: []
  7. action:
  8.   - choose:
  9.       - conditions:
  10.           - condition: template
  11.             value_template: '{{trigger.to_state.state!=trigger.from_state.state}}'
  12.         sequence:
  13.           - service: climate.set_hvac_mode
  14.             target:
  15.               entity_id: climate.wo_shi_kong_diao
  16.             data:
  17.               hvac_mode: |
  18.                 {{trigger.to_state.state}}
  19.       - conditions:
  20.           - condition: state
  21.             entity_id: climate.heng_wen_qi_zhi_leng
  22.             state: cool
  23.           - condition: state
  24.             entity_id: climate.wo_shi_kong_diao
  25.             state: cool
  26.           - condition: template
  27.             value_template: >-
  28.               {{(state_attr('climate.heng_wen_qi_zhi_leng','current_temperature')>state_attr('climate.heng_wen_qi_zhi_leng','temperature')
  29.               and
  30.               state_attr('climate.wo_shi_kong_diao','min_temp')<state_attr('climate.wo_shi_kong_diao','temperature'))
  31.               or
  32.               (state_attr('climate.heng_wen_qi_zhi_leng','current_temperature')<state_attr('climate.heng_wen_qi_zhi_leng','temperature')
  33.               and
  34.               state_attr('climate.wo_shi_kong_diao','max_temp')>state_attr('climate.wo_shi_kong_diao','temperature'))}}
  35.         sequence:
  36.           - service: climate.set_temperature
  37.             target:
  38.               entity_id: climate.wo_shi_kong_diao
  39.             data:
  40.               temperature: >
  41.                 {% if
  42.                 state_attr('climate.wo_shi_kong_diao','temperature')<(state_attr('climate.heng_wen_qi_zhi_leng','temperature')|int
  43.                 -5) %}
  44.                    {{state_attr('climate.heng_wen_qi_zhi_leng','temperature')|int -5}}
  45.                 {% elif
  46.                 (state_attr('climate.heng_wen_qi_zhi_leng','current_temperature')>state_attr('climate.heng_wen_qi_zhi_leng','temperature'))
  47.                 and ((trigger.from_state.attributes.current_temperature | float)
  48.                 <= (trigger.to_state.attributes.current_temperature | float) )
  49.                 %}
  50.                    {{state_attr('climate.wo_shi_kong_diao','temperature')-1}}
  51.                 {% elif
  52.                 (state_attr('climate.heng_wen_qi_zhi_leng','current_temperature')<state_attr('climate.heng_wen_qi_zhi_leng','temperature'))
  53.                 and ((trigger.from_state.attributes.current_temperature | float)
  54.                 >= (trigger.to_state.attributes.current_temperature | float) )
  55.                 %}
  56.                    {{state_attr('climate.wo_shi_kong_diao','temperature')+1}}
  57.                 {% else %}
  58.                    {{state_attr('climate.wo_shi_kong_diao','temperature')}}
  59.                 {% endif%}
  60.     default: []
  61. mode: single
复制代码





作者: dd102    时间: 2021-7-2 23:17
dscao 发表于 2021-6-11 16:30
在本帖子指导下,花了几天时间优化自动化,几十次的调试及测试,分享一下自动化给有需要的朋友。

目前只用 ...

climate.heng_wen_qi_zhi_leng 这个是虚拟设备?
作者: dscao    时间: 2021-7-3 01:17
dd102 发表于 2021-7-2 23:17
climate.heng_wen_qi_zhi_leng 这个是虚拟设备?

是的,参考楼主的帖子。
作者: dd102    时间: 2021-7-4 19:24
dscao 发表于 2021-7-3 01:17
是的,参考楼主的帖子。

谢谢,前两天我试了一下,体感温度有点高。。温度设定有点摸不着头脑,我又改回node-red里控制了
作者: xiaopi    时间: 2021-8-11 21:57
dscao 发表于 2021-6-11 16:30
在本帖子指导下,花了几天时间优化自动化,几十次的调试及测试,分享一下自动化给有需要的朋友。

目前只用 ...

虚拟温控器的制冷的图标怎么弄的,climate的配置文件给我抄一下
作者: dscao    时间: 2021-8-12 14:47
xiaopi 发表于 2021-8-11 21:57
虚拟温控器的制冷的图标怎么弄的,climate的配置文件给我抄一下
  1. climate:
  2.   - platform: generic_thermostat
  3.     name: 恒温器(制冷)
  4.     heater: switch.heater
  5.     target_sensor: sensor.woshiapptemp #体感温度
  6.     min_temp: 25
  7.     max_temp: 33
  8.     ac_mode: true
  9.     target_temp: 30
  10.     cold_tolerance: 1
  11.     hot_tolerance: 1
  12.     min_cycle_duration:
  13.       seconds: 5
  14.     keep_alive:
  15.       minutes: 3
  16.     initial_hvac_mode: "off"   #off 关,heat 加热设备,cool 制冷设备
  17.     precision: 0.1
复制代码

作者: gsdv    时间: 2021-8-16 09:38
斑竹,我家里的空调就是温控器坏了,经常失灵制冷不停歇。您这个帖子就是我想要的。
但是目前我测试了一些简单的自动化都总是不成功,没触发。希望能得到一点入门的指点。
作者: XCray    时间: 2021-8-16 09:54
gsdv 发表于 2021-8-16 09:38
斑竹,我家里的空调就是温控器坏了,经常失灵制冷不停歇。您这个帖子就是我想要的。
但是目前我测试了一些 ...

其实这个帖子的方法有些过于复杂了,体感温度也没有预想的好使。

建议就用“Generic Thermostat”这个组件,连自动化都不用设置,简单又好看。

当然,不用这个虚拟温控器也可以,设置两个简单的自动化:温度传感器数值高于门限就打开制冷、低于门限就关闭制冷。
作者: gsdv    时间: 2021-8-16 09:59
XCray 发表于 2021-8-16 09:54
其实这个帖子的方法有些过于复杂了,体感温度也没有预想的好使。

建议就用“Generic Thermostat”这个组 ...

多谢指点。
我刚装ha没多久。现在测试的就是根据温度计温度控制空调切换制冷送风模式。请问能帮我看看这个设置的问题出在哪里吗?
https://bbs.hassbian.com/thread-13816-1-1.html
作者: kingwell    时间: 2021-8-21 01:30
我是直接在米家里做的智能场景。
在合适的位置放了个温湿度传感器,自己根据体感温差,看这个传感器的数值变化,在感觉需要开空调的时候把空调温度调到26℃以下,比如23℃;在感觉需要停止制冷的时候,把空调的温度调高,比如29℃,最终只是干涉空调的制冷动作而已。
主要也是因为老空调,不是变频的,在空调不制冷的时候自动开启米家直流变频落地扇,在空调制冷的时候关闭。这么下来体验好了不少。
作者: zxyny1989    时间: 2021-9-11 00:47
大佬的贴必收藏,慢慢嗑。
作者: dark.forever    时间: 2022-6-19 11:13
大神,我经过测试发现这个方案还有个问题,不知道怎么解决:
1. 即使设置了00:30:00,还是会出现连续1~2分钟里调温好几次的情况.

我尝试过多种时间设置,如5分钟、15分钟等,发现自动调温的触发并没有规律.

贴上我的自动化代码.
  1. alias: 自动调温
  2. description: 根据hatherm表盘设定自动调温
  3. trigger:
  4.   - platform: state
  5.     entity_id: climate.hatherm
  6.     for:
  7.       hours: 0
  8.       minutes: 10
  9.       seconds: 0
  10. condition:
  11.   - condition: state
  12.     entity_id: climate.midea_ac_160528703464305
  13.     state: cool
  14.   - condition: template
  15.     value_template: >-
  16.       {{
  17.       not((state_attr('climate.hatherm','current_temperature')>state_attr('climate.hatherm','temperature')
  18.       and
  19.       state_attr('climate.midea_ac_160528703464305','min_temp')==state_attr('climate.midea_ac_160528703464305','temperature')
  20.           or
  21.           state_attr('climate.hatherm','current_temperature')<=state_attr('climate.hatherm','temperature') and state_attr('climate.midea_ac_160528703464305','max_temp')==state_attr('climate.midea_ac_160528703464305','temperature'))) }}
  22. action:
  23.   - service: climate.set_temperature
  24.     target:
  25.       entity_id: climate.midea_ac_160528703464305
  26.     data:
  27.       temperature: >
  28.         {% if
  29.         state_attr('climate.hatherm','current_temperature')>state_attr('climate.hatherm','temperature')
  30.         %}
  31.            {{state_attr('climate.midea_ac_160528703464305','temperature')-0.5}}
  32.         {% else %}
  33.            {{state_attr('climate.midea_ac_160528703464305','temperature')+0.5}}
  34.         {% endif%}
  35. mode: single
复制代码

作者: dark.forever    时间: 2022-6-19 11:14
  1.     value_template: >-
  2.       {{
  3.       not((state_attr('climate.hatherm','current_temperature')>state_attr('climate.hatherm','temperature')
  4.       and
  5.       state_attr('climate.midea_ac_160528703464305','min_temp')==state_attr('climate.midea_ac_160528703464305','temperature')
  6.           or
  7.           state_attr('climate.hatherm','current_temperature')<=state_attr('climate.hatherm','temperature') and state_attr('climate.midea_ac_160528703464305','max_temp')==state_attr('climate.midea_ac_160528703464305','temperature'))) }}
复制代码


这段代码是按你的代码复制进去了,只改了空调的entity_id,但只要保存就会变成目前这个样子,好像和你原本的代码有点不一样,不知道问题是不是出在这里.
作者: dark.forever    时间: 2022-6-19 11:16
还有设置的这个自动化会出现自动关闭的情况,不知道是本来就这样还是有bug?
作者: XCray    时间: 2022-6-19 11:57
dark.forever 发表于 2022-6-19 11:16
还有设置的这个自动化会出现自动关闭的情况,不知道是本来就这样还是有bug? ...

实话说,这个我自己都不用
当时只是实际验证一下思路,作为自动化设计调试的实验题目很好,但实际上空调温控没必要追求这个,尤其是现在的空调都是变频的。

体感温度引入了湿度和风速两个额外的变量,室内风速可以忽略、开启空调制冷后湿度其实也会被控制在比较稳定的水平(空调制冷物理上就有除湿的作用),所以没必要。

倒是纠结要不要开空调的时候,这个体感温度可以参考一下

实际控制的话,还是怎么简单怎么来比较好。
作者: dark.forever    时间: 2022-6-19 12:04
感谢回复
我这里可能情况比较特别:房间比较大,空调可能很快把它附近制冷了,然后空调内部的传感器就会认为房间温度够低了就不制冷了.
所以我需要一个外部的温湿度计(在身边)来根据实测温度设置空调是否制冷.强迫空调制冷的方法就是使target温度比current温度更低.
倒不是非常需要体感温度.

请问大神有什么解决思路吗?
作者: XCray    时间: 2022-6-19 20:51
本帖最后由 XCray 于 2022-6-19 20:52 编辑
dark.forever 发表于 2022-6-19 12:04
感谢回复
我这里可能情况比较特别:房间比较大,空调可能很快把它附近制冷了,然后空调内部的传感器就会认为房 ...

如果是普通的红外遥控空调,可以参考一下我另外一个帖子:
https://bbs.hassbian.com/thread-12895-1-1.html

或者利用HA内置的Generic Thermostat组件:
https://www.home-assistant.io/integrations/generic_thermostat/
定制一个虚拟开关,开的动作就是发射一个温度比较低的遥控指令。
如果是可以接入wifi或者蓝牙遥控的空调,应该还有更好的办法。

作者: dark.forever    时间: 2022-6-20 09:53
XCray 发表于 2022-6-19 20:51
如果是普通的红外遥控空调,可以参考一下我另外一个帖子:
https://bbs.hassbian.com/thread-12895-1-1.ht ...

忘记说了,是接入Wi-Fi的空调,并且HA能直接读取到空调内的传感器测得温度.

问题就近空调处由于温度降下来了空调内传感器测得温度比目标温度低了,就停止制冷了.但远离空调的那头温度还没降下来.
我知道可以用空气对流扇来解决这个问题,但我这边由于一些其他原因不适合用这个方案.
作者: XCray    时间: 2022-6-20 10:09
dark.forever 发表于 2022-6-20 09:53
忘记说了,是接入Wi-Fi的空调,并且HA能直接读取到空调内的传感器测得温度.

问题就近空调处由于温度降下来 ...

那简单呀,把空调的目标设置的低一点儿,比如16度,外面的传感器高于你的预设值(比如25度)就继续工作制冷,达到预设值就停止制冷(也可以把空调的目标温度提高)
作者: dark.forever    时间: 2022-6-20 14:15
XCray 发表于 2022-6-20 10:09
那简单呀,把空调的目标设置的低一点儿,比如16度,外面的传感器高于你的预设值(比如25度)就继续工作制 ...

啊,好像确实就是这么简单能解决.感谢了.

是我之前想太复杂了,总是想要把空调设置到一个合适的温度上,还想要它动态调整温度.
作者: wanyevyv    时间: 2023-5-12 10:40
XCray 发表于 2022-6-19 11:57
实话说,这个我自己都不用
当时只是实际验证一下思路,作为自动化设计调试的实验题目很好,但实际上空 ...

这个其实是非常有用的

我家是水机中央空调+地暖,目前温控器是装在墙上的heatcold(希到)的th125t和th125a,联动青萍空气监测仪,倒是能精确控温,但是问题是在于:

设置目标温度需要在自动化里手动修改(也就是只能我亲手修改),然而家里其他人有调节目标温度的需求,如果能做成这种图形界面就非常好了
作者: wanyevyv    时间: 2023-5-12 10:43
不知版主是否有空做出能外接温度计、能精确控温的集成,那就真是能造福一大票水机用户,功德无量呀
作者: wanyevyv    时间: 2023-5-12 11:40
本帖最后由 wanyevyv 于 2023-5-12 11:49 编辑

吐槽一下,水机中央空调属于上世纪的产品,而且所有的中央空调的控制都很原始。温控器是装在墙上的暗盒里,首先这个位置的温度和人的体感温度可能会存在很大差异,同时温控器探头还容易受到很多因素的影响,实际结果就是体感21、22度觉得很冷了,面板还是显示24度继续制冷;体感25、26度觉得很热了,面板还显示23度继续停机。

去年夏天尝试接入ha后精确控温,晚上睡觉时控制在24-25度,不盖被子,一个夏天没有感冒,感觉这才尼玛是王道

我试过的温控面板一共有6种,结论是没一个能准确控温。欧瑞博的750元的mix air,看似自带外置温度计可以精确控温了,但实际上那一大坨温度计测温根本不准,并且温度计和温控器直接的通讯还不即时,结果是个然并卵。希到出了个所谓业界首个精确测温的面板(还没上市),温控探头采用断桥铝隔离,然而根本没法考虑安装位置带来的温度漂移,一是面板不在回风风道上的话会有漂移,二是墙面等环境因素带来的温度偏移,估计也是个然并卵。感觉开发产品的这些人根本就没有使用中央空调的经验

试过的温度计有5、6种吧,还是青萍的两个空气检测仪体验最好。以前本来以为是吸入空气检测温度所以准确,最近有个风扇异响,拆开来才发现其实吸入空气只是pm2.5,温度湿度芯片的安装位置和别的温度计并没有什么区别








欢迎光临 『瀚思彼岸』» 智能家居技术论坛 (https://bbs.hassbian.com/) Powered by Discuz! X3.5