blueprint: name: "Smart Thermostat Controller" author: Andreas Gammelgaard Damsbo description: | Smart thermostat automation based on window/door sensors, outside temperature (winter mode), time schedules, and holiday calendar integration. * **Day Temperature is now controlled by a separate Input Number Helper.** domain: automation source_url: https://gdamsbo.dk/forgejo/andreas/ha-smart-thermostat-control/raw/branch/main/ha-smart-thermostat-control.yaml input: thermostat: name: Thermostat description: Select the thermostat(s) to control. selector: entity: domain: - climate multiple: true window_sensor: name: Window / Door Sensor Group description: Select your grouped or single window / door sensor. selector: entity: domain: - binary_sensor multiple: true window_delay: name: Window / Door Sensor Delay description: 'Time the sensor needs to stay the same after change to trigger the automation. (Default = 5s)' default: 5 selector: number: mode: box min: 0.0 max: 600.0 unit_of_measurement: seconds step: 5.0 outdoor: name: Outdoor Temperature Sensor description: Select your outdoor temperature sensor. selector: entity: domain: - sensor multiple: false wintermode: name: Winter Mode Threshold description: 'The outside temperature needs to be below this to activate winter mode. (Default = 16°C)' default: 16 selector: number: step: 1 min: 10.0 max: 25.0 unit_of_measurement: °C or °F mode: slider wintermode_delay: name: Winter Mode Delay description: 'Time the outside temperature needs to stay above the winter mode temperature to turn the heating off.' default: 30 selector: number: mode: box min: 1.0 max: 1440.0 unit_of_measurement: minutes step: 5.0 schedule_helper: name: Schedule Helper description: Select the schedule helper entity to determine day/night heating times. selector: entity: domain: - schedule multiple: false day_temp_helper: name: Day Time Temperature Input Number description: Select an input_number helper that stores the desired Day Time temperature. (Create one in Settings > Devices & Services > Helpers). selector: entity: domain: - input_number multiple: false night_temp: name: Night Time Temperature Target default: 18 selector: number: step: 0.5 min: 10.0 max: 30.0 unit_of_measurement: °C or °F mode: slider away_temp: name: Away Temperature Target description: Temperature when away/on holiday. default: 16 selector: number: step: 0.5 min: 10.0 max: 30.0 unit_of_measurement: °C or °F mode: slider away_calendar: name: Holiday or Away Calendar description: Calendar entity that indicates away/holiday periods. selector: entity: domain: - calendar multiple: false return_offset: name: Return Offset description: 'Time offset to start heating before returning from away. Negative value = minutes before return.' default: -120 selector: number: mode: box min: -1440.0 max: 0.0 unit_of_measurement: minutes step: 30.0 trigger: - platform: state entity_id: !input window_sensor for: seconds: !input window_delay id: window_change - platform: numeric_state entity_id: !input outdoor below: !input wintermode for: minutes: !input wintermode_delay id: cold_weather - platform: numeric_state entity_id: !input outdoor above: !input wintermode for: minutes: !input wintermode_delay id: warm_weather - platform: state entity_id: !input schedule_helper id: schedule_change - platform: state entity_id: !input day_temp_helper # Trigger when the input number changes id: day_temp_change - platform: calendar event: end entity_id: !input away_calendar offset: !input return_offset id: return_soon - platform: calendar event: start entity_id: !input away_calendar id: leaving - platform: homeassistant event: start id: ha_start - platform: event event_type: automation_reloaded id: reload variables: thermostat_entities: !input thermostat triggered_thermostat: "{{ trigger.entity_id | default('none') }}" # Entity ID variables for safe templating in action conditions schedule_helper_id: !input schedule_helper away_calendar_id: !input away_calendar # --- REVISED VARIABLE: Get state value from helper --- day_temp_id: !input day_temp_helper day_temp_input: "{{ states(day_temp_id) | float(1) }}" # --- END REVISED VARIABLE --- night_temp_input: !input night_temp away_temp_input: !input away_temp condition: [] action: - choose: # Priority 1: Windows/Doors Open - Turn OFF heating - conditions: - condition: state entity_id: !input window_sensor state: 'on' match: any sequence: - service: climate.turn_off target: entity_id: !input thermostat - service: logbook.log data: name: Smart Thermostat message: 'Heating OFF: Window or door is open' # Priority 2: Too Warm Outside - Turn OFF heating - conditions: - condition: numeric_state entity_id: !input outdoor above: !input wintermode sequence: - service: climate.turn_off target: entity_id: !input thermostat - service: logbook.log data: name: Smart Thermostat message: 'Heating OFF: Outside temperature above threshold' # Priority 3: Away/Holiday Mode - Set to away temperature - conditions: - condition: state entity_id: !input away_calendar state: 'on' - condition: numeric_state entity_id: !input outdoor below: !input wintermode - condition: state entity_id: !input window_sensor state: 'off' match: all sequence: - service: climate.set_temperature target: entity_id: !input thermostat data: temperature: !input away_temp hvac_mode: heat - service: logbook.log data: name: Smart Thermostat message: 'Away Mode: Heating set to away temperature' # Priority 4: Schedule Day Time - Set to day temperature - conditions: - condition: state entity_id: !input schedule_helper state: 'on' - condition: numeric_state entity_id: !input outdoor below: !input wintermode - condition: state entity_id: !input window_sensor state: 'off' match: all - condition: state entity_id: !input away_calendar state: 'off' sequence: - service: climate.set_temperature target: entity_id: !input thermostat data: # --- REVISED ACTION: Use the variable which holds the helper state --- temperature: "{{ day_temp_input }}" # --- END REVISED ACTION --- hvac_mode: heat - service: logbook.log data: name: Smart Thermostat message: 'Day Mode: Heating set to dynamic day temperature' # Priority 5: Schedule Night Time - Set to night temperature - conditions: - condition: state entity_id: !input schedule_helper state: 'off' - condition: numeric_state entity_id: !input outdoor below: !input wintermode - condition: state entity_id: !input window_sensor state: 'off' match: all - condition: state entity_id: !input away_calendar state: 'off' sequence: - service: climate.set_temperature target: entity_id: !input thermostat data: temperature: !input night_temp hvac_mode: heat - service: logbook.log data: name: Smart Thermostat message: 'Night Mode: Heating set to night temperature' # Default: Turn off if no conditions match default: - service: climate.turn_off target: entity_id: !input thermostat - service: logbook.log data: name: Smart Thermostat message: 'Heating OFF: No active heating conditions met' mode: restart max_exceeded: silent