Created
December 9, 2025 17:09
-
-
Save georgeh/f86a88949bef8558e44fc0bc5a14e619 to your computer and use it in GitHub Desktop.
Ecobee Fireplace Mode Blueprint
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| blueprint: | |
| name: Ecobee Fireplace Comfort Override | |
| description: > | |
| Keeps an Ecobee thermostat in a custom comfort setting while your fireplace | |
| is heating the room, overriding schedule changes, and resumes the program | |
| once the room cools off. | |
| domain: automation | |
| input: | |
| ecobee_thermostat: | |
| name: Ecobee thermostat | |
| selector: | |
| entity: | |
| domain: climate | |
| thermostat_temp_sensor: | |
| name: Thermostat temperature sensor | |
| description: Sensor near the thermostat used for comparison | |
| selector: | |
| entity: | |
| domain: sensor | |
| device_class: temperature | |
| room_temp_sensor: | |
| name: Room temperature sensor | |
| description: Sensor near the fireplace | |
| selector: | |
| entity: | |
| domain: sensor | |
| device_class: temperature | |
| fireplace_preset: | |
| name: Fireplace comfort setting name | |
| description: Name of the Ecobee comfort setting (e.g. "Fireplace On") | |
| default: Fireplace On | |
| selector: | |
| text: | |
| high_delta: | |
| name: Hot threshold (room - thermostat) | |
| description: > | |
| When the room is at least this many degrees warmer than the thermostat | |
| for the given duration, enter the fireplace comfort mode. | |
| default: 15 | |
| selector: | |
| number: | |
| min: 1 | |
| max: 40 | |
| step: 0.5 | |
| mode: box | |
| low_delta: | |
| name: Cool threshold (room - thermostat) | |
| description: > | |
| When the room is below this difference for the given duration, exit the | |
| fireplace comfort mode and resume the Ecobee program. | |
| default: 10 | |
| selector: | |
| number: | |
| min: 0 | |
| max: 40 | |
| step: 0.5 | |
| mode: box | |
| hot_for: | |
| name: Time hot before entering fireplace mode | |
| default: | |
| hours: 0 | |
| minutes: 5 | |
| seconds: 0 | |
| selector: | |
| duration: | |
| cool_for: | |
| name: Time cool before exiting fireplace mode | |
| default: | |
| hours: 0 | |
| minutes: 5 | |
| seconds: 0 | |
| selector: | |
| duration: | |
| mode: single | |
| triggers: | |
| # 1) Fireplace is clearly heating the room (enter override) | |
| - id: too_hot | |
| trigger: template | |
| value_template: >- | |
| {% set room_str = states(room_temp_sensor) %} | |
| {% set thermo_str = states(thermostat_temp_sensor) %} | |
| {% if room_str not in ['unknown','unavailable',''] and | |
| thermo_str not in ['unknown','unavailable',''] %} | |
| {% set room = room_str | float %} | |
| {% set thermo = thermo_str | float %} | |
| {{ room - thermo >= (high_delta | float) }} | |
| {% else %} | |
| false | |
| {% endif %} | |
| for: !input hot_for | |
| # 2) Room has cooled down enough (exit override) | |
| - id: cooled_off | |
| trigger: template | |
| value_template: >- | |
| {% set room_str = states(room_temp_sensor) %} | |
| {% set thermo_str = states(thermostat_temp_sensor) %} | |
| {% if room_str not in ['unknown','unavailable',''] and | |
| thermo_str not in ['unknown','unavailable',''] %} | |
| {% set room = room_str | float %} | |
| {% set thermo = thermo_str | float %} | |
| {{ room - thermo < (low_delta | float) }} | |
| {% else %} | |
| false | |
| {% endif %} | |
| for: !input cool_for | |
| # 3) Ecobee preset changes (e.g. due to schedule) while fireplace is still hot | |
| - id: preset_changed | |
| trigger: state | |
| entity_id: !input ecobee_thermostat | |
| attribute: preset_mode | |
| conditions: [] | |
| actions: | |
| - choose: | |
| # ENTER fireplace comfort mode | |
| - conditions: | |
| - condition: trigger | |
| id: too_hot | |
| - condition: state | |
| entity_id: !input ecobee_thermostat | |
| state: heat | |
| - condition: template | |
| value_template: >- | |
| {{ state_attr(ecobee_thermostat, 'preset_mode') != fireplace_preset }} | |
| sequence: | |
| - alias: "Set fireplace comfort setting" | |
| action: climate.set_preset_mode | |
| target: | |
| entity_id: !input ecobee_thermostat | |
| data: | |
| preset_mode: !input fireplace_preset | |
| # EXIT fireplace comfort mode | |
| - conditions: | |
| - condition: trigger | |
| id: cooled_off | |
| - condition: state | |
| entity_id: !input ecobee_thermostat | |
| state: heat | |
| - condition: template | |
| value_template: >- | |
| {{ state_attr(ecobee_thermostat, 'preset_mode') == fireplace_preset }} | |
| sequence: | |
| - alias: "Resume normal Ecobee program" | |
| action: ecobee.resume_program | |
| target: | |
| entity_id: !input ecobee_thermostat | |
| # OVERRIDE schedule changes while it's still hot | |
| - conditions: | |
| - condition: trigger | |
| id: preset_changed | |
| - condition: state | |
| entity_id: !input ecobee_thermostat | |
| state: heat | |
| - condition: template | |
| value_template: >- | |
| {% set room_str = states(room_temp_sensor) %} | |
| {% set thermo_str = states(thermostat_temp_sensor) %} | |
| {% if room_str not in ['unknown','unavailable',''] and | |
| thermo_str not in ['unknown','unavailable',''] %} | |
| {% set room = room_str | float %} | |
| {% set thermo = thermo_str | float %} | |
| {{ room - thermo >= (high_delta | float) and | |
| state_attr(ecobee_thermostat, 'preset_mode') != fireplace_preset }} | |
| {% else %} | |
| false | |
| {% endif %} | |
| sequence: | |
| - alias: "Re-assert fireplace comfort setting after schedule change" | |
| action: climate.set_preset_mode | |
| target: | |
| entity_id: !input ecobee_thermostat | |
| data: | |
| preset_mode: !input fireplace_preset |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment