bei diesem Baustein handelt es sich um eine Customlogik, mit der die Betriebsart (Komfort, Nacht/Eco, Frostschutz oder Standby) für einen Heizkreis/Raum/Stellantrieb aus diversen Eingangsbedingungen bestimmt wird und über den HVAC-Modus an das die Heizung regelnde Gerät übergeben werden kann.
Ich habe versucht, den Baustein möglichst generisch zu gestalten. Da ich aber keinen großen Überblick über die verschiedenen Systeme oder Anforderungen habe, ist er in dieser Version aber hauptsächlich auf meinen eigenen Anwendungsbereich zugeschnitten. Anregungen und Erweiterungswünsche nehme ich daher gerne entgegen!
Version:
1.0

Code:
Code: Alles auswählen
{
"Input": [
[
"Winterbetrieb",
"Im Sommerbetrieb (false) wird immer HVAC-Modus STANDBY (2) gesetzt",
"$InWinterbetrieb",
"c"
],
[
"Basis-HVAC-Modus (1 - 4)",
"Wird im Winterbetrieb an den Ausgang übergeben, wenn alle anderen Bedingungen nicht erfüllt sind oder niedrigere Priorität haben (1= KOMFORT, 2 = STANDBY, 3 = NACHT/ECO, 4 = FROSTSCHUTZ)",
"$InBasismodus",
"c"
],
[
"Fenster offen",
"Wenn Fenster oder Türen geöffnet sind, wird der HVAC-Modus STANDBY (2) übergeben",
"$InFensterOffen",
"c"
],
[
"Verzögerung Fenster [min]",
"Verzögerung (in Minuten) bis das Schließen des Fensters den HVAC-Status wieder ändert",
"$InFensterVerzoegerung",
"c"
],
[
"Reise/Urlaub (-> STANDBY)",
"true: abwesend / false: anwesend",
"$InAbwStandby",
"c"
],
[
"Nacht (-> NACHT/ECO)",
"true: Nacht / false: Tag",
"$InNacht",
"c"
],
[
"-> STANDBY",
"weiterer Eingang, der STANDBY auslöst",
"$VAR<STANDBY?>",
"c"
],
[
"-> NACHT/ECO",
"weiterer Eingang, der NACHT/ECO auslöst",
"$VAR<ECO?>",
"c"
],
[
"-> FROSTSCHUTZ",
"Eingang, der FROSTSCHUTZ auslöst",
"$VAR<FROSTSCHUTZ?>",
"c"
],
[
"Inhibit",
"INHIBIT",
"$VAR<Inhibit?>",
"u"
]
],
"Output": [
[
"HVAC-Modus",
"HVAC-Modus (1= Komfort, 2 = Standby, 3 = Nacht/Eco, 4 = Frostschutz)",
"$Out_HVAC",
"c"
],
[
"Betriebsart Komfort",
"TRUE bei Betriebsart Komfort",
"$Out_Komfort",
"c"
],
[
"Betriebsart Nacht/Eco",
"TRUE bei Betriebsart Nacht/Eco",
"$Out_Nacht",
"c"
],
[
"Betriebsart Frostschutz",
"TRUE bei Betriebsart Frostschutz",
"$Out_Frostschutz",
"c"
]
],
"Module": [
[
"Break",
[
"$VAR<Inhibit?>"
]
],
// Eingang "Basismodus" auf die Range der zulässigen HVAC-Status (1 - 4) prüfen (Wenn nicht bleibt $SetBasismodus auf dem Initialwert 1)
["Limiter","$InBasismodus","$SetBasismodus","$OutUnusedBool",["$OutValue_1", "$OutValue_4"]],
// Wert am Eingang "Verzögerung Fenster" in Minuten umrechnen
["Polynomial", "$InFensterVerzoegerung", "$InFensterVerzoegerung_Sek",["$Konst_Null", "$Konst_Sekunden"]],
// Ausschaltverzögerung nach Schließen des Fensters (Fenster offen-Eingang wechselt von TRUE auf FALSE)
[ "Monoflop","$InFensterOffen","$InFensterOffen","$Delayed_ON","$InFensterVerzoegerung_Sek",4],
["Or",["$Delayed_ON","$InFensterOffen"],"$InFensterOffen_Delayed"],
// Standby auslösende Bedingungen zusammenfassen
["Or",["$VAR<STANDBY?>","$InFensterOffen_Delayed", "$InAbwStandby"],"$Lvl1_Standby"],
// Nacht/Eco auslösende Bedingungen zusammenfassen
["Or",["$VAR<ECO?>","$InNacht"],"$Lvl1_Eco"],
// Frostschutz auslösende Bedingungen zusammenfassen
["Or",["$VAR<FROSTSCHUTZ?>"],"$Lvl1_Frostschutz"],
// zusammengefasste Eingänge in Binärwert umwandeln
[
"BinaryMultiplexer",
[
"$Lvl1_Standby",
"$Lvl1_Eco",
"$Lvl1_Frostschutz"
],
"$InStat"
],
// Steht der Basis-Modus auf 2 STANDBY ? -> dann $IsBasismodus2 = true
["Limiter","$SetBasismodus","$OutUnused","$IsBasismodus2",["$OutValue_2", "$OutValue_2"]],
// Wenn Basis-Modus = 2 dann ist er immer vorrangig gegenüber Modus 3
["Multiplexer",["$OutValue_3","$OutValue_2"],"$OutValue2_3","$IsBasismodus2"],
// Grundsätzlich zutreffenden Status aus der Kombination der zusammengefassten Eingänge bestimmen. Wenn keine Bedingung zutrifft dann auf den Basismodus setzen.
// Priorität: Frostschutz -> Standby -> Nacht/Eco -> (Komfort - nur wenn das der Basis-Modus ist)
["Multiplexer",["$SetBasismodus","$OutValue_2","$OutValue2_3","$OutValue_2","$OutValue_4"],"$Lvl2_Mode","$InStat"],
// Steht der Basis-Modus auf 4 FROSTSCHUTZ ? -> dann $IsBasismodus4 = true
["Limiter","$SetBasismodus","$OutUnused","$IsBasismodus4",["$OutValue_4", "$OutValue_4"]],
// FROSTSCHUTZ hat höchste Priorität. Wenn dieser als Basismodus gesetzt ist kann er durch nichts übersteuert werden
["Multiplexer",["$Lvl2_Mode","$OutValue_4"],"$Lvl2_Mode","$IsBasismodus4"],
// Im Sommerbetrieb immer Standby auf den Ausgang, sonst Ergebnis aus den Eingangsbedingungen.
["Multiplexer",["$OutValue_2","$Lvl2_Mode"],"$Out_HVAC","$InWinterbetrieb"],
// Aus dem ausgehenden HVAC-Status auch die Ausgänge für einzelne Betriebsarten belegen
["Limiter","$Out_HVAC","$OutUnused","$Out_Komfort",["$OutValue_1", "$OutValue_1"]],
["Limiter","$Out_HVAC","$OutUnused","$Out_Nacht",["$OutValue_3", "$OutValue_3"]],
["Limiter","$Out_HVAC","$OutUnused","$Out_Frostschutz",["$OutValue_4", "$OutValue_4"]]
],
"Level": [
["$InStat","integer",0],
["$Bit0","bool",false],
["$Bit1","bool",false],
["$Bit2","bool",false],
["$Bit3","bool",false],
["$InBasismodus","integer",1],
["$SetBasismodus","integer",1],["$InWinterbetrieb","bool",true],
["$InFensterOffen","bool",false],
["$InFensterOffen_Delayed","bool",false],
["$InFensterVerzoegerung","float",0.0],
["$InFensterVerzoegerung_Sek","float",0.0],
["$Delayed_ON","bool",false],
["$InNacht","bool",false],
["$InAbwStandby","bool",false],
["$VAR<STANDBY?>","bool",false],
["$VAR<ECO?>","bool",false],
["$VAR<FROSTSCHUTZ?>","bool",false],
["$Out_HVAC","integer",2],
["$Out_Komfort","bool",false],
["$Out_Nacht","bool",false],
["$Out_Frostschutz","bool",false],
["$OutValue_1","integer",1],
["$OutValue_2","integer",2],
["$OutValue_3","integer",3],
["$OutValue2_3","integer",3],
["$OutValue_4","integer",4],
["$OutUnused","integer",0],
["$OutUnusedBool","bool", false],
["$IsBasismodus2","bool",false],
["$IsBasismodus4","bool",false],
["$Lvl1_Standby","bool",false],
["$Lvl1_Eco","bool",false],
["$Lvl1_Frostschutz","bool",false],
["$Lvl2_Mode","integer",1],
["$Konst_Null","float",0.0],
["$Konst_Sekunden","float",60.0],
["$VAR<Inhibit?>","bool",false]
]
}
Der Ausgang „HVAC-Modus“ sendet einen Wert 1 – 4, der den jeweiligen HVAC-Modus repräsentiert:
1 = KOMFORT
2 = STANDBY
3 = NACHT/ECO
4 = FROSTSCHUTZ
In meinem Anwendungsfall (ich verwende die MDT Heizungsaktoren) ist dieser Ausgang mit einem KNX-Objekt verknüpft, dessen zugeordnete GA auf das Kommunikationsobjekt „Betriebsartvorwahl“ des Aktorkanals geht.
Hinweis: Der Timberwolf kennt den für den HVAC-Modus vorgesehenen DPT 20.102 noch nicht. Es kann stattdessen aber ein KNX-Objekt mit dem DPT 5.005 verwendet werden.
Als Alternative zum HVAC-Modus kann die Betriebsart auch einzeln über die drei weiteren Ausgänge (Betriebsart Komfort, Betriebsart Nacht/Eco, Betriebsart Frostschutz) gesteuert werden. Die Betriebsart Standby ergibt sich, wenn alle drei Ausgänge „false“ sind.
Eingänge:
Winterbetrieb (bool):
Sommerbetrieb (false) oder Winterbetrieb (true)
Basis-HVAC-Modus (integer):
Ein Wert zwischen 1 und 4, der den Basis-HVAC-Modus für den Raum/Heizkreis repräsentiert. Dieser gilt, wenn keine andere Eingangsbedingung mit höher priorisiertem Modus erfüllt ist.
Hier kann z. B. fest ein Parameter hinterlegt werden (z. B. 1 = KOMFORT). Natürlich ist es auch möglich, den Basismodus dynamisch über eine Verknüpfung des Eingangs zu bestimmen.
Fenster offen: (bool)
Ein geöffnetes Fenster (true) setzt grundsätzlich den HVAC-Modus STANDBY.
Verzögerung Fenster: (float)
Hier einen festen Parameter in Minuten hinterlegen ("0" setzen, wenn keine Verzögerung gewünscht wird).
Nachdem das Fenster geschlossen wurde (Fenster-Eingang wechselt von true auf false) bleibt der HVAC-Modus im STANDBY, bevor er wieder in einen anderen Modus (z. B. KOMFORT) umschaltet
Hintergrund: Ich nutze die Verzögerung für Räume mit Fußbodenheizung. Je nachdem wie viel kalte Luft der Temperatursensor durch das Lüften mitbekommen hat, würde der Aktor bei einem Hochsetzen der Betriebsart direkt nach dem Schließen des Fensters sofort die Ventile unnötig aufdrehen. Ich verzögere also die Zeit, bis sich die Raumlufttemperatur wieder normalisiert hat.
Reise/Urlaub:
Ist der Eingang „true“, wird ebenfalls grundsätzlich der HVAC-Modus 2 (STANDBY) gesetzt.
Nacht:
Ist der Eingang „true“, wird grundsätzlich der HVAC-Modus 3 (NACHT/ECO) gesetzt.
Weitere Eingänge:
Über das „+“-Zeichen besteht die Möglichkeit, beliebig viele weitere Eingänge hinzuzufügen, die entweder STANDBY, NACHT/ECO oder FROSTSCHUTZ setzen.
Diese sind jeweils gleichwertig mit anderen Eingängen, die den selben Modus steuern. Ein NACHT/ECO-Eingang funktioniert also genau so wie der Standard-„Nacht“-Eingang. Ich wollte nur erreichen, dass wenigstens die aus meiner Sicht gängigsten Eingänge standardmäßig vorhanden sind und sprechende Namen haben.
Priorität der Eingänge:
Die Priorität der Modi untereinander ist wie folgt festgelegt (von hoch nach niedrig):
FROSTSCHUTZ (4) → STANDBY (2)→ NACHT/ECO (3) → KOMFORT (1)
Dabei gilt:
- Im Sommerbetrieb ist der Modus am Ausgang immer STANDBY (2)
- Im Winterbetrieb: Der am Eingang Basis-HVAC-Modus anliegende Wert geht an den Ausgang, wenn keine andere Eingangsbedingung mit höher priorisiertem Modus erfüllt ist
- Sind Eingangsbedingungen mit höherer Priorität als dem Basis-Modus erfüllt, wird der Modus mit der höchsten Priorität gesetzt.
- Als Basis-Modus ist KOMFORT (1) eingestellt. Keine anderen Bedingungen sind erfüllt → der HVAC-Ausgang erhält ebenfalls Modus 1.
- Das Fenster wird geöffnet → Der HVAC-Ausgang wechselt auf STANDBY (2).
- Die Nacht bricht herein und Eingang „Nacht“ wechselt auf „true“. Dieser Eingang löst grundsätzlich Modus NACHT/ECO (3) aus. Modus 3 wird aber nicht gesetzt, da STANDBY aufgrund des noch geöffneten Fensters eine höhere Priorität hat.
- Das Fenster wird geschlossen. Nach Ablauf der Fenster-Verzögerungszeit wechselt der HVAC-Modus in den Status 3 (NACHT/ECO).
- Als Basis-Modus ist STANDBY (2) gesetzt.
- Die Nacht bricht herein und Eingang „Nacht“ wechselt auf „true“. Dieser Eingang löst grundsätzlich Modus 3 (NACHT/ECO) aus. Da der Basis-Modus STANDBY jedoch eine höhere Priorität hat, bleibt der Ausgang in diesem Modus (sonst würde es ja hier zu einer „Nacht-Anhebung“ der Solltemperatur kommen).
Version 1.1
- Neuer Ausgang "Sperrobjekt", der bei geöffnetem Fenster (+ Verzögerungszeit) true ist.
Code: Alles auswählen
{
"Input": [
[
"Winterbetrieb",
"Im Sommerbetrieb (false) wird immer HVAC-Modus STANDBY (2) gesetzt",
"$InWinterbetrieb",
"c"
],
[
"Basis-HVAC-Modus (1 - 4)",
"Wird im Winterbetrieb an den Ausgang übergeben, wenn alle anderen Bedingungen nicht erfüllt sind oder niedrigere Priorität haben (1= KOMFORT, 2 = STANDBY, 3 = NACHT/ECO, 4 = FROSTSCHUTZ)",
"$InBasismodus",
"c"
],
[
"Fenster offen",
"Wenn Fenster oder Türen geöffnet sind, wird der HVAC-Modus STANDBY (2) übergeben",
"$InFensterOffen",
"c"
],
[
"Verzögerung Fenster [min]",
"Verzögerung (in Minuten) bis das Schließen des Fensters den HVAC-Status wieder ändert",
"$InFensterVerzoegerung",
"c"
],
[
"Reise/Urlaub (-> STANDBY)",
"true: abwesend / false: anwesend",
"$InAbwStandby",
"c"
],
[
"Nacht (-> NACHT/ECO)",
"true: Nacht / false: Tag",
"$InNacht",
"c"
],
[
"-> STANDBY",
"weiterer Eingang, der STANDBY auslöst",
"$VAR<STANDBY?>",
"c"
],
[
"-> NACHT/ECO",
"weiterer Eingang, der NACHT/ECO auslöst",
"$VAR<ECO?>",
"c"
],
[
"-> FROSTSCHUTZ",
"Eingang, der FROSTSCHUTZ auslöst",
"$VAR<FROSTSCHUTZ?>",
"c"
],
[
"Inhibit",
"INHIBIT",
"$VAR<Inhibit?>",
"u"
]
],
"Output": [
[
"HVAC-Modus",
"HVAC-Modus (1= Komfort, 2 = Standby, 3 = Nacht/Eco, 4 = Frostschutz)",
"$Out_HVAC",
"c"
],
[
"Betriebsart Komfort",
"Optional: TRUE bei Betriebsart Komfort",
"$Out_Komfort",
"c"
],
[
"Betriebsart Nacht/Eco",
"Optional: TRUE bei Betriebsart Nacht/Eco",
"$Out_Nacht",
"c"
],
[
"Betriebsart Frostschutz",
"Optional: TRUE bei Betriebsart Frostschutz",
"$Out_Frostschutz",
"c"
],
[
"Sperrobjekt",
"Optional: Wird bei geöffnetem Fenster gesetzt, um bei Bedarf den Heizungsaktor zu sperren",
"$Out_Sperrobjekt",
"c"
]
],
"Module": [
[
"Break",
[
"$VAR<Inhibit?>"
]
],
// Eingang "Basismodus" auf die Range der zulässigen HVAC-Status (1 - 4) prüfen (Wenn nicht bleibt $SetBasismodus auf dem Initialwert 1)
["Limiter","$InBasismodus","$SetBasismodus","$OutUnusedBool",["$OutValue_1", "$OutValue_4"]],
// Wert am Eingang "Verzögerung Fenster" in Minuten umrechnen
["Polynomial", "$InFensterVerzoegerung", "$InFensterVerzoegerung_Sek",["$Konst_Null", "$Konst_Sekunden"]],
// Ausschaltverzögerung nach Schließen des Fensters (Fenster offen-Eingang wechselt von TRUE auf FALSE)
[ "Monoflop","$InFensterOffen","$InFensterOffen","$Delayed_ON","$InFensterVerzoegerung_Sek",4],
["Or",["$Delayed_ON","$InFensterOffen"],"$InFensterOffen_Delayed"],
["Multiplexer",["$InFensterOffen_Delayed"], "$Out_Sperrobjekt",0],
// Standby auslösende Bedingungen zusammenfassen
["Or",["$VAR<STANDBY?>","$InFensterOffen_Delayed", "$InAbwStandby"],"$Lvl1_Standby"],
// Nacht/Eco auslösende Bedingungen zusammenfassen
["Or",["$VAR<ECO?>","$InNacht"],"$Lvl1_Eco"],
// Frostschutz auslösende Bedingungen zusammenfassen
["Or",["$VAR<FROSTSCHUTZ?>"],"$Lvl1_Frostschutz"],
// zusammengefasste Eingänge in Binärwert umwandeln
[
"BinaryMultiplexer",
[
"$Lvl1_Standby",
"$Lvl1_Eco",
"$Lvl1_Frostschutz"
],
"$InStat"
],
// Steht der Basis-Modus auf 2 STANDBY ? -> dann $IsBasismodus2 = true
["Limiter","$SetBasismodus","$OutUnused","$IsBasismodus2",["$OutValue_2", "$OutValue_2"]],
// Wenn Basis-Modus = 2 dann ist er immer vorrangig gegenüber Modus 3
["Multiplexer",["$OutValue_3","$OutValue_2"],"$OutValue2_3","$IsBasismodus2"],
// Grundsätzlich zutreffenden Status aus der Kombination der zusammengefassten Eingänge bestimmen. Wenn keine Bedingung zutrifft dann auf den Basismodus setzen.
// Priorität: Frostschutz -> Standby -> Nacht/Eco -> (Komfort - nur wenn das der Basis-Modus ist)
["Multiplexer",["$SetBasismodus","$OutValue_2","$OutValue2_3","$OutValue_2","$OutValue_4"],"$Lvl2_Mode","$InStat"],
// Steht der Basis-Modus auf 4 FROSTSCHUTZ ? -> dann $IsBasismodus4 = true
["Limiter","$SetBasismodus","$OutUnused","$IsBasismodus4",["$OutValue_4", "$OutValue_4"]],
// FROSTSCHUTZ hat höchste Priorität. Wenn dieser als Basismodus gesetzt ist kann er durch nichts übersteuert werden
["Multiplexer",["$Lvl2_Mode","$OutValue_4"],"$Lvl2_Mode","$IsBasismodus4"],
// Im Sommerbetrieb immer Standby auf den Ausgang, sonst Ergebnis aus den Eingangsbedingungen.
["Multiplexer",["$OutValue_2","$Lvl2_Mode"],"$Out_HVAC","$InWinterbetrieb"],
// Aus dem ausgehenden HVAC-Status auch die Ausgänge für einzelne Betriebsarten belegen
["Limiter","$Out_HVAC","$OutUnused","$Out_Komfort",["$OutValue_1", "$OutValue_1"]],
["Limiter","$Out_HVAC","$OutUnused","$Out_Nacht",["$OutValue_3", "$OutValue_3"]],
["Limiter","$Out_HVAC","$OutUnused","$Out_Frostschutz",["$OutValue_4", "$OutValue_4"]]
],
"Level": [
["$InStat","integer",0],
["$Bit0","bool",false],
["$Bit1","bool",false],
["$Bit2","bool",false],
["$Bit3","bool",false],
["$InBasismodus","integer",1],
["$SetBasismodus","integer",1],["$InWinterbetrieb","bool",true],
["$InFensterOffen","bool",false],
["$InFensterOffen_Delayed","bool",false],
["$InFensterVerzoegerung","float",0.0],
["$InFensterVerzoegerung_Sek","float",0.0],
["$Delayed_ON","bool",false],
["$InNacht","bool",false],
["$InAbwStandby","bool",false],
["$VAR<STANDBY?>","bool",false],
["$VAR<ECO?>","bool",false],
["$VAR<FROSTSCHUTZ?>","bool",false],
["$Out_HVAC","integer",2],
["$Out_Komfort","bool",false],
["$Out_Nacht","bool",false],
["$Out_Frostschutz","bool",false],
["$Out_Sperrobjekt","bool",false],
["$OutValue_1","integer",1],
["$OutValue_2","integer",2],
["$OutValue_3","integer",3],
["$OutValue2_3","integer",3],
["$OutValue_4","integer",4],
["$OutUnused","integer",0],
["$OutUnusedBool","bool", false],
["$IsBasismodus2","bool",false],
["$IsBasismodus4","bool",false],
["$Lvl1_Standby","bool",false],
["$Lvl1_Eco","bool",false],
["$Lvl1_Frostschutz","bool",false],
["$Lvl2_Mode","integer",1],
["$Konst_Null","float",0.0],
["$Konst_Sekunden","float",60.0],
["$VAR<Inhibit?>","bool",false]
]
}
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.