UPGRADE IP 9 verfügbar!
Timberwolf VISU jetzt mit NEUEM Layout Editor
Freie Anordnung, Reihenfolge und Größe der Widgets - viele weitere Verbesserungen
Infos im Wiki: https://elabnet.atlassian.net/l/cp/06SeuHRJ

NEU! Insider & Leistungsmerkmale FÜR ALLE freigeschaltet
Damit kann nun jeder das Upgrade vornehmen und VISU & IFTTT testen. Alle Info hier: viewtopic.php?f=8&t=5074

[TOP TIPP] Vollautomatische 24h Jalousiesteuerung (Baustein 2: Berechnung Höhe)

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
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

Vollautomatische 24h Jalousiesteuerung (Baustein 2: Berechnung Höhe)

#1

Beitrag von Robert_Mini »

Hallo zusammen!

Ich möchte euch in diesem und weiteren Threads eine Lösung zur Steuerung der Jalousien vorstellen. Aufgrund meiner Erfahrungen mit dezentraler Logik auf Wetterstationen etc. habe ich nun die Steuerung komplett auf den TWS übertragen. Damit habe ich für mich eine (fast) perfekte Lösung geschaffen, die für viele andere auch funktionieren sollte.

Die Übersicht zu Hauptmerkmalen, Bausteinen und deren Zusammenspiel ist hier zu finden:
viewtopic.php?f=65&t=1564

Die Höhenberechnung liefert für den Automatikbetrieb die Sollhöhe, abhängig von Sommer/Winter und Innentemperatur.

Funktionsweise:
  • Im für Sommer kann eine fixe höhe zB 90% oder 100% parametriert werden. Damit wird eine maximale Beschattungswirkung erreicht (wenn die Bedingungen für Auto im Baustein 2 erfüllt sind).
  • Im Winter wird die Höhe proportional zu Überschreitung der Solltemperatur berechnet. Ich verwende dazu 10% pro 0,1°C (=> Delta_T 1°C für max. Beschattung) und 0,5°C Offset zur Temperatur des RTR.
    zB Solltemperatur 23°C, 0,5°C Offset => Bei 23,7°C wird 20% beschattet, bei 24,5% zu 100%.
Eingänge:
  • Winter: Winter = True, ggf. einfach am Eingang invertieren verwenden
  • T_Soll: Raumtemperatur Sollwert, ab dem beschattet werden soll. Damit nicht gleichzeitig geheizt und beschattet wird, sollte ein Offset verwendet werden (siehe unten)
  • T_Ist: Aktuelle Raumtemperatur zB als KNX-Objekt vom Raumtemperaturregler
  • Heizmodus: Aktueller Modus des Raumtemperaturreglers. 0=Heizen, 1=Kühlen. Solange an diesem Eingang 0 anliegt, wird nicht beschattet, da noch geheizt wird. Ist kein RTR vorhanden oder soll diese Verrieglung nicht verwendet werden, muss der Eingang als Parameter mit "True" gesetzt werden.
Parameter (optional auch über Eingang als Objekt):
  • Hoehe Sommer: Legt die Behanghöge im Sommermodus fest zB 90% oder 100%
  • Der Offset wird zur Solltemperatur addiert. Daher kann direkt der Sollwert des RTR als Sollwert verwendet werden.
  • Der Parameter Delta_T_Max gibt dT für 100% an, im obigen Beispiel 1°C
  • Der Parameter Step legt fest gibt dT für 100% an, im obigen Beispiel 1°C
  • Hoehe_Min / Hoehe_Max: beschränkt den Beschattungsbereich im Winter zB auf 20-80%, d.h. es wird erst ab Sollhöhe 20% ein Wert >0 gesendet, die max. Sollhöhe wird auf 80% beschränkt. Damit kann unter anderem eine mindest Helligkeit erhalten gesichert werden.
  • Step: Beschreibt die Höhendifferenz, ab der sofort der neue Wert für Sollhöhe gesendet wird.
  • Verzögerung: Gibt an, ab welcher Zeit ein neuer Wert gesendet wird, sofern nicht vorher Step überschritten wurde.
    Zusammen mit Step wird ein zu häufiges Verfahren der Jalousie verhindert.
