仅在有意义的条件下引入夜间凉风的换气降温
夏夜只有满足「室外比室内低至少 3 °C」且「室内 CO₂ 高于 900 ppm」时才自动开卧室窗,并在 05:30 或室外温度升到距室内 1.5 °C 以内时自动关闭。
# HearthNodes recipe 12 - night cooling purge
alias: "Climate - bedroom night purge that earns its keep"
id: hn_climate_night_cooling
description: "Open 12 percent only when outdoor air helps and CO2 needs clearing"
mode: restart
max_exceeded: silent
trigger:
- platform: numeric_state
entity_id: sensor.outdoor_temperature
below: "{{ states('sensor.bedroom_temperature') | float(30) - 3 }}"
for: "00:05:00"
id: cooler_outside
- platform: numeric_state
entity_id: sensor.bedroom_co2
above: 1400
id: co2_spike
- platform: state
entity_id: binary_sensor.rain_detected
to: "on"
id: rain_started
variables:
gap_pct: 12
end_conditions:
- "05:30"
- "rain"
- "delta_t_below_1_5"
- "co2_below_700_for_20min"
condition:
- condition: time
after: "21:00:00"
before: "05:30:00"
- condition: state
entity_id: binary_sensor.bedroom_window_manual_override
state: "off"
- condition: numeric_state
entity_id: sensor.rain_accumulation_15min
below: 0.1
- condition: template
value_template: >-
{{ states('sensor.bedroom_co2') | int(0) > 900
or states('sensor.bedroom_temperature') | float(20) > 24 }}
action:
- choose:
- conditions:
- condition: trigger
id: rain_started
sequence:
- service: cover.set_cover_position
target:
entity_id: cover.bedroom_window_actuator
data:
position: 0
- conditions: []
sequence:
- service: cover.set_cover_position
target:
entity_id: cover.bedroom_window_actuator
data:
position: "{{ gap_pct }}"
- service: fan.turn_on
target:
entity_id: fan.bedroom_supply
data:
percentage: 30
- delay: "00:30:00"
- service: fan.turn_off
target:
entity_id: fan.bedroom_supply
- wait_for_trigger:
- platform: time
at: "05:30:00"
- platform: state
entity_id: binary_sensor.rain_detected
to: "on"
- platform: numeric_state
entity_id: sensor.bedroom_co2
below: 700
for: "00:20:00"
timeout: "08:00:00"
continue_on_timeout: true
- service: cover.set_cover_position
target:
entity_id: cover.bedroom_window_actuator
data:
position: 0
# A 12 cm gap on this casement gives about 34 m3/h. Rain sensor offline -> window
# held shut, MVHR boost instead. Actuator loss while open -> 15 minute watchdog
# cuts the actuator supply, which is the fail-safe direction for a window.
触发器 · numeric_state
sensor.outdoor_temperature
21:00 至 05:30 之间,室外温度比卧室温度低 3 °C 以上。
分步说明
- cover.bedroom_window_actuator把窗户开到 12 %——在这个窗户的几何条件下,12 厘米的缝隙在典型夜间微风下可提供 34 m³/h 的换气量,足以排出 CO₂,又不会在床面形成穿堂风。
set_cover_position · 12 - fan.bedroom_supply低速送风机运行 30 分钟建立气流;它由自己的计时器关闭,而不依赖窗户状态。
turn_on · speed low · 30 min - cover.bedroom_window_actuator在四个独立结束条件中最先满足的那个上关闭,任意一个都意味着换气已不再有益。
set_cover_position · 0 on any of: 05:30, rain, ΔT < 1.5 °C, CO₂ < 700 ppm for 20 min
开 12 %,不要全开
夜里把卧室窗全开,会在人最不能忍受的温度上。算出能给你 30–40 m³/h 的缝隙:对典型 1.2 米平开窗约为 12 厘米。量一次,把百分比写进配方。
除温度外还要以 CO₂ 作为门槛
只看温度,会在凉爽但无需换气的夜晚也开窗,既浪费热量又放进噪声。要求 CO₂ 高于 900 ppm,换气只在确实有污浊空气需要排出时发生。双人卧室在夏季每月约触发 8–10 次。
给它四个独立的关闭方式
时间(05:30)、下雨、温差收敛、CO₂ 回落。任意一条单独成立即可关闭。只有一个关闭条件的自动窗,迟早会在暴雨里开着。
硬件
| 型号 | 协议 | 连接 | 在本链路中的作用 |
|---|---|---|---|
| Chain window actuator (24 V) with a Matter module | matter |
有线 | 24 V 链条式开窗器,采用有线连接,因为电池机型恰恰会在最需要它的那些夜晚需要充电。 |
| Weather station with rain detection | zigbee |
无线 | 同一根立杆提供下雨标记和室外温度,保证两个读数一致。 |
| CO₂ sensor with NDIR measurement | matter |
有线 | 必须用 NDIR,而不是基于 VOC 估算的 eCO₂;用估算值做卧室换气决策,会在不该开窗的时候开窗。 |
失效时怎么办
如果雨量传感器离线,窗户保持关闭,配方回退为开启新风系统强档——效果差一些,但不会让房间进水。如果执行器在开启状态下失联,15 分钟看门狗会切断执行器供电强制关闭,关窗是窗户的安全方向。