[TIPP] [V4.8 IP7] Dynamische Fenster-Beschattung nach Sonnenstand

Hier stellen Foristen und Kunden Ihre EIGENEN Logikbausteine vor. Diese Logikbausteine stehen jedem im Rahmen der vom Autor eingeräumten / genannten Lizenz zur Verfügung.
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln
Antworten

Ersteller
Sunshinemaker
Beiträge: 294
Registriert: So Mai 22, 2022 11:45 am
Hat sich bedankt: 137 Mal
Danksagung erhalten: 156 Mal

[V4.8 IP7] Dynamische Fenster-Beschattung nach Sonnenstand

#1

Beitrag von Sunshinemaker »

Der Text wurde unter Zuhilfenahme von KI erstellt und der Code wurde komplett mit KI erstellt. Nein nicht der von eib-eg sondern ich habe meinen eigenen Promt geschrieben. Ich nutze zur Beschattung viewtopic.php?f=65&t=1350&hilit=Beschat ... r+Rolladen von @Dragonos2000 und meine Logik liefert nur die Behanghöhe für die Beschattung bei Schwelle 2. Wenn jemand Verbesserungsvorschläge oder konstruktive Kritik hat, gerne raus damit. Viellicht kann der ein oder andere ja was mit der Logik anfangen.

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
Zuletzt geändert von Sunshinemaker am So Mai 03, 2026 12:11 pm, insgesamt 2-mal geändert.
LG Sören

TWS 3500 XL / ID 846 / VPN:offen / Reboot nach Rücksprache
Antworten

Zurück zu „Zusätzliche Logikbausteine“