SNO_HeatFlow
Smarte Heizpläne.
Ohne Automatisierungs-Chaos.
Smart heating schedules.
Without the automation chaos.
Dieser hochmoderne Home Assistant Blueprint bringt flexible, zonenbasierte Heizungssteuerung auf das nächste Level. Er meistert bis zu 7 Zeitfenster, dynamische Abwesenheitserkennung und komplexe Urlaubs-Modi – fehlerfrei und ohne unzählige Automatisierungen zu schreiben. This state-of-the-art Home Assistant blueprint takes flexible, zone-based heating control to the next level. It masters up to 7 time slots, dynamic absence detection, and complex vacation modes – flawlessly and without writing countless automations.
✨ Features & Vorteile✨ Features & Benefits
Maximale Zeit-FlexibilitätMaximum Time Flexibility
Definiere bis zu 7 individuelle Zeitfenster (Schichten) mit eigenen Temperaturen und weise diese völlig frei beliebigen Wochentagen zu.Define up to 7 individual time slots (shifts) with custom temperatures and assign them freely to any day of the week.
Smarter Abwesenheits- & UrlaubsmodusSmart Absence & Vacation Mode
Pausiere den Zeitplan über einen Schalter oder integriere deinen HA-Kalender für punktgenaue Urlaubssteuerungen (inkl. sekundengenauer Start-/Endzeiten).Pause the schedule dynamically via a switch or integrate your HA calendar for precise vacation control (incl. exact start/end times).
Intelligentes 7-Tage RollbackIntelligent 7-Day Rollback
Wurde heute noch kein Zeitfenster erreicht (z.B. früh morgens)? Die Logik blickt automatisch in die vergangenen Tage zurück, um die korrekte Nachttemperatur zu ermitteln.Has no time slot been reached today yet? The logic automatically looks back at previous days to determine the correct night temperature of the last shift.
Absolute Zonen-FreiheitAbsolute Zone Freedom
Steuere einzelne Thermostate, komplette Geräte-Gruppen oder ganze Räume (Areas) zentral über eine einzige Blueprint-Instanz.Control single thermostats, complete device groups, or whole rooms/areas centrally via a single blueprint instance.
Der Workflow in der Praxis The Workflow in Practice
So arbeitet die Automatisierung chronologisch und unsichtbar im Hintergrund. How the automation works chronologically and invisibly in the background.
Auslösung (Der Trigger)Wake-up (The Trigger)
Der Blueprint wacht auf, wenn eine programmierte Zeit erreicht wird, sich ein Abwesenheitsschalter ändert oder ein Urlaubs-Termin im Kalender startet/endet.The blueprint wakes up when a programmed time is reached, an absence switch toggles, or a vacation event in the calendar starts/ends.
Prioritäten-CheckPriority Check
Bevor geheizt wird, prüft das System die Prioritäten: Ist jemand im Urlaub? Ist der Abwesenheitsschalter aktiv? Falls ja, wird sofort die Eco-Temperatur gesetzt und abgebrochen.Before heating, the system checks priorities: Is someone on vacation? Is the absence switch active? If yes, the eco temperature is set immediately and the process halts.
Evaluierung & RollbackEvaluation & Rollback
Sind alle zu Hause, sucht das System das aktuell gültige Zeitfenster für den heutigen Tag. Gibt es noch keines, greift das intelligente Rollback auf den Vortag zurück.If everyone is home, the system finds the currently valid time slot for today. If none exists yet, the intelligent rollback falls back to the previous day.
Zonen-AusführungZone Execution
Die final berechnete Ziel-Temperatur wird zeitgleich an alle konfigurierten Zonen, Entitäten und Räume gesendet.The final calculated target temperature is sent simultaneously to all configured zones, entities, and rooms.
📖 Benutzerhandbuch: SNO_HeatFlow📖 User Manual: SNO_HeatFlow
Diese Anleitung führt dich Schritt für Schritt durch die Einrichtung. Das Wichtigste vorab: Mit Ausnahme des ersten Zeitfensters und der Ziel-Thermostate sind alle Felder komplett optional!This guide takes you step-by-step through the setup. Most importantly: Except for the first time slot and the target thermostats, all fields are completely optional!
Einrichtung in 4 SchrittenSetup in 4 Steps
Schritt 1: Ziel-Thermostate wählen (Pflicht)Step 1: Choose Target Thermostats (Mandatory)
In der Sektion "1️⃣ Kern-Konfiguration" wählst du aus, welche Heizungen gesteuert werden sollen. Du kannst hier flexibel agieren: Wähle ein einzelnes Thermostat oder wähle einen gesamten Raum (z.B. "Wohnzimmer"). Alle Thermostate in diesem Raum reagieren dann synchron.In section "1️⃣ Core Configuration", choose which heaters to control. You can be flexible: Select a single thermostat or an entire room (e.g., "Living Room"). All thermostats in this area will react synchronously.
Schritt 2: Abwesenheit konfigurieren (Optional)Step 2: Configure Absence (Optional)
Wenn du das Haus kurzzeitig verlässt (z.B. Arbeiten, Einkaufen), kannst du die Heizung herunterregeln. Wähle einen input_boolean Schalter. Bei der Temperatur gilt das Entweder/Oder-Prinzip: Entweder du wählst einen Nummern-Helfer (input_number) ODER du nutzt den Schieberegler im Blueprint. Wichtig: Ist ein Helfer gewählt, wird der Schieberegler ignoriert.If you leave the house briefly (e.g., work, shopping), you can lower the heating. Choose an input_boolean switch. For the temperature, the Either/Or principle applies: Either choose a number helper (input_number) OR use the slider in the blueprint. Important: If a helper is selected, the slider is ignored.
Schritt 3: Urlaub konfigurieren (Optional)Step 3: Configure Vacation (Optional)
Der Urlaubsmodus überschreibt den Zeitplan langfristig. Wähle deinen Home Assistant Kalender (Empfehlung!) oder einen Schalter. Bei einem Schalter kannst du Start und Ende vorab definieren (wieder Entweder/Oder: per input_datetime Helfer oder direkt in die UI-Felder des Blueprints eintragen).Vacation mode overrides the schedule long-term. Choose your Home Assistant calendar (Recommended!) or a switch. With a switch, you can define start and end in advance (again Either/Or: via input_datetime helper or directly into the blueprint's UI fields).
Schritt 4: Zeitfenster anlegenStep 4: Create Time Slots
Du kannst bis zu 7 Zeitfenster definieren. Die Logik sucht jeden Tag automatisch nach dem aktuellsten Zeitfenster. SNO_HeatFlow ist intelligent: Um 02:00 Uhr nachts greift automatisch noch das z.B. "22:00 Uhr"-Fenster des Vortages!You can define up to 7 time slots. The logic automatically searches for the most current time slot every day. SNO_HeatFlow is intelligent: At 02:00 AM, it will automatically apply the e.g., "22:00" slot from the previous day!
Praxisorientierte AnwendungsbeispielePractical Application Examples
Beispiel 1: Der klassische SchichtarbeiterExample 1: The Shift Worker
Du arbeitest in unregelmäßigen Schichten und möchtest nicht jeden Tag feste Zeiten haben, sondern flexibel schalten.You work irregular shifts and don't want fixed times every day, but rather switch flexibly.
- Lösung: Nutze den Abwesenheits-Modus.Solution: Use the Absence Mode.
- Umsetzung: Lege in Zeitfenster 1 (Mo-So ab 00:00 Uhr) deine Wohlfühltemperatur von 22°C fest. Wähle deinen "Ich bin auf Arbeit"-Schalter als Abwesenheits-Trigger und stelle den Regler auf 18°C.Execution: Set your comfort temp of 22°C in Slot 1 (Mon-Sun from 00:00). Select your "I am at work" switch as the absence trigger and set the slider to 18°C.
Beispiel 2: Home-Office & WochenendeExample 2: Home Office & Weekend
Du arbeitest Mo-Mi im Home-Office, Do-Fr im Büro. Am Wochenende stehst du später auf.You work Mon-Wed in home office, Thu-Fri at the office. You wake up later on weekends.
Beispiel 3: Winterurlaub präzise steuernExample 3: Precise Winter Vacation
Du willst 15°C im Urlaub, aber bei Ankunft soll es bereits warm sein.You want 15°C during vacation, but it should be warm upon arrival.
- Umsetzung: Wähle einen Urlaubs-Schalter. Nutze die direkten UI-Eingabefelder für Start (z.B. 20.12. 08:00) und Ende (z.B. 27.12. 12:00).Execution: Select a vacation switch. Use the direct UI input fields for Start (e.g., Dec 20, 08:00) and End (e.g., Dec 27, 12:00).
- Ergebnis: Schaltest du den Schalter am 19.12. ein, passiert noch nichts. Erst am 20.12. exakt um 08:00 greift der Urlaub. Am 27.12. um 12:01 Uhr schaltet das System in den Normalbetrieb zurück!Result: Turning the switch on Dec 19 does nothing yet. Only on Dec 20 at exactly 08:00 does the vacation trigger. On Dec 27 at 12:01, the system reverts to normal operation!
GUI-Glossar (Eingabefelder erklärt)GUI Glossary (Input Fields Explained)
1️⃣ Kern-Konfiguration
Thermostat(e) auswählen (PFLICHT): Wählst du hier eine "Area" (Raum), steuert das Blueprint alle in diesem Raum erkannten climate-Entitäten simultan.Select Thermostat(s) (MANDATORY): If you select an "Area" (Room) here, the blueprint controls all climate entities detected in this room simultaneously.
2️⃣ Abwesenheits-Modus
- Schalter für Abwesenheit: Erwartet eine
input_booleanEntität. Wenn AN, ignoriert das System alle Zeitfenster.Absence Switch: Expects aninput_booleanentity. If ON, the system ignores all time slots. - ENTWEDER: Temperatur-Helfer: Erwartet eine
input_numberEntität für dein Dashboard.EITHER: Temp Helper: Expects aninput_numberentity for your dashboard. - ODER: Schieberegler: Wird komplett vom System ignoriert, wenn darüber ein Helfer ausgewählt wurde!OR: Slider: Is completely ignored by the system if a helper was selected above!
3️⃣ Urlaubs-Modus
- Urlaubs-Schalter oder Kalender: Ein Kalender-Event (Status "on") oder manueller Schalter.Vacation Switch or Calendar: A calendar event (status "on") or manual switch.
- ENTWEDER: Start/Ende als Helfer: Erwartet einen
input_datetimeHelfer.EITHER: Start/End as Helper: Expects aninput_datetimehelper. - ODER: Start/Ende in der UI: Helfer-Entitäten (oben) haben immer Vorrang vor diesen statischen UI-Eingaben (Datumsauswahl).OR: Start/End in UI: Helper entities (above) always take precedence over these static UI inputs (date picker).
Changelog & History
v0.5.0 (Current Version)
Direkte UI-Eingabefelder für Urlaubs-Start und -Ende (datetime-Selektor) als Fallback für Nutzer ohne Helfer-Entitäten hinzugefügt.
Added direct UI input fields for vacation start and end (datetime selector) as a fallback for users without helper entities.
Beschreibungen massiv überarbeitet ("ENTWEDER / ODER" Prinzip) für klarere Verständlichkeit der Prioritäten. Massively revised descriptions ("EITHER / OR" principle) for clearer understanding of priorities.
Komplexe Zeitstempel-Abgleichslogik für gemischte Entitäten-/UI-Datumsangaben implementiert. Implemented complex timestamp matching logic for mixed entity/UI date inputs.
v0.4.0
-
Urlaub kann nun sekundengenau begrenzt werden (Start- und Enddatum inkl. Uhrzeit via
input_datetimeHelfer).Vacation can now be limited down to the second (start and end date incl. time viainput_datetimehelper).
v0.3.0
- "Entweder Entität ODER Schieberegler" Architektur für Temperatur-Eingaben bei Abwesenheit und Urlaub eingeführt.Introduced "Either Entity OR Slider" architecture for temperature inputs during absence and vacation.
v0.2.1 & v0.2.0
- Bugfix: YAML-Formatierungsfehler in den Selektoren behoben.Bugfix: Fixed YAML formatting errors in selectors.
- Architektur-Wechsel: Starre Wochentags-Slots entfernt. Neue Logik nutzt 7 flexible Zeitfenster.Architecture change: Removed rigid weekday slots. New logic uses 7 flexible time slots.
- 7-Tage-Rollback-Logik implementiert.7-day rollback logic implemented.
v0.1.0
- Initial Release: Basis-Framework.
🛠️ Entwickler-Dokumentation🛠️ Developer Documentation
Technische Architektur für SNO_HeatFlow.Technical architecture for SNO_HeatFlow.
1. Trigger-Architektur1. Trigger Architecture
Die Automatisierung arbeitet ereignis- und zeitgesteuert: The automation is event- and time-driven:
- time_pattern (/1): Prüft minütlich, ob ein neues Zeitfenster erreicht wurde oder ein Urlaub startet/endet.Checks every minute if a new time slot has been reached or a vacation starts/ends.
- state: Reagiert sofort (ohne minütliche Verzögerung) auf Änderungen der Abwesenheits- und Urlaubs-Schalter.Reacts instantly to changes in absence and vacation switches.
2. Evaluierungs-Logik (Temperatur-Bestimmung)2. Evaluation Logic (Temperature Determination)
Die Ermittlung der korrekten Temperatur erfolgt in einem Jinja2-Template-Block in vier Phasen:Determining the correct temperature is done in a Jinja2 template block in four phases:
Phase 1 & 2: Slot-Aggregation & Heutige ValidierungPhase 1 & 2: Slot Aggregation & Today Validation
Alle konfigurierten Zeitfenster werden in eine Liste geladen. Das Skript iteriert darüber und vergleicht die hinterlegten Wochentage mit heute. Der Slot mit der neuesten (höchsten) Uhrzeit <= current_time gewinnt und wird im Namespace gesichert.All configured time slots are loaded into a list. The script iterates and compares days with today. The slot with the newest (highest) time <= current_time wins and is saved in the namespace.
Phase 3: Rollback-Schleife (Mitternachts-Problem)Phase 3: Rollback Loop (Midnight Problem)
Wird das Skript morgens (z.B. 03:00 Uhr) ausgeführt und das erste heutige Zeitfenster beginnt erst um 06:00 Uhr, ist der Namespace leer. Eine Schleife (range(1, 8)) durchläuft die vergangenen Tage rückwärts. Es wird nach dem spätesten Slot des Vortages gesucht und dieser übernommen.If the script runs in the morning (e.g., 03:00 AM) and today's first time slot starts at 06:00 AM, the namespace is empty. A loop (range(1, 8)) iterates backward through past days to find the latest slot of the previous day.
Phase 4: Overrides & Limits (Abwesenheit / Urlaub)Phase 4: Overrides & Limits (Absence / Vacation)
Zuletzt werden manuelle Overrides geprüft. Vorrang haben Helfer-Entitäten (state_attr('...', 'timestamp')), als Fallback UI-Eingaben (as_timestamp(...)). Priorisierung: Ist Abwesend -> Abwesenheits-Temp. Sonst: Ist Urlaub -> Urlaubs-Temp. Sonst -> Zeitplan-Temp.Finally, manual overrides are checked. Helper entities have priority, fallback is UI input. Priority: If absent -> Absence Temp. Else: If Vacation -> Vacation Temp. Else -> Schedule Temp.
🖼️ Blueprint UI & Screenshots🖼️ Blueprint UI & Screenshots
Diese Bilder zeigen dir die Konfigurationsoberfläche (Blueprint UI) direkt in Home Assistant.These images show the configuration interface (Blueprint UI) directly inside Home Assistant.
📦 Versions-Archiv & Downloads📦 Version Archive & Downloads
Hier findest du die aktuelle Version sowie Zugriff auf ältere Releases des Blueprints.Here you can find the current stable build as well as legacy releases.
🚀 Installations-Anleitung🚀 Installation Guide
Du hast drei Möglichkeiten, diesen Blueprint in deinem Home Assistant System zu installieren:You have three options to install this blueprint in your Home Assistant system:
Methode 1: 1-Klick Import (Empfohlen)Method 1: 1-Click Import (Recommended)
Importiert den Blueprint direkt und sicher in deine Instanz.Imports the blueprint directly and securely into your instance.
Methode 2: Manueller YAML-DownloadMethod 2: Manual YAML Download
Lade die Datei herunter und lege sie in `/config/blueprints/automation/` ab.Download the file and place it in `/config/blueprints/automation/`.
Methode 3: GitHub SourceMethod 3: GitHub Source
Kopiere den Quellcode direkt aus dem offiziellen Repository.Copy the raw code directly from the official repository.
SNO_HeatFlow Blueprint
Aktuelles Release mit direkten UI-Eingabefeldern für Urlaub und überarbeiteten Entweder/Oder Prioritäten.Current release featuring direct UI input fields for vacation and revised Either/Or priorities.
📚 Dokumentations-Archiv📚 Documentation Archive
Technische Dokumentationen zu historischen Releases.Technical references for deprecated or older releases.
Aktuell sind alle Dokumente auf dem Stand von v0.5.0. Ältere Referenzen werden hier hinterlegt, sobald strukturelle Core-Änderungen stattfinden.All current documentation matches v0.5.0. Legacy documentation entries will appear here upon future breaking changes.
❓ Häufig gestellte Fragen (FAQ) ❓ Frequently Asked Questions
Hier findest du Antworten auf die 11 häufigsten Fragen zur Einrichtung und Nutzung des SNO_HeatFlow Blueprints. Here you will find answers to the 11 most common questions regarding setup and usage of the SNO_HeatFlow blueprint.
Nein. Nur das "Zeitfenster 1" und die Auswahl der "Ziel-Thermostate" sind Pflichtfelder. Alle anderen Zeitfenster (2 bis 7) sind rein optional. Wenn du bei einem optionalen Fenster keine Uhrzeit einträgst, wird dieses vom System komplett ignoriert.No. Only "Time Slot 1" and the selection of "Target Thermostats" are mandatory fields. All other time slots (2 to 7) are purely optional. If you do not enter a time for an optional window, it will be completely ignored by the system.
Das Blueprint verfügt über eine intelligente "Rollback-Logik". Wenn für den heutigen Tag noch kein Zeitfenster erreicht wurde, schaut das System automatisch in die vergangenen Tage zurück und ermittelt das zuletzt aktive Zeitfenster (in der Regel deine konfigurierte Nachtabsenkung vom Vorabend) und wendet diese Temperatur an.The blueprint has an intelligent "rollback logic". If no time slot has been reached for the current day, the system automatically looks back to the past days and determines the last active time slot (usually your configured night setback from the evening before) and applies this temperature.
Das Blueprint arbeitet nach dem "ENTWEDER / ODER"-Prinzip. Wenn du im Feld ENTWEDER: Temperatur-Helfer eine Entität (input_number) ausgewählt hast, hat dieser Helfer absolute Priorität. Der Schieberegler direkt im Blueprint dient nur als Fallback und wird ignoriert. Überprüfe den Wert deines Helfers auf dem Dashboard!The blueprint works on an "EITHER / OR" principle. If you selected an entity (input_number) in the helper field, this helper has absolute priority. The slider directly in the blueprint serves only as a fallback and will be ignored. Check the value of your helper on the dashboard!
Die manuell eingestellte Temperatur bleibt so lange erhalten, bis die Automatisierung das nächste Mal aktiv eingreift. Das passiert entweder, wenn ein neues Zeitfenster erreicht wird, oder wenn sich der Status von Urlaub/Abwesenheit ändert. So kannst du jederzeit spontan eingreifen, ohne die Automatisierung ausschalten zu müssen.The manually set temperature remains active until the automation actively intervenes the next time. This happens either when a new time slot is reached or when the status of vacation/absence changes. This allows you to intervene spontaneously at any time without having to turn off the automation.
Nein. Wenn du einen Kalender in der Sektion "Urlaubs-Modus" ausgewählt hast, reagiert die Automatisierung auf *jedes* aktive Event in diesem Kalender. Es ist daher Best Practice, in Home Assistant einen eigenen, dedizierten Kalender (z.B. "Heizung Urlaub") anzulegen, um Überschneidungen mit privaten Terminen zu vermeiden.No. If you selected a calendar in the "Vacation Mode" section, the automation reacts to *every* active event in this calendar. It is therefore best practice to create your own, dedicated calendar in Home Assistant (e.g., "Heating Vacation") to avoid overlaps with private appointments.
Die Felder für Start- und Enddatum sind optional. Wenn du nur einen Schalter (ohne Datum) nutzt, ist der Urlaub aktiv, solange der Schalter auf "AN" steht. Wenn du zusätzlich ein Startdatum, aber kein Enddatum konfigurierst, beginnt der Urlaub zum Startzeitpunkt und läuft endlos weiter, bis du den Schalter manuell wieder ausschaltest.The start and end date fields are optional. If you only use a switch (without a date), the vacation is active as long as the switch is "ON". If you additionally configure a start date but no end date, the vacation starts at the start time and runs endlessly until you manually turn the switch off again.
Das hängt von deinen Bedürfnissen ab: Eine für alles: Wenn dein gesamtes Haus denselben Rhythmus hat, kannst du im Feld "Ziel-Thermostate" einfach alle Geräte oder Räume auswählen. Pro Raum (Empfohlen): Wenn das Badezimmer morgens um 06:00 Uhr warm sein soll, das Arbeitszimmer aber erst ab 08:00 Uhr, solltest du für jeden Raum eine eigene Automatisierung aus diesem Blueprint erstellen.This depends on your needs: One for all: If your entire house follows the same rhythm, select all devices or rooms in the "Target Thermostats" field. Per room (Recommended): If the bathroom needs to be warm at 06:00, but the office at 08:00, create a separate automation from this blueprint for each room.
Die Logik sucht immer nach der neuesten, bereits erreichten Uhrzeit. Wenn du versehentlich Zeitfenster 2 auf 14:00 Uhr und Zeitfenster 3 ebenfalls auf 14:00 Uhr für denselben Wochentag legst, wird die Temperatur des Zeitfensters angewendet, das in der Liste weiter unten steht (hier Z3). Vermeide identische Uhrzeiten am selben Tag.The logic always searches for the latest time already reached. If you accidentally set slot 2 to 14:00 and slot 3 also to 14:00 for the same day, the temperature of the slot further down the list will be applied (here slot 3). Avoid identical times on the same day.
Home Assistant Helfer können nach einem Neustart manchmal kurzzeitig "unknown" oder "unavailable" sein. SNO_HeatFlow ist fehlertolerant: Erkennt das Skript, dass der Helfer keinen gültigen Wert liefert, greift es sicherheitshalber automatisch auf die über den Schieberegler eingestellte Fallback-Temperatur zurück.Home Assistant helpers can sometimes briefly be "unknown" or "unavailable" after a restart. SNO_HeatFlow is fault-tolerant: If the script detects that the helper does not provide a valid value, it safely falls back to the slider temperature automatically.
Ja, absolut. Wenn deine Zeiten wöchentlich wechseln und feste Wochentage nicht helfen, nutze am besten den Abwesenheits-Modus als "Schicht-Modus". Lege deine Wohlfühltemperatur in "Zeitfenster 1" fest (z.B. für 24/7). Wenn du zur Schicht fährst, drückst du den Abwesenheits-Schalter, und die Heizung fährt herunter.Yes, absolutely. If your times change weekly and fixed weekdays don't help, it's best to use the Absence Mode as a "Shift Mode". Set your comfort temp in "Time Slot 1" (e.g., 24/7). When you leave for your shift, press the absence switch and the heating powers down.
Home Assistant unterstützt aktuell noch keine automatischen Update-Benachrichtigungen für einzelne Blueprints. Behalte daher das GitHub-Repository im Auge (nutze die Funktion "Watch" auf GitHub), um über Fehlerbehebungen und neue Versionen informiert zu bleiben.Home Assistant currently does not support automatic update notifications for individual blueprints. Keep an eye on the GitHub repository (use the "Watch" feature on GitHub) to stay informed about bug fixes and new versions.
Über SNOAbout SNO
SyncNetOps
Die Entstehungsgeschichte dieses BlueprintsThe Origin Story of this Blueprint
"Mein Dienstplan änderte sich spontan, das Haus war eiskalt. Home Assistant 'dachte', ich sei arbeiten. Meine Automatisierungen? Ein unwartbares Monster aus 15 verschachtelten Skripten. Ich löschte alles. Ich brauchte ein zentrales Gehirn, das Schichten versteht, Helfer priorisiert und in die Vergangenheit blickt. Das war die Geburtsstunde von SNO_HeatFlow." "My shift schedule changed spontaneously, the house was freezing. Home Assistant 'thought' I was working. My automations? An unmaintainable monster of 15 nested scripts. I deleted everything. I needed a central brain that understands shifts, prioritizes helpers, and looks into the past. That was the birth of SNO_HeatFlow."
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.
Blueprint Code & InstallationBlueprint Code & Installation
Kopiere den Code, lade die Datei herunter oder importiere sie direkt in Home Assistant.Copy the raw code, download the file or import directly into Home Assistant.
blueprint:
name: "SNO_HeatFlow"
description: |
# 🌡️ SNO_HeatFlow - Intelligente Heizungssteuerung
Dieser hochmoderne Blueprint ermöglicht eine detaillierte, flexible und benutzerfreundliche Heizungszeitplanung pro Raum oder Zone.
**WICHTIG:** Alle Sektionen bis auf "Ziel-Thermostate" und "Zeitfenster 1" sind **optional**! Du musst nur ausfüllen, was du wirklich brauchst.
**So funktioniert es:**
1. Wähle im ersten Schritt deine Ziel-Thermostate.
2. Richte Abwesenheit und Urlaub ein (Optional). Du kannst hierbei zwischen Entitäten (Helfern für dein Dashboard) oder festen Werten direkt hier im Blueprint wählen.
3. Definiere bis zu 7 Zeitfenster. Lege Uhrzeit, Temperatur und Wochentage fest.
---
**Version:** 0.5.0
**Hilfe & Dokumentation:** https://sno.mb222.de/heatflow
**Fehler melden (GitHub):** https://github.com/SyncNetOps/HA-Blueprint_HeatFlow
domain: automation
input:
# --- BASIS SETUP ---
section_core:
name: "1️⃣ Kern-Konfiguration"
icon: mdi:thermostat
input:
target_heating:
name: "Thermostat(e) auswählen (PFLICHT)"
description: "Wähle hier einzelne Thermostate, ganze Geräte oder Räume aus."
selector:
target:
entity:
domain: climate
# --- ABWESENHEIT ---
section_absence:
name: "2️⃣ Abwesenheits-Modus (Optional)"
icon: mdi:home-export-outline
collapsed: true
input:
absence_toggle:
name: "Schalter für Abwesenheit"
description: "Ein `input_boolean` Helfer. Ist dieser AN, wird der reguläre Zeitplan pausiert."
default: []
selector:
entity:
domain: input_boolean
absence_temp_entity:
name: "ENTWEDER: Temperatur-Helfer"
description: "Wähle einen `input_number` Helfer, um die Abwesenheits-Temperatur bequem über dein Dashboard zu steuern."
default: []
selector:
entity:
domain: input_number
absence_temp_slider:
name: "ODER: Temperatur direkt hier einstellen"
description: "Wird **nur** genutzt, wenn oben **kein** Helfer ausgewählt wurde!"
default: 15.0
selector: { number: { min: 5, max: 30, step: 0.5, unit_of_measurement: "°C", mode: slider } }
# --- URLAUB ---
section_vacation:
name: "3️⃣ Urlaubs-Modus (Optional)"
icon: mdi:beach
collapsed: true
input:
vacation_entity:
name: "Urlaubs-Schalter oder Kalender"
description: |
Wann ist Urlaub?
* **Kalender (Empfohlen):** Sobald ein Event im Kalender läuft, ist Urlaub aktiv. Start/Ende regelt der Kalender.
* **Schalter (input_boolean):** Ein manueller Schalter auf deinem Dashboard.
default: []
selector:
entity:
domain: [calendar, input_boolean]
vacation_start_entity:
name: "ENTWEDER: Start-Datum & Uhrzeit als Helfer"
description: "Wähle einen `input_datetime` Helfer. (Wird bevorzugt, falls ausgefüllt)"
default: []
selector:
entity:
domain: input_datetime
vacation_start_ui:
name: "ODER: Start-Datum & Uhrzeit direkt hier"
description: "Stelle den Start direkt im Blueprint ein. (Wird ignoriert, wenn oben ein Helfer gewählt ist)"
default: ""
selector:
datetime: {}
vacation_end_entity:
name: "ENTWEDER: End-Datum & Uhrzeit als Helfer"
description: "Wähle einen `input_datetime` Helfer."
default: []
selector:
entity:
domain: input_datetime
vacation_end_ui:
name: "ODER: End-Datum & Uhrzeit direkt hier"
description: "Stelle das Ende direkt im Blueprint ein."
default: ""
selector:
datetime: {}
vacation_temp_entity:
name: "ENTWEDER: Temperatur-Helfer"
description: "Wähle einen `input_number` Helfer für die Urlaubstemperatur."
default: []
selector:
entity:
domain: input_number
vacation_temp_slider:
name: "ODER: Temperatur direkt hier einstellen"
description: "Wird **nur** genutzt, wenn oben **kein** Helfer ausgewählt wurde!"
default: 15.0
selector: { number: { min: 5, max: 30, step: 0.5, unit_of_measurement: "°C", mode: slider } }
# --- ZEITFENSTER 1 (PFLICHT) ---
section_slot_1:
name: "🕒 Zeitfenster 1 (Pflicht)"
icon: mdi:clock-check-outline
input:
s1_time:
name: "Uhrzeit"
default: "06:00:00"
selector: { time: {} }
s1_temp:
name: "Ziel-Temperatur"
default: 21.0
selector: { number: { min: 5, max: 30, step: 0.5, unit_of_measurement: "°C", mode: slider } }
s1_days:
name: "Wochentage"
description: "An welchen Tagen soll dieses Zeitfenster aktiv sein?"
default: ["0", "1", "2", "3", "4", "5", "6"]
selector:
select:
multiple: true
options:
- label: "Montag"
value: "0"
- label: "Dienstag"
value: "1"
- label: "Mittwoch"
value: "2"
- label: "Donnerstag"
value: "3"
- label: "Freitag"
value: "4"
- label: "Samstag"
value: "5"
- label: "Sonntag"
value: "6"
# --- ZEITFENSTER 2 ---
section_slot_2:
name: "🕒 Zeitfenster 2 (Optional)"
icon: mdi:clock-outline
collapsed: true
input:
s2_time:
name: "Uhrzeit"
description: "Leer lassen, um dieses Fenster zu deaktivieren."
default: ""
selector: { text: { type: time } }
s2_temp:
name: "Ziel-Temperatur"
default: 21.0
selector: { number: { min: 5, max: 30, step: 0.5, unit_of_measurement: "°C", mode: slider } }
s2_days:
name: "Wochentage"
default: ["0", "1", "2", "3", "4"]
selector:
select:
multiple: true
options:
- label: "Montag"
value: "0"
- label: "Dienstag"
value: "1"
- label: "Mittwoch"
value: "2"
- label: "Donnerstag"
value: "3"
- label: "Freitag"
value: "4"
- label: "Samstag"
value: "5"
- label: "Sonntag"
value: "6"
# --- ZEITFENSTER 3 ---
section_slot_3:
name: "🕒 Zeitfenster 3 (Optional)"
icon: mdi:clock-outline
collapsed: true
input:
s3_time:
name: "Uhrzeit"
default: ""
selector: { text: { type: time } }
s3_temp:
name: "Ziel-Temperatur"
default: 21.0
selector: { number: { min: 5, max: 30, step: 0.5, unit_of_measurement: "°C", mode: slider } }
s3_days:
name: "Wochentage"
default: ["5", "6"]
selector:
select:
multiple: true
options:
- label: "Montag"
value: "0"
- label: "Dienstag"
value: "1"
- label: "Mittwoch"
value: "2"
- label: "Donnerstag"
value: "3"
- label: "Freitag"
value: "4"
- label: "Samstag"
value: "5"
- label: "Sonntag"
value: "6"
# --- ZEITFENSTER 4 ---
section_slot_4:
name: "🕒 Zeitfenster 4 (Optional)"
icon: mdi:clock-outline
collapsed: true
input:
s4_time:
name: "Uhrzeit"
default: ""
selector: { text: { type: time } }
s4_temp:
name: "Ziel-Temperatur"
default: 18.0
selector: { number: { min: 5, max: 30, step: 0.5, unit_of_measurement: "°C", mode: slider } }
s4_days:
name: "Wochentage"
default: ["0", "1", "2", "3", "4", "5", "6"]
selector:
select:
multiple: true
options:
- label: "Montag"
value: "0"
- label: "Dienstag"
value: "1"
- label: "Mittwoch"
value: "2"
- label: "Donnerstag"
value: "3"
- label: "Freitag"
value: "4"
- label: "Samstag"
value: "5"
- label: "Sonntag"
value: "6"
# --- ZEITFENSTER 5 ---
section_slot_5:
name: "🕒 Zeitfenster 5 (Optional)"
icon: mdi:clock-outline
collapsed: true
input:
s5_time:
name: "Uhrzeit"
default: ""
selector: { text: { type: time } }
s5_temp:
name: "Ziel-Temperatur"
default: 21.0
selector: { number: { min: 5, max: 30, step: 0.5, unit_of_measurement: "°C", mode: slider } }
s5_days:
name: "Wochentage"
default: ["0", "1", "2", "3", "4", "5", "6"]
selector:
select:
multiple: true
options:
- label: "Montag"
value: "0"
- label: "Dienstag"
value: "1"
- label: "Mittwoch"
value: "2"
- label: "Donnerstag"
value: "3"
- label: "Freitag"
value: "4"
- label: "Samstag"
value: "5"
- label: "Sonntag"
value: "6"
# --- ZEITFENSTER 6 ---
section_slot_6:
name: "🕒 Zeitfenster 6 (Optional)"
icon: mdi:clock-outline
collapsed: true
input:
s6_time:
name: "Uhrzeit"
default: ""
selector: { text: { type: time } }
s6_temp:
name: "Ziel-Temperatur"
default: 21.0
selector: { number: { min: 5, max: 30, step: 0.5, unit_of_measurement: "°C", mode: slider } }
s6_days:
name: "Wochentage"
default: ["0", "1", "2", "3", "4", "5", "6"]
selector:
select:
multiple: true
options:
- label: "Montag"
value: "0"
- label: "Dienstag"
value: "1"
- label: "Mittwoch"
value: "2"
- label: "Donnerstag"
value: "3"
- label: "Freitag"
value: "4"
- label: "Samstag"
value: "5"
- label: "Sonntag"
value: "6"
# --- ZEITFENSTER 7 ---
section_slot_7:
name: "🕒 Zeitfenster 7 (Optional)"
icon: mdi:clock-outline
collapsed: true
input:
s7_time:
name: "Uhrzeit"
default: ""
selector: { text: { type: time } }
s7_temp:
name: "Ziel-Temperatur"
default: 21.0
selector: { number: { min: 5, max: 30, step: 0.5, unit_of_measurement: "°C", mode: slider } }
s7_days:
name: "Wochentage"
default: ["0", "1", "2", "3", "4", "5", "6"]
selector:
select:
multiple: true
options:
- label: "Montag"
value: "0"
- label: "Dienstag"
value: "1"
- label: "Mittwoch"
value: "2"
- label: "Donnerstag"
value: "3"
- label: "Freitag"
value: "4"
- label: "Samstag"
value: "5"
- label: "Sonntag"
value: "6"
variables:
absence_toggle: !input absence_toggle
absence_temp_entity: !input absence_temp_entity
absence_temp_slider: !input absence_temp_slider
vacation_entity: !input vacation_entity
vacation_start_entity: !input vacation_start_entity
vacation_start_ui: !input vacation_start_ui
vacation_end_entity: !input vacation_end_entity
vacation_end_ui: !input vacation_end_ui
vacation_temp_entity: !input vacation_temp_entity
vacation_temp_slider: !input vacation_temp_slider
s1_time: !input s1_time
s1_temp: !input s1_temp
s1_days: !input s1_days
s2_time: !input s2_time
s2_temp: !input s2_temp
s2_days: !input s2_days
s3_time: !input s3_time
s3_temp: !input s3_temp
s3_days: !input s3_days
s4_time: !input s4_time
s4_temp: !input s4_temp
s4_days: !input s4_days
s5_time: !input s5_time
s5_temp: !input s5_temp
s5_days: !input s5_days
s6_time: !input s6_time
s6_temp: !input s6_temp
s6_days: !input s6_days
s7_time: !input s7_time
s7_temp: !input s7_temp
s7_days: !input s7_days
mode: single
max_exceeded: silent
trigger:
- platform: time_pattern
minutes: "/1"
- platform: state
entity_id: !input absence_toggle
- platform: state
entity_id: !input vacation_entity
action:
- variables:
target_temp: >
{% set current_day = now().weekday() | string %}
{% set current_time = now().strftime('%H:%M') %}
{# Lade alle konfigurierten Slots in eine Liste #}
{% set all_slots = [] %}
{% if s1_time != '' and s1_days | length > 0 %}
{% set all_slots = all_slots + [{'time': s1_time[:5], 'temp': s1_temp, 'days': s1_days}] %}
{% endif %}
{% if s2_time != '' and s2_time != none and s2_days | length > 0 %}
{% set all_slots = all_slots + [{'time': s2_time[:5], 'temp': s2_temp, 'days': s2_days}] %}
{% endif %}
{% if s3_time != '' and s3_time != none and s3_days | length > 0 %}
{% set all_slots = all_slots + [{'time': s3_time[:5], 'temp': s3_temp, 'days': s3_days}] %}
{% endif %}
{% if s4_time != '' and s4_time != none and s4_days | length > 0 %}
{% set all_slots = all_slots + [{'time': s4_time[:5], 'temp': s4_temp, 'days': s4_days}] %}
{% endif %}
{% if s5_time != '' and s5_time != none and s5_days | length > 0 %}
{% set all_slots = all_slots + [{'time': s5_time[:5], 'temp': s5_temp, 'days': s5_days}] %}
{% endif %}
{% if s6_time != '' and s6_time != none and s6_days | length > 0 %}
{% set all_slots = all_slots + [{'time': s6_time[:5], 'temp': s6_temp, 'days': s6_days}] %}
{% endif %}
{% if s7_time != '' and s7_time != none and s7_days | length > 0 %}
{% set all_slots = all_slots + [{'time': s7_time[:5], 'temp': s7_temp, 'days': s7_days}] %}
{% endif %}
{# 1. Finde das aktuellste gültige Zeitfenster von HEUTE #}
{% set ns = namespace(latest_time='', temp=none) %}
{% for s in all_slots %}
{% if current_day in s.days %}
{% if s.time <= current_time %}
{% if s.time >= ns.latest_time %}
{% set ns.latest_time = s.time %}
{% set ns.temp = s.temp %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{# 2. FALLBACK: Suche die letzten 7 Tage rückwärts, falls heute noch kein Slot erreicht wurde #}
{% if ns.temp == none %}
{% set ns_prev = namespace(found=false, temp=20.0) %}
{% for i in range(1, 8) %}
{% if not ns_prev.found %}
{% set check_day = ((now().weekday() - i) % 7) | string %}
{% set ns_day = namespace(latest_time='', temp=none) %}
{% for s in all_slots %}
{% if check_day in s.days %}
{% if s.time >= ns_day.latest_time %}
{% set ns_day.latest_time = s.time %}
{% set ns_day.temp = s.temp %}
{% endif %}
{% endif %}
{% endfor %}
{% if ns_day.temp != none %}
{% set ns_prev.temp = ns_day.temp %}
{% set ns_prev.found = true %}
{% endif %}
{% endif %}
{% endfor %}
{% set final_schedule_temp = ns_prev.temp %}
{% else %}
{% set final_schedule_temp = ns.temp %}
{% endif %}
{# 3. LOGIK FÜR ABWESENHEIT & URLAUB INKL. DATUM/UHRZEIT GRENZEN #}
{% set is_absent = absence_toggle != [] and absence_toggle != none and states(absence_toggle) == 'on' %}
{# Prüfe Urlaubs-Schalter #}
{% set is_vacation = vacation_entity != [] and vacation_entity != none and states(vacation_entity) == 'on' %}
{% if is_vacation %}
{% set current_ts = as_timestamp(now()) %}
{# Startdatum und -uhrzeit prüfen (Entität gewinnt über UI) #}
{% if vacation_start_entity != [] and vacation_start_entity != none %}
{% set start_ts = state_attr(vacation_start_entity, 'timestamp') %}
{% if start_ts != none and current_ts < start_ts %}
{% set is_vacation = false %}
{% endif %}
{% elif vacation_start_ui != "" and vacation_start_ui != none %}
{% set start_ts = as_timestamp(vacation_start_ui) %}
{% if start_ts != none and current_ts < start_ts %}
{% set is_vacation = false %}
{% endif %}
{% endif %}
{# Enddatum und -uhrzeit prüfen (Entität gewinnt über UI) #}
{% if is_vacation %}
{% if vacation_end_entity != [] and vacation_end_entity != none %}
{% set end_ts = state_attr(vacation_end_entity, 'timestamp') %}
{% if end_ts != none and current_ts > end_ts %}
{% set is_vacation = false %}
{% endif %}
{% elif vacation_end_ui != "" and vacation_end_ui != none %}
{% set end_ts = as_timestamp(vacation_end_ui) %}
{% if end_ts != none and current_ts > end_ts %}
{% set is_vacation = false %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{# Temperaturen ermitteln (Entität hat Prio, ansonsten Regler) #}
{% set abs_target = states(absence_temp_entity) | float(absence_temp_slider) if absence_temp_entity != [] and absence_temp_entity != none and states(absence_temp_entity) not in ['unknown', 'unavailable'] else absence_temp_slider | float %}
{% set vac_target = states(vacation_temp_entity) | float(vacation_temp_slider) if vacation_temp_entity != [] and vacation_temp_entity != none and states(vacation_temp_entity) not in ['unknown', 'unavailable'] else vacation_temp_slider | float %}
{# 4. FINALE ENTSCHEIDUNG WELCHE TEMPERATUR GESETZT WIRD #}
{% if is_absent %}
{{ abs_target }}
{% elif is_vacation %}
{{ vac_target }}
{% else %}
{{ final_schedule_temp | float(20.0) }}
{% endif %}
- service: climate.set_temperature
target: !input target_heating
data:
temperature: "{{ target_temp }}"