Heize smart. Lebe komfortabel.
Spare automatisch.
Heat smartly. Live comfortably.
Save automatically.
SNO-perfekt-Heating ist ein fortschrittlicher Home Assistant Blueprint, der deine Heizungssteuerung auf ein neues Level hebt. Er kombiniert Tageszeitpläne, Anwesenheitserkennung, Fenster-Sensoren und Jahreszeitenlogik in einer einzigen, leistungsstarken Automatisierung. Anstatt starr nach Uhrzeit zu heizen, passt sich das System dynamisch an deinen Alltag an. SNO-perfekt-Heating is an advanced Home Assistant Blueprint that takes your heating control to the next level. It combines daily schedules, presence detection, window sensors, and seasonal logic into a single, powerful automation. Instead of heating strictly by time, the system adapts dynamically to your daily routine.
So smart sieht dein Tag ausThis is what your smart day looks like
Beobachte, wie die Automatisierung alle Ereignisse abfängt und nahtlos die perfekte Entscheidung für deinen Komfort und deinen Geldbeutel trifft.Watch how the automation intercepts all events and seamlessly makes the perfect decision for your comfort and wallet.
Guten Morgen!Good Morning!
Du betrittst den Raum (Präsenz erkannt). Die Heizung fährt pünktlich auf 21°C Komforttemperatur hoch.You enter the room (presence detected). The heating rises right on time to 21°C Comfort temperature.
Haus ist leerHouse is empty
Alle sind bei der Arbeit. Das System erkennt die Abwesenheit und senkt automatisch auf 16.5°C ab, um Energie zu sparen.Everyone is at work. The system detects the absence and automatically drops to 16.5°C to save energy.
StoßlüftenVentilation
Fenster auf! Die Heizung reagiert in Millisekunden und geht auf Frostschutz (5°C). Du heizt nicht nach draußen.Window open! The heating reacts in milliseconds and goes to frost protection (5°C). You don't heat the outside.
KaminfeuerFireplace
Der Ofen brennt (Extern-Modus). Das Thermostat fährt intelligent zurück auf 15°C. Pures Gas/Öl gespart!The stove is burning (External Mode). The thermostat intelligently drops back to 15°C. Pure gas/oil saved!
Auto-Reset
Du hattest manuell auf 24°C gedreht und bist eingeschlafen? Der Auto-Reset löscht den Boost sicher zur Nachtruhe.You manually set it to 24°C and fell asleep? The Auto-Reset safely deletes the boost for bedtime.
✨ Features & Vorteile✨ Features & Benefits
Konfliktfreie Prioritäten-LogikConflict-Free Priority Logic
Das System weiß jederzeit genau, was zu tun ist. Manuelle Eingriffe überschreiben den Sommer-Modus, dieser überschreibt Urlaub, und diese wiederum überschreiben den normalen Zeitplan. Keine überlappenden Befehle mehr!The system always knows exactly what to do. Manual interventions override summer mode, which overrides vacation mode, which overrides the schedule. No more conflicting commands!
Smartes Auto-ResetSmart Auto-Reset
Manueller Boost oder Urlaubsmodus vergessen auszuschalten? Kein Problem. Das System deaktiviert diese Modi vollautomatisch nach Zeit, Dauer oder beim Verlassen des Hauses.Forgot to turn off manual boost or vacation mode? No problem. The system automatically deactivates these modes based on time, duration, or when leaving the house.
Dynamische Fenster & SektionenDynamic Windows & Sections
Entscheide selbst, ob offene Fenster beim manuellen Heizen oder im Urlaub ignoriert werden sollen. Konfiguriert wird das Ganze im übersichtlichen Section-UI-Design.Decide for yourself whether open windows should be ignored during manual heating or vacation. Configured easily via the clean Section UI design.
Live Status-AusgabeLive Status Output
Lass dir in Echtzeit auf deinem Dashboard anzeigen, was die Automatisierung gerade tut (z.B. "🪟 1 Fenster (Balkontür) offen - Soll: 5.0 °C").See exactly what the automation is doing in real-time on your dashboard (e.g. "🪟 1 window open - Target: 5.0 °C").
Batterieschonend & Delay-FreeBattery Saving & Delay-Free
Eine hochgradig optimierte Jinja2-State-Engine berechnet den Sollzustand und sendet nur dann Funkbefehle, wenn sich die Zieltemperatur ändert. Komplett ohne fehleranfällige Delay-Timer!A highly optimized Jinja2 state engine calculates the target state and only sends radio commands if the target temperature has actually changed. Completely without error-prone delay timers!
📖 Benutzerhandbuch: SNO-perfekt-Heating V2.4.0📖 User Manual: SNO-perfekt-Heating V2.4.0
Willkommen beim SNO-perfekt-Heating Blueprint! Diese Pro-Edition bietet dir eine extrem smarte, dynamische und vollständig konfigurierbare Heizungssteuerung für dein Home Assistant.Welcome to the SNO-perfekt-Heating Blueprint! This Pro-Edition offers you an extremely smart, dynamic, and fully configurable heating control for your Home Assistant.
🧠 Das Konzept: Die Prioritäten-Kette🧠 The Concept: The Priority Chain
Die Steuerung funktioniert nach einem strikten "Wer gewinnt?"-Prinzip. Wenn mehrere Situationen gleichzeitig eintreten, gewinnt immer die Situation, die weiter oben in der Liste steht: The control works on a strict "Who wins?" principle. If several situations occur at the same time, the situation higher up in the list always wins:
- 1. ✋ Manuell: Du drückst einen Knopf? Die Automatisierung gehorcht dir (bis zum Auto-Reset).✋ Manual: You press a button? The automation obeys you (until the auto-reset).
- 2. ☀️ Sommer: Es ist warm genug. Die Heizung geht aus (Fenster werden ignoriert).☀️ Summer: It's warm enough. The heating turns off (windows are ignored).
- 3. 🌴 Urlaub: Du bist länger weg. Eine feste Spartemperatur wird gehalten.🌴 Vacation: You are away for longer. A fixed eco temperature is maintained.
- 4. 🪟 Fenster Offen: Ein Fenster geht auf? Die Heizung wird sofort abgesenkt (konfigurierbar, in welchen Modi das erlaubt ist!).🪟 Window Open: A window opens? The heating is immediately lowered (configurable in which modes this is allowed!).
- 5. 🔥 Extern (Kamin): Der Kamin brennt? Die normale Heizung schaltet ab.🔥 Extern (Fireplace): The fireplace is burning? Normal heating turns off.
- 6. 🚶 Abwesend: Niemand ist im Haus.🚶 Away: Nobody is home.
- 7. 🕒 Auto: Der normale Alltag (Zeitpläne & Raum-Präsenz).🕒 Auto: Normal daily routine (Schedules & Room Presence).
🚀 Installation & Einrichtung🚀 Installation & Setup
- Blueprint importieren: Lade den Blueprint in dein Home Assistant.Import Blueprint: Load the blueprint into your Home Assistant.
- Automatisierung erstellen: Gehe zu Einstellungen > Automatisierungen, klicke auf "Automatisierung erstellen" und wähle "SNO-perfekt-Heating".Create Automation: Go to Settings > Automations, click on "Create Automation" and select "SNO-perfekt-Heating".
- UI ausfüllen: Arbeite dich von oben nach unten durch die Sektionen. Keine Sorge: Alles bis auf die "Klima-Entität" (Sektion 1) ist optional!Fill out UI: Work your way through the sections from top to bottom. Don't worry: Everything except the "Climate Entity" (Section 1) is optional!
⚙️ Die Sektionen im Detail & Praxisbeispiele⚙️ Sections in Detail & Practical Examples
1️⃣ Kern-Konfiguration1️⃣ Core Configuration
Hier legst du das Fundament.Here you lay the foundation.
- Klima-Entität(en): Wähle ein oder gleich mehrere Thermostate (z.B. Heizkörper & Fußbodenheizung im Wohnzimmer) aus.Climate Entity/Entities: Select one or multiple thermostats (e.g., radiator & underfloor heating in the living room).
- Haus- / Raumanwesenheit: Nutze Bewegungsmelder oder Ping-Sensoren.Home / Room Presence: Use motion detectors or ping sensors.
2️⃣ Manueller Modus & Auto-Reset2️⃣ Manual Mode & Auto-Reset
Manchmal möchte man die Temperatur einfach per Knopfdruck am Dashboard überschreiben.Sometimes you just want to override the temperature at the push of a button on the dashboard.
- Manueller Schalter: Lege dir einen "Input Boolean" (Helfer-Schalter) an und wähle ihn hier aus.Manual Switch: Create an "Input Boolean" (helper switch) and select it here.
- Auto-Reset: Vergessen, den manuellen Modus auszuschalten? Kein Problem.Auto-Reset: Forgot to turn off manual mode? No problem.
3️⃣ Urlaubsmodus3️⃣ Vacation Mode
Perfekt für längere Reisen.Perfect for longer trips.
4️⃣ Fenster-Erkennung4️⃣ Window Detection
Die Heizung soll beim Lüften nicht umsonst feuern.The heating shouldn't fire for nothing when ventilating.
- Fenster-Sensor(en): Wähle hier alle Fensterkontakte des Raumes aus (Mehrfachauswahl möglich!).Window Sensor(s): Select all window contacts of the room here (multiple selection possible!).
- Fenster-Absenkung zulassen in: Ein genialer Filter!Allow window setback in: A brilliant filter!
5️⃣ Sommer & Extern (Kamin)5️⃣ Summer & External (Fireplace)
Spare Energie in der warmen Jahreszeit oder wenn alternative Wärmequellen aktiv sind.Save energy during the warm season or when alternative heat sources are active.
- Sommer-Sensor & Schwellwert: Nutze deinen Außentemperatur-Sensor. Steigt dieser über z.B. 22°C, schaltet das System in den Sommermodus (Heizung aus).Summer Sensor & Threshold: Use your outdoor temperature sensor. If this rises above e.g. 22°C, the system switches to summer mode (heating off).
- Extern (Kamin): Wenn dein Temperatursensor an der Wohnzimmerdecke über 28°C meldet (oder du einen Schalter drückst), wird die normale Heizung ausgesetzt, bis der Kamin aus ist.External (Fireplace): If your temperature sensor on the living room ceiling reports above 28°C (or you press a switch), normal heating is suspended until the fireplace is off.
6️⃣ Zeitpläne (Auto)6️⃣ Schedules (Auto)
Dein digitaler Alltag, aufgeteilt in Morgen, Tag, Abend und Nacht.Your digital everyday life, divided into Morning, Day, Evening and Night.
7️⃣ Dashboard Status & Helper7️⃣ Dashboard Status & Helper
Mache sichtbar, was im Hintergrund passiert!Make visible what happens in the background!
Changelog & History
V2.4.0 (Pro-Edition)
Release Date: 15.05.2026. Diese Version bringt erhebliche Verbesserungen in der Benutzerfreundlichkeit, der Benutzeroberfläche und der Art und Weise, wie Entitäten vom Blueprint verarbeitet werden, ohne dabei die Abwärtskompatibilität zu V2.3.0 zu beeinträchtigen. Release Date: May 15, 2026. This version brings significant improvements in usability, the user interface, and the way entities are processed by the blueprint, without compromising backward compatibility with V2.3.0.
Neue FeaturesNew Features
-
Native Mehrfachauswahl (Multi-Select):Native Multi-Select: Es ist nun möglich, direkt im Blueprint-Menü mehrere Thermostate (climate_entity) und mehrere Fenstersensoren (window_sensor) auszuwählen. Das manuelle Erstellen von Helfer-Gruppen in Home Assistant ist für diese Funktionen nicht mehr zwingend erforderlich!It is now possible to select multiple thermostats (climate_entity) and multiple window sensors (window_sensor) directly in the blueprint menu. Manually creating helper groups in Home Assistant is no longer strictly necessary for these functions!
-
Smartes Listen-Handling:Smart List Handling: Die interne Logik-Engine wurde auf die Jinja-Funktion expand() umgeschrieben. Egal ob ein einzelner Sensor, eine per Multi-Select erstellte Liste oder eine klassische Helfer-Gruppe übergeben wird – das System verarbeitet alles nativ und fehlerfrei.The internal logic engine has been rewritten to use the Jinja function expand(). Regardless of whether a single sensor, a list created via multi-select, or a classic helper group is passed – the system processes everything natively and flawlessly.
UI/UX VerbesserungenUI/UX Improvements
-
Aufgeräumtes Layout:Cleaned up layout: Alle Blueprint-Sektionen (ab Sektion 2) starten nun standardmäßig eingeklappt (collapsed: true). Dies sorgt für eine wesentlich sauberere und übersichtlichere Darstellung, besonders auf mobilen Geräten. (Hinweis: Sektion 1 bleibt technisch bedingt durch HA aufgeklappt, bis ein Pflicht-Thermostat gewählt wurde).All blueprint sections (from section 2 onwards) now start collapsed by default. This ensures a much cleaner and clearer display, especially on mobile devices. (Note: Due to HA technical reasons, Section 1 remains expanded until a mandatory thermostat is selected).
-
Optimierte Beschreibung:Optimized Description: Die Kopf-Beschreibung (Description) wurde von technischem Jargon befreit. Sie enthält nun eine strukturierte, schrittweise Kurzanleitung zur Einrichtung, die dank angepasstem Markdown-Formatting (| Operator) sauber aufgelistet wird.The head description has been freed of technical jargon. It now contains a structured, step-by-step quick setup guide, which is neatly listed thanks to adapted Markdown formatting (| operator).
Optimierungen unter der HaubeUnder the Hood Optimizations
-
Netzwerk-Spam Schutz V2:Network Spam Protection V2: Da die Zieltemperatur-Verifizierung nun Listen von Thermostaten unterstützen muss, wurde ein intelligenter Loop (mit Jinja Namespace) integriert. Ein Z-Wave/Zigbee Funkbefehl (climate.set_temperature) wird nur dann ins Netzwerk gefeuert, wenn bei mindestens einem der ausgewählten Thermostate der Ist-Soll-Zustand abweicht.Since target temperature verification must now support lists of thermostats, an intelligent loop (with Jinja Namespace) was integrated. A Z-Wave/Zigbee command (climate.set_temperature) is only fired into the network if the current/target state differs for at least one of the selected thermostats.
-
Entfernung von Dummy-Sektionen:Removal of Dummy Sections: Bereinigung des Codes von Platzhalter-Inputs, um strikt den Home Assistant Design-Guidelines für Blueprints zu folgen.Cleaned up the code from placeholder inputs to strictly follow the Home Assistant Design Guidelines for Blueprints.
V2.3.0 (Pro-Edition / Fix 1)
Einführung von Urlaubsmodus, smartem Auto-Reset für den manuellen Modus, dynamischer Fensterabsenkung (Multi-Select Modus) und Fixes für die Fenster-Zählung.Introduction of vacation mode, smart auto-reset for manual mode, dynamic window setback, and fixes for window counting.
V2.2.2 (Hardened)
Behebung von Group-Lags (Fenster), strikte Float-Konvertierungen und erweiterte Fenster-Statusausgabe mit Namen.Fixing group lags (windows), strict float casting, and enhanced window status output with names.
V2.2 (Major Overhaul)
Die initiale Einführung der asynchronen Jinja2 State-Engine und Regler vs. Entitäten Fallback-Logik.Initial introduction of the asynchronous Jinja2 State Engine and Slider vs. Entity fallback logic.
🛠️ Entwickler-Dokumentation🛠️ Developer Documentation
V2.4.0Zweck: Technische Referenz für zukünftige Entwickler, Contributor und Wartungsarbeiten am Blueprint. Dieses Dokument erklärt die architektonischen Designentscheidungen, die Logik-Engine und die spezifischen Neuerungen in V2.4.0.Purpose: Technical reference for future developers, contributors, and maintenance work on the blueprint. This document explains the architectural design decisions, the logic engine, and the specific novelties in V2.4.0.
1. Architektur-Paradigma1. Architecture Paradigm
Der Blueprint nutzt bewusst den mode: restart. Um Netzwerk-Spam (insbesondere in Zigbee/Z-Wave Mesh-Netzwerken) zu verhindern und die Stabilität zu maximieren, nutzt die Automatisierung keine verschachtelten Logikbäume (if/else) in den Actions. Stattdessen wird der zukünftige Soll-Zustand (Modus, Temperatur, Helper-Zustände) komplett im variables-Block vorausberechnet. Die action-Sequenz dient lediglich der "stumpfen" Ausführung (Push to Thermostat & Helfer), falls der aktuelle Zustand vom berechneten Soll abweicht.
The blueprint deliberately uses mode: restart. To prevent network spam (especially in Zigbee/Z-Wave mesh networks) and maximize stability, the automation uses no nested logic trees (if/else) in the actions. Instead, the future target state (mode, temperature, helper states) is completely precalculated in the variables block. The action sequence only serves for the "blunt" execution (Push to Thermostat & Helper), if the current state differs from the calculated target.
2. Kern-Upgrades in V2.4.0 (Multi-Select & Listen-Handling)2. Core Upgrades in V2.4.0 (Multi-Select & List Handling)
Die wichtigste Neuerung in V2.4.0 ist die native Unterstützung von Listen (Arrays) für Thermostate (climate_entity) und Fenstersensoren (window_sensor) durch multiple: true in den UI-Selektoren.The most important new feature in V2.4.0 is the native support of lists (arrays) for thermostats (climate_entity) and window sensors (window_sensor) via multiple: true in the UI selectors.
2.1. Die expand() Funktion2.1. The expand() Function
Um maximale Abwärtskompatibilität zu gewährleisten, wird die Jinja-Funktion expand() genutzt. Sie ist extrem mächtig, da sie verschiedene Datentypen nahtlos verarbeitet:
To ensure maximum backwards compatibility, the Jinja function expand() is used. It is extremely powerful as it processes different data types seamlessly:
- Ein einzelner String (z.B.
climate.wohnzimmer)A single string (e.g.,climate.livingroom) - Eine Liste von Strings (z.B.
['climate.w1', 'climate.w2'])A list of strings (e.g.,['climate.w1', 'climate.w2']) - Eine Home Assistant Gruppe (Helfer)A Home Assistant Group (Helper)
Die Logik in is_window_open und in der Action-Condition für das Thermostat bricht die Inputs mittels expand() auf die atomaren Entitäten herunter und wertet diese aus.The logic in is_window_open and in the action condition for the thermostat breaks down the inputs using expand() to the atomic entities and evaluates them.
2.2. Smarter Netzwerk-Schutz (Namespace Loop)2.2. Smart Network Protection (Namespace Loop)
Da state_attr(climate_entity, 'temperature') bei einer Liste fehlschlägt, wurde die Condition in Action 5 neu geschrieben. Es wird über alle ausgewählten Thermostate iteriert. Ein namespace wird genutzt, um den Scope der Variable innerhalb der Jinja-Schleife zu erhalten:
Since state_attr(climate_entity, 'temperature') fails with a list, the condition in Action 5 was rewritten. It iterates over all selected thermostats. A namespace is used to maintain the scope of the variable inside the Jinja loop:
{% set target = calc_target_temp | float(-99) %}
{% set ns = namespace(update_needed=false) %}
{% for state in expand(climate_entity) %}
{% set curr = state.attributes.temperature | float(-99) %}
{% if curr != target %}
{% set ns.update_needed = true %}
{% endif %}
{% endfor %}
{{ ns.update_needed }}
Ergebnis: Der Funkbefehl wird nur gesendet, wenn mindestens ein Thermostat der Gruppe noch nicht den korrekten Zielwert hat.The radio command is only sent if at least one thermostat of the group does not yet have the correct target value.
3. Die Prioritäten-Engine (Variables)3. The Priority Engine (Variables)
Die Kette wird strictly top-to-bottom im variables-Block ausgewertet:The chain is evaluated strictly top-to-bottom in the variables block:
- base_mode: Prüft die Status-Variablen in fester Reihenfolge: is_manual -> is_summer -> is_vacation -> is_extern -> is_away -> auto.Checks the status variables in fixed order: is_manual -> is_summer -> is_vacation -> is_extern -> is_away -> auto.
- base_temp: Lädt die korrespondierende
eff_...(Effective) Temperatur für den festgestellten Modus.Loads the correspondingeff_...(Effective) temperature for the determined mode. - calc_target_temp: Die finale Instanz. Sie überschreibt
base_tempzwingend, falls is_window_open == true UND der berechnete base_mode in der User-Erlaubnisliste (window_active_modes) steht.The final instance. It mandatorily overwritesbase_tempif is_window_open == true AND the calculated base_mode is in the user allowlist (window_active_modes).
4. Trigger & Auto-Reset Logik4. Trigger & Auto-Reset Logic
Timer (delay) in Automatisierungen mit mode: restart sind ein Anti-Pattern.Timers (delay) in automations with mode: restart are an anti-pattern.
- TemplateSyntaxError Fix: Da HA verbietet,
!inputdirekt in Jinja-Triggern zu nutzen, werden im Blocktrigger_variablessichere Kopien der Inputs erzeugt.TemplateSyntaxError Fix: Since HA forbids using!inputdirectly in Jinja triggers, safe copies of the inputs are created in thetrigger_variablesblock. - Asynchrone Prüfung: Die Auto-Reset-Funktionen prüfen asynchron über das Attribut
last_changedder Status-Entität, wie lange ein Schalter bereits aktiv ist.Asynchronous Check: The auto-reset functions asynchronously check via thelast_changedattribute of the status entity how long a switch has been active. - Execution: Löst ein Reset-Trigger aus, schaltet Action 0 den Helper hart auf
offund beendet den aktuellen Durchlauf mitstop:. Der Blueprint startet danach sofort neu, getriggert durch die Statusänderung des Helpers.Execution: If a reset trigger fires, Action 0 hard switches the helper tooffand ends the current run withstop:. The blueprint then immediately restarts, triggered by the status change of the helper.
5. Leitfaden für zukünftige Erweiterungen5. Guide for future Extensions
Wenn ein neuer Modus (z.B. "Party-Modus") hinzugefügt wird, müssen folgende Schritte zwingend eingehalten werden:If a new mode (e.g., "Party Mode") is added, the following steps must be strictly observed:
- UI-Inputs definieren: In einer bestehenden oder neuen Sektion einkapseln.Define UI Inputs: Encapsulate in an existing or new section.
- Variablen registrieren: Input im
variables-Block mappen (Niemals!inputdirekt in Jinja-Templates verwenden!).Register variables: Map input in thevariablesblock (Never use!inputdirectly in Jinja templates!). - Effective Temp (eff_party): Variable für die Temperatur-Fallback-Logik erstellen (Input-Entität vs. statischer Regler).Effective Temp (eff_party): Create variable for the temperature fallback logic (Input entity vs. static slider).
- Status Check (is_party): Variable für den Aktivitätsstatus des Schalters erstellen.Status Check (is_party): Create variable for the activity status of the switch.
- Logik-Kette anpassen: In
base_mode,base_tempundstatus_stringan der gewünschten hierarchischen Stelle einfügen.Adjust logic chain: Insert inbase_mode,base_tempandstatus_stringat the desired hierarchical position.
Doku-ArchivDocs Archive
LegacyHier findest du technische Dokumentationen zu älteren Versionen des Blueprints.Here you will find technical documentation for older versions of the blueprint.
Architektur-Paradigma: Der Blueprint "SNO-perfekt-Heating" nutzt den mode: restart. Um Netzwerk-Spam (Zigbee/Z-Wave) zu verhindern und die Stabilität zu maximieren, nutzt die Automatisierung keine verschachtelten Logikbäume in den Actions. Stattdessen wird der zukünftige Soll-Zustand (calc_target_temp) komplett im variables-Block vorausberechnet.Architecture Paradigm: The blueprint "SNO-perfekt-Heating" uses mode: restart. To prevent network spam (Zigbee/Z-Wave) and maximize stability, the automation uses no nested logic trees in the actions. Instead, the future target state (calc_target_temp) is completely precalculated in the variables block.
Kern-Upgrades in V2.3: Lösung des TemplateSyntaxError (trigger_variables) - Home Assistant verbietet die direkte Nutzung von Blueprint-Tags innerhalb von Jinja2-Templates. Implementierung eines trigger_variables-Blocks über den Variablen. Dynamische Fenster-Absenkung (Multi-Select) über das Array window_active_modes. Verzicht auf delay für Auto-Resets.Core Upgrades in V2.3: Resolving TemplateSyntaxError (trigger_variables) - Home Assistant forbids direct use of blueprint tags within Jinja2 templates. Implemented a trigger_variables block. Dynamic Window Setback (Multi-Select) via the array window_active_modes. Avoiding delay for Auto-Resets.
Architektur-Übersicht: Ereigisgesteuerte State-Machine ohne verschachtelte YAML-choose-Blöcke. Die Variable calc_target_temp wird durch eine feste if-elif-else Kette bestimmt (1. is_manual, 2. is_summer, 3. is_window_open, 4. is_extern, 5. is_away, 6. Auto).Architecture Overview: Event-driven state machine without nested YAML choose blocks. The variable calc_target_temp is determined by a rigid if-elif-else chain.
Spezielles Hardening: Beinhaltet den Group-Lag Fix per synchronem expand() Abgleich für Fenstergruppen sowie das strikte | float Casting am Endpunkt des Thermostats. Nutzt noch keine trigger_variables Architektur.Special Hardening: Contains the group-lag fix via synchronous expand() for window groups and strict | float casting at the thermostat. Does not yet use the trigger_variables architecture.
Initiale Einführung der asynchronen Jinja2 State-Engine. Entfernung aller verschachtelten YAML choose Blöcke zugunsten einer zentralen variables Deklaration. Einführung der Regler vs. Entitäten Fallback-Logik. Im Vergleich zur Version 2.2.2 fehlen hier der expand() Fix für Fenstergruppen sowie die explizite | float Konvertierung am Endpunkt des Thermostats.Initial introduction of the asynchronous Jinja2 State Engine. Removed all deeply nested YAML choose blocks in favor of a centralized variables declaration. Introduced the Slider vs. Entity fallback logic. Compared to version 2.2.2, this lacks the expand() fix for window groups and the explicit | float casting at the thermostat endpoint.
Downloads & ArchivDownloads & Archive
blueprints/automation/ deines Home Assistant geladen wird.
Installation Note: The current version can be conveniently imported via the blueprint URL. Older versions from the archive must always be installed manually by uploading the respective YAML file to the blueprints/automation/ folder of your Home Assistant.
SNO-perfekt-Heating V2.4.0
Pro-Edition mit Multi-Select & Auto-ResetPro-Edition with Multi-Select & Auto-Reset
Vorherige Versionen (Legacy)Previous Versions (Legacy)
SNO-perfekt-Heating V2.3.0
Pro-Edition (Single-Select)Pro-Edition (Single-Select)
SNO-perfekt-Heating V2.2.2
Hardened Version (Starre Logik, kein Urlaub)Hardened Version (Rigid logic, no vacation)
SNO-perfekt-Heating V2.2
Legacy (Ohne Group-Lag Fix)Legacy (Without Group-Lag fix)
Screenshots & UI-IntegrationScreenshots & UI Integration
Einblicke in die neuen Sektionen und das Dashboard.Insights into the new sections and the dashboard.
Interaktiver Guide & FAQInteractive Guide & FAQ
Löse häufige Problemstellungen zu V2.3 & V2.4.0.Solve common issues regarding V2.3 & V2.4.0.
Neue Features (V2.3)New Features (V2.3)
Urlaubs-AutomatikVacation Auto
Sorgt bei Abwesenheit für konstante 15°C und schaltet sich pünktlich zu deiner Heimkehr vollautomatisch wieder ab.Maintains 15°C during absence and turns off fully automatically just in time for your return.
Smart-ResetSmart Reset
Wenn du manuell die Heizung aufdrehst, fängt das System dich auf und löscht den Boost nach Zeit oder Haus-Abwesenheit.If you manually crank up the heat, the system catches you and deletes the boost based on time or house absence.
Heizkurve: Komfort vs. EcoHeating Curve: Comfort vs. Eco
Beispiel für automatische Absenkung bei fehlender Raumanwesenheit.Example of automatic lowering when room is empty.
Häufig gestellte Fragen (FAQ)Frequently Asked Questions
Die größten Upgrades sind der neue Urlaubsmodus (inkl. automatischer Beendigung nach X Tagen), das Auto-Reset für den manuellen Modus (nach Zeit, Dauer oder Abwesenheit) und die in "Sections" aufgeräumte Benutzeroberfläche.The biggest upgrades are the new vacation mode (incl. automatic termination after X days), the auto-reset for manual mode (by time, duration, or absence), and the UI organized into "Sections".
Wenn du den manuellen Schalter auf dem Dashboard drückst, springt die Heizung auf die eingestellte Temperatur. In V2.3 kannst du Haken setzen, damit der Schalter sich von selbst wieder ausschaltet: Entweder nach X Minuten, um eine feste Uhrzeit oder wenn du das Haus verlässt. Die Heizung fällt dann zurück in den Automatik-Modus.When you press the manual switch on the dashboard, the heating jumps to the set temp. In V2.3 you can set checkmarks so the switch turns off by itself: Either after X minutes, at a set time, or when you leave the house. The heating then falls back to auto mode.
Ja! Du kannst z.B. 120 Minuten UND 22:00 Uhr aktivieren. Das System reagiert auf das Ereignis, welches zuerst eintritt.Yes! You can e.g., activate 120 minutes AND 22:00. The system reacts to the event that occurs first.
Der Urlaubsmodus (Prio 3) überschreibt die normalen Zeitpläne und die tägliche An-/Abwesenheit. Das System hält das Haus konstant auf der eingestellten Urlaubstemperatur (z.B. 15°C), um Energie zu sparen.Vacation mode (Prio 3) overrides normal schedules and daily presence/absence. The system keeps the house constant at the set vacation temp (e.g., 15°C) to save energy.
Du kannst in der Sektion "Urlaubsmodus" eine Anzahl an Tagen eintragen (z.B. 14). Die Automatisierung zählt ab dem Moment, wo du den Schalter aktivierst, die Sekunden. Exakt nach 14 Tagen (14 x 24 Stunden) schaltet sie den Helfer aus und das Haus heizt sich passend zu deiner Rückkehr wieder auf.You can enter a number of days (e.g., 14) in the "Vacation Mode" section. The automation counts the seconds from the moment you flip the switch. Exactly after 14 days (14 x 24 hours), it turns off the helper and the house heats up ready for your return.
Die Fenster-Erkennung ist ein Sicherheits-Feature und liegt standardmäßig über dem Automatik-Betrieb. In V2.3 hast du jedoch die volle Kontrolle darüber.Window detection is a safety feature and by default sits above auto mode. In V2.3, however, you have full control over this.
Ja! In der Sektion "Fenster-Erkennung" gibt es das Feld "Fenster-Absenkung zulassen in...". Entferne dort einfach "Manuell" oder "Urlaub", wenn offene Fenster in diesen Situationen ignoriert werden sollen.Yes! In the "Window Detection" section there is a field "Allow window setback in...". Simply remove "Manual" or "Vacation" if open windows should be ignored in these situations.
Der Sommer-Modus hat eine höhere Priorität. Wenn du im Urlaub bist, aber die Außentemperatur über 25°C steigt (und dein Sommer-Sensor greift), schaltet das System die Heizung komplett in den Frostschutz. Fällt die Temperatur, greifen wieder deine z.B. 15°C Urlaubstemperatur.Summer mode has a higher priority. If you are on vacation, but the outdoor temp rises above 25°C (and your summer sensor triggers), the system switches completely to frost protection. If the temp drops, your 15°C vacation temp takes over again.
Um die Automatisierung übersichtlicher zu machen, haben wir verwandte Einstellungen (z.B. alles zum Thema Fenster) in Blöcke (Sections) gepackt. Experten-Einstellungen wie die Zeitpläne sind oft standardmäßig eingeklappt (Collapsed) – klicke einfach auf den kleinen Pfeil, um sie zu sehen.To make the automation clearer, we packed related settings (e.g., everything about windows) into blocks (Sections). Expert settings like schedules are often collapsed by default – just click the small arrow to see them.
Delays brechen ab, sobald ein Blueprint neu ausgelöst wird (z.B. wenn sich eine Temperatur ändert). Um 100% zuverlässig zu sein, berechnet V2.3 die Zeiträume dynamisch über den "Zuletzt geändert"-Zeitstempel der Sensoren. Das ist absolut sturmsicher!Delays abort as soon as a blueprint is re-triggered (e.g., when a temp changes). To be 100% reliable, V2.3 dynamically calculates periods via the "last changed" timestamp of the sensors. This is absolutely storm-proof!
Der Blueprint ist robust. Er reagiert nur auf ein klares on (Offen). Steht der Sensor auf unknown oder unavailable, geht die Heizung davon aus, dass das Fenster geschlossen ist, damit du im Winter nicht frierst.The blueprint is robust. It only reacts to a clear on (Open). If the sensor is unknown or unavailable, the heating assumes the window is closed so you don't freeze in winter.
Gehe in Home Assistant auf Einstellungen -> Geräte & Dienste -> Helfer -> Helfer erstellen. Wähle "Nummer" (Slider), vergib einen Namen, wähle ein Icon, setze Minimum (z.B. 5) und Maximum (z.B. 30) sowie den Schritt (0.5). Diesen Helfer kannst du dann im Blueprint eintragen.Go to Settings -> Devices & Services -> Helpers -> Create Helper. Select "Number" (Slider), give a name, choose an icon, set minimum (e.g. 5) and maximum (e.g. 30) and step (0.5). Enter this helper in the blueprint.
Das ist ein gewolltes Feature gegen "GPS-Bouncing". In der Kern-Konfiguration gibt es die "Wartezeit bis Abwesenheit" (Standard: 60 Sekunden). Erst wenn dein Handy wirklich 60 Sekunden lang als "abwesend" gilt, fährt die Heizung herunter.This is an intended feature against "GPS-Bouncing". In the core configuration there is the "Wait time for absence" (Default: 60 seconds). Only when your phone is truly "absent" for 60 seconds will the heating turn down.
Lege dir einen Helfer vom Typ "Text" (input_text) an und trage ihn in Sektion 7 unter "Status-Text Ausgabe" ein. Lege dir diesen Helfer auf dein Dashboard – er zeigt dir immer in Echtzeit und auf Deutsch an, in welchem Modus sich die Heizung gerade befindet (z.B. "🕒 Auto (Tag | Komf.) - Soll: 21.0 °C").Create a helper of type "Text" (input_text) and enter it in Section 7 under "Status Text Output". Put this helper on your dashboard – it always shows in real-time which mode the heating is currently in (e.g. "🕒 Auto (Day | Comf.) - Target: 21.0 °C").
Nichts ist störender, als zum Heizen das Handy suchen zu müssen. Nutze einfach einen physischen Zigbee-Button (z.B. von IKEA oder Aqara) und klebe ihn an die Wand. Erstelle in HA eine simple Automation, die bei Knopfdruck deinen "Manuellen Schalter" (Prio 1) auf ON toggelt. Dank dem neuen Auto-Reset (z.B. nach 60 Minuten) geht die Heizung danach von ganz allein wieder aus. Perfekter WAF!Nothing is more annoying than having to find your phone to heat the room. Simply use a physical Zigbee button (e.g. IKEA or Aqara) and stick it to the wall. Create a simple HA automation that toggles your "Manual Switch" (Prio 1) to ON when pressed. Thanks to the new Auto-Reset (e.g., after 60 minutes), the heating turns off by itself later. Perfect WAF!
Ja, aber Fußbodenheizungen sind extrem träge. Du solltest folgendes beachten: 1. Setze die Startzeiten in den Zeitplänen ca. 2 Stunden früher an. 2. Verzichte auf die "Fenster-Erkennung", da ein 5-Minuten-Lüften die schwere Estrich-Masse ohnehin nicht auskühlt und ein Abschalten des Ventils hier kontraproduktiv wäre (entferne einfach den Sensor im Blueprint).Yes, but underfloor heating is extremely slow to react. You should consider: 1. Set the start times in the schedules about 2 hours earlier. 2. Skip the "Window Detection", as a 5-minute ventilation won't cool down the heavy floor mass anyway and shutting off the valve would be counterproductive (just remove the sensor in the blueprint).
Ich kann jetzt mehrere Fenster direkt im Blueprint auswählen. Soll ich das nutzen, oder lieber weiterhin eine Helfer-Gruppe in Home Assistant erstellen? Das bleibt ganz dir überlassen! Das Update 2.4.0 verarbeitet beides fehlerfrei. Die direkte Auswahl (Multi-Select) ist oft schneller und bequemer für Anfänger. Helfer-Gruppen sind praktisch, wenn du diese exakte Fenster-Gruppe auch in anderen Automatisierungen oder Dashboards wiederverwenden möchtest. (Siehe Sektion 4)I can now select multiple windows directly in the blueprint. Should I use this, or rather continue to create a helper group in Home Assistant? That is entirely up to you! Update 2.4.0 processes both flawlessly. The direct selection (Multi-Select) is often faster and more convenient for beginners. Helper groups are practical if you want to reuse this exact window group in other automations or dashboards. (See Section 4)
Ich habe von V2.3.0 auf V2.4.0 aktualisiert. Plötzlich sehe ich keine Auswahlfelder für Thermostate und Fenster mehr. Ist der Blueprint kaputt? Nein, das ist ein bekanntes Anzeigeproblem von Home Assistant beim Wechsel von Einzel- auf Mehrfachauswahl. Lösung: Klicke oben rechts in der Automatisierung auf die drei Punkte -> "Als YAML bearbeiten". Suche die Zeile climate_entity: und setze eckige Klammern um deinen Eintrag (aus climate.wohn wird [climate.wohn]). Wechsle zurück zum visuellen Editor und alles ist wieder da!I updated from V2.3.0 to V2.4.0. Suddenly I don't see any selection fields for thermostats and windows anymore. Is the blueprint broken? No, this is a known display issue in Home Assistant when switching from single to multiple selection. Solution: Click the three dots in the top right of the automation -> "Edit in YAML". Find the line climate_entity: and put square brackets around your entry (change climate.wohn to [climate.wohn]). Switch back to the visual editor and everything is back!
Alle Sektionen klappen sich wunderbar zusammen, nur "1️⃣ Kern-Konfiguration" weigert sich. Warum? Das ist ein fest integriertes Sicherheitsfeature von Home Assistant. Sektionen, die noch ein unausgefülltes Pflichtfeld enthalten, dürfen nicht zugeklappt werden. Da du zwingend ein Thermostat (climate_entity) angeben musst, sperrt HA das Einklappen. Sobald du ein Gerät ausgewählt hast, erscheint auch der Pfeil zum Einklappen. (Siehe Sektion 1)All sections collapse beautifully, only "1️⃣ Core Configuration" refuses. Why? This is a hard-coded security feature of Home Assistant. Sections that still contain an unfilled required field cannot be collapsed. Since you must specify a thermostat (climate_entity), HA blocks collapsing. As soon as you have selected a device, the arrow to collapse appears. (See Section 1)
Kann ich im Feld "Fenster-Sensor(en)" auch meine Balkontür auswählen? Ja, absolut. Du kannst dort jeden Entitätstypen der Klasse binary_sensor eintragen, sei es ein Fenster, eine Tür, ein Schiebetor oder ein Dachfenster. Die Logik löst sofort die Temperatur-Absenkung aus, sobald auch nur einer dieser ausgewählten Kontakte den Status "offen" (on) meldet.Can I also select my balcony door in the "Window Sensor(s)" field? Yes, absolutely. You can enter any entity type of the class binary_sensor there, be it a window, a door, a sliding gate, or a skylight. The logic immediately triggers the temperature setback as soon as even one of these selected contacts reports the status "open" (on).
Wenn ich im Wohnzimmer drei Heizkörperthermostate im Blueprint auswähle, regeln die dann alle synchron? Ja. Die Logik der Version 2.4.0 berechnet den Zielwert (z.B. 21°C für "Tag Komfort") und sendet diesen Befehl exakt zeitgleich an alle von dir ausgewählten Thermostate in dieser Blueprint-Instanz.If I select three radiator thermostats in the living room in the blueprint, do they all regulate synchronously? Yes. The logic of version 2.4.0 calculates the target value (e.g., 21°C for "Day Comfort") and sends this command at exactly the same time to all thermostats you selected in this blueprint instance.
Ich habe mir viel Mühe gegeben, Gruppen in HA anzulegen. Muss ich die jetzt alle löschen und neu klicken? Auf keinen Fall! Version 2.4.0 ist zu 100% abwärtskompatibel. Die neue, smarte Hintergrund-Logik (expand()) erkennt automatisch, ob du ihr eine Gruppe übergibst und löst diese intern völlig selbstständig in die einzelnen Sensoren/Thermostate auf.I put a lot of effort into creating groups in HA. Do I have to delete them all and click them again? Absolutely not! Version 2.4.0 is 100% backwards compatible. The new, smart background logic (expand()) automatically detects whether you pass it a group and resolves it internally completely independently into the individual sensors/thermostats.
In den Patchnotes steht etwas von "Netzwerk-Spam Schutz". Was bedeutet das für mich? Smarthome-Netzwerke mögen es nicht, wenn sie hunderte gleiche Befehle pro Minute erhalten. Der Blueprint sendet den Befehl "Stelle auf 21°C" nur dann an die Liste deiner Thermostate, wenn er vorher geprüft hat, ob mindestens eines dieser Thermostate aktuell auf einem anderen Wert steht. Stehen alle schon auf 21°C, wird das Signal komplett geblockt. Das schont die Batterien deiner Thermostate und hält dein Netzwerk reaktionsschnell!The patch notes mention "Network Spam Protection". What does that mean for me? Smarthome networks do not like receiving hundreds of the same commands per minute. The blueprint only sends the command "Set to 21°C" to the list of your thermostats if it has previously checked whether at least one of these thermostats is currently set to a different value. If they are all already at 21°C, the signal is completely blocked. This saves the batteries of your thermostats and keeps your network responsive!
Ü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. 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.
Für mich ist das Automatisieren nicht nur ein Hobby, sondern ein Lifestyle. Wenn ich im Haus noch Lichtschalter drücken oder Heizkörper manuell drehen muss, empfinde ich das als persönliche Niederlage. Technik muss lautlos, intelligent und effizient im Hintergrund arbeiten. Genau aus diesem Grundgedanken ist der SNO-perfekt-Heating Blueprint entstanden. Ich wollte eine Steuerung, über die ich nicht nachdenken muss; eine, die bei offenem Fenster, laufendem Kamin oder plötzlichem Sommer-Wetter vollautomatisch die exakt richtige Entscheidung trifft. For me, automation isn't just a hobby; it's a lifestyle. Having to press light switches or manually turn thermostats feels like a personal failure. Technology must work silently, intelligently, and efficiently in the background. That's exactly why the SNO-perfekt-Heating blueprint was born. I wanted a heating system I don't have to think about; one that makes the perfect decision completely automatically when a window is open, the fireplace is on, or summer suddenly hits.
Es macht mir großen Spaß, smarte Lösungen (und den dazugehörigen Code) auszuarbeiten, stetig zu optimieren und schließlich mit der Community zu teilen. Wenn mein Blueprint dir hilft, deinen Alltag etwas bequemer und dein Haus etwas smarter zu machen, habe ich mein Ziel erreicht! I deeply enjoy developing smart solutions (and the corresponding code), optimizing them constantly, and sharing them with the community. If my blueprint helps make your everyday life a little more comfortable and your home a bit smarter, I've reached my goal!
Blueprint CodeBlueprint Code
Kopiere den YAML-Code oder lade die Datei herunter.Copy the YAML code or download the file.
# --- @SyncNetOps || SNO-perfekt-Heating || V2.4.0-F5 || 15052026---
blueprint:
name: SNO-perfekt-Heating V2.4.0
description: |
# 🌟 SNO-perfekt-Heating
Diese intelligente Heizungssteuerung optimiert deinen Komfort und Energieverbrauch durch eine dynamische Prioritäten-Logik (Manuell > Sommer > Urlaub > Fenster > Extern > Abwesend > Auto).
### 🛠️ Kurzanleitung zur Einrichtung:
**1️⃣ Kern-Konfiguration:** Wähle deine Thermostate & Anwesenheits-Helfer.
**2️⃣ Manuell:** Schalter für Handbetrieb & automatische Rücksetzung.
**3️⃣ Urlaub:** Urlaubs-Modus & automatische Deaktivierung nach X Tagen.
**4️⃣ Fenster:** Sensoren & Zuweisung, wann Fenster relevant sind.
**5️⃣ Sommer & Extern:** Kamin-Erkennung & automatische Sommer-Abschaltung.
**6️⃣ Zeitpläne (Auto):** Uhrzeiten & Zieltemperaturen für deinen Alltag.
**7️⃣ Dashboard:** Helfer für Status-Anzeigen in deiner UI.
---
🔗 **Hilfe & Detaillierte Anleitung:** [Projektseite / FAQ](https://sno.mb222.de/ph-faq/)
🐞 **Fehler gefunden?** [Issue auf GitHub öffnen](https://github.com/SyncNetOps/SNO-perfekt-Heating-V2)
domain: automation
input:
# --- 1️⃣ BASIS SETUP ---
section_core:
name: "1️⃣ Kern-Konfiguration"
icon: mdi:thermostat
collapsed: true
input:
climate_entity:
name: Klima-Entität(en) (Thermostate)
description: "Wähle ein oder mehrere Thermostate oder eine Helfer-Gruppe aus."
selector:
entity:
domain: climate
multiple: true
home_presence:
name: Anwesenheit Haus (Optional)
description: "Leer = Haus gilt als 'immer bewohnt'."
default: []
selector: {entity: {domain: [binary_sensor, input_boolean]}}
no_home_presence_wait:
name: Wartezeit bis Abwesenheit (Sekunden)
default: 60
selector: {number: {min: 0.0, max: 3600.0, step: 1.0, mode: slider}}
room_presence:
name: Raum-Anwesenheit (Optional)
description: "Leer = Raum gilt als 'immer belegt'."
default: []
selector: {entity: {domain: [binary_sensor, input_boolean]}}
away_temperature:
name: Abwesenheits-Temperatur (Regler)
default: 16.5
selector: {number: {min: 5.0, max: 30.0, step: 0.1, mode: slider}}
away_temperature_entity:
name: Abwesenheits-Temperatur (Entität / Optional)
default: []
selector: {entity: {domain: [input_number, number]}}
# --- 2️⃣ MANUELLER MODUS ---
section_manual:
name: "2️⃣ Manueller Modus & Auto-Reset"
icon: mdi:hand-back-right
collapsed: true
input:
manual_temperature_control:
name: ✋ Manueller Schalter (Optional)
default: []
selector: {entity: {domain: [binary_sensor, input_boolean]}}
manual_temperature:
name: ✋ Manuelle Temperatur (Eingabe)
default: []
selector: {entity: {domain: [input_number, number]}}
manual_auto_off_time_enabled:
name: ⏰ Auto-Aus per Uhrzeit
description: "Deaktiviert den manuellen Modus zu einer festen Uhrzeit."
default: false
selector: {boolean: {}}
manual_auto_off_time:
name: ↳ Deaktivierungs-Uhrzeit
default: "22:00:00"
selector: {time: {}}
manual_auto_off_duration_enabled:
name: ⏳ Auto-Aus nach Dauer
description: "Deaktiviert den manuellen Modus nach X Minuten."
default: false
selector: {boolean: {}}
manual_auto_off_duration:
name: ↳ Dauer in Minuten
default: 120
selector: {number: {min: 1, max: 1440, mode: box}}
manual_auto_off_presence:
name: 🚶 Auto-Aus bei Haus-Abwesenheit
description: "Deaktiviert den manuellen Modus, sobald das Haus verlassen wird."
default: false
selector: {boolean: {}}
# --- 3️⃣ URLAUBSMODUS ---
section_vacation:
name: "3️⃣ Urlaubsmodus"
icon: mdi:palm-tree
collapsed: true
input:
vacation_switch:
name: 🌴 Urlaubsmodus Schalter (Optional)
default: []
selector: {entity: {domain: [input_boolean, binary_sensor]}}
vacation_temperature:
name: 🌴 Urlaubs-Temperatur (Regler)
default: 15.0
selector: {number: {min: 4.0, max: 30.0, step: 0.5, mode: slider}}
vacation_temperature_entity:
name: 🌴 Urlaubs-Temperatur (Entität / Optional)
default: []
selector: {entity: {domain: [input_number, number]}}
vacation_auto_off_days_enabled:
name: 📅 Auto-Aus nach Tagen
description: "Deaktiviert den Urlaub automatisch nach X Tagen."
default: false
selector: {boolean: {}}
vacation_auto_off_days:
name: ↳ Anzahl Tage
default: 14
selector: {number: {min: 1, max: 365, mode: box}}
# --- 4️⃣ FENSTER-ERKENNUNG ---
section_window:
name: "4️⃣ Fenster-Erkennung (Dynamisch)"
icon: mdi:window-open
collapsed: true
input:
window_sensor:
name: 🪟 Fenster-Sensor(en) (Optional)
description: "Wähle ein oder mehrere Fenster-Sensoren oder eine Helfer-Gruppe aus."
default: []
selector:
entity:
domain: binary_sensor
multiple: true
window_temperature:
name: 🪟 Fenster Offen Temperatur (Regler)
default: 5.0
selector: {number: {min: 4.0, max: 30.0, step: 0.5, mode: slider}}
window_temperature_entity:
name: 🪟 Fenster Offen Temperatur (Entität / Optional)
default: []
selector: {entity: {domain: [input_number, number]}}
window_active_modes:
name: 🎯 Fenster-Absenkung zulassen in...
description: "Wähle, in welchen Modi ein offenes Fenster die Heizung absenken darf."
default: ["auto", "away", "manual", "vacation"]
selector:
select:
multiple: true
custom_value: false
options:
- label: 🕒 Auto (Zeitpläne)
value: auto
- label: 🚶 Abwesend
value: away
- label: ✋ Manuell
value: manual
- label: 🌴 Urlaub
value: vacation
- label: 🔥 Extern (Kamin)
value: extern
# --- 5️⃣ SOMMER & EXTERN ---
section_summer_extern:
name: "5️⃣ Sommer & Extern (Kamin)"
icon: mdi:weather-sunny
collapsed: true
input:
extern_mode_switch:
name: 🔥 Extern-Modus Schalter (Optional)
default: []
selector: {entity: {domain: [input_boolean, binary_sensor, switch]}}
extern_temperature:
name: 🔥 Extern-Temperatur (Regler)
default: 15.0
selector: {number: {min: 4.0, max: 30.0, step: 0.5, mode: slider}}
extern_temperature_entity:
name: 🔥 Extern-Temperatur (Entität / Optional)
default: []
selector: {entity: {domain: [input_number, number]}}
summer_mode_toggle:
name: ☀️ Sommer-Modus Schalter (Optional)
default: []
selector: {entity: {domain: [input_boolean, binary_sensor]}}
summer_sensor:
name: ☀️ Sommer-Sensor (Optional)
default: []
selector: {entity: {domain: sensor, device_class: temperature}}
summer_sensor_threshold:
name: ☀️ Sommer-Sensor Schwellwert (°C)
default: 22.0
selector: {number: {min: 10.0, max: 40.0, step: 0.5, mode: slider}}
summer_temperature_static:
name: ☀️ Sommer-Temperatur (Regler)
default: 5.0
selector: {number: {min: 4.0, max: 30.0, step: 0.5, mode: slider}}
summer_temperature_entity:
name: ☀️ Sommer-Temperatur (Entität / Optional)
default: []
selector: {entity: {domain: [input_number, number]}}
# --- 6️⃣ ZEITPLÄNE (AUTO) ---
section_schedules:
name: "6️⃣ Zeitpläne (Morgen, Tag, Abend, Nacht)"
icon: mdi:clock-outline
collapsed: true
input:
morning_time:
name: ⏰ Startzeit Morgen
default: "06:00:00"
selector: {time: {}}
morning_eco_temperature:
name: Morgen Eco (Regler)
default: 19.0
selector: {number: {min: 5.0, max: 30.0, step: 0.1, mode: slider}}
morning_eco_temperature_entity:
name: Morgen Eco (Entität)
default: []
selector: {entity: {domain: [input_number, number]}}
morning_comfort_temperature:
name: Morgen Komfort (Regler)
default: 21.0
selector: {number: {min: 5.0, max: 30.0, step: 0.1, mode: slider}}
morning_comfort_temperature_entity:
name: Morgen Komfort (Entität)
default: []
selector: {entity: {domain: [input_number, number]}}
day_time:
name: ⏰ Startzeit Tag
default: "09:00:00"
selector: {time: {}}
day_eco_temperature:
name: Tag Eco (Regler)
default: 19.0
selector: {number: {min: 5.0, max: 30.0, step: 0.1, mode: slider}}
day_eco_temperature_entity:
name: Tag Eco (Entität)
default: []
selector: {entity: {domain: [input_number, number]}}
day_comfort_temperature:
name: Tag Komfort (Regler)
default: 21.0
selector: {number: {min: 5.0, max: 30.0, step: 0.1, mode: slider}}
day_comfort_temperature_entity:
name: Tag Komfort (Entität)
default: []
selector: {entity: {domain: [input_number, number]}}
evening_time:
name: ⏰ Startzeit Abend
default: "17:00:00"
selector: {time: {}}
evening_eco_temperature:
name: Abend Eco (Regler)
default: 18.0
selector: {number: {min: 5.0, max: 30.0, step: 0.1, mode: slider}}
evening_eco_temperature_entity:
name: Abend Eco (Entität)
default: []
selector: {entity: {domain: [input_number, number]}}
evening_comfort_temperature:
name: Abend Komfort (Regler)
default: 21.0
selector: {number: {min: 5.0, max: 30.0, step: 0.1, mode: slider}}
evening_comfort_temperature_entity:
name: Abend Komfort (Entität)
default: []
selector: {entity: {domain: [input_number, number]}}
night_time:
name: ⏰ Startzeit Nacht
default: "21:00:00"
selector: {time: {}}
night_eco_temperature:
name: Nacht Eco (Regler)
default: 17.0
selector: {number: {min: 5.0, max: 30.0, step: 0.1, mode: slider}}
night_eco_temperature_entity:
name: Nacht Eco (Entität)
default: []
selector: {entity: {domain: [input_number, number]}}
night_comfort_temperature:
name: Nacht Komfort (Regler)
default: 21.0
selector: {number: {min: 5.0, max: 30.0, step: 0.1, mode: slider}}
night_comfort_temperature_entity:
name: Nacht Komfort (Entität)
default: []
selector: {entity: {domain: [input_number, number]}}
# --- 7️⃣ DASHBOARD STATUS ---
section_status:
name: "7️⃣ Dashboard Status & Helper"
icon: mdi:monitor-dashboard
collapsed: true
input:
status_text_entity:
name: ℹ️ Status-Text Ausgabe (Optional)
default: []
selector: {entity: {domain: input_text}}
window_status_boolean:
name: ℹ️ Fenster-Status Schalter (Optional)
default: []
selector: {entity: {domain: input_boolean}}
summer_status_boolean:
name: ℹ️ Sommer-Status Schalter (Optional)
default: []
selector: {entity: {domain: input_boolean}}
extern_status_boolean:
name: ℹ️ Extern-Status Schalter (Optional)
default: []
selector: {entity: {domain: input_boolean}}
mode: restart
max_exceeded: silent
trigger_variables:
trig_man_ctrl: !input manual_temperature_control
trig_man_dur_en: !input manual_auto_off_duration_enabled
trig_man_dur: !input manual_auto_off_duration
trig_man_time_en: !input manual_auto_off_time_enabled
trig_man_time: !input manual_auto_off_time
trig_man_pres: !input manual_auto_off_presence
trig_home: !input home_presence
trig_home_wait: !input no_home_presence_wait
trig_vac_switch: !input vacation_switch
trig_vac_days_en: !input vacation_auto_off_days_enabled
trig_vac_days: !input vacation_auto_off_days
variables:
climate_entity: !input climate_entity
home_presence: !input home_presence
no_home_presence_wait: !input no_home_presence_wait
room_presence: !input room_presence
window_active_modes: !input window_active_modes
away_temperature: !input away_temperature
away_temperature_entity: !input away_temperature_entity
manual_temperature_control: !input manual_temperature_control
manual_temperature: !input manual_temperature
vacation_switch: !input vacation_switch
vacation_temperature: !input vacation_temperature
vacation_temperature_entity: !input vacation_temperature_entity
window_sensor: !input window_sensor
window_temperature: !input window_temperature
window_temperature_entity: !input window_temperature_entity
extern_mode_switch: !input extern_mode_switch
extern_temperature: !input extern_temperature
extern_temperature_entity: !input extern_temperature_entity
summer_mode_toggle: !input summer_mode_toggle
summer_sensor: !input summer_sensor
summer_sensor_threshold: !input summer_sensor_threshold
summer_temperature_static: !input summer_temperature_static
summer_temperature_entity: !input summer_temperature_entity
morning_time: !input morning_time
morning_eco_temperature: !input morning_eco_temperature
morning_eco_temperature_entity: !input morning_eco_temperature_entity
morning_comfort_temperature: !input morning_comfort_temperature
morning_comfort_temperature_entity: !input morning_comfort_temperature_entity
day_time: !input day_time
day_eco_temperature: !input day_eco_temperature
day_eco_temperature_entity: !input day_eco_temperature_entity
day_comfort_temperature: !input day_comfort_temperature
day_comfort_temperature_entity: !input day_comfort_temperature_entity
evening_time: !input evening_time
evening_eco_temperature: !input evening_eco_temperature
evening_eco_temperature_entity: !input evening_eco_temperature_entity
evening_comfort_temperature: !input evening_comfort_temperature
evening_comfort_temperature_entity: !input evening_comfort_temperature_entity
night_time: !input night_time
night_eco_temperature: !input night_eco_temperature
night_eco_temperature_entity: !input night_eco_temperature_entity
night_comfort_temperature: !input night_comfort_temperature
night_comfort_temperature_entity: !input night_comfort_temperature_entity
status_text_entity: !input status_text_entity
window_status_boolean: !input window_status_boolean
summer_status_boolean: !input summer_status_boolean
extern_status_boolean: !input extern_status_boolean
manual_auto_off_time_enabled: !input manual_auto_off_time_enabled
manual_auto_off_time: !input manual_auto_off_time
manual_auto_off_duration_enabled: !input manual_auto_off_duration_enabled
manual_auto_off_duration: !input manual_auto_off_duration
manual_auto_off_presence: !input manual_auto_off_presence
vacation_auto_off_days_enabled: !input vacation_auto_off_days_enabled
vacation_auto_off_days: !input vacation_auto_off_days
eff_away: >-
{% set ent = away_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(16.5) }}
{% else %} {{ away_temperature | float(16.5) }} {% endif %}
eff_window: >-
{% set ent = window_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(5.0) }}
{% else %} {{ window_temperature | float(5.0) }} {% endif %}
eff_extern: >-
{% set ent = extern_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(15.0) }}
{% else %} {{ extern_temperature | float(15.0) }} {% endif %}
eff_summer: >-
{% set ent = summer_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(5.0) }}
{% else %} {{ summer_temperature_static | float(5.0) }} {% endif %}
eff_vacation: >-
{% set ent = vacation_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(15.0) }}
{% else %} {{ vacation_temperature | float(15.0) }} {% endif %}
eff_m_eco: >-
{% set ent = morning_eco_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(19.0) }}
{% else %} {{ morning_eco_temperature | float(19.0) }} {% endif %}
eff_m_comf: >-
{% set ent = morning_comfort_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(21.0) }}
{% else %} {{ morning_comfort_temperature | float(21.0) }} {% endif %}
eff_d_eco: >-
{% set ent = day_eco_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(19.0) }}
{% else %} {{ day_eco_temperature | float(19.0) }} {% endif %}
eff_d_comf: >-
{% set ent = day_comfort_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(21.0) }}
{% else %} {{ day_comfort_temperature | float(21.0) }} {% endif %}
eff_e_eco: >-
{% set ent = evening_eco_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(18.0) }}
{% else %} {{ evening_eco_temperature | float(18.0) }} {% endif %}
eff_e_comf: >-
{% set ent = evening_comfort_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(21.0) }}
{% else %} {{ evening_comfort_temperature | float(21.0) }} {% endif %}
eff_n_eco: >-
{% set ent = night_eco_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(17.0) }}
{% else %} {{ night_eco_temperature | float(17.0) }} {% endif %}
eff_n_comf: >-
{% set ent = night_comfort_temperature_entity %}
{% if ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] %} {{ states(ent) | float(21.0) }}
{% else %} {{ night_comfort_temperature | float(21.0) }} {% endif %}
is_manual: >-
{% set ent = manual_temperature_control %}
{{ ent != [] and ent != none and is_state(ent, 'on') }}
is_vacation: >-
{% set ent = vacation_switch %}
{{ ent != [] and ent != none and is_state(ent, 'on') }}
is_room_occupied: >-
{% set ent = room_presence %}
{{ ent == [] or ent == none or is_state(ent, 'on') }}
is_extern: >-
{% set ent = extern_mode_switch %}
{{ ent != [] and ent != none and is_state(ent, 'on') }}
is_summer_toggle: >-
{% set ent = summer_mode_toggle %}
{{ ent != [] and ent != none and is_state(ent, 'on') }}
is_summer_sensor: >-
{% set ent = summer_sensor %}
{{ ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', ''] and states(ent) | float(0) >= (summer_sensor_threshold | float(22.0)) }}
is_summer: "{{ is_summer_toggle | bool or is_summer_sensor | bool }}"
is_window_open: >-
{% set ent = window_sensor %}
{% if ent != [] and ent != none %}
{{ expand(ent) | selectattr('state', 'eq', 'on') | list | length > 0 }}
{% else %} false {% endif %}
open_windows_text: >-
{% set ent = window_sensor %}
{% if ent != [] and ent != none %}
{% set opens = expand(ent) | selectattr('state', 'eq', 'on') | list %}
{% set count = opens | length %}
{% if count > 0 %}
{% set names = opens | map(attribute='name') | join(', ') %}
{% if count == 1 %} 1 Fenster ({{ names }}) offen
{% else %} {{ count }} Fenster ({{ names }}) offen {% endif %}
{% else %} geschlossen {% endif %}
{% else %} geschlossen {% endif %}
is_away: >-
{% if home_presence == [] or home_presence == none or is_state(home_presence, 'on') %} false
{% else %}
{% set entity_obj = states[home_presence] %}
{% if entity_obj %}
{{ (now() - entity_obj.last_changed).total_seconds() >= (no_home_presence_wait | float(0)) }}
{% else %} false {% endif %}
{% endif %}
current_period: >-
{% set t = now() %}
{% set m = today_at(morning_time) %}
{% set d = today_at(day_time) %}
{% set e = today_at(evening_time) %}
{% set n = today_at(night_time) %}
{% if m <= t < d %} Morgen
{% elif d <= t < e %} Tag
{% elif e <= t < n %} Abend
{% else %} Nacht {% endif %}
base_mode: >-
{% if is_manual | bool %}manual
{% elif is_summer | bool %}summer
{% elif is_vacation | bool %}vacation
{% elif is_extern | bool %}extern
{% elif is_away | bool %}away
{% else %}auto{% endif %}
base_temp: >-
{% if is_manual | bool %}
{% set ent = manual_temperature %}
{{ states(ent) | float(21.0) if (ent != [] and ent != none and states(ent) not in ['unknown', 'unavailable', 'none', '']) else 21.0 }}
{% elif is_summer | bool %}{{ eff_summer | float }}
{% elif is_vacation | bool %}{{ eff_vacation | float }}
{% elif is_extern | bool %}{{ eff_extern | float }}
{% elif is_away | bool %}{{ eff_away | float }}
{% else %}
{% if current_period == 'Morgen' %}{{ eff_m_comf | float if is_room_occupied | bool else eff_m_eco | float }}
{% elif current_period == 'Tag' %}{{ eff_d_comf | float if is_room_occupied | bool else eff_d_eco | float }}
{% elif current_period == 'Abend' %}{{ eff_e_comf | float if is_room_occupied | bool else eff_e_eco | float }}
{% else %}{{ eff_n_comf | float if is_room_occupied | bool else eff_n_eco | float }}{% endif %}
{% endif %}
calc_target_temp: >-
{% if is_window_open | bool and base_mode in window_active_modes %}
{{ eff_window | float }}
{% else %}
{{ base_temp | float }}
{% endif %}
status_string: >-
{% if is_window_open | bool and base_mode in window_active_modes %}🪟 {{ open_windows_text }} - Soll: {{ calc_target_temp }} °C
{% elif base_mode == 'manual' %}✋ Manuell - Soll: {{ calc_target_temp }} °C
{% elif base_mode == 'summer' %}☀️ Sommermodus - Soll: {{ calc_target_temp }} °C
{% elif base_mode == 'vacation' %}🌴 Urlaub - Soll: {{ calc_target_temp }} °C
{% elif base_mode == 'extern' %}🔥 Extern-Betrieb - Soll: {{ calc_target_temp }} °C
{% elif base_mode == 'away' %}🚶 Abwesend - Soll: {{ calc_target_temp }} °C
{% else %}
{% set mode_str = 'Komf.' if is_room_occupied | bool else 'ECO' %}
🕒 Auto ({{ current_period }} | {{ mode_str }}) - Soll: {{ calc_target_temp }} °C
{% endif %}
trigger:
- platform: state
entity_id: !input climate_entity
from: unavailable
- platform: time
at: !input morning_time
- platform: time
at: !input day_time
- platform: time
at: !input evening_time
- platform: time
at: !input night_time
- platform: state
entity_id: !input home_presence
- platform: state
entity_id: !input room_presence
- platform: state
entity_id: !input manual_temperature_control
- platform: state
entity_id: !input manual_temperature
- platform: state
entity_id: !input vacation_switch
- platform: state
entity_id: !input vacation_temperature_entity
- platform: state
entity_id: !input extern_mode_switch
- platform: state
entity_id: !input extern_temperature_entity
- platform: state
entity_id: !input summer_mode_toggle
- platform: state
entity_id: !input summer_sensor
- platform: state
entity_id: !input window_sensor
- platform: state
entity_id: !input away_temperature_entity
- platform: template
value_template: >-
{% if trig_man_dur_en and trig_man_ctrl != [] and trig_man_ctrl != none %}
{% if is_state(trig_man_ctrl, 'on') %}
{{ (now() - states[trig_man_ctrl].last_changed).total_seconds() >= (trig_man_dur | float(120) * 60) }}
{% else %}false{% endif %}
{% else %}false{% endif %}
- platform: template
value_template: >-
{% if trig_man_time_en and trig_man_ctrl != [] and trig_man_ctrl != none %}
{{ is_state(trig_man_ctrl, 'on') and now().strftime('%H:%M') == trig_man_time[0:5] }}
{% else %}false{% endif %}
- platform: template
value_template: >-
{% if trig_man_pres and trig_man_ctrl != [] and trig_man_ctrl != none and trig_home != [] and trig_home != none %}
{% if is_state(trig_man_ctrl, 'on') and is_state(trig_home, 'off') %}
{{ (now() - states[trig_home].last_changed).total_seconds() >= (trig_home_wait | float(0)) }}
{% else %}false{% endif %}
{% else %}false{% endif %}
- platform: template
value_template: >-
{% if trig_vac_days_en and trig_vac_switch != [] and trig_vac_switch != none %}
{% if is_state(trig_vac_switch, 'on') %}
{{ (now() - states[trig_vac_switch].last_changed).total_seconds() >= (trig_vac_days | float(14) * 86400) }}
{% else %}false{% endif %}
{% else %}false{% endif %}
condition: []
action:
- choose:
- conditions:
- condition: template
value_template: >-
{% set ent = manual_temperature_control %}
{% if ent != [] and ent != none and is_state(ent, 'on') %}
{% set cond_time = (manual_auto_off_time_enabled and now().strftime('%H:%M') == manual_auto_off_time[0:5]) %}
{% set cond_dur = (manual_auto_off_duration_enabled and (now() - states[ent].last_changed).total_seconds() >= (manual_auto_off_duration | float(120) * 60)) %}
{% set home = home_presence %}
{% set cond_pres = (manual_auto_off_presence and home != [] and home != none and is_state(home, 'off') and (now() - states[home].last_changed).total_seconds() >= (no_home_presence_wait | float(0))) %}
{{ cond_time or cond_dur or cond_pres }}
{% else %}false{% endif %}
sequence:
- service: input_boolean.turn_off
target:
entity_id: !input manual_temperature_control
- stop: "Deaktiviert."
- conditions:
- condition: template
value_template: >-
{% set ent = vacation_switch %}
{% if ent != [] and ent != none and is_state(ent, 'on') %}
{{ vacation_auto_off_days_enabled and (now() - states[ent].last_changed).total_seconds() >= (vacation_auto_off_days | float(14) * 86400) }}
{% else %}false{% endif %}
sequence:
- service: input_boolean.turn_off
target:
entity_id: !input vacation_switch
- stop: "Deaktiviert."
- choose:
- conditions:
- condition: template
value_template: >-
{% set ent = summer_status_boolean %}
{{ ent != [] and ent != none and is_state(ent, 'on') == false and is_summer | bool == true }}
sequence:
- service: input_boolean.turn_on
target:
entity_id: !input summer_status_boolean
- conditions:
- condition: template
value_template: >-
{% set ent = summer_status_boolean %}
{{ ent != [] and ent != none and is_state(ent, 'on') == true and is_summer | bool == false }}
sequence:
- service: input_boolean.turn_off
target:
entity_id: !input summer_status_boolean
- choose:
- conditions:
- condition: template
value_template: >-
{% set ent = window_status_boolean %}
{{ ent != [] and ent != none and is_state(ent, 'on') == false and (is_window_open | bool and base_mode in window_active_modes) == true }}
sequence:
- service: input_boolean.turn_on
target:
entity_id: !input window_status_boolean
- conditions:
- condition: template
value_template: >-
{% set ent = window_status_boolean %}
{{ ent != [] and ent != none and is_state(ent, 'on') == true and (is_window_open | bool and base_mode in window_active_modes) == false }}
sequence:
- service: input_boolean.turn_off
target:
entity_id: !input window_status_boolean
- choose:
- conditions:
- condition: template
value_template: >-
{% set ent = extern_status_boolean %}
{{ ent != [] and ent != none and is_state(ent, 'on') == false and is_extern | bool == true }}
sequence:
- service: input_boolean.turn_on
target:
entity_id: !input extern_status_boolean
- conditions:
- condition: template
value_template: >-
{% set ent = extern_status_boolean %}
{{ ent != [] and ent != none and is_state(ent, 'on') == true and is_extern | bool == false }}
sequence:
- service: input_boolean.turn_off
target:
entity_id: !input extern_status_boolean
- choose:
- conditions:
- condition: template
value_template: >-
{% set ent = status_text_entity %}
{{ ent != [] and ent != none and states(ent) != status_string }}
sequence:
- service: input_text.set_value
data:
value: "{{ status_string }}"
target:
entity_id: !input status_text_entity
- choose:
- conditions:
- condition: template
value_template: >-
{% set target = calc_target_temp | float(-99) %}
{% set ns = namespace(update_needed=false) %}
{% for state in expand(climate_entity) %}
{% set curr = state.attributes.temperature | float(-99) %}
{% if curr != target %}
{% set ns.update_needed = true %}
{% endif %}
{% endfor %}
{{ ns.update_needed }}
sequence:
- service: climate.set_temperature
data:
temperature: "{{ calc_target_temp | float }}"
target:
entity_id: !input climate_entity