Fenster & Türen im Blick.
Smarte Schaltzentrale.
Windows & Doors in focus.
Smart Control Center.
SNO WindowState ist eine hochprofessionelle, fehlertolerante Schaltzentrale für dein Smart Home. Sie überwacht alle Fenster und Türen, generiert formatierten Text für dein Dashboard, liefert globale Steuerungssignale und warnt dich proaktiv sowie absolut spamfrei vor Regen bei offenen Fenstern. SNO WindowState is a highly professional, fault-tolerant control center for your Smart Home. It monitors all windows and doors, generates formatted text for your dashboard, provides global control signals, and proactively warns you absolutely spam-free about rain if windows are open.
✨ Hauptfunktionen✨ Main Features
Dashboard-ReadyDashboard-Ready
Generiert automatisch formatierte, saubere Listen (inklusive Emojis) deiner offenen Fenster für `input_text` Helfer, perfekt abgestimmt für unsere Dark/Glass UI-Karten.Automatically generates formatted, clean lists (including emojis) of your open windows for `input_text` helpers, perfectly tuned for our Dark/Glass UI cards.
Smarte & Hybride RegenwarnungSmart & Hybrid Rain Warning
Erkennt Wetteränderungen automatisch und integriert selbst definierte Regenzustände. Sendet zuverlässig Push-Nachrichten an bis zu 3 Smartphones.Automatically detects weather changes and integrates self-defined rain states. Reliably sends push messages to up to 3 smartphones.
Integrierter Anti-Spam-FilterIntegrated Anti-Spam Filter
Verhindert störende Push-Dauerfeuer. Alarmiert nur dann, wenn das Wetter exakt in diesem Moment auf Regen umschlägt ODER ein Fenster bei bestehendem Regen frisch geöffnet wird.Prevents annoying push spam. Only alerts when the weather switches to rain at that exact moment OR a window is freshly opened while it is already raining.
Sperrsignale & BlockerBlocker Signals & Status
Stellt globale Signale (`input_boolean`) bereit, um z. B. die Markise bei Regen einzufahren, die Heizung beim Lüften zu drosseln oder das Scharfschalten einer Alarmanlage zu verhindern.Provides global signals (`input_boolean`) to retract the awning when it rains, reduce heating while airing, or prevent the alarm system from arming.
📘 Benutzerhandbuch: SNO WindowState (v0.3.0)📘 User Manual: SNO WindowState (v0.3.0)
Herzlich willkommen! Diese Anleitung führt dich Schritt für Schritt durch die Installation und erweiterte Konfiguration der SNO WindowState Schaltzentrale. Auch wenn du Home Assistant Anfänger bist, wirst du am Ende eine perfekt laufende, hochkomplexe Automatisierung besitzen.Welcome! This guide takes you step-by-step through the installation and advanced setup of the SNO WindowState control center. Even if you are a Home Assistant beginner, you will have a perfectly running, highly complex automation at the end.
🛠️ Schritt 1: Vorbereitung (Die 9 Helfer anlegen)🛠️ Step 1: Preparation (Create the 9 Helpers)
Ein Blueprint (die Schaltzentrale) arbeitet im Hintergrund. Damit du die Informationen auf deinem Dashboard sehen oder in anderen Automatisierungen nutzen kannst, müssen wir "Speicherorte" erstellen. Diese nennt man Helfer. Gehe in Home Assistant auf Einstellungen ➔ Geräte & Dienste ➔ Helfer und klicke unten rechts auf + Helfer erstellen. A blueprint works in the background. For you to see the information on your dashboard or use it in other automations, we need to create "storage locations". These are called helpers. Go to Home Assistant under Settings ➔ Devices & Services ➔ Helpers and click + Create Helper in the bottom right.
⚠️ ABSOLUT WICHTIG⚠️ ABSOLUTELY IMPORTANT
Klicke nach dem Erstellen auf das Zahnrad-Symbol jedes Text-Helfers und setze die "Maximale Länge" zwingend auf 255!After creation, click on the gear icon of each text helper and strictly set the "Maximum length" to 255!
📝 Text-Helfer (Typ: "Text" / `input_text`)📝 Text Helpers (Type: "Text" / `input_text`)
Erstelle diese vier Helfer:Create these four helpers:
fenster_offen_anzahlfenster_offen_kritischfenster_infoturen_offen_name
🔘 Schalter-Helfer (Typ: "Schalter" / `input_boolean`)🔘 Toggle Helpers (Type: "Toggle" / `input_boolean`)
Erstelle diese fünf Schalter. Sie dienen als Statussignale für dein Dashboard und andere Automationen:Create these five switches. They serve as status signals for your dashboard and other automations:
warnung_schalter_kritisch_fenster_turen_offenwarnung_schalter_gesamt_fenster_turen_offenstatus_fenster_dachfenster_offenstatus_tueren_offenstatus_regen_erwartet
📥 Schritt 2: Blueprint importieren & Automation erstellen📥 Step 2: Import Blueprint & Create Automation
- Klicke im Bereich Downloads auf den Quick-Import-Button oder importiere manuell die Datei `SNO_WindowState.yaml`.Click the Quick Import button in the Downloads section or manually import the file `SNO_WindowState.yaml`.
- Bestätige den Import in deinem Home Assistant.Confirm the import in your Home Assistant.
- Gehe nun auf Einstellungen ➔ Automatisierungen ➔ + Automatisierung erstellen und wähle den "SNO WindowState" Blueprint aus.Now go to Settings ➔ Automations ➔ + Create Automation and select the "SNO WindowState" blueprint.
⚙️ Schritt 3: Felder & Funktionen erklärt (Praxisbeispiele)⚙️ Step 3: Fields & Functions explained (Practical examples)
Hier erkläre ich dir jedes Feld des Blueprints. Felder mit (Optional) kannst du einfach leer lassen.Here I will explain every field of the blueprint. Fields with (Optional) can simply be left empty.
1. Basis-Entitäten (🪟 / 🪜 / 🚪)1. Base Entities (🪟 / 🪜 / 🚪)
Wähle hier per Mehrfachauswahl deine physischen Kontaktsensoren aus.
Praxisbeispiel: Ordne dein schräges Schlafzimmerfenster explizit unter Dachfenster ein. Nur so greift dort die automatische Schutzlogik bei Unwetter!Select your physical contact sensors here via multiple selection.
Practical example: Explicitly assign your slanted bedroom window under Roof windows. This is the only way the automatic protection logic for storms applies there!
2. ⚠️ Kritische Überwachung2. ⚠️ Critical Monitoring
Wähle hier Sensoren aus, die ein Sicherheitsrisiko darstellen (z. B. Erdgeschossfenster, Haustür).
Praxisbeispiel: Steht das Badfenster im OG offen, zeigt das Dashboard eine normale Warnung. Steht die Haustür offen, schaltet der Blocker warnung_schalter_kritisch... sofort auf AN und färbt deine Dashboard-Karten alarmierend rot.Select sensors here that pose a security risk (e.g., ground floor windows, front door).
Practical example: If the upstairs bathroom window is open, the dashboard shows a normal warning. If the front door is open, the blocker warnung_schalter_kritisch... immediately switches to ON and turns your dashboard cards alarmingly red.
3. 🌧️ Wetter & Aktionen bei Regen3. 🌧️ Weather & Actions during Rain
- Regensensor: Wähle deine Wetter-Entität (z. B.
weather.[stadt]) oder einen binären Sensor.Select your weather entity (e.g.,weather.home) or a binary sensor. - Eigene Regen-Zustände (Optional): Das System erkennt Standard-Status wie
rainyoderpouring. Trage hier eigene Wörter ein, falls dein Sensor andere liefert (z.B.starkregen, nass).The system detects standard statuses likerainyorpouring. Enter custom words here if your sensor provides different ones (e.g.,heavyrain, wet). - Welche Fenster lösen Alarm aus?: Umschaltbar zwischen "Nur Dachfenster" und "Alle geöffneten Fenster & Türen".Switchable between "Only roof windows" and "All open windows & doors".
- Smartphones 1-3: Geräte für automatische Push-Nachrichten bei Regen.Devices for automatic push messages during rain.
- Komplexe Aktionen: Praxisbeispiel: Lasse Alexa rufen "Es regnet, Fenster zu!" oder sende ein Signal an dein Wanddisplay (NS Panel).Practical example: Let Alexa shout "It's raining, close the windows!" or send a signal to your wall display (NS Panel).
4. 💾 Text-Ausgabe & 🛑 Erweiterte Helfer4. 💾 Text Output & 🛑 Advanced Helpers
Verknüpfe hier einfach die exakt gleichnamigen Helfer, die du in Schritt 1 angelegt hast.Simply link the exactly identically named helpers you created in Step 1 here.
🕵️♂️ Anleitung: Wie lese ich die exakten Regenzustände meines Sensors aus?🕵️♂️ Guide: How do I read the exact rain states of my sensor?
Manche Wetterdienste nutzen ungewöhnliche Begriffe für Regen. Wenn deine Regenwarnung nicht auslöst, kannst du den exakten "wahren Zustand" deines Sensors auslesen und im Blueprint bei "Eigene Regen-Zustände" eintragen:Some weather services use unusual terms for rain. If your rain warning doesn't trigger, you can read the exact "true state" of your sensor and enter it in the blueprint under "Custom Rain States":
- Navigiere im linken Seitenmenü von HA auf Entwicklerwerkzeuge.Navigate in the left side menu of HA to Developer Tools.
- Klicke oben auf den Reiter Zustände.Click on the tab States at the top.
- Suche nach deiner Wetter-Entität (z. B.
weather.[stadt]).Search for your weather entity (e.g.,weather.home). - In der Spalte Zustand steht das exakte System-Wort (z. B.
rainyoderschauer).In the State column is the exact system word (e.g.,rainyorshowers). - Kopiere dieses Wort und füge es im Blueprint kommagetrennt hinzu.Copy this word and add it comma-separated in the blueprint.
🧠 Der Anti-Spam-Filter (Hintergrund-Logik)🧠 The Anti-Spam Filter (Background Logic)
SNO WindowState v0.3.0 nutzt einen Smart-Trigger-Filter:SNO WindowState v0.3.0 uses a Smart-Trigger Filter:
- Ändert sich an deiner Wetter-App nur die Temperatur oder Luftfeuchtigkeit, bricht der Blueprint sofort ab, um deine Datenbank nicht zu belasten.If only the temperature or humidity changes in your weather app, the blueprint aborts immediately to avoid burdening your database.
- Eine Regenwarnung wird nur dann abgeschickt, wenn das Wetter exakt in diesem Moment von "Trocken" auf "Regen" umschlägt ODER es bereits regnet und du ein Fenster frisch öffnest.A rain warning is only sent if the weather changes from "Dry" to "Rain" exactly at that moment OR it is already raining and you freshly open a window.
- Das garantiert dir absolute Stille im Alltag, ohne dass du jemals eine echte Gefahr verpasst!This guarantees you absolute silence in everyday life without ever missing a real danger!
🎨 Anleitung: Dashboard Karten einrichten🎨 Guide: Setting up Dashboard Cards
Die Daten liegen nun dank des Blueprints bereit. Jetzt bringen wir sie in einem modernen "Dark/Glass"-Design auf dein Dashboard.The data is now ready thanks to the blueprint. Now let's bring them to your dashboard in a modern "Dark/Glass" design.
Grundregel für alle Karten:Basic rule for all cards:
- Gehe auf dein Dashboard ➔ Oben rechts auf den Stift (Bearbeiten).Go to your dashboard ➔ Top right on the Pencil (Edit).
- Klicke auf + Karte hinzufügen.Click on + Add Card.
- Scrolle ganz nach unten und wähle "Manuell".Scroll all the way down and select "Manual".
- Lösche den dortigen Code und kopiere unseren passenden YAML-Code hinein.Delete the code there and paste our matching YAML code.
Option 1: Native Standard-KarteOption 1: Native Standard Card
Perfekt für Einsteiger! Keine Zusatz-Downloads nötig. Diese simple Markdown-Karte nutzt die Bordmittel von Home Assistant.Perfect for beginners! No additional downloads required. This simple Markdown card uses Home Assistant's built-in tools.
type: markdown
content: >
## 🪟 Fenster & Türen
**Status:** {{ states('input_text.fenster_offen_anzahl') }}
{{ states('input_text.fenster_offen_kritisch') }}
{{ states('input_text.fenster_info') }}
{{ states('input_text.turen_offen_name') }}
Option 2: Mushroom Card (Milchglas-Design)Option 2: Mushroom Card (Frosted Glass Design)
Eine extrem elegante, kleine Kachel mit Dark/Glass Effekt.
Voraussetzungen: Du musst über HACS die Frontend-Erweiterungen Mushroom und card-mod installiert haben. Das Icon färbt sich automatisch rot, sobald ein kritisches Fenster offen ist.An extremely elegant, small tile with Dark/Glass effect.
Requirements: You must have installed the frontend extensions Mushroom and card-mod via HACS. The icon turns red automatically when a critical window is open.
type: custom:mushroom-template-card
primary: Fenster & Türen
secondary: "{{ states('input_text.fenster_offen_anzahl') }}"
icon: >
{% if states('input_boolean.warnung_schalter_kritisch_fenster_turen_offen') == 'on' %} mdi:shield-alert
{% elif states('input_boolean.warnung_schalter_gesamt_fenster_turen_offen') == 'on' %} mdi:window-open
{% else %} mdi:shield-check {% endif %}
icon_color: >
{% if states('input_boolean.warnung_schalter_kritisch_fenster_turen_offen') == 'on' %} red
{% elif states('input_boolean.warnung_schalter_gesamt_fenster_turen_offen') == 'on' %} orange
{% else %} green {% endif %}
tap_action:
action: more-info
entity: input_text.fenster_offen_anzahl
card_mod:
style: |
ha-card {
background: rgba(20, 20, 20, 0.4) !important;
backdrop-filter: blur(12px) !important;
border: 1px solid rgba(255, 255, 255, 0.1) !important;
box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1) !important;
}
Option 3: Bubble Card (High-End Pop-up)Option 3: Bubble Card (High-End Pop-up)
Das absolute Premium-Erlebnis. Ein Button öffnet ein verstecktes, abgedunkeltes Pop-up.
Voraussetzungen: Du musst über HACS die Erweiterung Bubble Card (Version 3.2.0 oder neuer!) installiert haben. Dieses Konzept besteht aus ZWEI Teilen, die als separate manuelle Karten platziert werden!The absolute premium experience. A button opens a hidden, darkened pop-up.
Requirements: You must have installed the Bubble Card extension via HACS. This concept consists of TWO parts, placed as separate manual cards!
Schritt A: Der Trigger ButtonStep A: The Trigger Button
Erzeugt den Button. Er zeigt live an, wie viele Fenster offen sind. Klickst du ihn an, leitet er (dank der `Maps` Aktion) auf das versteckte Pop-up weiter.Generates the button. Shows live how many windows are open. Clicking it redirects (via `Maps` action) to the hidden pop-up.
type: custom:bubble-card
card_type: button
button_type: state
entity: input_text.fenster_offen_anzahl
name: Fenster & Türen
icon: mdi:window-open
tap_action:
action: navigate
navigation_path: "#fenster-details"
sub_button:
main: []
bottom: []
double_tap_action:
action: navigate
navigation_path: "#fenster-details"
hold_action:
action: more-info
button_action:
tap_action:
action: navigate
navigation_path: "#fenster-details"
Schritt B: Das versteckte Pop-upStep B: The Hidden Pop-up
Im Bearbeitungsmodus sichtbar, wird nach dem Speichern unsichtbar! Es ploppt erst wunderschön abgedunkelt auf, wenn der Button geklickt wird und listet die Details.Visible in edit mode, becomes invisible after saving! It pops up beautifully darkened when the button is clicked and lists the details.
type: custom:bubble-card
card_type: pop-up
hash: "#fenster-details"
name: "Geöffnete Fenster & Türen"
icon: mdi:information-outline
entity: input_text.fenster_offen_anzahl
styles: |
.pop-up-container {
background: rgba(15, 15, 15, 0.65) !important;
backdrop-filter: blur(15px) !important;
}
cards:
- type: markdown
content: |
**Zusammenfassung:** {{ states('input_text.fenster_offen_anzahl') }}
***
{{ states('input_text.fenster_offen_kritisch') }}
{{ states('input_text.fenster_info') }}
{{ states('input_text.turen_offen_name') }}
button_type: name
sub_button:
main: []
bottom: []
Changelog & History
Alle Meilensteine und Änderungen dieses Projekts werden hier sauber dokumentiert.All milestones and changes of this project are properly documented here.
v0.3.0 (Hybrides Wetter & Anti-Spam Update)
Hinzugefügt / FeaturesAdded / Features
-
Neu:New: Massive Erweiterung der standardmäßig erkannten Wetter-Zustände (`rainy`, `drizzle`, `snowy-rainy`, `hail`).Massive expansion of standard recognized weather states (`rainy`, `drizzle`, `snowy-rainy`, `hail`).
-
Custom Rain States:Custom Rain States: Optionales Freitextfeld `custom_rain_states` eingeführt, um kommagetrennte, eigene Regenzustände für unkonventionelle Sensoren zu erlauben.Optional text field `custom_rain_states` introduced to allow comma-separated, custom rain states for unconventional sensors.
-
Alarm Scope:Alarm Scope: Dropdown `rain_warning_scope` zur flexiblen Auswahl des Alarm-Bereichs (Entweder nur Dachfenster oder globale Überwachung aller Entitäten bei Regen).Dropdown `rain_warning_scope` for flexible selection of the alarm scope (Either only roof windows or global monitoring of all entities during rain).
-
Anti-Spam Filter:Anti-Spam Filter: Integrierter Anti-Spam-Filter auf Template-Basis (`trigger.to_state.state` Evaluierung). Verhindert wiederholte Push-Nachrichten bei reinen Attribut-Updates (z. B. Temperaturwechsel innerhalb der Wetter-Entität).Integrated Anti-Spam Filter on a template basis (`trigger.to_state.state` evaluation). Prevents repeated push messages during pure attribute updates (e.g., temperature changes within the weather entity).
-
Doku Update:Docs Update: Anleitung zum Auslesen von Roh-Zuständen über die HA-Entwicklerwerkzeuge hinzugefügt. Bubble Card Handbuch vollständig auf das neue v3.2.0 Standalone-Format umgestellt.Guide added for reading raw states via HA Developer Tools. Bubble Card manual fully migrated to the new v3.2.0 standalone format.
v0.2.0 (Status-Schalter Update)
-
Spezifische Status-Schalter:Specific Status Switches: Neue Schalter-Helfer (`input_boolean`) für Fenster/Dachfenster, Türen und Regen aktuell eingeführt, ideal als Backend für Markisen- oder Saugroboter-Steuerung.New switch helpers (`input_boolean`) introduced for windows/roof windows, doors, and current rain, ideal as a backend for awning or robot vacuum control.
-
Variablen-Logik:Variable Logic: Komplett überarbeitete Logik zur Trennung von spezifischen Raum-Zuständen.Completely revised logic for separating specific room states.
v0.1.0 (Initial Release)
-
Initiale Release-Version der SNO WindowState Schaltzentrale mit Split-Architektur zur Umgehung des 255-Zeichen-Limits.Initial Release version of the SNO WindowState control center with split architecture to bypass the 255-character limit.
💻 Technische Entwickler-Doku (Deep-Dive)💻 Technical Developer Docs (Deep-Dive)
v0.3.0Dieses Dokument richtet sich an Entwickler und Power-User, die die interne Logik und erweiterte Filter-Evaluation des SNO WindowState Blueprints nachvollziehen oder anpassen möchten.This document is aimed at developers and power users who want to understand or modify the internal logic and advanced filter evaluation of the SNO WindowState blueprint.
1. Architektur der Datenerfassung1. Architecture of Data Collection
Der Blueprint nutzt Jinja2, um Entitäten hochperformant zu bündeln und Zähl-Fehler zu vermeiden:The blueprint uses Jinja2 to bundle entities with high performance and avoid counting errors:
expand(category): Löst Entitäten-Gruppen/Arrays auf und erfasst Live-Stati.Resolves entity groups/arrays and captures live statuses.unique: Da eine Tür gleichzeitig in der Kategorie "🚪 Türen" und "⚠️ Kritisch" eingetragen werden kann, fügt die Variableall_entitiesalle Arrays zusammen und wendet denuniqueFilter auf dieentity_idan. Dies garantiert absolute Zählgenauigkeit für dentotal_openStatus.Since a door can be entered in both "🚪 Doors" and "⚠️ Critical" categories simultaneously, the `all_entities` variable merges all arrays and applies the `unique` filter to the `entity_id`. This guarantees absolute counting accuracy for the `total_open` status.- Neu ab v0.2.0:New since v0.2.0: Getrennte Counter-Variablen (
open_windows_count,open_doors_count) evaluieren Teilmengen, um spezifische Status-Helfer sauber zu schalten.Separate counter variables (open_windows_count,open_doors_count) evaluate subsets to cleanly switch specific status helpers.
2. Hybride Wetter-Evaluation (`is_raining`)2. Hybrid Weather Evaluation (`is_raining`)
Die Überprüfung des Wetter-Zustands wurde flexibilisiert, um String-Arrays dynamisch zur Laufzeit zu verketten. Dadurch können Standard-Wetterereignisse nahtlos mit eigenen User-Inputs gemischt werden:The weather state check has been made more flexible to dynamically concatenate string arrays at runtime. This allows standard weather events to be seamlessly mixed with custom user inputs:
is_raining: >
{% if rain_sensor != '' %}
{% set state = states(rain_sensor) %}
{% set standard_states = ['on', 'rain', 'rainy', 'pouring', 'lightning-rainy', 'drizzle', 'snowy-rainy', 'hail'] %}
{% set custom_input = custom_rain_states | default('', true) %}
{% set custom_list = custom_input.split(',') | map('trim') | reject('eq', '') | list if custom_input != '' else [] %}
{% set all_states = standard_states + custom_list %}
{{ state in all_states }}
{% else %}
false
{% endif %}
3. Globaler Condition-Block (Attribut-Filter)3. Global Condition Block (Attribute Filter)
Wetter-Entitäten in Home Assistant triggern bei jeder Änderung ihrer Attribute (z. B. temperature, humidity, wind_speed). Um unnötige Rechnungen der Jinja-Zusammenfassung zu verhindern, blockiert eine globale Bedingung die Automatisierung sofort, wenn sich der primäre State nicht geändert hat:Weather entities in Home Assistant trigger upon every change to their attributes (e.g., temperature, humidity, wind_speed). To prevent unnecessary calculations of the Jinja summary, a global condition immediately blocks the automation if the primary state has not changed:
condition:
- condition: template
value_template: >
{% if trigger is defined and trigger.to_state is defined and trigger.from_state is defined %}
{{ trigger.to_state.state != trigger.from_state.state }}
{% else %}
true
{% endif %}
4. Edge-Trigger-Filter (Anti-Spam für Benachrichtigungen)4. Edge-Trigger Filter (Anti-Spam for Notifications)
Um Spam bei anhaltendem Regen zu unterdrücken, wertet die Bedingung im Action-Block das auslösende Event (trigger.entity_id) aus. Eine Benachrichtigung wird nur generiert, wenn der Zustandsübergang eine Verschlechterung darstellt (Wechsel von Trocken zu Regen, oder Wechsel eines Fensters von off zu on während der Regen-Status bereits aktiv ist). Dies stellt sicher, dass die Push-Dienste flankengetriggert operieren.To suppress spam during persistent rain, the condition in the action block evaluates the triggering event (trigger.entity_id). A notification is only generated if the state transition represents a deterioration (change from Dry to Rain, or change of a window from off to on while the rain status is already active). This ensures that push services operate edge-triggered.
{% if t == rain_sensor %}
{{ t_to in all_states and t_from not in all_states }}
{% else %}
...
{% endif %}
5. Das 255-Zeichen Limit (Troubleshooting)5. The 255-Character Limit (Troubleshooting)
Home Assistant limitiert den state einer Entität systembedingt auf exakt 255 Zeichen. Der Blueprint nutzt den truncate(240, True, '...') Filter. Strings werden vor dem 255-Limit sanft abgeschnitten, was Systemabstürze oder SQLite-Fehler verhindert.Home Assistant systematically limits the `state` of an entity to exactly 255 characters. The blueprint uses the `truncate(240, True, '...')` filter. Strings are gently cut off before the 255 limit, which prevents system crashes or SQLite errors.
Doku-ArchivDocs Archive
LegacyHier findest du technische Dokumentationen zu älteren Versionen des Codes.Here you will find technical documentation for older versions of the code.
Legacy: v0.1.0 Architektur der Datenerfassung
In der ersten Version wurde auf die Evaluierung via Counter-Variablen (`open_windows_count`) verzichtet. Die reine Zustandsprüfung basierte auf simplen Jinja Arrays. Diese Logik wurde in v0.2.0 aufgrund der Einführung spezifischer Status-Blocker für Markisen verworfen und neu aufgebaut.
Zu den Legacy-Downloads navigieren →
Downloads & InstallationDownloads & Installation
Lade dir die neueste Version von SNO WindowState herunter oder greife auf das Archiv zu.Download the latest version of SNO WindowState or access the archive.
Schnell-Import v0.3.0 (Empfohlen)Quick Import v0.3.0 (Recommended)
Klicke auf den Button, um das Blueprint mit einem Klick direkt in deine Home Assistant Instanz zu laden.Click the button to load the blueprint directly into your Home Assistant instance with one click.
Lokal & Manuell (.yaml)Local & Manual (.yaml)
Lade das aktuelle v0.3.0 Blueprint herunter und platziere es in /config/blueprints/automation/.Download the current v0.3.0 blueprint and place it in /config/blueprints/automation/.
Archiv & Vorherige VersionenArchive & Previous Versions
Ältere Versionen des Blueprints zur lokalen Installation. Hinweis: Diese Versionen erhalten keine Updates mehr.Older versions of the blueprint for local installation. Note: These versions no longer receive updates.
Screenshots & IntegrationScreenshots & Integration
Einblicke in das Dashboard-Design. Klicken zum Vergrößern.Insights into the dashboard design. Click to enlarge.
🙋 Häufig gestellte Fragen (FAQ)🙋 Frequently Asked Questions
Antworten auf die wichtigsten Fragen zur Einrichtung und Fehlerbehebung. Fokus auf v0.3.0.Answers to the most important questions regarding setup and troubleshooting. Focus on v0.3.0.
🌧️ Neue Wetter- & Filterfunktionen (v0.3.0)🌧️ New Weather & Filter Functions (v0.3.0)
Bei einigen Wetter-Diensten kam es vor, dass die Regenwarnung stumm blieb. Das lag daran, dass Home Assistant Wetter-Integrationen sehr viele unterschiedliche Statuswörter für Regen nutzen (z. B. drizzle für Nieselregen oder snowy-rainy). Version 0.3.0 führt eine hybride Regen-Erkennung ein, die all diese Zustände abfängt und für den Benutzer anpassbar macht.With some weather services, it happened that the rain warning remained silent. This was because Home Assistant weather integrations use many different status words for rain (e.g., drizzle or snowy-rainy). Version 0.3.0 introduces hybrid rain detection that catches all these states and makes them customizable for the user.
Wenn du eine spezielle Wetterstation hast, die bei Regen z. B. den Text es_regnet ausgibt, konntest du das früher nicht nutzen. Jetzt trägst du dieses Wort einfach exakt so in das optionale Feld ein. Der Blueprint kombiniert deine Eingabe automatisch mit den Standardwerten.If you have a special weather station that outputs the text es_regnet when it rains, you couldn't use it before. Now you simply enter this word exactly into the optional field. The blueprint automatically combines your input with the standard values.
Gehe in Home Assistant auf Entwicklerwerkzeuge ➔ Zustände und filtere nach deiner Wetter-Entität (z. B. weather.[stadt]). In der Spalte "Zustand" siehst du das exakte System-Wort. Dieses Wort kopierst du bei Bedarf in den Blueprint.Go to Home Assistant under Developer Tools ➔ States and filter by your weather entity (e.g., weather.home). In the "State" column, you'll see the exact system word. Copy this word into the blueprint if necessary.
Wetter-Apps senden im Minutentakt Updates, wenn sich die Temperatur oder Luftfeuchtigkeit ändert, obwohl es einfach kontinuierlich weiterregnet. Unser neuer Filter blockiert diese Datenflut. Er lässt eine Regenwarnung per Push-Nachricht nur dann durch, wenn sich der Zustand des Wetters wirklich verschlechtert hat oder wenn du bei bestehendem Regen ein neues Fenster öffnest.Weather apps send updates every minute when the temperature or humidity changes, even though it just keeps raining continuously. Our new filter blocks this flood of data. It only lets a rain warning through via push message if the condition of the weather has really deteriorated or if you open a new window while it is raining.
Ja! Über das neue Dropdown-Feld 🎯 Welche Fenster lösen Regen-Alarm aus? kannst du von "Nur Dachfenster (Standard)" auf "Alle geöffneten Fenster & Türen" umschalten.Yes! Using the new dropdown field 🎯 Which windows trigger rain alarm? you can switch from "Only roof windows (Standard)" to "All open windows & doors".
Die Dashboard-Texte und die Blocker-Schalter (input_boolean) aktualisieren sich weiterhin in absoluter Echtzeit! Der Filter blockiert intelligent nur die Push-Benachrichtigungen und Custom-Actions, damit deine Handys nicht ununterbrochen piepen.The dashboard texts and the blocker switches (input_boolean) continue to update in absolute real-time! The filter intelligently blocks only the push notifications and custom actions so that your phones don't beep continuously.
⚙️ Allgemeine Fragen zur Einrichtung⚙️ General Setup Questions
Ein Blueprint arbeitet im Hintergrund und kann Texte nicht direkt auf ein Dashboard "zaubern". Er benötigt einen Speicherort. Der Blueprint sammelt die Namen der offenen Fenster und schreibt sie in diese Text-Helfer. Dein Dashboard liest dann einfach diesen Helfer aus.A blueprint works in the background and cannot "conjure" texts directly onto a dashboard. It needs a storage location. The blueprint collects the names of the open windows and writes them to these text helpers. Your dashboard then simply reads this helper.
Home Assistant limitiert Text-Helfer standardmäßig auf 100 Zeichen. Wenn du mehrere Fenster öffnest, werden die 100 Zeichen schnell überschritten. Ohne die Erhöhung auf das Maximum von 255 Zeichen würde Home Assistant das Speichern verweigern und die Automatisierung abbrechen.Home Assistant limits text helpers to 100 characters by default. If you open multiple windows, the 100 characters are quickly exceeded. Without the increase to the maximum of 255 characters, Home Assistant would refuse to save and abort the automation.
Keine Sorge, das System stürzt nicht ab! Der Blueprint besitzt eine intelligente Schutzfunktion. Er schneidet den Text punktgenau bei 240 Zeichen ab und fügt sanft ein `...` hinzu. Deine Automatisierung läuft zu 100 % fehlerfrei weiter.Don't worry, the system won't crash! The blueprint has an intelligent protection function. It cuts off the text precisely at 240 characters and gently adds `...`. Your automation continues to run 100% error-free.
Normale Fenster (z. B. im 1. OG) sind beim Lüften harmlos. Kritische Zugänge (z. B. Haustür, Kellerfenster) sind sicherheitsrelevant. Der Blueprint trennt diese Daten, sodass dein Dashboard kritische Warnungen direkt optisch hervorheben kann (z. B. rotes Warnschild).Normal windows (e.g., on the 1st floor) are harmless when airing. Critical accesses (e.g., front door, basement window) are security-relevant. The blueprint separates this data so that your dashboard can directly highlight critical warnings visually (e.g., red warning sign).
Ja, absolut! Wähle den Sensor einfach in beiden Kategorien aus. Der Blueprint filtert Duplikate im Hintergrund automatisch heraus. Es wird trotzdem korrekt nur als ein einziges offenes Fenster gezählt.Yes, absolutely! Just select the sensor in both categories. The blueprint filters out duplicates in the background automatically. It is still correctly counted as only one single open window.
Dies ist ein geniales Backend-Feature. Der Blueprint schaltet diesen Helfer auf AN, wenn es regnet. Du kannst nun deine Markise so programmieren: "Wenn Status Regen = AN, dann Markise einfahren!"This is a brilliant backend feature. The blueprint switches this helper to ON when it rains. You can now program your awning: "If Status Rain = ON, then retract awning!"
Auch das sind Helfer für deine eigenen Automatisierungen. Beispiel: "Wenn Tür_Offen = AN, dann schalte den Saugroboter nicht in diesem Raum ein, da er sonst flüchtet."These are also helpers for your own automations. Example: "If Door_Open = ON, then do not turn on the robot vacuum in this room, otherwise it will escape."
Ein Blocker dient als Sperrsignal. Du kannst in Home Assistant eine Automatisierung bauen wie: "Verhindere das Scharfschalten der Alarmanlage, wenn der Blocker Gesamt auf AN steht".A blocker serves as a locking signal. You can build an automation in Home Assistant like: "Prevent the arming of the alarm system if the Total Blocker is ON".
Hier haben Power-User grenzenlose Freiheit. Wenn es bei offenen Dachfenstern regnet, kannst du hier einstellen, dass z. B. deine smarten Lampen rot blinken, Alexa eine Warnung ausgibt oder ein NS Panel Display im Flur warnt.Power users have boundless freedom here. If it rains with open roof windows, you can set it here so that, for example, your smart lamps flash red, Alexa issues a warning, or an NS Panel display in the hallway warns.
In älteren Versionen hat die Bubble Card versucht, den Text-Helfer beim Tippen auszuschalten (input_text.turn_off). Da ein Textfeld keinen Ausschalter hat, kam es zum Konfigurationsfehler. In unserer aktualisierten Dashboard-Anleitung nutzen wir nun button_type: state, wodurch der Button fehlerfrei als reiner Navigations-Link agiert.In older versions, the Bubble Card tried to turn off the text helper when typing (input_text.turn_off). Since a text field has no off switch, a configuration error occurred. In our updated dashboard instructions, we now use button_type: state, making the button act flawlessly as a pure navigation link.
Home Assistant speichert Automatisierungen stark im Cache. Wenn du Felder im Blueprint änderst, klicke zwingend auf "Speichern" und gehe danach unter Entwicklerwerkzeuge ➔ YAML auf Automatisierungen neu laden. Öffne danach physisch ein Fenster, um das System einmalig neu zu triggern.Home Assistant caches automations heavily. If you change fields in the blueprint, click "Save" and then go to Developer Tools ➔ YAML and click Reload automations. Then physically open a window to trigger the system once anew.
Wenn du auf "Aktion hinzufügen" klickst, aber den Block nicht vollständig ausfüllst (z. B. ein leeres Skript-Feld hinterlässt), verwirft Home Assistant diesen Block. Lösche nicht benötigte Aktionen einfach über das Mülleimer-Symbol an der rechten Seite, bevor du auf Speichern klickst.If you click on "Add action" but do not completely fill out the block (e.g., leave an empty script field), Home Assistant discards this block. Simply delete unneeded actions via the trash can icon on the right side before you click save.
Über SNOAbout SNO
SyncNetOps
Hi! Hinter SNO (kurz für SyncNetOps) stehe ich – Matt. 35+ aus dem schönen NRW, beruflich wie privat ein absoluter IT-Mensch (Informatiker, Digitalisierung & Prozessanalyse) und ein Smart-Home-Enthusiast mit einer riesigen Leidenschaft für Home Assistant Automatisierungen. Hi! Behind SNO (short for SyncNetOps) is me – Matt. 35+ from North Rhine-Westphalia, Germany. Professionally and privately a total IT guy (Computer Scientist, Digitalization & Process Analyst) and a Smart Home enthusiast with a massive passion for Home Assistant automations.
Der nasse Laminatboden... The wet laminate floor...
Die Idee zu WindowState entstand an einem unfassbar stürmischen Herbsttag. Wir waren gerade einkaufen, als plötzlich ein massiver Regenschauer losbrach. Ich war mir 100% sicher, alle Fenster geschlossen zu haben – bis wir nach Hause kamen und feststellten, dass das große Dachfenster im oberen Flur sperrangelweit offen stand. Der teure Laminatboden war komplett ruiniert und aufgequollen. Zu allem Überfluss hatte ich mich kurz zuvor schon massiv darüber geärgert, dass sich meine Alarmanlage scharfgeschaltet hatte, obwohl die Terrassentür noch auf stand (was mir prompt nachts einen Fehlalarm bescherte). Ich suchte überall nach einer zentralen Schaltzentrale für Home Assistant, die meine Sensoren zusammenfasst, Regenwarnungen verschickt und globale Sperrsignale für die Alarmanlage liefert. Ich fand nichts, was einfach einzurichten war und gleichzeitig Emojis für mein Dashboard formatieren konnte. Also habe ich es kurzerhand selbst programmiert! The idea for WindowState came about on an incredibly stormy autumn day. We were just out grocery shopping when a massive downpour suddenly started. I was 100% sure I had closed all the windows – until we got home and realized that the large roof window in the upper hallway was wide open. The expensive laminate floor was completely ruined and swollen. To make matters worse, I had recently been very annoyed that my alarm system had armed itself even though the patio door was still open (which promptly caused a false alarm at night). I searched everywhere for a central control unit for Home Assistant that summarizes my sensors, sends rain warnings, and provides global block signals for the alarm system. I couldn't find anything that was easy to set up and could format emojis for my dashboard at the same time. So, without further ado, I programmed it myself!
Es macht mir großen Spaß, smarte Lösungen auszuarbeiten, stetig zu optimieren und schließlich mit der Community zu teilen. Wenn mein Code dir hilft, deinen Alltag sicherer und etwas bequemer zu machen, habe ich mein Ziel erreicht! I deeply enjoy developing smart solutions, optimizing them constantly, and sharing them with the community. If my code helps make your everyday life safer and a little more comfortable, I've reached my goal!
BLUEPRINT Code (v0.3.0)BLUEPRINT Code (v0.3.0)
Kopiere den Quellcode oder lade die Datei herunter.Copy the source code or download the file.
blueprint:
name: "SNO WindowState"
description: |
**Version: 0.3.0**
Diese smarte Schaltzentrale überwacht all deine Fenster und Türen.
Sie fasst die Zustände für dein Dashboard zusammen, steuert Sperrsignale für andere Automatisierungen
und warnt dich proaktiv, wenn es regnet und (Dach-)Fenster noch geöffnet sind.
---
### ⚙️ Übersicht der Konfiguration:
* **🪟/🪜/🚪 Basis-Entitäten:** Wähle deine Fenster, Dachfenster und Türen aus.
* **⚠️ Kritisch:** Markiere bestimmte Zugänge (z. B. Haustür, EG-Fenster) als sicherheitsrelevant.
* **🌧️ Wetter & Aktionen:** Konfiguriere deine Regenwarnung flexibel (inkl. eigener Regenzustände und NS-Panel Support).
* **💾 Text-Ausgabe:** Bestimme Text-Helfer (`input_text`), um die Namen offener Fenster formatiert bereitzustellen.
* **🛑/🔢 Erweiterte Helfer:** Hinterlege Schalter (`input_boolean`) als Sperrsignale oder Zähler (`input_number`).
---
🔗 **[Hilfe & FAQ](https://sno.mb222.de/es-faq/)** | 🐛 **[Fehler auf GitHub melden (Issues)](https://github.com/SyncNetOps/SNO-Ha_Bluprint-WindowState)**
domain: automation
input:
# --- FENSTER ---
section_windows:
name: "🪟 Standard-Fenster"
icon: mdi:window-closed-variant
input:
standard_windows:
name: Fenster
description: Wähle alle normalen Fenster aus.
default: []
selector:
entity:
multiple: true
domain: binary_sensor
device_class: window
# --- DACHFENSTER ---
section_roof:
name: "🪜 Dachfenster"
icon: mdi:window-open
input:
roof_windows:
name: Dachfenster
description: Wähle alle Dachfenster aus (Besonders wichtig für die Regenwarnung!).
default: []
selector:
entity:
multiple: true
domain: binary_sensor
device_class: window
# --- TÜREN ---
section_doors:
name: "🚪 Türen"
icon: mdi:door
input:
doors:
name: Türen
description: Wähle alle Türen (Haus-, Terrassen- oder Balkontüren) aus.
default: []
selector:
entity:
multiple: true
domain: binary_sensor
device_class: door
# --- KRITISCH ---
section_critical:
name: "⚠️ Kritische Überwachung"
icon: mdi:alert-outline
input:
critical_entities:
name: Kritische Zugänge
description: Wähle Entitäten (z. B. Haustür, Erdgeschoss-Fenster), die als sicherheitskritisch markiert werden sollen.
default: []
selector:
entity:
multiple: true
domain: binary_sensor
# --- WETTER & BENACHRICHTIGUNGEN ---
section_weather:
name: "🌧️ Wetter & Aktionen bei Regen"
icon: mdi:weather-pouring
input:
rain_sensor:
name: Regensensor / Wetterdienst
description: Sensor, der Regen meldet (z.B. weather.zuhause oder Feuchtigkeitssensor).
default: ""
selector:
entity:
domain:
- weather
- binary_sensor
custom_rain_states:
name: 📝 Eigene Regen-Zustände (Optional)
description: "Das System erkennt automatisch 'rainy', 'pouring', 'drizzle' etc. Füge hier kommagetrennt EIGENE Statuswörter hinzu (z. B. 'starkregen, nass')."
default: ""
selector:
text: {}
rain_warning_scope:
name: 🎯 Welche Fenster lösen Regen-Alarm aus?
description: "Standardmäßig lösen nur Dachfenster den Alarm aus. Hier kannst du das ändern."
default: "roof_only"
selector:
select:
options:
- label: "Nur Dachfenster (Standard)"
value: "roof_only"
- label: "Alle geöffneten Fenster & Türen"
value: "all_open"
notify_device_1:
name: 📱 Smartphone 1 (Optional)
description: Haupt-Gerät für die Push-Warnung.
default: ""
selector:
device:
integration: mobile_app
notify_device_2:
name: 📱 Smartphone 2 (Optional)
description: Weiteres Gerät für die Push-Warnung.
default: ""
selector:
device:
integration: mobile_app
notify_device_3:
name: 📱 Smartphone 3 (Optional)
description: Weiteres Gerät für die Push-Warnung.
default: ""
selector:
device:
integration: mobile_app
custom_action_1:
name: ⚙️ Komplexe Aktion 1 (Optional)
description: "Erlaube zusätzliche Aktionen (z. B. NS Panel Warnung, Sprachansage, Lichter blinken lassen)."
default: []
selector:
action: {}
custom_action_2:
name: ⚙️ Komplexe Aktion 2 (Optional)
description: "Weitere zusätzliche Aktion bei Regen."
default: []
selector:
action: {}
# --- TEXT-AUSGABE (FÜR DASHBOARD) ---
section_dashboard:
name: "💾 Text-Ausgabe (für Dashboard)"
icon: mdi:monitor-dashboard
input:
target_summary:
name: "1️⃣ Haupt-Status (Zahlen) (Optional)"
description: Zeigt die Zusammenfassung (z.B. "5 geöffnet, davon 1 kritisch").
default: ""
selector:
entity:
domain: input_text
target_details_crit:
name: "2️⃣ Details: Kritisch (Optional)"
description: Listet nur die Namen der kritischen Zugänge.
default: ""
selector:
entity:
domain: input_text
target_details_win:
name: "3️⃣ Details: Fenster & Dach (Optional)"
description: Listet nur die Namen aller Fenster.
default: ""
selector:
entity:
domain: input_text
target_details_doors:
name: "4️⃣ Details: Türen (Optional)"
description: Listet nur die Namen aller Türen.
default: ""
selector:
entity:
domain: input_text
# --- ZUSATZ-HELFER (BLOCKER & ZÄHLER) ---
section_advanced_helpers:
name: "⚙️ Erweiterte Helfer (Blocker & Zähler)"
icon: mdi:cog-transfer
collapsed: true
input:
target_blocker_crit:
name: "🛑 Blocker: Kritisch (Optional)"
description: "Dieser Schalter wird auf 'AN' gesetzt, sobald mindestens 1 kritisches Fenster offen ist."
default: ""
selector:
entity:
domain: input_boolean
target_blocker_all:
name: "🛑 Blocker: Gesamt (Optional)"
description: "Dieser Schalter wird auf 'AN' gesetzt, sobald IRGENDEIN Fenster oder eine Tür offen ist."
default: ""
selector:
entity:
domain: input_boolean
target_blocker_windows:
name: "🛑 Status: Nur Fenster/Dachfenster (Optional)"
description: "Dieser Schalter wird auf 'AN' gesetzt, wenn mindestens ein normales Fenster oder Dachfenster offen ist."
default: ""
selector:
entity:
domain: input_boolean
target_blocker_doors:
name: "🛑 Status: Nur Türen (Optional)"
description: "Dieser Schalter wird auf 'AN' gesetzt, wenn mindestens eine Tür offen ist."
default: ""
selector:
entity:
domain: input_boolean
target_blocker_rain:
name: "🛑 Status: Regen erwartet/aktuell (Optional)"
description: "Dieser Schalter wird auf 'AN' gesetzt, sobald der Regensensor anschlägt."
default: ""
selector:
entity:
domain: input_boolean
target_count_crit:
name: "🔢 Zähler: Kritisch (Optional)"
description: "Zahlen-Helfer, in den die reine Anzahl der offenen kritischen Zugänge geschrieben wird."
default: ""
selector:
entity:
domain: input_number
target_count_all:
name: "🔢 Zähler: Gesamt (Optional)"
description: "Zahlen-Helfer, in den die reine Gesamtzahl aller offenen Zugänge geschrieben wird."
default: ""
selector:
entity:
domain: input_number
variables:
standard_windows: !input standard_windows
roof_windows: !input roof_windows
doors: !input doors
critical_entities: !input critical_entities
rain_sensor: !input rain_sensor
custom_rain_states: !input custom_rain_states
rain_warning_scope: !input rain_warning_scope
target_summary: !input target_summary
target_details_crit: !input target_details_crit
target_details_win: !input target_details_win
target_details_doors: !input target_details_doors
target_blocker_crit: !input target_blocker_crit
target_blocker_all: !input target_blocker_all
target_blocker_windows: !input target_blocker_windows
target_blocker_doors: !input target_blocker_doors
target_blocker_rain: !input target_blocker_rain
target_count_crit: !input target_count_crit
target_count_all: !input target_count_all
mode: queued
max: 5
trigger:
- platform: state
entity_id: !input standard_windows
- platform: state
entity_id: !input roof_windows
- platform: state
entity_id: !input doors
- platform: state
entity_id: !input critical_entities
- platform: state
entity_id: !input rain_sensor
condition:
# ANTI-ATTRIBUT-SPAM FILTER: Bricht ab, wenn sich z.B. nur die Temperatur der Wetter-App ändert
- condition: template
value_template: >
{% if trigger is defined and trigger.to_state is defined and trigger.from_state is defined %}
{{ trigger.to_state.state != trigger.from_state.state }}
{% else %}
true
{% endif %}
action:
# --- DATEN ERFASSEN ---
- variables:
crit_list: >
{{ expand(critical_entities) | selectattr('state', 'eq', 'on') | map(attribute='name') | list }}
win_list: >
{{ expand(standard_windows) | selectattr('state', 'eq', 'on') | map(attribute='name') | list }}
roof_list: >
{{ expand(roof_windows) | selectattr('state', 'eq', 'on') | map(attribute='name') | list }}
door_list: >
{{ expand(doors) | selectattr('state', 'eq', 'on') | map(attribute='name') | list }}
all_entities: "{{ standard_windows + roof_windows + doors + critical_entities }}"
total_open: >
{{ expand(all_entities) | selectattr('state', 'eq', 'on') | map(attribute='entity_id') | unique | list | length }}
total_crit: "{{ crit_list | length }}"
open_windows_count: "{{ (win_list + roof_list) | length }}"
open_doors_count: "{{ door_list | length }}"
# Hybride Wetter-Erkennung (Standard + Custom-Inputs)
is_raining: >
{% if rain_sensor != '' %}
{% set state = states(rain_sensor) %}
{% set standard_states = ['on', 'rain', 'rainy', 'pouring', 'lightning-rainy', 'drizzle', 'snowy-rainy', 'hail'] %}
{% set custom_input = custom_rain_states | default('', true) %}
{% set custom_list = custom_input.split(',') | map('trim') | reject('eq', '') | list if custom_input != '' else [] %}
{% set all_states = standard_states + custom_list %}
{{ state in all_states }}
{% else %}
false
{% endif %}
# --- 1. HAUPT-STATUS (ZAHLEN) UPDATEN ---
- if:
- condition: template
value_template: "{{ target_summary != '' }}"
then:
- service: input_text.set_value
target:
entity_id: "{{ target_summary }}"
data:
value: >
{% if total_open == 0 %}
🟢 Alles geschlossen und sicher.
{% else %}
{{ total_open }} geöffnet, davon {{ total_crit }} kritisch
{% endif %}
# --- 2. DETAILS KRITISCH UPDATEN ---
- if:
- condition: template
value_template: "{{ target_details_crit != '' }}"
then:
- service: input_text.set_value
target:
entity_id: "{{ target_details_crit }}"
data:
value: >
{% if crit_list | length > 0 %}
⚠️ Kritisch: {{ crit_list | join(', ') | truncate(240, True, '...') }}
{% else %}
🛡️ Keine kritischen Zugänge offen.
{% endif %}
# --- 3. DETAILS FENSTER UPDATEN ---
- if:
- condition: template
value_template: "{{ target_details_win != '' }}"
then:
- service: input_text.set_value
target:
entity_id: "{{ target_details_win }}"
data:
value: >
{% set combined = win_list + roof_list %}
{% if combined | length > 0 %}
🪟/🪜 Fenster: {{ combined | join(', ') | truncate(240, True, '...') }}
{% else %}
➖ Keine Fenster offen.
{% endif %}
# --- 4. DETAILS TÜREN UPDATEN ---
- if:
- condition: template
value_template: "{{ target_details_doors != '' }}"
then:
- service: input_text.set_value
target:
entity_id: "{{ target_details_doors }}"
data:
value: >
{% if door_list | length > 0 %}
🚪 Türen: {{ door_list | join(', ') | truncate(240, True, '...') }}
{% else %}
➖ Keine Türen offen.
{% endif %}
# --- 5. ERWEITERTE HELFER (BLOCKER, STATUS & ZÄHLER) UPDATEN ---
# Blocker: Kritisch
- if:
- condition: template
value_template: "{{ target_blocker_crit != '' }}"
then:
- if:
- condition: template
value_template: "{{ total_crit > 0 }}"
then:
- service: input_boolean.turn_on
target:
entity_id: "{{ target_blocker_crit }}"
else:
- service: input_boolean.turn_off
target:
entity_id: "{{ target_blocker_crit }}"
# Blocker: Gesamt
- if:
- condition: template
value_template: "{{ target_blocker_all != '' }}"
then:
- if:
- condition: template
value_template: "{{ total_open > 0 }}"
then:
- service: input_boolean.turn_on
target:
entity_id: "{{ target_blocker_all }}"
else:
- service: input_boolean.turn_off
target:
entity_id: "{{ target_blocker_all }}"
# Status: Nur Fenster
- if:
- condition: template
value_template: "{{ target_blocker_windows != '' }}"
then:
- if:
- condition: template
value_template: "{{ open_windows_count > 0 }}"
then:
- service: input_boolean.turn_on
target:
entity_id: "{{ target_blocker_windows }}"
else:
- service: input_boolean.turn_off
target:
entity_id: "{{ target_blocker_windows }}"
# Status: Nur Türen
- if:
- condition: template
value_template: "{{ target_blocker_doors != '' }}"
then:
- if:
- condition: template
value_template: "{{ open_doors_count > 0 }}"
then:
- service: input_boolean.turn_on
target:
entity_id: "{{ target_blocker_doors }}"
else:
- service: input_boolean.turn_off
target:
entity_id: "{{ target_blocker_doors }}"
# Status: Regen erwartet/aktuell
- if:
- condition: template
value_template: "{{ target_blocker_rain != '' }}"
then:
- if:
- condition: template
value_template: "{{ is_raining }}"
then:
- service: input_boolean.turn_on
target:
entity_id: "{{ target_blocker_rain }}"
else:
- service: input_boolean.turn_off
target:
entity_id: "{{ target_blocker_rain }}"
# Zähler: Kritisch
- if:
- condition: template
value_template: "{{ target_count_crit != '' }}"
then:
- service: input_number.set_value
target:
entity_id: "{{ target_count_crit }}"
data:
value: "{{ total_crit | float }}"
# Zähler: Gesamt
- if:
- condition: template
value_template: "{{ target_count_all != '' }}"
then:
- service: input_number.set_value
target:
entity_id: "{{ target_count_all }}"
data:
value: "{{ total_open | float }}"
# --- 6. REGEN-WARNUNG & AKTIONEN (Mit Smart-Trigger-Filter) ---
- if:
- condition: template
value_template: "{{ rain_sensor != '' }}"
- condition: template
value_template: "{{ is_raining }}"
- condition: template
value_template: >
{% if rain_warning_scope == 'roof_only' %}
{% set open_windows = expand(roof_windows) | selectattr('state', 'eq', 'on') | list | length %}
{{ open_windows > 0 }}
{% else %}
{{ total_open > 0 }}
{% endif %}
# Filter: Nur auslösen, wenn sich das Wetter JETZT verschlechtert hat ODER das Fenster JETZT geöffnet wurde. Verhindert Spam!
- condition: template
value_template: >
{% if trigger is not defined or trigger.to_state is not defined or trigger.from_state is not defined %}
true
{% else %}
{% set t = trigger.entity_id %}
{% set t_to = trigger.to_state.state %}
{% set t_from = trigger.from_state.state %}
{% set standard_states = ['on', 'rain', 'rainy', 'pouring', 'lightning-rainy', 'drizzle', 'snowy-rainy', 'hail'] %}
{% set custom_input = custom_rain_states | default('', true) %}
{% set custom_list = custom_input.split(',') | map('trim') | reject('eq', '') | list if custom_input != '' else [] %}
{% set all_states = standard_states + custom_list %}
{% set all_ent_list = standard_windows + roof_windows + doors + critical_entities %}
{% if t == rain_sensor %}
{{ t_to in all_states and t_from not in all_states }}
{% else %}
{% if rain_warning_scope == 'roof_only' %}
{{ t in roof_windows and t_to == 'on' and t_from == 'off' }}
{% else %}
{{ t in all_ent_list and t_to == 'on' and t_from == 'off' }}
{% endif %}
{% endif %}
{% endif %}
then:
# Push Benachrichtigung 1
- if:
- condition: template
value_template: "{{ notify_device_1 != '' }}"
then:
- domain: mobile_app
type: notify
device_id: !input notify_device_1
title: "🌧️ Achtung, es regnet!"
message: "Es sind noch überwachte Fenster geöffnet. Bitte sofort überprüfen und schließen!"
# Push Benachrichtigung 2
- if:
- condition: template
value_template: "{{ notify_device_2 != '' }}"
then:
- domain: mobile_app
type: notify
device_id: !input notify_device_2
title: "🌧️ Achtung, es regnet!"
message: "Es sind noch überwachte Fenster geöffnet. Bitte sofort überprüfen und schließen!"
# Push Benachrichtigung 3
- if:
- condition: template
value_template: "{{ notify_device_3 != '' }}"
then:
- domain: mobile_app
type: notify
device_id: !input notify_device_3
title: "🌧️ Achtung, es regnet!"
message: "Es sind noch überwachte Fenster geöffnet. Bitte sofort überprüfen und schließen!"
# Komplexe Aktion 1
- choose:
- conditions:
- condition: template
value_template: "{{ true }}"
sequence: !input custom_action_1
# Komplexe Aktion 2
- choose:
- conditions:
- condition: template
value_template: "{{ true }}"
sequence: !input custom_action_2