mirror of
				https://github.com/CCOSTAN/Home-AssistantConfig.git
				synced 2025-10-31 10:46:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			285 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			285 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
| ######################################################################
 | ||
| ##  AC related automations
 | ||
| ##  For more info visit https://www.vcloudinfo.com/click-here
 | ||
| ##  Contact: @CCOSTAN 
 | ||
| ######################################################################
 | ||
| 
 | ||
| input_datetime:
 | ||
|   downstairs_last_filter_change:
 | ||
|     name: Downstairs Last Filter Change
 | ||
|     has_date: true
 | ||
|     has_time: true
 | ||
|   upstairs_last_filter_change:
 | ||
|     name: Upstairs Last Filter Change
 | ||
|     has_date: true
 | ||
|     has_time: true
 | ||
| 
 | ||
| # ---------------------------------------------------------------------------
 | ||
| #  Binary sensors – true when the thermostat reports the compressor is running
 | ||
| # ---------------------------------------------------------------------------
 | ||
| binary_sensor:
 | ||
|   - platform: template
 | ||
|     sensors:
 | ||
|       downstairs_ac_cooling:
 | ||
|         friendly_name: "Downstairs AC is Cooling"
 | ||
|         value_template: >
 | ||
|           {{ state_attr('climate.downstairs', 'hvac_action') == 'cooling' }}
 | ||
|       upstairs_ac_cooling:
 | ||
|         friendly_name: "Upstairs AC is Cooling"
 | ||
|         value_template: >
 | ||
|           {{ state_attr('climate.upstairs', 'hvac_action') == 'cooling' }}
 | ||
| 
 | ||
| sensor:
 | ||
|   - platform: template
 | ||
|     sensors:
 | ||
|       downstairs_ac_cooling_numeric:
 | ||
|         friendly_name: "Downstairs AC Cooling Numeric"
 | ||
|         value_template: "{{ 1 if is_state('binary_sensor.downstairs_ac_cooling', 'on') else 0 }}"
 | ||
|       upstairs_ac_cooling_numeric:
 | ||
|         friendly_name: "Upstairs AC Cooling Numeric "
 | ||
|         value_template: "{{ 1 if is_state('binary_sensor.upstairs_ac_cooling', 'on') else 0 }}"
 | ||
| 
 | ||
|   - platform: integration
 | ||
|     name: Downstairs AC Runtime Raw
 | ||
|     source: sensor.downstairs_ac_cooling_numeric
 | ||
|     unit_time: h
 | ||
|     method: left
 | ||
|     round: 2
 | ||
|   - platform: integration
 | ||
|     name: Upstairs AC Runtime Raw
 | ||
|     source: sensor.upstairs_ac_cooling_numeric
 | ||
|     unit_time: h
 | ||
|     method: left
 | ||
|     round: 2
 | ||
| 
 | ||
| # ---------------------------------------------------------------------------
 | ||
| #  Utility‑meters that act like odometers (reset when you swap the filter)
 | ||
| # ---------------------------------------------------------------------------
 | ||
| utility_meter:
 | ||
|   downstairs_ac_runtime_since_last_filter_change:
 | ||
|     source: sensor.downstairs_ac_runtime_raw
 | ||
|   upstairs_ac_runtime_since_last_filter_change:
 | ||
|     source: sensor.upstairs_ac_runtime_raw
 | ||
|   
 | ||
| script:
 | ||
|   reset_downstairs_filter:
 | ||
|     alias: Reset Downstairs Filter
 | ||
|     mode: queued
 | ||
|     sequence:
 | ||
|       - service: input_datetime.set_datetime
 | ||
|         data:
 | ||
|           entity_id: input_datetime.downstairs_last_filter_change
 | ||
|           datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
 | ||
|       - service: utility_meter.reset
 | ||
|         target:
 | ||
|           entity_id: sensor.downstairs_ac_runtime_since_last_filter_change
 | ||
| 
 | ||
|   reset_upstairs_filter:
 | ||
|     alias: Reset Upstairs Filter
 | ||
|     mode: queued
 | ||
|     sequence:
 | ||
|       - service: input_datetime.set_datetime
 | ||
|         data:
 | ||
|           entity_id: input_datetime.upstairs_last_filter_change
 | ||
|           datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
 | ||
|       - service: utility_meter.reset
 | ||
|         target:
 | ||
|           entity_id: sensor.upstairs_ac_runtime_since_last_filter_change
 | ||