Ausgänge:
  • Hoehe Soll: Aktueller Sollwert
  • Hoehe Last: Letzter gesendete Wert
  • Aktiv: Gibt bei Höhe > 0 den Wert true aus.
Bild

Code: Alles auswählen

/**===========================================================
HoeheSoll aus Temperatur für Winterbetrieb
Sommer fixe einstellbare Höhe
Step und Delay beim Senden
TODO: Step-Min
============================================================*/
{
    "Level":[
        ["$I_Winter","bool",false],
        ["$I_Heizmodus","bool",false],
        ["$I_Hoehe_Sommer","float",100.0],
		["$I_Temp_Soll","float",24.0],
	    ["$Temp_Soll","float",24.5],
        ["$I_Temp_Akt","float",25.0],
        ["$I_Delta_T_Max","float",25.5],
		["$I_Step","float",20.0],
		["$I_Delay","float",20.0],
		["$I_Hoehe_Max","float",100.0],
		["$I_Hoehe_Min","float",20.0],
        ["$Hoehe_Soll","float",0.0],
        ["$Hoehe_Soll_Lim","float",0.0],
        ["$Hoehe_Soll_Step","float",0.0],
        ["$Hoehe_Soll_OutLast","float",0.0],
        ["$Hoehe_Soll_Out","float",0.0],
        ["$Hoehe_Soll_Out1","float",0.0],
        ["$I_Offset","float",0.5],
        ["$Delta_T","float",0.0],
        ["$Delta_Hoehe","float",0.0],
        ["$Delta_Hoehe_Abs","float",0.0],
        ["$Delta_Hoehe_Select","float",0.0],	
        ["$Steigung","float",0.0],
        ["$Konst100","float",100.0],
        ["$Konst1","float",1.0],
        ["$Konst0","float",0.0],
        ["$Val_ok","bool",false],
        ["$Trigger","bool",false],
        ["$Aktiv","bool",false],		
        ["$SelectHoehe","bool",false],
        ["$SelectStep","bool",false],
        ["$Step","float",20.0]		
    ],
    "Module":[
      // Letzte Höhe zu Beginn merken
		["Polynomial", "$Konst1", "$Hoehe_Soll_OutLast",["$Konst0", "$Hoehe_Soll_Out"]],	
	  //Offset berücksichtigen
	    ["Polynomial", "$Konst1", "$Temp_Soll",["$I_Temp_Soll", "$I_Offset"]],	
      // Delta T zur Solltemperatur berechnen
        ["Polynomial", "$Konst1", "$Delta_T",["$I_Temp_Akt", "-$Temp_Soll"]],	
      // Umrechnung dT in 0-100% 
		["Ratio","$Konst100","$Steigung","$I_Delta_T_Max"],
        ["Polynomial", "$Delta_T", "$Hoehe_Soll",["$Konst0", "$Steigung"]],
      //Sollwert Hoehe auf Min/Max einschränken, wenn <Min => auf Null setzen.
		["Limiter","$Hoehe_Soll","$Hoehe_Soll_Lim","$Val_ok",["$I_Hoehe_Min", "$I_Hoehe_Max"]],
		["Comparator", "$I_Hoehe_Min", "$SelectHoehe", "$Hoehe_Soll"],
        ["Multiplexer",["$Konst0","$Hoehe_Soll_Lim"],"$Hoehe_Soll_Lim","-$SelectHoehe"],			
	  //Höhe berechen mit aktuellem Step-Wert
		["Step","$Hoehe_Soll_Lim","$Hoehe_Soll_Step",0,"$Step",0],
	  //Prüfen ob sich der Wert geändert hat (Änderung>Step) und Verzögerungszeit starten
	  //Re-trigger wenn Step überschritten wird (betragsmäßig)
		["Polynomial", "$Konst1", "$Delta_Hoehe",["$Hoehe_Soll_Step", "-$Hoehe_Soll_OutLast"]],	
		["Comparator" , "-$Delta_Hoehe" , "$Delta_Hoehe_Select" , "$Konst0"],		
		["Multiplexer",["$Delta_Hoehe","-$Delta_Hoehe"],"$Delta_Hoehe_Abs","$Delta_Hoehe_Select"],		
		["Comparator" , "$Delta_Hoehe_Abs" , "$Trigger" , "$Konst0"],   		
		["Monoflop","$Trigger",0,"$SelectStep","$I_Delay",3],
	  //Während Verzögerungszeit nur Wert übernehmen, wenn I_Step überschritten ist, danach sofort senden. 
		["Multiplexer",["$Konst0","$I_Step"],"$Step","$SelectStep"],
	  //Höhe berechen mit neuem Step-Wert, damit auch nach Ablauf des Timers die Hoehe neu berechnet wird
		["Step","$Hoehe_Soll_Lim","$Hoehe_Soll_Step",0,"$Step",0],
	  //Heizmodus aktiv
  		["Multiplexer",["$Konst0","$Hoehe_Soll_Step"],"$Hoehe_Soll_Out1","$I_Heizmodus"],	
      //Sommer/Winter
		["Multiplexer",["$I_Hoehe_Sommer","$Hoehe_Soll_Out1"],"$Hoehe_Soll_Out","$I_Winter"],
	  //T_Akt > Temp_Soll
	    ["Comparator" , "$Delta_T" , "$Aktiv" , "$Konst0"]
    ],
    "Input":[
        ["Winter","Winter bei Winter=true","$I_Winter","c"],
        ["Hoehe Sommer","Beschattungsposition im Sommer","$I_Hoehe_Sommer","c"],
	    ["T_Soll","Soll-temperatur","$I_Temp_Soll","c"], 
	    ["T_Offset","Offset zu T-Soll, wenn T-Soll der Heizung-Solltemperatur entspricht","$I_Offset","c"], 	    
        ["T_Ist","Ist-Temperatur","$I_Temp_Akt","c"],
		["Heizmodus","Heizung aktiv, d.h. Reglersollwert sind schon Kühlbetrieb","$I_Heizmodus","c"],
 	    ["Hoehe_Min","Min. Beschattungsposition","$I_Hoehe_Min","c"],
 	    ["Hoehe_Max","Max. Beschattungsposition","$I_Hoehe_Max","c"],
 	    ["Delta_T_max","max. deltaT für Höhe 100%","$I_Delta_T_Max","c"],		
   	    ["Step","Position bei der sofort gesendet wird","$I_Step","c"],
        ["Verzögerung","Verzögerungszeit, aber der auch kleinere Höhendifferenzen gesendet werden","$I_Delay","c"]     	    	      
    ],
    "Output":[
        ["Hoehe Soll","Sollhöhe aus Temperaturdifferenz","$Hoehe_Soll_Out","c"],
        ["Hoehe Last","Letzte Höhe","$Hoehe_Soll_OutLast","c"],
        ["Aktiv","Beschattung aktiv, da T>Tsoll","$Aktiv","c"]
    ]
}
/**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.*/
Nutzungsrechte:
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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Robert_Mini am So Jan 31, 2021 5:31 pm, insgesamt 7-mal geändert.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

