之前零零碎碎的发过几个相关的帖子,更多的是探讨思路。这几天看论坛里好像没有一个完整的描述,干脆整理一下发出来一个完整的可实施的方案,供大家参考。
1. 配置温控器/完成空调接入
这个是用于直接控制空调的,这里称之为A温控器。
比如我用的SmartIR。之前发帖说过,这个插件只是实现了向空调机发出红外指令,并没有控温的作用(控温还是由空调自己完成)。虽然在配置里可以指定一个传感器,但也只用于显示,并不参与温控过程。
之前我说过直接修改smartir代码的方法,显然不是一个好的方案,不够直观,并且每次版本升级都要修改,太麻烦。
2. 配置另一个温控器
这里称之为B温控器,推荐使用HA自带的“Generic Thermostat”,或者不嫌简陋的话就用一个“Input Number”来代替。
这个温控器是用于控制上面那个A温控器的,配置一个传感器(可以用体感温度)。这里传感器将真正发挥作用。
这是我实际使用的两个温控器,左边的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
如果温度传感器更新比较频繁,可能会出现温度设置过高或过低的问题,只需要在后面再增加一行:
这样每次调整之后半小时就不再调整,当然,这个间隔可以随便调。
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温控器的目标温度。
|