Hallo bbserv,
und herzlich willkommen im Forum (dein erster post). Ich bin relativ neu beim Timberwolf und habe mir auch von Forenmitgliedern, danke nochmal insbes. an
@Robert_Mini helfen lassen.
An dieser Stelle ist es fair, auf die gute und permanent aktualisierte Doku
link zu verweisen.
Füttert man diese Doku in eine LLM, kann man sich auch individiduell helfen lassen (mit allen Vor- und Nachteilen, die sowas mit sich bringt) (
link).
Deine Anfrage wird dort bspw. so beantwortet (Achtung ausschließlich in die Richtung Custom-Logiken und nicht zu den normalen Logiken (zum Zusammenklicken in der GUI). Ich habe den Gemini Text überflogen und man kann ihn so stehen lassen, denke ich. Frag bei Fragen, die sich daraus ergeben, die Inhalte sind, wie gesagt alle aus dem Timberwolf-Wiki, das als Primärquelle (und zahlreicher wertvoller Forenbeiträge) immer herangezogen werden sollte.
=== gemini 2.5 pro Antwort START ===
Hallo,
gerne erkläre ich, wie das im Timberwolf Server (TWS) Logikeditor funktioniert. Dein Gedanke mit der globalen Variable aus der SPS-Welt ist richtig, die Umsetzung in der TWS Custom-Logik ist nur etwas anders strukturiert.
Du benötigst eine Kombination aus einer
internen Variable (im
Level-Array deklariert) und einem
Eingang (im
Input-Array definiert), die auf dieselbe interne Variable zugreifen.
Das Prinzip:
Interne Variable (Level): Hier deklarierst du eine Variable, die den Sollwert dauerhaft
speichert (sie behält ihren Wert zwischen den Logik-Ausführungen, ähnlich einer statischen Variable). Wichtig ist hier auch ein
Initialwert, der als Standard dient, bis der erste externe Wert kommt.
Eingang (Input): Du erstellst einen Eingang für deine Logikzelle (z.B. "Sollwert Extern"). Dieser Eingang wird später mit deinem externen Objekt (KNX GA, Visu-Objekt etc.) verbunden. Entscheidend ist: Dieser Input-Eintrag wird so konfiguriert, dass er
auf die gleiche interne Variable schreibt, die du im
Level-Array deklariert hast. Die
Trigger-Option (z.B. "c" für "on change") bestimmt dabei, wann ein neuer externer Wert übernommen wird.
EDIT: Korrektur: Wann die Logik getriggert=Durchlaufen wird
Logikmodul (Module): Dein
Schwellwertschalter (
Comparator) oder jedes andere Modul verwendet dann die
interne Variable aus dem
Level-Array als Schwellwert bzw. Datenquelle. Er greift immer auf den aktuellsten Wert dieser Variablen zu.
Beispiel:
Angenommen, du möchtest einen Temperaturwert ($TemperaturAktuell) mit einem einstellbaren Sollwert ($TemperaturSoll) vergleichen und ein boolesches Ergebnis ($HeizungAn) erhalten.
Code: Alles auswählen
[code]{
// 1. Deklaration der internen Variablen
"Level": [
// Variable für den aktuellen Messwert (wird von einem anderen Eingang kommen)
["$TemperaturAktuell", "float", 0.0],
// !!! Variable für den Sollwert - mit einem Startwert initialisiert !!!
["$TemperaturSoll", "float", 20.0],
// Variable für das Ergebnis des Vergleichs
["$HeizungAn", "bool", false]
],
// 3. Logikbaustein, der die interne Variable $TemperaturSoll verwendet
"Module": [
// Vergleicht, ob $TemperaturAktuell < $TemperaturSoll ist
// Beachte: Comparator gibt TRUE aus, wenn Eingang > Schwelle.
// Für "Heizung AN wenn Temp < Soll" müssen wir invertieren:
// TRUE wenn -$TemperaturAktuell > -$TemperaturSoll
// Oder einfacher: Eigene Logik für "<" bauen oder Ergebnis negieren.
// Hier als Beispiel: Heizung AN, wenn $TemperaturAktuell >= $TemperaturSoll
["Comparator", "$TemperaturAktuell", "$HeizungAn", "$TemperaturSoll"]
// Wenn du "<" brauchst, wäre eine Variante:
// ["Comparator", "$TemperaturSoll", "$HeizungAn", "$TemperaturAktuell"] // TRUE wenn Soll > Aktuell
],
// 2. Eingänge der Logikzelle
"Input": [
// Eingang für den aktuellen Temperaturwert
["Temp_Ist", "Aktuelle Temperatur", "$TemperaturAktuell", "c"],
// !!! Eingang für den externen Sollwert !!!
// Dieser Eingang schreibt den Wert vom verbundenen Objekt in die Variable $TemperaturSoll
["Temp_Soll_Ext", "Sollwert von Extern", "$TemperaturSoll", "c"]
// Die Trigger-Option "c" (on change) ist hier meist sinnvoll.
],
// Ausgang der Logikzelle
"Output": [
["Heizung", "Heizungsanforderung", "$HeizungAn", "c"]
]
}
Erklärung:
Im
Level-Array definieren wir
$TemperaturSoll vom Typ float mit einem Startwert von 20.0. Dieser Wert wird verwendet, bis der Eingang
Temp_Soll_Ext zum ersten Mal einen Wert erhält.
Im
Input-Array definieren wir den Eingang
Temp_Soll_Ext. Als drittes Argument geben wir
$TemperaturSoll an. Das bedeutet: Wenn ein Objekt mit diesem Eingang verbunden wird und einen Wert sendet, wird dieser Wert in die interne Variable
$TemperaturSoll geschrieben.
Im
Module-Array greift der
Comparator auf die interne Variable
$TemperaturSoll zu, um den Vergleich durchzuführen. Er verwendet immer den
aktuellsten Wert, der in
$TemperaturSoll gespeichert ist (entweder der Initialwert oder der letzte Wert, der über den Eingang
Temp_Soll_Ext kam).
Wie verwendest du das im Logik Manager?
Erstelle eine neue Custom-Logik und füge den obigen JSON-Code ein (oder passe ihn an).
Speichere die Logikzelle. Du siehst jetzt die Eingänge
"Temp_Ist" und
"Temp_Soll_Ext" sowie den Ausgang
"Heizung".
Jetzt kommt der entscheidende Schritt, den du aus den Videos kennst:
Ziehe dein Objekt für den Ist-Wert (z.B. KNX GA vom Temperatursensor) auf den Eingang
"Temp_Ist".
Ziehe dein Objekt für den
Sollwert (z.B. eine KNX Gruppenadresse, die du per Visu beschreibst, oder ein Visu-Objekt direkt) auf den Eingang
"Temp_Soll_Ext".
Verbinde den Ausgang
"Heizung" mit dem Objekt, das geschaltet werden soll.
Jetzt wird jeder Wert, der an das mit
"Temp_Soll_Ext" verbundene Objekt gesendet wird, automatisch in die interne Variable
$TemperaturSoll übernommen und vom
Comparator verwendet. Du hast somit deinen extern einstellbaren Sollwert realisiert.
=== gemini 2.5 pro Antwort ENDE ===