markusrohr
Reactions:
Beiträge: 192
Registriert: Sa Dez 08, 2018 7:33 pm
Wohnort: Lostorf
Hat sich bedankt: 173 Mal
Danksagung erhalten: 94 Mal
Kontaktdaten:

#2

Beitrag von markusrohr »

Guten Tag Robert,

wieder einmal mehr besten Dank für Deine Custom Logiken.

ich mache wieder einmal einen Anlauf um die Jalousiesteuerung umzusetzen. Bei mir erscheinen Debug Ausgänge wenn ich diese Custom Logik kopiere. Stammt der Code von einer älteren Version?
Freundliche Grüsse
Markus Rohr
TWS 950 ID 238 mit PBM ID: 10008, 3 Kanäle, Wartungs-VPN aktiviert, Neustart bitte nur nach Nachfrage, markus.rohr@bluewin.ch

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#3

Beitrag von Robert_Mini »

Hallo Markus!

Danke für deine Rückfrage.
In der Tat habe ich den Baustein nicht mehr aktualisiert bzw. die Debug-Ausgänge behalten.

Ich habe den Code+Bild ausgetauscht!
Es gibt nun zusätzlich einen Ausgang "Aktiv", der bei einer Höhe >0 den Wert true ausgibt.

lg
Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Piranha
Reactions:
Beiträge: 47
Registriert: Sa Jan 04, 2020 10:23 pm
Danksagung erhalten: 5 Mal

#4

Beitrag von Piranha »

Hallo Robert,

