Re: [V 4.5 IP8] Beschattungsmodul: Öffnen der Lamellen bei Freigabe aber Inaktivität
Verfasst: So Sep 07, 2025 4:26 pm
von eib-eg
ich gebe dir von meiner ki überarbeitete lokig zum testen
selber kann ich dies nicht testen da mir die hardware fehlt
{
"_Meta": {
"Description": "Angepasstes Beschattungsmodul: Öffnen der Lamellen bei Freigabe, aber Inaktivität. Sendet RaffPosAus und LamellePosOffen, wenn Steuerung ein, aber Beschattung inaktiv ist.",
"Version": "6.08.5",
"Author": "Georg E. & AI",
"Last_Update": "2025-09-07"
},
"Level": [
[
"$BeschattungEin",
"bool",
false
],
[
"$LuxAussen",
"float",
50000
],
[
"$LuxSchwelleDunkel",
"float",
300
],
[
"$LuxSchwelleHell",
"float",
1000
],
[
"$AussenHell",
"bool",
false
],
[
"$SonnenHoehe",
"float",
0
],
[
"$HoeheStart",
"float",
0
],
[
"$HoeheEnde",
"float",
90
],
[
"$HoeheInnerhalb",
"bool",
false
],
[
"$SonnenAzimut",
"float",
0
],
[
"$AzimutStart",
"float",
90
],
[
"$AzimutEnde",
"float",
270
],
[
"$AzimutInnerhalb",
"bool",
false
],
[
"$BeschattungAktiv",
"bool",
false
],
[
"$RaffPosAus",
"float",
0
],
[
"$RaffPosEin",
"float",
100
],
[
"$RaffPosOut",
"float",
0
],
[
"$LamellePosZu",
"float",
100
],
[
"$LamellePosOffen",
"float",
0
],
[
"$LamellePosDiff",
"float",
0
],
[
"$LamellePosSteigung",
"float",
0
],
[
"$LamellePosOffset",
"float",
0
],
[
"$HoeheZu",
"float",
10
],
[
"$HoeheOffen",
"float",
50
],
[
"$HoeheDiff",
"float",
50
],
[
"$HoeheLimit",
"float",
0
],
[
"$LamellePosEin",
"float",
0
],
[
"$LamellePosOut",
"float",
0
],
[
"$LamellePosStep",
"float",
5
],
[
"$LamellePosStpOut",
"float",
0
],
[
"$EinsKonst",
"float",
1
],
[
"$VAR<Inhibit?>",
"bool",
false
],
// --- NEU hinzugefügt für die Anforderung ---
[
"$Konst_True",
"bool",
true
],
[
"$State_BeschattungEin_Last",
"bool",
false
],
[
"$Lgc_BeschattungEin_RisingEdge",
"bool",
false
],
[
"$Lgc_SendOpenPositions_Trigger",
"bool",
false
]
],
"Module": [
[
"Break",
[
"$VAR<Inhibit?>"
]
],
// --- NEU: Robuste Flankenerkennung für BeschattungEin ---
[
"And",
[
"$BeschattungEin",
"-$State_BeschattungEin_Last"
],
"$Lgc_BeschattungEin_RisingEdge"
],
[
"Comparator",
"$LuxAussen",
"$AussenHell",
[
"$LuxSchwelleDunkel",
"$LuxSchwelleHell"
]
],
[
"Limiter",
"$SonnenHoehe",
0,
"$HoeheInnerhalb",
[
"$HoeheStart",
"$HoeheEnde"
]
],
[
"Limiter",
"$SonnenAzimut",
0,
"$AzimutInnerhalb",
[
"$AzimutStart",
"$AzimutEnde"
]
],
[
"And",
[
"$BeschattungEin",
"$AussenHell",
"$HoeheInnerhalb",
"$AzimutInnerhalb"
],
"$BeschattungAktiv"
],
// --- NEU: Bedingung für explizites Senden der offenen/inaktiven Positionen ---
// Sende, wenn BeschattungEin gerade aktiviert wurde UND die Beschattung noch nicht aktiv ist (z.B. weil es zu dunkel ist)
[
"And",
[
"$Lgc_BeschattungEin_RisingEdge",
"-$BeschattungAktiv"
],
"$Lgc_SendOpenPositions_Trigger"
],
[
"Multiplexer",
[
"$RaffPosAus",
"$RaffPosEin"
],
"$RaffPosOut",
"$BeschattungAktiv"
],
[
"Limiter",
"$SonnenHoehe",
"$HoeheLimit",
0,
[
"$HoeheZu",
"$HoeheOffen"
]
],
[
"Polynomial",
"$LamellePosOffen",
"$LamellePosDiff",
[
"-$LamellePosZu",
"$EinsKonst"
]
],
[
"Polynomial",
"$HoeheOffen",
"$HoeheDiff",
[
"-$HoeheZu",
"$EinsKonst"
]
],
[
"Ratio",
"$LamellePosDiff",
"$LamellePosSteigung",
"$HoeheDiff"
],
[
"Polynomial",
"$HoeheZu",
"$LamellePosOffset",
[
"$LamellePosZu",
"-$LamellePosSteigung"
]
],
[
"Polynomial",
"$HoeheLimit",
"$LamellePosEin",
[
"$LamellePosOffset",
"$LamellePosSteigung"
]
],
[
"Multiplexer",
[
"$LamellePosOffen",
"$LamellePosEin"
],
"$LamellePosOut",
"$BeschattungAktiv"
],
[
"Step",
"$LamellePosOut",
"$LamellePosStpOut",
0,
"$LamellePosStep",
0
],
// --- NEU: Explizites Senden der Positionen bei Trigger ---
[
"SendExplicit",
"$Lgc_SendOpenPositions_Trigger",
"$RaffPosOut",
1
],
[
"SendExplicit",
"$Lgc_SendOpenPositions_Trigger",
"$LamellePosStpOut",
1
],
// --- NEU: Aktualisierung des letzten Zustands für die Flankenerkennung (muss am Ende stehen) ---
[
"Multiplexer",
[
"$BeschattungEin",
"$BeschattungEin"
],
"$State_BeschattungEin_Last",
"$Konst_True"
]
],
"Input": [
[
"Steuerung Ein",
"Beschattungssteuerung einschalten",
"$BeschattungEin",
"c"
],
[
"Lux",
"Aussenhelligkeit",
"$LuxAussen",
"c"
],
[
"SchwelleDunkel",
"untere Schwelle für Aussenhelligkeit",
"$LuxSchwelleDunkel",
"c"
],
[
"SchwelleHell",
"obere Schwelle für Aussenhelligkeit",
"$LuxSchwelleHell",
"c"
],
[
"SonnenHoehe",
"Winkel des Sonnenstands über dem Horizont",
"$SonnenHoehe",
"c"
],
[
"HoeheBegin",
"Höhenuntergrenze für Beschattung",
"$HoeheStart",
"c"
],
[
"HoeheEnde",
"Höheobergrenze für Beschattung",
"$HoeheEnde",
"c"
],
[
"Sonnenrichtung",
"Richtungswinkel des Sonnenstands",
"$SonnenAzimut",
"c"
],
[
"RichtungBegin",
"Richtungswinkel für Start der Beschattung",
"$AzimutStart",
"c"
],
[
"RichtungEnde",
"Richtungswinkel für Ende der Beschattung",
"$AzimutEnde",
"c"
],
[
"RaffPosAus",
"Position für Raffstore bei inaktiver Beschattung",
"$RaffPosAus",
"c"
],
[
"RaffPosEin",
"Position für Raffstore bei aktiver Beschattung",
"$RaffPosEin",
"c"
],
[
"LamellePosOffen",
"Position für Lamellen bei inaktiver Beschattung",
"$LamellePosOffen",
"c"
],
[
"LamellePosZu",
"Position für Lamellen bei aktiver Beschattung",
"$LamellePosZu",
"c"
],
[
"HoeheZu",
"Sonenhöhe bei der die Lamellennachführung startet",
"$HoeheZu",
"c"
],
[
"HoeheOffen",
"Sonenhöhe bei der die Lamellennachführung endet",
"$HoeheOffen",
"c"
],
[
"LamelleStep",
"Schrittweite für Lamellennachführung",
"$LamellePosStep",
"c"
],
[
"Inhibit",
"Inhibit",
"$VAR<Inhibit?>",
"u"
]
],
"Output": [
[
"RaffPos",
"Aktuelle Position für Raffstore",
"$RaffPosOut",
"c"
],
[
"LamellePos",
"Aktuelle Position für Lamellen",
"$LamellePosStpOut",
"c"
]
]
}
sowie eine anleitung der ki
ab hier ki text
___________________
Hallo Arne,
ich habe die Standard-Beschattungslogik des Timberwolf Servers um die von dir gewünschte Funktion erweitert. Die Anpassung sorgt dafür, dass die Lamellen und Raffstores ihre "offenen" bzw. "inaktiven" Positionen explizit senden, sobald du die Beschattungssteuerung freigibst ("Steuerung Ein" auf true wechselt), auch wenn die aktiven Beschattungsbedingungen (z.B. ausreichend Helligkeit) noch nicht erfüllt sind.
So implementierst du die Änderung:
Ersetze deine bestehende Custom Logic:
Kopiere den vollständigen JSON-Code, den ich dir im vorherigen Schritt bereitgestellt habe.
Öffne deine aktuelle Beschattungs-Logik-Zelle im Timberwolf Server.
Ersetze den gesamten Inhalt des Code-Feldes mit dem neuen, kopierten JSON-Code.
Klicke auf "Speichern" (Disketten-Symbol).
Verständnis der Änderung:
Ich habe interne Logik hinzugefügt, die erkennt, wenn dein Eingang "Steuerung Ein" von false auf true wechselt.
Wenn dieser Wechsel stattfindet und gleichzeitig die eigentliche Beschattung (bedingt durch Helligkeit, Sonnenstand etc.) noch nicht aktiv ist, wird ein kurzer Impuls ausgelöst.
Dieser Impuls veranlasst die Ausgänge "RaffPos" und "LamellePos", ihren aktuellen (inaktiven) Wert explizit zu senden. Dies stellt sicher, dass die Befehle für die "offene" Position sofort an deine Aktoren gehen, auch wenn sich der Wert numerisch nicht geändert hat, aber eben gesendet werden soll.
Was du nicht ändern musst:
Alle deine bestehenden Eingänge ($BeschattungEin, $LuxAussen, etc.) bleiben unverändert.
Alle Ausgänge ($RaffPosOut, $LamellePosStpOut) behalten ihre Namen und Trigger-Optionen (Standard "c" für "on change"). Die explizite Sende-Logik wird intern durch SendExplicit-Module behandelt, ohne die externen Verknüpfungen zu beeinflussen.
Ich hoffe, diese Anpassung löst dein Problem.
_________________
ende ki text
viel erfolg