Ich habe nach dem Speichern der Logik die beiden Eingänge von "C" auf "U" geändert und einen Trigger über das + hinzugefügt und auf 300sek. gestellt damit nicht alle paar sek. ein neuer wert Gesagt wird. Hängt natürlich bei euch davon ab wie oft ihr den Sonnenstand an die Logik übergebt.
-------------- Ab hier KI Text --------------
Hallo zusammen,
ich möchte heute eine Logik mit euch teilen, an der ich gearbeitet habe. Ziel war es, meine Rollladen-Beschattung "intelligent" zu machen. Statt starrer Schwellwerte berechnet dieses Skript die optimale Position basierend auf der realen Geometrie des Fensters.
Was macht die Logik?
Die Logik berechnet die exakte Rollladen-Position in Prozent. Dabei wird berücksichtigt:
Sonnenhöhe (Elevation): Je flacher die Sonne steht, desto weiter muss der Rollladen schließen, um die Blendung zu verhindern.
Sonnenrichtung (Azimut): Es wird berechnet, ob die Sonne überhaupt auf das Fenster scheint (180° Bereich). Zudem wird der seitliche Einfallswinkel via Cosinus-Funktion berücksichtigt.
Reale Maße: Die Logik arbeitet intern mit Zentimetern (Glasfläche & Abstand Rollladen zum Fenster).
Individuelle Kalibrierung: Damit die werte wirklich passen, gibt es eine Interpolationstabelle für eure eigenen Messwerte!
Die Highlights der V1.2:
Richtungssperre: Der Rollladen bleibt oben, wenn die Sonne hinter dem Haus verschwindet.
Einfache Anpassung: Ich habe den Code so strukturiert, dass ihr nur 4 zentrale Werte anpassen müsst, um ihn für jedes Fenster in eurem Haus zu nutzen.
Saubere Struktur: Keine Key-Duplikate, inkl. Inhibit-Funktion (Sperre).
Code: Alles auswählen
/**
* Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter
* https://wrgt.news/TOLL zum Download zur Verfügung steht.
* ============================================================
* DYNAMISCHE FENSTER-BESCHATTUNG NACH SONNENSTAND
* V1.2 - 03.05.2026 - Anpassungshinweise für andere Fenster ergänzt
* ============================================================
*
* BESCHREIBUNG:
* Berechnet anhand von Sonnenhöhe (Elevation) und Sonnenrichtung (Azimut)
* die exakte Rollladen-Position in Prozent. Die Logik berücksichtigt die
* reale Geometrie des Fensters: Je flacher die Sonne steht, desto weiter
* muss der Rollladen herunterfahren um denselben Schatten zu werfen.
* Beinhaltet eine Richtungssperre (Rollladen bleibt offen wenn Sonne
* hinter dem Haus steht) und nutzt eine gemessene Kalibrierungstabelle
* (Zentimeter Rollladen-Position zu Prozent).
*
* ============================================================
* ANPASSUNG FÜR EIN ANDERES FENSTER — NUR DIESE 4 DINGE ÄNDERN:
* ============================================================
*
* 1. FENSTER-AUSRICHTUNG (Azimut der Fenstermitte in Grad)
* Wo: $F_Divisor und die beiden Comparator-Konstanten
* Wert: Himmelsrichtung des Fensters als Grad (0=Nord, 90=Ost, 180=Süd, 270=West)
* Beispiele:
* Süd -> 180.0 (Konstanten: $Const90=90.0, $Const270=270.0)
* West -> 270.0 (Konstanten: $Const90=180.0, $Const270=360.0)
* Südwest -> 225.0 (Konstanten: $Const90=135.0, $Const270=315.0)
* Formel: Const_Links = Ausrichtung - 90, Const_Rechts = Ausrichtung + 90
*
* 2. FENSTERHÖHE (in Zentimeter)
* Wo: $Const205 UND in $F_Target (der erste Wert "205.0")
* Wert: Höhe der Glasfläche in cm (nicht Rahmen, nur Glas!)
* Beispiel: Fenster 150cm hoch -> $Const205=150.0, $F_Target="150.0 - (36.0 * ...)"
* WICHTIG: Wert muss an BEIDEN Stellen identisch geändert werden!
*
* 3. ABSTAND ROLLADEN ZUM FENSTER (in Zentimeter)
* Wo: $F_Target (der Wert "36.0")
* Wert: Vertikaler Abstand zwischen Rolladen-Oberkante und Fensterbank in cm
* Beispiel: Abstand 50cm -> "205.0 - (50.0 * (tan(X1 * 0.0174533) / X2))"
* Tipp: Messen wenn Rollladen komplett oben ist
*
* 4. KALIBRIERUNGSTABELLE (Zentimeter zu Prozent)
* Wo: Interpolation am Ende der Module-Liste
* Wert: Eigene Messungen — links=cm Position, rechts=% Rollladen
* So messen: Rollladen auf 10%, 20%, ... 100% fahren und jeweils
* Abstand Rollladen-Unterkante zur Fensterbank messen.
* Format: [[cm_bei_0%, 0.0], [cm_bei_10%, 10.0], ... [cm_bei_100%, 100.0]]
*
* ============================================================
*
* EINGÄNGE:
* $I_Inhibit : Sperrt die Logik (TRUE = gesperrt, keine Updates)
* $I_Sun_Az : Sonnen-Azimut in Grad (z.B. 180.0 für exakt Süd)
* $I_Sun_El : Sonnen-Elevation in Grad (z.B. 38.1)
*
* AUSGÄNGE:
* $O_Position : Ziel-Position des Rollladens (0.0 bis 100.0 %)
*
* CHANGELOG:
* V1.0 - 03.05.2026 - Initialversion
* V1.1 - 03.05.2026 - FIX: JSON Key-Duplikate entfernt, Formatierung
* nach Rule_82, Kommentare nach Rule_81
* V1.2 - 03.05.2026 - Anpassungshinweise für andere Fenster ergänzt.
* Kommentare an allen 4 Anpassungsstellen im Code
* konkret beschriftet.
* ============================================================
*/
{
"_Meta": {
"Name": "Dynamische Beschattung Süd (180°)",
"Description": "Rollladen-Automatik nach Sonnenstand und Fenstertiefe",
"Version": "1.2",
"Autor": "Sören"
},
"Input": [
["Sperre / Inhibit", "Blockiert die Logikausführung bei TRUE", "$I_Inhibit", "u"],
["Sonnenrichtung (Azimut)", "Sonnenstand in Grad (0-360)", "$I_Sun_Az", "c"],
["Sonnenhöhe (Elevation)", "Höhenwinkel in Grad", "$I_Sun_El", "c"]
],
"Output": [
["Ziel-Position (%)", "Beschattungsposition des Rollladens", "$O_Position", "a"]
],
"Level": [
// --- EINGÄNGE ---
["$I_Inhibit", "bool", false],
["$I_Sun_Az", "float", 0.0],
["$I_Sun_El", "float", 0.0],
// --- AUSGÄNGE ---
["$O_Position", "float", 0.0],
// --- KONSTANTEN ---
["$Const0", "float", 0.0],
["$Const0_01", "float", 0.01], // Schutzwert gegen Division durch Null
["$Const1", "float", 1.0],
// ANPASSEN 1a: Untere Azimut-Grenze = Fensterausrichtung - 90
// Süd (180°) -> 90.0 | West (270°) -> 180.0 | Südwest (225°) -> 135.0
["$Const90", "float", 90.0],
// ANPASSEN 1b: Obere Azimut-Grenze = Fensterausrichtung + 90
// Süd (180°) -> 270.0 | West (270°) -> 360.0 | Südwest (225°) -> 315.0
["$Const270", "float", 270.0],
// ANPASSEN 2: Fensterhöhe in Zentimeter (nur Glasfläche, ohne Rahmen)
// WICHTIG: Denselben Wert auch in $F_Target ändern (der erste Wert "205.0")!
// Beispiel: 150 cm hohes Fenster -> 150.0
["$Const205", "float", 205.0],
// --- INTERN: GÜLTIGKEITSPRÜFUNG ---
["$Az_GT_90", "bool", false],
["$Az_GT_270", "bool", false],
["$El_GT_0", "bool", false],
["$Valid_Bool", "bool", false],
["$Valid_Int", "integer", 0],
// --- INTERN: MATHEMATIK ---
// ANPASSEN 1c: Fensterausrichtung in Grad (der Wert "180.0" in der Formel)
// 0=Nord, 90=Ost, 180=Süd, 270=West
// Beispiel Westfenster: "cos((X1 - 270.0) * 0.0174533)"
["$F_Divisor", "string,200", "cos((X1 - 180.0) * 0.0174533)"],
["$Divisor_Raw", "float", 0.0],
["$Divisor_Lim", "float", 0.0],
["$Lim_Ok1", "bool", false],
// ANPASSEN 2 + 3: Fensterhöhe und Abstand Rolladen-Oberkante zu Fensterbank
// Format: "FENSTERHOEHE - (ABSTAND * (tan(X1 * 0.0174533) / X2))"
// FENSTERHOEHE : Höhe der Glasfläche in cm -> hier: 205.0
// (muss identisch mit $Const205 sein!)
// ABSTAND : Rolladen-Oberkante zu Fensterbank in cm -> hier: 36.0
// Beispiel: 150 cm Fenster, 50 cm Abstand:
// "150.0 - (50.0 * (tan(X1 * 0.0174533) / X2))"
["$F_Target", "string,200", "205.0 - (36.0 * (tan(X1 * 0.0174533) / X2))"],
["$Target_Raw", "float", 0.0],
["$Target_Gated", "float", 0.0],
["$Target_Lim", "float", 0.0],
["$Lim_Ok2", "bool", false]
],
"Module": [
// 1. INHIBIT: Bricht Ausführung ab, wenn Sperre aktiv ist
["Break", ["$I_Inhibit"]],
// 2. PRÜFUNG: Steht die Sonne vor dem Fenster?
// Gültig wenn Azimut zwischen $Const90 und $Const270 (= Ausrichtung ± 90°)
// UND Elevation > 0 (Sonne über dem Horizont)
// -> ANPASSEN 1a+1b: $Const90 und $Const270 im Level-Block ändern
["Comparator", "$I_Sun_Az", "$Az_GT_90", "$Const90"],
["Comparator", "$I_Sun_Az", "$Az_GT_270", "$Const270"],
["Comparator", "$I_Sun_El", "$El_GT_0", "$Const0"],
// Valid = TRUE wenn Azimut > Const90 UND NICHT > Const270 UND Elevation > 0
["And", ["$Az_GT_90", "-$Az_GT_270", "$El_GT_0"], "$Valid_Bool"],
["BinaryMultiplexer", ["$Valid_Bool"], "$Valid_Int"],
// 3. MATHEMATIK TEIL 1: Winkelversatz zur Fenstermitte berechnen (Cosinus)
// -> ANPASSEN 1c: Fensterausrichtung in $F_Divisor im Level-Block ändern
["CalcFormula", ["$I_Sun_Az"], "$Divisor_Raw", "$F_Divisor"],
// Schutz vor Division durch Null (Cosinus = 0 wenn Sonne exakt seitlich)
["Limiter", "$Divisor_Raw", "$Divisor_Lim", "$Lim_Ok1", ["$Const0_01", "$Const1"]],
// 4. MATHEMATIK TEIL 2: Benötigte Rolladen-Position in Zentimeter
// -> ANPASSEN 2+3: Fensterhöhe und Abstand in $F_Target im Level-Block ändern
["CalcFormula", ["$I_Sun_El", "$Divisor_Lim"], "$Target_Raw", "$F_Target"],
// 5. SAFETY GATE: Bei ungültiger Sonnenposition -> 0.0 cm (Rollladen offen)
["Multiplexer", ["$Const0", "$Target_Raw"], "$Target_Gated", "$Valid_Int"],
// Begrenzung auf reale Fensterhöhe (0 bis $Const205 cm)
// -> ANPASSEN 2: $Const205 im Level-Block ändern
["Limiter", "$Target_Gated", "$Target_Lim", "$Lim_Ok2", ["$Const0", "$Const205"]],
// 6. ÜBERSETZUNG: Zentimeter -> Rollladen-Prozent (eigene Messtabelle)
// -> ANPASSEN 4: Eigene Messwerte eintragen
// Links = gemessene cm bei dieser Prozentstellung, Rechts = Prozent
// Messen: Rollladen auf 10%, 20%... fahren, Abstand Unterkante zu Fensterbank messen
["Interpolation", "$Target_Lim", "$O_Position", [
[0.0, 0.0], // 0% -> Rollladen ganz oben, 0 cm
[33.0, 10.0], // 10% -> 33 cm
[62.0, 20.0], // 20% -> 62 cm
[90.0, 30.0], // 30% -> 90 cm
[115.0, 40.0], // 40% -> 115 cm
[139.0, 50.0], // 50% -> 139 cm
[160.0, 60.0], // 60% -> 160 cm
[180.0, 70.0], // 70% -> 180 cm
[198.0, 80.0], // 80% -> 198 cm
[217.0, 90.0], // 90% -> 217 cm
[230.0, 100.0] // 100% -> Rollladen ganz unten, 230 cm
]]
]
}Ich freue mich über euer Feedback oder Verbesserungsvorschläge!
Viele Grüße,
Sören