blueprint:
  name: "SNO_Window-Watch (v0.1.0)"
  description: >
    <img src="https://sno.mb222.de/!git/snologo.png" width="150" align="right" alt="SNO Logo">
    
    <h2>SNO_Window-Watch - Intelligente Raum-Heizungssteuerung</h2>
    <p>Dieses Blueprint überwacht mehrere Fenster und Türen in einem Raum. Sobald ein Fenster geöffnet wird (und eine einstellbare Verzögerung abgelaufen ist), merkt sich das System den aktuellen Zustand der Heizung und senkt diese ab oder schaltet sie aus. Sobald <b>alle</b> Fenster wieder geschlossen sind, wird der exakte vorherige Zustand der Heizung automatisch wiederhergestellt.</p>
    
    <h3>Schritt-für-Schritt Anleitung:</h3>
    <ol>
      <li><b>Hauptschalter (Optional):</b> Wähle einen Hauptschalter, um die Automatisierung bei Bedarf komplett zu pausieren.</li>
      <li><b>Fenster wählen:</b> Wähle alle Fenster-/Tür-Sensoren aus, die zu diesem Raum gehören.</li>
      <li><b>Heizkörper wählen:</b> Wähle die Thermostate dieses Raumes aus.</li>
      <li><b>Aktion definieren:</b> Wähle, ob die Heizung komplett ausgeschaltet oder auf eine Absenktemperatur (via Entität oder Schieberegler) wechseln soll.</li>
      <li><b>Verzögerung einstellen:</b> Definiere die Karenzzeit vor der Auslösung.</li>
    </ol>
    
    <hr>
    <p><b>Hilfreiche Links:</b></p>
    <ul>
      <li><a href="https://sno.mb222.de/ww-faq/" target="_blank">📚 Dokumentation & Hilfe</a></li>
      <li><a href="https://github.com/SyncNetOps/HA-Blueprint_SNO_Window-Watch/issues" target="_blank">🐛 Fehler melden (GitHub Issues)</a></li>
    </ul>
    <br>
    <p><small>Ein Blueprint von <a href="https://github.com/SyncNetOps" target="_blank">SyncNetOps</a></small></p>
  domain: automation
  
  input:
    main_switch:
      name: ⚙️ Hauptschalter (Optional)
      description: "Wähle hier einen Schalter (z.B. einen input_boolean Helfer), um die Fenster-Auf-Absenkung global ein- oder auszuschalten. Bleibt dieses Feld leer, ist die Überwachung immer aktiv."
      default: ""
      selector:
        entity:
          domain:
            - input_boolean
            - switch
            
    window_sensors:
      name: 🪟 Fenster & Türen (Sensoren)
      description: "Wähle hier alle Fenster und Türen aus, die in diesem Raum überwacht werden sollen. (Mehrfachauswahl möglich)."
      selector:
        entity:
          domain: binary_sensor
          device_class:
            - window
            - door
          multiple: true
          
    climate_targets:
      name: 🌡️ Heizkörper & Thermostate
      description: "Wähle alle Heizungs-Entitäten aus, die in diesem Raum gesteuert werden sollen. (Mehrfachauswahl möglich)."
      selector:
        entity:
          domain: climate
          multiple: true
          
    delay_time:
      name: ⏱️ Verzögerung vor Aktion (Sekunden)
      description: "Wie lange muss ein Fenster durchgehend geöffnet sein, bevor die Heizung reagiert? (Schont die Thermostat-Batterien)."
      default: 30
      selector:
        number:
          min: 0
          max: 600
          unit_of_measurement: 's'
          mode: slider
          
    action_mode:
      name: 🛠️ Aktion bei geöffnetem Fenster
      description: "Was soll mit den Thermostaten passieren, wenn ein Fenster geöffnet ist?"
      default: 'off'
      selector:
        select:
          options:
            - label: "Heizung komplett ausschalten (Off)"
              value: "off"
            - label: "Auf eine bestimmte Absenktemperatur wechseln"
              value: "eco"
              
    eco_temp_entity:
      name: 📉 Dynamische Absenktemperatur (Entität - Optional)
      description: "Wähle optional einen Sensor oder Helfer (z.B. input_number), der die Temperatur dynamisch vorgibt. Ist hier etwas ausgewählt, wird der Schieberegler unten ignoriert!"
      default: ""
      selector:
        entity:
          domain:
            - input_number
            - sensor
            - number
            
    eco_temp:
      name: 📉 Statische Absenktemperatur (°C)
      description: "Diese Temperatur wird eingestellt, falls oben KEINE Entität ausgewählt wurde."
      default: 12.0
      selector:
        number:
          min: 5.0
          max: 20.0
          step: 0.5
          unit_of_measurement: '°C'
          mode: slider

variables:
  climate_entities: !input climate_targets
  window_entities: !input window_sensors
  action_mode: !input action_mode
  eco_temp_static: !input eco_temp
  eco_temp_entity: !input eco_temp_entity
  main_switch: !input main_switch
  
  # Logik für die Ziel-Temperatur: Wenn eine Entität definiert ist und gültige Werte liefert, nimm diesen. Ansonsten den Schieberegler.
  target_eco_temp: >
    {% if eco_temp_entity != none and eco_temp_entity != '' and states(eco_temp_entity) not in ['unknown', 'unavailable'] %}
      {{ states(eco_temp_entity) | float(eco_temp_static) }}
    {% else %}
      {{ eco_temp_static }}
    {% endif %}

trigger:
  - platform: state
    entity_id: !input window_sensors
    to: 'on'
    for:
      seconds: !input delay_time

condition:
  # Prüfen, ob der Hauptschalter definiert wurde. Wenn ja, muss er 'on' sein. Wenn das Feld leer ist, wird die Bedingung als "wahr" gewertet.
  - condition: template
    value_template: >
      {{ main_switch == none or main_switch == '' or states(main_switch) == 'on' }}

action:
  # 1. Vorherigen Status aller gewählten Heizungen als Szene speichern
  - service: scene.create
    data:
      scene_id: "sno_window_watch_{{ this.entity_id | replace('.', '_') }}"
      snapshot_entities: "{{ climate_entities }}"
      
  # 2. Gewählte Aktion ausführen (Ausschalten ODER Absenken)
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ action_mode == 'off' }}"
        sequence:
          - service: climate.set_hvac_mode
            target:
              entity_id: "{{ climate_entities }}"
            data:
              hvac_mode: 'off'
      - conditions:
          - condition: template
            value_template: "{{ action_mode == 'eco' }}"
        sequence:
          - service: climate.set_temperature
            target:
              entity_id: "{{ climate_entities }}"
            data:
              temperature: "{{ target_eco_temp }}"
              
  # 3. Warten, bis ALLE ausgewählten Fenster wieder geschlossen ('off') sind
  - wait_for_trigger:
      - platform: template
        value_template: "{{ expand(window_entities) | selectattr('state', 'eq', 'on') | list | length == 0 }}"
    continue_on_timeout: false
    
  # 4. Den zuvor gespeicherten Status exakt wiederherstellen
  - service: scene.turn_on
    target:
      entity_id: "scene.sno_window_watch_{{ this.entity_id | replace('.', '_') }}"

# mode: single garantiert, dass beim Öffnen eines zweiten Fensters die Automation nicht von vorne beginnt und den bereits abgesenkten Status überschreibt.
mode: single
max_exceeded: silent