| 
 | ||
| automation:
 | ||
|   - alias: Notify Downstairs Filter Change Due
 | ||
|     description: Notify when downstairs runtime exceeds threshold since last filter change
 | ||
|     trigger:
 | ||
|       - platform: numeric_state
 | ||
|         entity_id: sensor.downstairs_ac_runtime_since_last_filter_change
 | ||
|         above: 800      # hours
 | ||
|     action:
 | ||
|       - service: script.notify_engine        # <-- keep your existing notify helper
 | ||
|         data:
 | ||
|           title: "Home Maintenance Reminder"
 | ||
|           value1: "It's time to change your Downstairs AC filter."
 | ||
|           value2: >
 | ||
|             Runtime has exceeded 800 h. Last changed {{ ((now() - states.input_datetime.downstairs_last_filter_change.last_changed).total_seconds() / 86400) | round(0) }} days ago.
 | ||
|           who: "Carlo"
 | ||
|           group: "maintenance"
 | ||
|           level: "active"
 | ||
| 
 | ||
|   - alias: Notify Upstairs Filter Change Due
 | ||
|     description: Notify when upstairs runtime exceeds threshold since last filter change
 | ||
|     trigger:
 | ||
|       - platform: numeric_state
 | ||
|         entity_id: sensor.upstairs_ac_runtime_since_last_filter_change
 | ||
|         above: 450      # hours
 | ||
|     action:
 | ||
|       - service: script.notify_engine
 | ||
|         data:
 | ||
|           title: "Home Maintenance Reminder"
 | ||
|           value1: "It's time to change your Upstairs AC filter."
 | ||
|           value2: >
 | ||
|             Runtime has exceeded 450 h. Last changed {{ ((now() - states.input_datetime.upstairs_last_filter_change.last_changed).total_seconds() / 86400) | round(0) }} days ago.
 | ||
|           who: "Carlo"
 | ||
|           group: "maintenance"
 | ||
| 
 | ||
|   - alias: 'AC Status Announcement'
 | ||
|     id: 7812fdaf-a3f8-498b-8f07-28e977e528fe
 | ||
|     trigger:
 | ||
|       - platform: state
 | ||
|         entity_id:
 | ||
|           - climate.downstairs
 | ||
|           - climate.upstairs
 | ||
|         from: 'off'
 | ||
|       - platform: state
 | ||
|         entity_id:
 | ||
|           - climate.downstairs
 | ||
|           - climate.upstairs
 | ||
|         to: 'off'
 | ||
|     action:
 | ||
|       - service: script.speech_engine
 | ||
|         data:
 | ||
|           NestStatus: "The {{ trigger.entity_id.split('.')[1].split('_')[0]}} {{ trigger.entity_id.split('.')[1].split('_')[1]}} has now been turned on for {{(trigger.to_state.state)}}."
 | ||
|           call_window_check: 1
 | ||
|   
 | ||
|   - alias: Prevent Upstairs Nest Below 76
 | ||
|     id: 7812fdaf-a3f8-498b-8f07-28e977e528ff
 | ||
|     trigger:
 | ||
|       - platform: numeric_state
 | ||
|         entity_id: climate.upstairs
 | ||
|         attribute: temperature
 | ||
|         below: 76
 | ||
|     action:
 | ||
|       - delay: "00:03:00"
 | ||
|       - service: climate.set_temperature
 | ||
|         data:
 | ||
|           entity_id: climate.upstairs
 | ||
|           temperature: 77
 | ||
| 
 | ||
|   - alias: Set Downstairs Nest to 76 When both in bed
 | ||
|     id: set_downstairs_nest_76_both_in_bed
 | ||
|     trigger:
 | ||
|       - platform: numeric_state
 | ||
|         entity_id: climate.downstairs
 | ||
|         attribute: temperature
 | ||
|         above: 76
 | ||
|       - platform: state
 | ||
|         entity_id: group.bed
 | ||
|         to: 'on'
 | ||
|     condition:
 | ||
|       - condition: and
 | ||
|         conditions:
 | ||
|           - condition: state
 | ||
|             entity_id: binary_sensor.sleepnumber_carlo_carlo_is_in_bed
 | ||
|             state: 'on'
 | ||
|           - condition: state
 | ||
|             entity_id: binary_sensor.sleepnumber_carlo_stacey_is_in_bed
 | ||
|             state: 'on'
 | ||
|       - condition: numeric_state
 | ||
|         entity_id: climate.downstairs
 | ||
