blueprint: name: Open Windows/Doors Weather & Temperature Notification description: Notify when windows or doors are open during bad weather or extreme temperatures, with a customizable message. domain: automation input: openings: name: Windows & Doors description: Select windows and doors to monitor selector: entity: multiple: true temperature_sensor: name: Temperature Sensor description: Select a sensor or forecast entity for temperature selector: entity: filter: domain: - sensor - weather device_class: - temperature temperature_cold_threshold: name: Cold Temperature Threshold description: Notify if temperature drops below this value default: 15 selector: number: min: -50 max: 50 unit_of_measurement: °C temperature_hot_threshold: name: Hot Temperature Threshold description: Notify if temperature rises above this value default: 28 selector: number: min: -50 max: 50 unit_of_measurement: °C weather_entity: name: Weather Forecast Entity description: Select a weather forecast entity for bad weather detection selector: entity: domain: weather bad_weather_states: name: Bad Weather States description: List of weather states that should trigger a notification default: - storm - rain selector: text: multiline: true notify_target: name: Notification Target description: Who to notify selector: target: {} min_open_time: name: Minimum Open Time description: Duration in minutes before notifying default: 20 selector: number: min: 1 max: 120 unit_of_measurement: minutes custom_message: name: Custom Notification Message description: Use {{ entity_name }}, {{ temperature }}, and {{ condition }} as placeholders default: "{{ entity_name }} is open! Condition: {{ condition }}, Current temperature: {{ temperature }}°C" selector: text: {} trigger: - platform: state entity_id: !input openings to: 'on' for: minutes: !input min_open_time action: - variables: # Safely extract temperature from sensor or weather entity current_temp: > {% if state_attr(!input.temperature_sensor, 'temperature') is not none %} {{ state_attr(!input.temperature_sensor, 'temperature') | float }} {% else %} {{ states(!input.temperature_sensor) | map(attribute='state') | map('float', default=0) | min }} {% endif %} # Determine current condition based on thresholds and bad weather current_condition: > {% set states_list = !input.bad_weather_states.split(',') | map('trim') %} {% if current_temp < !input.temperature_cold_threshold %} too cold {% elif current_temp > !input.temperature_hot_threshold %} too hot {% elif states(!input.weather_entity) | string in states_list %} bad weather {% else %} unknown {% endif %} - service: notify.notify data: target: "{{ !input.notify_target }}" message: > {% if state_attr(trigger.entity_id, 'device_class') in ['window','door'] %} {{ !input.custom_message | replace('{{ entity_name }}', state_attr(trigger.entity_id,'friendly_name')) | replace('{{ temperature }}', current_temp | string) | replace('{{ condition }}', current_condition) }} {% endif %}