eine Frage was macht der Heizmodus im Vergleich zu Sommer/Winter-Umschaltung? Geht leider nicht aus der Beschreibung hervor.

LG

Alex
TWS 975 ID:433, VPN offen, Reboot auf nachfrage

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#5

Beitrag von Robert_Mini »

Hallo Alex!

Danke für die Rückfrage, hatte ich tatsächlich vergessen.
Ich hab's im Eingangsposting ergänzt.

Sag Bescheid, ob es verständlich beschrieben ist und ACHTUNG: nur bei "True" wird auch der berechnet Wert ausgegen.

lg
Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

markusrohr
Reactions:
Beiträge: 192
Registriert: Sa Dez 08, 2018 7:33 pm
Wohnort: Lostorf
Hat sich bedankt: 173 Mal
Danksagung erhalten: 94 Mal
Kontaktdaten:

#6

Beitrag von markusrohr »

Hallo Robert,

eine eher akademische Frage: wenn ich den Logikbaustein 2 richtig verstehe sendet dieser im Sommer immer die Sollhöhe Sommer (I_Hoehe_Sommer) unabhängig davon ob eine "Übertemperatur" im Raum herrscht oder nicht. Wäre es nicht konsequenter den Ausgang "Hoehe_Soll" im Sommer mit dem "neuen" Ausgang "Aktiv" zu verknüpfen so dass nur bei einem "Delta_T" > 0 der Wert 255 gesendet wird und sonst der Wert =

Ich bin mir bewusst, dass dies in den folgenden Bausteinen aufgefangen wird.

lg Markus
TWS 950 ID 238 mit PBM ID: 10008, 3 Kanäle, Wartungs-VPN aktiviert, Neustart bitte nur nach Nachfrage, markus.rohr@bluewin.ch

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#7

Beitrag von Robert_Mini »

Hallo Markus!

Da muss ich dir recht geben. Trifft zwar praktisch nie zu, aber beo so schlechten Sommertagen wie aktuell könnte das schon schlagend werden.
Bisher wollte ich dann aber auch schon für die nächsten heißen Tage ein paar Zehntel-Grad hinüber retten...

Lg
Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

martin
Reactions:
Beiträge: 138
Registriert: Mo Okt 15, 2018 10:07 pm
Wohnort: bei Stuttgart
Hat sich bedankt: 76 Mal
Danksagung erhalten: 69 Mal

#8

Beitrag von martin »

Hallo Robert,

nachdem der Winterbetrieb nun wieder aktiv ist, hab ich mir das zu häufige Verfahren der Raffstoren aufgrund der Differenztemperatur nochmal genauer angeschaut.
Bei mir kommt die Ist-Temperatur alle 5 Minuten auf den Eingang des Baustein 2 . Auflösung sind 2 Nachkommastellen, d.h. in der Regel wird dadurch der Baustein bei jedem Eingangssignal alle 5 Minuten ausgeführt. Die Verzögerungszeit habe ich auf 30 Minuten parametriert. Innerhalb dieser 30 Minuten wird keine aktualisierte Sollhöhe gesendet. Nach Ablauf des Timers wird der aktuelle Sollwert gesendet. Dieser Sollwert, der durch Ablauf des Timers gesendet wird startet jedoch den Timer nicht erneut. Dieser Neustart des Timers erfolgt erst bei der nächsten Ausführung des Bausteins, d.h. wenn ein weiteres Temperatursignal ankommt. Damit kommen bei mir nach Ablauf des Timers oft zwei Raffstorebewegungen innerhalb von 5-10 Minuten. Auch hier hätte ich gerne die parametrierten 30 Minuten.

Kennst du das Problem bei dir auch und hast ggf. schon eine bessere Lösung?

Bei mir habe ich es jetzt erstmal so gelöst, dass ich den im Eingangspost noch enthaltenen comperator mit float Ausgang auf bool geändert habe, siehe
viewtopic.php?f=95&t=3573&p=39781#p39781

und, dass ich eine Zeile eingefügt habe die die Änderungen an der Ist-Temperatur nur über 0,1K berücksichtigt. Solange die Änderung der Eingangstemperatur unterhalb der 0,1K innerhalb des 5-minuten Signalzyklus bleibt, funktioniert der 30Minuten-Timer dann wieder.

