Seite 3 von 3

Re: Sommer / Winterumschaltung nach DIN

Verfasst: Sa Dez 26, 2020 10:02 pm
von blaubaerli
Hi Georg,

danke Dir und allen anderen auch frohe Weihnachten.

Beste Grüße
Jens

Re: Sommer / Winterumschaltung nach DIN

Verfasst: Di Jul 20, 2021 12:44 pm
von Robosoc
Ich habe Roberts Code leicht ergänzt um:

A) einen manuellen Schalter, mit dem man im Doktormodus einen Ausgangswert erzwingen kann, der solange anliegt, bis der Ausgang von einem automatischen Wert überschrieben wird (was bei Ausgangsmodus "ct" eben defaultmäßig um 7:00, 14:00 oder 22:00 Uhr passiert).

B) in den ersten 24 Stunden jeweils alle 15 minunten den aktuellen Temperaturwert in die Speicher schreibt, solange wie die Speicher noch nicht vom Automatismus beschrieben wurden. Sobald ein Speicher um 7:00, 14:00 oder 22:00 Uhr beschrieben wird, wird nur noch der Wert genutzt. Sobald alle drei Speicher mindestens einmal vom Automatismus beschrieben wurden, wird der 15 Minuten Trigger (Cron) nicht mehr ausgeführt.
Auf diese Weise hat man auch in den ersten 24h nach einem Update der Logik (zum Beispiel hinzuzufügen eines weiteren Ausganges) bereits einen abgeschätzten Wert erhalten. Ohne die Änderung hat die Logik bis zu 24 h nach Erstinbetiebname meist Winter angezeigt, auch wenn Hochsommer war.

Code: Alles auswählen

