This blueprint provides a fully automated, context‑aware HVAC controller for homes using Ecobee (or any compatible) thermostats. It intelligently adjusts heating, cooling, and temperature setpoints based on weather, occupancy, time of day, and bedtime mode, with special logic for extreme hot and extreme cold conditions.
Features
- Automatically switches between heat, cool, and heat_cool modes
- Adjusts temperatures based on:
- Weather category (winter, summer, mild, extremehot, extremecold)
- Home occupancy (home vs. away)
- Bedtime mode
- Morning warm‑up window
- Daytime seasonal logic
- Sends detailed notifications for every HVAC event
- Supports two thermostats (upstairs + downstairs)
- Runs every 15 minutes and on key state changes
- Replaces or enhances Ecobee’s built‑in scheduling with smarter logic
Requirements
To use this blueprint, you’ll need the following entities:
- Two Climate Entities (Ecobee or compatible)
- Upstairs thermostat
- Downstairs thermostat
Must support:
- climate.sethvacmode
- climate.set_temperature
- Heat, cool, and heat_cool modes
- Weather Condition Sensor
A sensor whose state represents a weather category:
- winter
- summer
- mild
- extreme_hot
- extreme_cold
And includes a temperature attribute.
This can be:
- A template sensor
- A weather integration
- A custom classification sensor
- Occupancy Zone
A zone.home entity that indicates:
- 0 = away
- !0 = someone home
- Bedtime Boolean
An input_boolean that toggles bedtime mode:
- on = bedtime
- off = daytime
- Notification Service
Any notification service (e.g., Telegram, Signal, Discord, Matrix, mobile app).
You will provide:
- The service name (e.g., notify.chat_hass)
- The target (chat ID, device, or group)
How It Works
The automation reacts to:
- Weather changes
- Occupancy changes
- Bedtime toggles
- A 15‑minute time pattern
It then applies the appropriate HVAC logic:
Extreme Weather
- Forces heat or cool mode
- Uses aggressive setpoints
- Sends an alert
Bedtime Mode
- Applies fixed nighttime temperatures
- Chooses heat or cool based on season
- Overrides other logic
Morning Warm‑Up (05:30–07:30)
- Warms the house before wake‑up
- Uses consistent morning setpoints
Daytime Logic
- Seasonal behavior (winter/summer/mild)
- Occupancy‑aware setpoints
- Heat/cool mode with ranges during mild weather
Every action includes a detailed notification so you always know why the system changed modes or temperatures.
Ideal For
- Users who want full HVAC automation
- Homes with multiple thermostats
- Anyone in climates with large seasonal swings
- People who want occupancy‑aware and weather‑aware temperature control
Blueprint YAML
blueprint:
name: Dynamic Ecobee Thermostat Adjustment with Extreme Weather Conditions
description: >
Adjust Ecobee thermostats dynamically based on weather, occupancy, bedtime,
and time of day. Includes extreme weather handling.
domain: automation
input:
weather_sensor:
name: Weather Condition Sensor
description: Sensor providing weather category + temperature attribute
selector:
entity:
domain: sensor
occupancy_zone:
name: Home Occupancy Zone
description: Zone entity that indicates if anyone is home
selector:
entity:
domain: zone
bedtime_boolean:
name: Bedtime Boolean
description: Input boolean that indicates bedtime mode
selector:
entity:
domain: input_boolean
upstairs_thermostat:
name: Upstairs Thermostat
selector:
entity:
domain: climate
downstairs_thermostat:
name: Downstairs Thermostat
selector:
entity:
domain: climate
notify_target:
name: Notification Target
description: Chat ID or notification target
selector:
text:
notify_service:
name: Notification Service
description: e.g., notify.chat_hass
selector:
text:
mode: single
variables:
thermostats:
- !input upstairs_thermostat
- !input downstairs_thermostat
trigger:
- platform: state
entity_id: !input weather_sensor
attribute: temperature
for: "00:15:00"
- platform: state
entity_id: !input occupancy_zone
- platform: time_pattern
minutes: "/15"
- platform: state
entity_id: !input bedtime_boolean
condition: []
action:
- choose:
# EXTREME COLD (Bedtime OFF)
- conditions:
- condition: state
entity_id: !input weather_sensor
state: extreme_cold
- condition: state
entity_id: !input bedtime_boolean
state: "off"
sequence:
- service: !input notify_service
data:
target: [!input notify_target]
message: >
🚨 HVAC Event: Heat turned on due to Extreme Cold!
Weather: {{ states(input.weather_sensor) }}
Bedtime: {{ states(input.bedtime_boolean) }}
Upstairs Setpoint: {{ 72 if states(input.occupancy_zone)|int > 0 else 60 }}°F
Downstairs Setpoint: {{ 74 if states(input.occupancy_zone)|int > 0 else 60 }}°F
- service: climate.set_hvac_mode
target:
entity_id: "{{ thermostats }}"
data:
hvac_mode: heat
- service: climate.set_temperature
target:
entity_id: !input upstairs_thermostat
data:
temperature: "{{ 71 if states(input.occupancy_zone)|int > 0 else 60 }}"
- service: climate.set_temperature
target:
entity_id: !input downstairs_thermostat
data:
temperature: "{{ 72 if states(input.occupancy_zone)|int > 0 else 60 }}"
# EXTREME HOT (Bedtime OFF)
- conditions:
- condition: state
entity_id: !input weather_sensor
state: extreme_hot
- condition: state
entity_id: !input bedtime_boolean
state: "off"
sequence:
- service: !input notify_service
data:
target: [!input notify_target]
message: >
❄️ HVAC Event: Cool turned on due to Extreme Hot!
Weather: {{ states(input.weather_sensor) }}
Bedtime: {{ states(input.bedtime_boolean) }}
Upstairs Setpoint: {{ 71 if states(input.occupancy_zone)|int > 0 else 78 }}°F
Downstairs Setpoint: {{ 72 if states(input.occupancy_zone)|int > 0 else 78 }}°F
- service: climate.set_hvac_mode
target:
entity_id: "{{ thermostats }}"
data:
hvac_mode: cool
- service: climate.set_temperature
target:
entity_id: !input upstairs_thermostat
data:
temperature: "{{ 71 if states(input.occupancy_zone)|int > 0 else 78 }}"
- service: climate.set_temperature
target:
entity_id: !input downstairs_thermostat
data:
temperature: "{{ 72 if states(input.occupancy_zone)|int > 0 else 78 }}"
# BEDTIME MODE ON
- conditions:
- condition: state
entity_id: !input bedtime_boolean
state: "on"
sequence:
- choose:
# WINTER
- conditions:
- condition: state
entity_id: !input weather_sensor
state: winter
sequence:
- service: !input notify_service
data:
target: [!input notify_target]
message: >
🌙 Bedtime HVAC Event: Heat turned on (Winter)!
Upstairs Setpoint: 67°F
Downstairs Setpoint: 69°F
- service: climate.set_hvac_mode
target:
entity_id: "{{ thermostats }}"
data:
hvac_mode: heat
# EXTREME COLD
- conditions:
- condition: state
entity_id: !input weather_sensor
state: extreme_cold
sequence:
- service: !input notify_service
data:
target: [!input notify_target]
message: >
🌙 Bedtime HVAC Event: Heat turned on (Extreme Cold)!
Upstairs Setpoint: 67°F
Downstairs Setpoint: 69°F
- service: climate.set_hvac_mode
target:
entity_id: "{{ thermostats }}"
data:
hvac_mode: heat
# SUMMER
- conditions:
- condition: state
entity_id: !input weather_sensor
state: summer
sequence:
- service: !input notify_service
data:
target: [!input notify_target]
message: >
🌙 Bedtime HVAC Event: Cool turned on (Summer)!
Upstairs Setpoint: 67°F
Downstairs Setpoint: 69°F
- service: climate.set_hvac_mode
target:
entity_id: "{{ thermostats }}"
data:
hvac_mode: cool
# EXTREME HOT
- conditions:
- condition: state
entity_id: !input weather_sensor
state: extreme_hot
sequence:
- service: !input notify_service
data:
target: [!input notify_target]
message: >
🌙 Bedtime HVAC Event: Cool turned on (Extreme Hot)!
Upstairs Setpoint: 67°F
Downstairs Setpoint: 69°F
- service: climate.set_hvac_mode
target:
entity_id: "{{ thermostats }}"
data:
hvac_mode: cool
# MILD
- conditions:
- condition: state
entity_id: !input weather_sensor
state: mild
sequence:
- service: !input notify_service
data:
target: [!input notify_target]
message: >
🌙 Bedtime HVAC Event: Cool turned on (Mild Weather)!
Upstairs Setpoint: 67°F
Downstairs Setpoint: 69°F
- service: climate.set_hvac_mode
target:
entity_id: "{{ thermostats }}"
data:
hvac_mode: cool
- service: climate.set_temperature
target:
entity_id: !input upstairs_thermostat
data:
temperature: 67
- service: climate.set_temperature
target:
entity_id: !input downstairs_thermostat
data:
temperature: 69
# Final bedtime override
- service: climate.set_temperature
target:
entity_id: !input upstairs_thermostat
data:
temperature: 65
- service: climate.set_temperature
target:
entity_id: !input downstairs_thermostat
data:
temperature: 69
# MORNING WAKE-UP
- conditions:
- condition: time
after: "05:30:00"
before: "07:30:00"
- condition: state
entity_id: !input bedtime_boolean
state: "off"
sequence:
- service: !input notify_service
data:
target: [!input notify_target]
message: |
☀️ Morning Wake-up Event: Thermostat temperatures adjusted.
Upstairs Setpoint: 70°F
Downstairs Setpoint: 72°F
- service: climate.set_hvac_mode
target:
entity_id: "{{ thermostats }}"
data:
hvac_mode: heat
- service: climate.set_temperature
target:
entity_id: !input upstairs_thermostat
data:
temperature: 70
- service: climate.set_temperature
target:
entity_id: !input downstairs_thermostat
data:
temperature: 72
# DAYTIME LOGIC (Outside Morning Window)
- conditions:
- condition: or
conditions:
- condition: time
before: "05:30:00"
- condition: time
after: "07:30:00"
- condition: state
entity_id: !input bedtime_boolean
state: "off"
sequence:
- choose:
# WINTER
- conditions:
- condition: state
entity_id: !input weather_sensor
state: winter
sequence:
- service: !input notify_service
data:
target: [!input notify_target]
message: >
🏠 HVAC Event (Day): Heat turned on (Winter)!
Upstairs Setpoint: {{ 68 if states(input.occupancy_zone)|int > 0 else 64 }}°F
Downstairs Setpoint: {{ 70 if states(input.occupancy_zone)|int > 0 else 62 }}°F
- service: climate.set_hvac_mode
target:
entity_id: "{{ thermostats }}"
data:
hvac_mode: heat
- service: climate.set_temperature
target:
entity_id: !input upstairs_thermostat
data:
temperature: "{{ 70 if states(input.occupancy_zone)|int > 0 else 64 }}"
- service: climate.set_temperature
target:
entity_id: !input downstairs_thermostat
data:
temperature: "{{ 71 if states(input.occupancy_zone)|int > 0 else 64 }}"
# SUMMER
- conditions:
- condition: state
entity_id: !input weather_sensor
state: summer
sequence:
- service: !input notify_service
data:
target: [!input notify_target]
message: >
🏠 HVAC Event (Day): Cool turned on (Summer)!
Upstairs Setpoint: {{ 72 if states(input.occupancy_zone)|int > 0 else 77 }}°F
Downstairs Setpoint: {{ 73 if states(input.occupancy_zone)|int > 0 else 78 }}°F
- service: climate.set_hvac_mode
target:
entity_id: "{{ thermostats }}"
data:
hvac_mode: cool
- service: climate.set_temperature
target:
entity_id: !input upstairs_thermostat
data:
temperature: "{{ 73 if states(input.occupancy_zone)|int > 0 else 77 }}"
- service: climate.set_temperature
target:
entity_id: !input downstairs_thermostat
data:
temperature: "{{ 74 if states(input.occupancy_zone)|int > 0 else 78 }}"
# MILD
- conditions:
- condition: state
entity_id: !input weather_sensor
state: mild
sequence:
- service: !input notify_service
data:
target: [!input notify_target]
message: >
🏡 HVAC Event (Day): Heat/Cool mode enabled (Mild Weather)!
Upstairs Range: {{ 68 if states(input.occupancy_zone)|int > 0 else 64 }}°F - {{ 74 if states(input.occupancy_zone)|int > 0 else 78 }}°F
Downstairs Range: {{ 67 if states(input.occupancy_zone)|int > 0 else 62 }}°F - {{ 73 if states(input.occupancy_zone)|int > 0 else 77 }}°F
- service: climate.set_hvac_mode
target:
entity_id: "{{ thermostats }}"
data:
hvac_mode: heat_cool
- service: climate.set_temperature
target:
entity_id: !input upstairs_thermostat
data:
target_temp_high: "{{ 73 if states(input.occupancy_zone)|int > 0 else 78 }}"
target_temp_low: "{{ 67 if states(input.occupancy_zone)|int > 0 else 64 }}"
- service: climate.set_temperature
target:
entity_id: !input downstairs_thermostat
data:
target_temp_high: "{{ 74 if states(input.occupancy_zone)|int > 0 else 77 }}"
target_temp_low: "{{ 68 if states(input.occupancy_zone)|int > 0 else 62 }}"