Code: Alles auswählen

/**===========================================================
HoeheSoll aus Temperatur für Winterbetrieb
Sommer fixe einstellbare Höhe
Step und Delay beim Senden
TODO: Step-Min

Ergänzung 2022-09-26 für hochauflösende Eingangstemperatur
============================================================*/
{
    "Level":[
        ["$I_Winter","bool",false],
        ["$I_Heizmodus","bool",false],
        ["$I_Hoehe_Sommer","float",100.0],
		["$I_Temp_Soll","float",24.0],
	    ["$Temp_Soll","float",24.5],
        ["$I_Temp_Akt","float",25.0],
        ["$I_Delta_T_Max","float",25.5],
		["$I_Step","float",20.0],
		["$I_Delay","float",20.0],
		["$I_Hoehe_Max","float",100.0],
		["$I_Hoehe_Min","float",20.0],
        ["$Hoehe_Soll","float",0.0],
        ["$Hoehe_Soll_Lim","float",0.0],
        ["$Hoehe_Soll_Step","float",0.0],
        ["$Hoehe_Soll_OutLast","float",0.0],
        ["$Hoehe_Soll_Out","float",0.0],
        ["$Hoehe_Soll_Out1","float",0.0],
        ["$I_Offset","float",0.5],
        ["$Delta_T","float",0.0],
        ["$Delta_Hoehe","float",0.0],
        ["$Delta_Hoehe_Abs","float",0.0],
        ["$Delta_Hoehe_Select","bool",false],	
        ["$Steigung","float",0.0],
        ["$Konst100","float",100.0],
        ["$Konst1","float",1.0],
        ["$Konst0","float",0.0],
        ["$Val_ok","bool",false],
        ["$Trigger","bool",false],
        ["$Aktiv","bool",false],		
        ["$SelectHoehe","bool",false],
        ["$SelectStep","bool",false],
        ["$Step","float",20.0],
        /* */
        //neu 2022-09-26
        ["$Temp_Smoothen_Step","float",0.1],
        ["$Temp_Akt_Smooth","float",20.0]
        /* */
    ],
    "Module":[
      // Letzte Höhe zu Beginn merken
		["Polynomial", "$Konst1", "$Hoehe_Soll_OutLast",["$Konst0", "$Hoehe_Soll_Out"]],	

	  //Offset berücksichtigen
	    ["Polynomial", "$Konst1", "$Temp_Soll",["$I_Temp_Soll", "$I_Offset"]],
	  /* */ 
	  //neu 2022-09-26 - zappelige Eingangstemperatur dämpfen als workaround, um zu häufiges Versenden nach Ablauf des Timers zu reduzieren
	    ["Step","$I_Temp_Akt","$Temp_Akt_Smooth",0,"$Temp_Smoothen_Step",0],
	  /* */   
      // Delta T zur Solltemperatur berechnen
        ["Polynomial", "$Konst1", "$Delta_T",["$Temp_Akt_Smooth", "-$Temp_Soll"]],	
      // Umrechnung dT in 0-100% 
		["Ratio","$Konst100","$Steigung","$I_Delta_T_Max"],
        ["Polynomial", "$Delta_T", "$Hoehe_Soll",["$Konst0", "$Steigung"]],
      //Sollwert Hoehe auf Min/Max einschränken, wenn <Min => auf Null setzen.
		["Limiter","$Hoehe_Soll","$Hoehe_Soll_Lim","$Val_ok",["$I_Hoehe_Min", "$I_Hoehe_Max"]],
		["Comparator", "$I_Hoehe_Min", "$SelectHoehe", "$Hoehe_Soll"],
        ["Multiplexer",["$Konst0","$Hoehe_Soll_Lim"],"$Hoehe_Soll_Lim","-$SelectHoehe"],			
	  //Höhe berechen mit aktuellem Step-Wert
		["Step","$Hoehe_Soll_Lim","$Hoehe_Soll_Step",0,"$Step",0],
	  //Prüfen ob sich der Wert geändert hat (Änderung>Step) und Verzögerungszeit starten
	  //Re-trigger wenn Step überschritten wird (betragsmäßig)
		["Polynomial", "$Konst1", "$Delta_Hoehe",["$Hoehe_Soll_Step", "-$Hoehe_Soll_OutLast"]],	
		["Comparator" , "-$Delta_Hoehe" , "$Delta_Hoehe_Select" , "$Konst0"],		
		["Multiplexer",["$Delta_Hoehe","-$Delta_Hoehe"],"$Delta_Hoehe_Abs","$Delta_Hoehe_Select"],		
		["Comparator" , "$Delta_Hoehe_Abs" , "$Trigger" , "$Konst0"],   		
		["Monoflop","$Trigger",0,"$SelectStep","$I_Delay",3],
	  //Während Verzögerungszeit nur Wert übernehmen, wenn I_Step überschritten ist, danach sofort senden. 
		["Multiplexer",["$Konst0","$I_Step"],"$Step","$SelectStep"],
	  //Höhe berechen mit neuem Step-Wert, damit auch nach Ablauf des Timers die Hoehe neu berechnet wird
		["Step","$Hoehe_Soll_Lim","$Hoehe_Soll_Step",0,"$Step",0],
	  //Heizmodus aktiv
  		["Multiplexer",["$Konst0","$Hoehe_Soll_Step"],"$Hoehe_Soll_Out1","$I_Heizmodus"],	
      //Sommer/Winter
		["Multiplexer",["$I_Hoehe_Sommer","$Hoehe_Soll_Out1"],"$Hoehe_Soll_Out","$I_Winter"],
	  //T_Akt > Temp_Soll
	    ["Comparator" , "$Delta_T" , "$Aktiv" , "$Konst0"]
    ],
    "Input":[
        ["Winter","Winter bei Winter=true","$I_Winter","c"],
        ["Hoehe Sommer","Beschattungsposition im Sommer","$I_Hoehe_Sommer","c"],
	    ["T_Soll","Soll-temperatur","$I_Temp_Soll","c"], 
	    ["T_Offset","Offset zu T-Soll, wenn T-Soll der Heizung-Solltemperatur entspricht","$I_Offset","c"], 	    
        ["T_Ist","Ist-Temperatur","$I_Temp_Akt","c"],
		["Heizmodus","Heizung aktiv, d.h. Reglersollwert sind schon Kühlbetrieb","$I_Heizmodus","c"],
 	    ["Hoehe_Min","Min. Beschattungsposition","$I_Hoehe_Min","c"],
 	    ["Hoehe_Max","Max. Beschattungsposition","$I_Hoehe_Max","c"],
 	    ["Delta_T_max","max. deltaT für Höhe 100%","$I_Delta_T_Max","c"],		
   	    ["Step","Position bei der sofort gesendet wird","$I_Step","c"],
        ["Verzögerung","Verzögerungszeit, aber der auch kleinere Höhendifferenzen gesendet werden","$I_Delay","c"]     	    	      
    ],
    "Output":[
        ["Hoehe Soll","Sollhöhe aus Temperaturdifferenz","$Hoehe_Soll_Out","c"],
        ["Hoehe Last","Letzte Höhe","$Hoehe_Soll_OutLast","c"],
        ["Aktiv","Beschattung aktiv, da T>Tsoll","$Aktiv","c"]
    ]
}
/**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.*/