/**===========================================================
Temperaturmittel und Sommer/Winter Umschaltung nach DIN 
mit Initialabschätzung (nicht nach DIN) und manuellem Schalter zum temporären übersteuern
============================================================*/
{
  "Input": [
        ["Außentemperatur","Gemessene Außentemperatur","$I_Temperature","u"], 
		["Temp. Sommer","Außentemperatur bei der auf Sommer umgeschaltet wird","$I_TempSommer","c"], 
		["Temp. Winter","Außentemperatur bei der auf Winter umgeschaltet wird","$I_TempWinter","c"],
		["Manueller Schalter", "Mannuelles Schreiben des Ausgangs bis zum nächsten automatichen Wert","$manTrigger","a"]
  ],
  "Output": [
		["Heizungsmodus Sommer/Winter","Ausgabe ob Sommer oder Winter","$Output","ct"],
		["Temperatur Tag gleitend","(T1+T2+T3*T3)/4","$Temperature_avg","ct"],
		["Temperatur Mittelwert Monat","Mittelwert seit Monatswechsel","$Temperature_avg_Monat","c"],
		["Counter","Anzahl Werte","$Counter?","c"],
		["Temp1 / 7:00","Anzahl Werte","$Temp1_?","c"],
		["Temp2 / 14:00","Anzahl Werte","$Temp2_?","c"],
		["Temp3 / 22:00","Anzahl Werte","$Temp3_?","c"]
  ],
  "Level": [
		["$manTrigger","bool",false],
		["$touched","bool",false],
		["$I_Temperature","float",0.0],
		["$I_TempSommer","float",0.0],
		["$I_TempWinter","float",0.0],
		["$I_Totzone","float",0.0],
		["$Output","bool",false],
		["$Temperature_sum","float",0.0],
		["$Temperature_avg","float",0.0],
		["$Temperature_sum_Monat","float",0.0],
		["$Temperature_sum_temp","float",0.0],
		["$Temperature_avg_Monat","float",0.0],
		["$Temperature_avg_MonatLast","float",0.0],
		["$Counter","integer",0],
		["$Counter_temp","integer",1],
		["$Counter_Lim","integer",0],
		["$Val_ok","bool",false],
		["$Temp1_","float",0.0],
		["$Temp2_","float",0.0],
		["$Temp3_","float",0.0],
		["$Init","bool",true],
		["$Reset0","bool",false],
		["$Reset1","bool",false],
		["$Reset2","bool",false],
		["$Reset3","bool",false],
		["$Temp1_gesetzt","bool",false],
		["$Temp2_gesetzt","bool",false],
		["$Temp3_gesetzt","bool",false],
		["$ResetMonatTrigger","bool",false],
		["$KonstTrue","bool",true],
		["$Konst0","float",0.0],
		//["$Konst0int","int",0],
		["$Konst1","float",1.0],
		["$Konst4","float",4.0],
		["$KonstFalse","bool",false],
		["$Zeitpunkt_init","string","0 10 * * * *"],
		["$Zeitpunkt1","string","0 0 7 * * *"],
		["$Zeitpunkt2","string","0 0 14 * * *"],
		["$Zeitpunkt3","string","0 0 22 * * *"],
		["$ResetMonat","string","20 2 0 1 * *"]
  ],
  "Module": [
		// manuelles triggeren erkennen
		[ "Triggered", "$manTrigger", "$touched" ],
		
		//Initialisierung
		["And" , ["-$Temp1_gesetzt","-$Temp2_gesetzt","-$Temp3_gesetzt"], "$Init"],
		["Cron","$Init","$Reset0",0,"$Zeitpunkt_init"],
        ["Latch","$I_Temperature","$Temp1_","-$Temp1_gesetzt",0],
        ["Latch","$I_Temperature","$Temp2_","-$Temp2_gesetzt",0],
        ["Latch","$I_Temperature","$Temp3_","-$Temp3_gesetzt",0],
		
		// Trigger für 7 / 14 und 22 Uhr
		["Cron","$KonstTrue","$Reset1",0,"$Zeitpunkt1"],
		["Cron","$KonstTrue","$Reset2",0,"$Zeitpunkt2"],
		["Cron","$KonstTrue","$Reset3",0,"$Zeitpunkt3"],
		["Cron","$KonstTrue","$ResetMonatTrigger",0,"$ResetMonat"],
		// Temperatur speichern
		["Multiplexer",["$Temp1_","$I_Temperature"],"$Temp1_","$Reset1"],
		["Multiplexer",["$Temp2_","$I_Temperature"],"$Temp2_","$Reset2"],
		["Multiplexer",["$Temp3_","$I_Temperature"],"$Temp3_","$Reset3"],
		// Pürfung ob Temperaturen gesichert sind
		["Multiplexer",["$Temp1_gesetzt","$KonstTrue"],"$Temp1_gesetzt","$Reset1"],
		["Multiplexer",["$Temp2_gesetzt","$KonstTrue"],"$Temp2_gesetzt","$Reset1"],
		["Multiplexer",["$Temp3_gesetzt","$KonstTrue"],"$Temp3_gesetzt","$Reset1"],
		// Mittelwert berechnen
		["Polynomial","$Konst1","$Temperature_sum",["$Temp1_","$Temp2_","$Temp3_","$Temp3_"]],
		["Ratio", "$Temperature_sum", "$Temperature_avg", "$Konst4"],
		// Überprüfung 
		["Comparator","$Temperature_avg","$Output",["$I_TempWinter","$I_TempSommer"]],
		
		// Summe um aktuellen Mittelwert erhöhen (nur bei Reset3)
	    ["Polynomial","$Konst1","$Temperature_sum_temp",["$Temperature_sum_Monat","$Temperature_avg"]],
	    ["Polynomial","$Konst1","$Counter_temp",["$Counter","$Konst1"]],
	    ["Multiplexer",["$Temperature_sum_Monat","$Temperature_sum_temp"],"$Temperature_sum_Monat","$Reset3"],
	    ["Multiplexer",["$Counter","$Counter_temp"],"$Counter","$Reset3"],
	    
	    // Divisor prüfen und bei Null mit 1 ersetzen
	    ["Limiter","$Counter","$Counter_Lim","$Val_ok",["$Konst0", "$Konst0"]],
	    ["Latch","$Konst1","$Counter","$Val_ok",0],
	    ["Ratio", "$Temperature_sum_Monat", "$Temperature_avg_Monat", "$Counter"],
	    // Ergebnis überschreiben und alten Divisor wiederherstellen
	    ["Latch","$Konst0","$Temperature_avg_Monat","$Val_ok",0],
	    ["Latch","$Konst0","$Counter","$Val_ok",0],
	    
	    // Summe und Counter zurücksetzen
	    ["Multiplexer",["$Counter","$Konst0"],"$Counter","$ResetMonatTrigger"],
	    ["Multiplexer",["$Temperature_sum_Monat","$Konst0"],"$Temperature_sum_Monat","$ResetMonatTrigger"],
	    
		// Reset auf 0 setzen
		["Multiplexer",["$Reset1","$KonstFalse"],"$Reset1","$Reset1"],
		["Multiplexer",["$Reset2","$KonstFalse"],"$Reset2","$Reset2"],
		["Multiplexer",["$Reset3","$KonstFalse"],"$Reset3","$Reset3"],
		["Multiplexer",["$ResetMonatTrigger","$KonstFalse"],"$ResetMonatTrigger","$ResetMonatTrigger"],
		
		// manuelles Schalten ausführen
		["Latch","$manTrigger","$Output","$touched",0]
  ]
}
/** 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. */

Empfehlung: Das Startverhalten des Temperatureingang habe ich auf I statt X gestellt. Das geht aber nur manuell vor dem Speichern der Logik.