|         attribute: temperature
 | ||
|         above: 76
 | ||
|       - condition: numeric_state
 | ||
|         entity_id: sensor.pirateweather_temperature
 | ||
|         above: 88
 | ||
|       - condition: state
 | ||
|         entity_id: sun.sun
 | ||
|         state: 'below_horizon'
 | ||
|     action:
 | ||
|       - service: climate.set_temperature
 | ||
|         data:
 | ||
|           entity_id: climate.downstairs
 | ||
|           temperature: 76
 | ||
|   - alias: 'Set Downstairs Thermostat to 80 During Daylight'
 | ||
|     id: set_downstairs_thermostat_80_daylight
 | ||
|     mode: single
 | ||
|     trigger:
 | ||
|       - platform: state
 | ||
|         entity_id: sun.sun
 | ||
|         to: 'above_horizon'
 | ||
|       - platform: numeric_state
 | ||
|         entity_id: climate.downstairs
 | ||
|         attribute: temperature
 | ||
|         below: 79
 | ||
|     condition:
 | ||
|       - condition: state
 | ||
|         entity_id: sun.sun
 | ||
|         state: 'above_horizon'
 | ||
|       - condition: template
 | ||
|         value_template: "{{ state_attr('climate.downstairs', 'temperature') < 79 }}"
 | ||
|       - condition: state
 | ||
|         entity_id: input_boolean.guest_mode
 | ||
|         state: 'off'
 | ||
|       - condition: numeric_state
 | ||
|         entity_id: sensor.pirateweather_temperature
 | ||
|         above: 80
 | ||
|     action:
 | ||
|       - service: climate.set_temperature
 | ||
|         data:
 | ||
|           entity_id: climate.downstairs
 | ||
|           temperature: 80
 | ||
|           
 | ||
| # Set thermostats to eco mode when everyone is away
 | ||
|   - alias: 'Set Thermostats to Eco When Away'
 | ||
|     id: 1e2d3c4b-eco-thermostat-away
 | ||
|     mode: single
 | ||
|     trigger:
 | ||
|       - platform: state
 | ||
|         entity_id: group.family
 | ||
|         to: 'not_home'
 | ||
|     condition:
 | ||
|       - condition: state
 | ||
|         entity_id: group.family
 | ||
|         state: 'not_home'
 | ||
|       - condition: state
 | ||
|         entity_id: input_boolean.guest_mode
 | ||
|         state: 'off'
 | ||
|     action:
 | ||
|       - service: climate.set_preset_mode
 | ||
|         data:
 | ||
|           entity_id:
 | ||
|             - climate.downstairs
 | ||
|             - climate.upstairs
 | ||
|           preset_mode: 'eco'
 | ||
| 
 | ||
|   # Automation: Set Thermostats Back to Cool Mode
 | ||
|   - alias: 'Set Thermostats to Cool When Home'
 | ||
|     id: 1e2d3c4b-cool-thermostat-home
 | ||
|     mode: single
 | ||
|     trigger:
 | ||
|       - platform: state
 | ||
|         entity_id: group.family
 | ||
|         to: 'home'
 | ||
|       - platform: state
 | ||
|         entity_id: person.justin
 | ||
|         to: 'home'
 | ||
|     condition:
 | ||
|       - condition: or
 | ||
|         conditions:
 | ||
|           - condition: state
 | ||
|             entity_id: group.family
 | ||
|             state: 'home'
 | ||
|           - condition: state
 | ||
|             entity_id: person.justin
 | ||
|             state: 'home'
 | ||
|       - condition: state
 | ||
|         entity_id: input_boolean.guest_mode
 | ||
|         state: 'off'
 | ||
|     action:
 | ||
|       - choose:
 | ||
|           - conditions:
 | ||
|               - condition: state
 | ||
|                 entity_id: group.family
 | ||
|                 state: 'home'
 | ||
|             sequence:
 | ||
|               - service: climate.set_preset_mode
 | ||
|                 data:
 | ||
|                   entity_id: climate.downstairs
 | ||
|                   preset_mode: 'none'
 | ||
|           - conditions:
 | ||
|               - condition: state
 | ||
|                 entity_id: person.justin
 | ||
|                 state: 'home'
 | ||
|             sequence:
 | ||
|               - service: climate.set_preset_mode
 | ||
|                 data:
 | ||
|                   entity_id: climate.upstairs
 | ||
|                   preset_mode: 'none'
 |