VG Martin
TWS 2500 ID:152 + PBM ID:819 + PBM ID:1079, VPN aktiv, Reboot erlaubt"

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#9

Beitrag von Robert_Mini »

Hallo @martin !

Ich habe gerade gesehen, dass ich das bei einem anderen Raum schon gefixt habe. Lösung ist in dem Fall so umgesetzt, dass im Spezialfall ablaufender Timer ein Monoflop gestartet wird, das nach 1sec die Logik nochmal triggert und damit auch der zuletzt abgelaufene Timer wieder zu laufen beginnt.
Das Thema float beim comperator kommt nicht vor, hab ich grad geprüft.

Deinen Workaround hab ich jetzt nicht drinnen (da ja nicht notwendig), sollte aber noch rein, da er dem To-Do "Step-Min" entspricht!

Danke und lg
Robert

Code: Alles auswählen

/**===========================================================
HoeheSoll aus Temperatur für Winterbetrieb
Sommer fixe einstellbare Höhe
Step und Delay beim Senden
TODO: Step-Min
============================================================*/
{
    "Level":[
        ["$I_Winter","bool",false],
        ["$I_Heizmodus","bool",false],
        ["$I_Hoehe_Sommer","float",100.0],
		["$I_Temp_Soll","float",24.0],
	    ["$Temp_Soll","float",24.5],
        ["$I_Temp_Akt","float",25.0],
        ["$I_Delta_T_Max","float",25.5],
		["$I_Step","float",20.0],
		["$I_Delay","float",20.0],
		["$I_Hoehe_Max","float",100.0],
		["$I_Hoehe_Min","float",20.0],
		["$I_Offset","float",0.5],
        ["$Hoehe_Soll","integer",0],
        ["$Hoehe_Soll_Lim","integer",0],
        ["$Hoehe_Soll_Step","integer",0],
        ["$Hoehe_Soll_StepB","integer",0],
        ["$Hoehe_Soll_OutLast","integer",0],
        ["$Hoehe_Soll_Out","integer",0],
        ["$Hoehe_Soll_Out1","integer",0],
        ["$Delta_T","float",0.0],
        ["$Delta_Hoehe","integer",0],
        ["$Delta_HoeheLim","integer",0],
        ["$Delta_Timer","float",0.0],
        ["$Steigung","float",0.0],
        ["$Konst100","float",100.0],
        ["$Konst1","float",1.0],
        ["$Konst0","float",0.0],
        ["$KonstTrue","bool",true],
        ["$Val_ok","bool",false],
        ["$Val_Small","bool",false],
        ["$Val_Large1","bool",false],
        ["$Val_Large2","bool",false],
        ["$Val_Large","bool",false],
        ["$Val_Null","bool",false],
        ["$Trigger_Small","bool",false],
        ["$Trigger_Ende","bool",false],
        ["$Toggle","bool",false],
        ["$Aktiv","bool",false],		
        ["$SelectHoehe","bool",false],
        ["$Timer_Aktiv","bool",true],
        ["$Timer_Large","bool",false],
        ["$Timer_Small","bool",false],
        ["$Timer_Small_Last","bool",false],
        ["$Timer_ReTrigger","bool",false],
        ["$Step","float",20.0],
        ["$StepSmall","float",10.0],
        ["$StepLim","float",20.0],
        ["$Delay_ReTrigger","float",1.0]
    ],
    "Module":[
	  //Offset berücksichtigen
	    ["Polynomial", "$Konst1", "$Temp_Soll",["$I_Temp_Soll", "$I_Offset"]],	
      // Delta T zur Solltemperatur berechnen
        ["Polynomial", "$Konst1", "$Delta_T",["$I_Temp_Akt", "-$Temp_Soll"]],	
      // Umrechnung dT in 0-100% 
		["Ratio","$Konst100","$Steigung","$I_Delta_T_Max"],
        ["Polynomial", "$Delta_T", "$Hoehe_Soll",["$Konst0", "$Steigung"]],
      //Sollwert Hoehe auf Min/Max einschränken, wenn <Min => auf Null setzen.
		["Limiter","$Hoehe_Soll","$Hoehe_Soll_Lim","$Val_ok",["$I_Hoehe_Min", "$I_Hoehe_Max"]],
		["Comparator", "$I_Hoehe_Min", "$SelectHoehe", "$Hoehe_Soll"],
        ["Multiplexer",["$Konst0","$Hoehe_Soll_Lim"],"$Hoehe_Soll_Lim","-$SelectHoehe"],			
	  //Höhe berechen mit Minimum-Step-Wert
		["Step","$Hoehe_Soll_Lim","$Hoehe_Soll_Step",0,"$StepSmall",0],
	  
	  //Prüfen ob sich der Wert geändert hat (Änderung>Step) und Verzögerungszeit starten
	  //Re-trigger wenn Step überschritten wird (betragsmäßig)
	  
	  // Differenz zur letzten gesendeten Höhe	
		["Polynomial", "$Konst1", "$Delta_Hoehe",["$Hoehe_Soll_Step", "-$Hoehe_Soll_OutLast"]],	
		// Prüfe ob > 0
		["Limiter","$Delta_Hoehe","$Delta_HoeheLim","$Val_Null",["$Konst0", "$Konst0"]],
		["Limiter","$Delta_Hoehe","$Delta_HoeheLim","$Val_Large1",["-$I_Hoehe_Max", "-$I_Step"]],
		["Limiter","$Delta_Hoehe","$Delta_HoeheLim","$Val_Large2",["$I_Step","$I_Hoehe_Max"]],
	  //Große vs. kleine Änderung ermitteln
	    ["Or" , ["$Val_Large1" , "$Val_Large2"], "$Val_Large"],
	    ["And" , ["-$Val_Large" , "-$Val_Null"], "$Val_Small"],
	  //Wert übernehmen und Timer starten / re-triggern bei großer Änderung
	    ["Monoflop","$Val_Large",0,"$Timer_Large","$I_Delay",1],
	    ["Latch","$Hoehe_Soll_Step","$Hoehe_Soll_StepB","$Val_Large",0],
      //Prüfen ob StepSmall anliegt und Timer_Large oder beide Timer_Small abgelaufen sind
        ["And" , ["$Val_Small","-$Timer_Large","-$Timer_Small"], "$Trigger_Small"],
        ["Latch","$Hoehe_Soll_Step","$Hoehe_Soll_StepB","$Trigger_Small",0],
      
      //Timer starten
        ["Latch","$Timer_Small","$Timer_Small_Last","$KonstTrue",0],
        ["Monoflop","$Trigger_Small","$Val_Large","$Timer_Small","$I_Delay",2],
    
        // Wenn Timer_A_Vor <> Timer_A => Timer hat sich geändert
        // Wenn Small_Step = True => Senden und Logik re-triggern
        // Wenn Small_Step = False => nichts machen
        ["Limiter","$Timer_Small_Last","$Delta_Timer","-$Trigger_Ende",["$Timer_Small","$Timer_Small"]],
        
        ["Monoflop","$Trigger_Ende","$Val_Large","$Timer_ReTrigger","$Delay_ReTrigger",2],
        
	  //Heizmodus aktiv
  		["Multiplexer",["$Konst0","$Hoehe_Soll_StepB"],"$Hoehe_Soll_Out1","-$I_Heizmodus"],	
      //Sommer/Winter
		["Multiplexer",["$I_Hoehe_Sommer","$Hoehe_Soll_Out1"],"$Hoehe_Soll_Out","$I_Winter"],
		 //Beim neuen Aufruf letzten Wert merken
      	["Latch","$Hoehe_Soll_Out","$Hoehe_Soll_OutLast","$KonstTrue",0]
    ],
    "Input":[
        ["Winter","Winter bei Winter=true","$I_Winter","c"],
        ["Hoehe Sommer","Beschattungsposition im Sommer","$I_Hoehe_Sommer","c"],
	    ["T_Soll","Soll-temperatur","$I_Temp_Soll","c"], 
	    ["T_Offset","Offset zu T-Soll, wenn T-Soll der Heizung-Solltemperatur entspricht","$I_Offset","c"], 	    
        ["T_Ist","Ist-Temperatur","$I_Temp_Akt","c"],
		["Heizmodus","Heizung aktiv, d.h. Reglersollwert sind schon Kühlbetrieb","$I_Heizmodus","c"],
 	    ["Hoehe_Min","Min. Beschattungsposition","$I_Hoehe_Min","c"],
 	    ["Hoehe_Max","Max. Beschattungsposition","$I_Hoehe_Max","c"],
 	    ["Delta_T_max","max. deltaT für Höhe 100%","$I_Delta_T_Max","c"],		
   	    ["Step","Position bei der sofort gesendet wird","$I_Step","c"],
        ["Verzögerung","Verzögerungszeit, aber der auch kleinere Höhendifferenzen gesendet werden","$I_Delay","c"]     	    	      
    ],
    "Output":[
        ["Hoehe Soll","Sollhöhe aus Temperaturdifferenz","$Hoehe_Soll_Out","c"],
        ["Hoehe Last","Letzte Höhe","$Hoehe_Soll_OutLast","c"],
		["Debug Timer Large","","$Timer_Large","a"],
		["Debug Timer Small","","$Timer_Small","a"],
		["Debug Timer Re-Trigger","","$Timer_ReTrigger","a"],
		["Debug Delta_Hoehe","","$Delta_Hoehe","a"],
		["Debug Val_Large","","$Val_Large","a"],
		["Debug Val_Small","","$Val_Small","a"]
    ]
}
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297
Antworten

Zurück zu „Zusätzliche Logikbausteine“