Seite 1 von 1

Baustein zur Erkennung von Sonnenschein, aktuell: V1.0

Verfasst: Di Aug 27, 2019 11:27 pm
von Dragonos2000
Da nachgefragt wurde hier ein Bausteincode, um zu erkennen, ob die Sonne scheint. Ich werde hier immer die aktuelle Version posten, inhaltliche Diskussionen bitte in einem separaten Thread, daher ist hier für Beiträge gesperrt.

Zeit für die nächste Version :)

Changelog seit V0.8
  • Anpassung des Umschaltgrenzwerts per ext. Parameter (Schaltschwelle kann angepasst werden)
  • Abfangen Division durch Null, falls die Sensoren tatsächlichen 0 Lux liefern (würde den Baustein abbrechen lassen)
  • Implementierung einer Hysterese
  • Ausgang für ungeglätteten maximalen Helligkeitswert
  • Ausgang für träge und flinke Ausgabe der Sonnenerkennung
  • Eingang zum setzen einer mindest Helligkeit zur Sonnenerkennung
  • Eingang zum Deaktivieren der Sonnenerkennung (maximale Helligkeitswerte werden weiterhin gesendet)
  • Es sind standardmäßig bereits die 2 mindestens benötigten Helligkeitseingänge angelegt
########### V1.0 ###########

Code: Alles auswählen

{
	"Level":[
		["$Stat_Min","float",0],
		["$Stat_Max","float",0],
		["$ConstEins","integer",1],
		["$ConstHundert","integer",100],
		["$ConstTrue","bool",true],		
		["$MinLux","float",0],
		["$MaxLux","float",0],
		["$MaxLuxOut","float",0],
		["$Div_Quotient_short","float",0],
		["$Div_Quotient_long","float",0],
		["$Threshold_baseline","float",0.38],
		["$Threshold","float",0],
		["$P_Threshold_Adjust","integer",0],
		["$Threshold_Adjust","float",0.0],
		["$Threshold_Hysteresis","float",0],
		["$Sunshine_long","bool",false],
		["$Sunshine_short","bool",false],		
		["$Result_long","bool",false],
		["$Holddownsun","bool",false],
		["$Holddownlux","bool",false],
		["$MinCResult","bool",false],
		["$MaxCResult","bool",false],		
		["$Holddown_result","bool",false],
		["$WaitTimesun","integer",1],
		["$LowpassPar","integer",60],
		["$P_WaitTimelux","integer",10],		
		["$P_Hysteresis","float",0.04],
		["$P_Darkness_limit_max","float",5000],
		["$P_Darkness_limit_min","float",999],
		["$P_Filtertime","integer",600],
		["$O_Sun_long","bool",false],
		["$O_Outlux","float",0],
		["$O_Result_short","bool",false],
		["$I_SunDis","bool",false],
		["$I_Helligkeit","float",0],
		["$VAR<I_Helligkeit!>","float",0],
		["$VAR<Inhibit?>","bool",false]
	],
	"Module":[
		["Break",["$VAR<Inhibit?>"]],
		["Statistic",["$I_Helligkeit","$VAR<I_Helligkeit!>"],"$Stat_Min","$Stat_Max",0,0],
		["Multiplexer",["$ConstEins","$Stat_Min"],"$Stat_Min","$Stat_Min"],																	//Abfangen Division durch 0 bei Sensorwert 0
		["Lowpass","$Stat_Max","$MaxLux","$LowpassPar"],																					//Glättung Maximalwerte Helligkeit vor Berechnung
		["Lowpass","$Stat_Min","$MinLux","$LowpassPar"],																					//Glättung Minimalwerte Helligkeit vor Berechnung
		["Ratio","$MinLux","$Div_Quotient_long","$MaxLux"],																					//Für langsam reagierenden Ausgang
		["Ratio","$Stat_Min","$Div_Quotient_short","$Stat_Max"],																			//Für schnell reagierenden Ausgang
		["Ratio","$P_Threshold_Adjust","$Threshold_Adjust","$ConstHundert"],
		["Polynomial","$ConstEins","$Threshold",["$Threshold_baseline","-$Threshold_Adjust"]],
		["Polynomial","$ConstEins","$Threshold_Hysteresis",["$Threshold","-$P_Hysteresis"]],		
		["Comparator","$Div_Quotient_long","-$Sunshine_long",["$Threshold_Hysteresis","$Threshold"]],
		["Comparator","$Div_Quotient_short","-$Sunshine_short",["$Threshold_Hysteresis","$Threshold"]],
		["Comparator","$MinLux","$MinCResult","$P_Darkness_limit_min"],																		//Keine Ausgabe Sonnenschein bei zu geringer Helligkeit
		["Comparator","$MaxLux","$MaxCResult","$P_Darkness_limit_max"],
		["And",["$Sunshine_long","$MaxCResult","$MinCResult"],"$Result_long"],
		["And",["$Sunshine_short","$MaxCResult","$MinCResult"],"$O_Result_short"],
		["Or",["$O_Result_short","$I_SunDis"],"$O_Result_short"],																			//Sperre Sonnenerkennung
		["Lowpass","$Stat_Max","$MaxLuxOut","$P_Filtertime"],																				//Filter für Summenausgang maximale Helligkeit
		["Monoflop","$ConstTrue","-$ConstTrue","$Holddownsun","$WaitTimesun",1],
		["Monoflop","$ConstTrue","-$ConstTrue","$Holddownlux","$P_WaitTimelux",0],
		["Multiplexer",["$Result_long","$Holddown_result"],"$Holddown_result","$Holddownsun"],
		["Multiplexer",["$MaxLuxOut","$O_Outlux"],"$O_Outlux","$Holddownlux"],
		["Or",["$Holddown_result","$I_SunDis"],"$O_Sun_long"]																				//Sperre Sonnenerkennung
	],
	"Input":[
		["Sektor 0","Eingang Helligkeitssensor (Lux)","$I_Helligkeit","c"],																	//Erster immer benötigter Sektor (mind. 2)
		["Sektor","Eingang Helligkeitssensor (Lux)","$VAR<I_Helligkeit!>","c"],																//Dynamisches ergänzen weiterer Sektoren, 1 weiterer Sektor auf jeden Fall
		["MinimumLux","Mindesthelligkeit zur Erkennung Sonnenschein und deaktivierung Hitzeschutz (empf. 5000)","$P_Darkness_limit_max","c"],
		["SchwelleMod","Anpassung Schaltschwelle (ca. +/- 10, positive Werte bedeuten mehr Sonne um zu schalten)","$P_Threshold_Adjust","c"],
		["Verzoegerung","Verzoegerung in s, bis neue Helligkeit gesendet wird (empf. 60s)","$P_WaitTimelux","c"],
		["Filterzeit","Lowpass Zeitkonstante zur Glättung der Helligkeit des Ausgangs (empf. 600s)","$P_Filtertime","c"],
		["SonneSperre","Sperren der Sonnenerkennung (Gesperrt = True); MaxLux wird weiterhin gesendet","$I_SunDis","c"],
		["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
	],
	"Output":[
		["MaxLux(gefiltert)","Ausgang für geglätteten max. Helligkeitswert aller Eingänge","$O_Outlux","c"],
		["MaxLux(raw)","Ausgang für ungeglätteten max. Helligkeitswert aller Eingänge","$Stat_Max","c"],
		["SonneLang","Sonne scheint, langsame Reaktionszeit (Bei Sonnenschein = True)","$O_Sun_long","c"],
		["SonneKurz","Sonne scheint, schnelle Reaktionszeit (Bei Sonnenschein = True)","$O_Result_short","c"]
	]
}
Beschreibung
  • Der Baustein benötigt mindestens 2 Helligkeitswerte aus sich nicht überlappenden Sektoren
  • Es können beliebig viele Helligkeitssensoren zugeführt werden
  • Das Umschalten Sonne/keine Sonne (lang) benötigt etwa 2 Minuten
  • Die einstellbare Verzögerung dient dem Zweck, nicht bei bei jedem neuen Trigger durch geringfügig geänderte Helligkeiten, nachgelagerte Logiken ebenfalls sofort zu triggern (bspw. alle Beschattungsbausteine durch geringfügige Helligkeitsänderungen an einem der Sensoren)
  • Bei gesetzter Sperre werden die beiden Sonnen-Ausgänge auf "True" gesetzt
  • Die Mindesthelligkeit der Sonnenerkennung kann nun eingestellt werden. Sinnvolle Werte hängen stark von den Helligkeitssensoren ab. Ich empfehle 5000 Lux
  • Die Schaltschwelle kann bei Bedarf über den Eingang "SchwelleMod" verändert/verschoben werden (ganzzahlige Werte -10...+10). Positive Werte bedeuten es ist mehr Sonne nötig, um zu schalten.

Re: Baustein zur Erkennung von Sonnenschein, aktuell: V0.7

Verfasst: Do Aug 29, 2019 10:05 pm
von Dragonos2000
Backlog für die nächsten Releases:
  1. Ausgang für den geglätteten maximalen Helligkeitswert aller Eingänge
  2. Zusätzlicher Ausgang für verzögertes Schalten Sonne/keine Sonne (-> separater Zusatzbaustein für Beschattung)
  3. Geändertes Sendeverhalten (Ausgangskonfiguration nicht "on Timer")
  4. Einstellbarer Schwellwert für Mindesthelligkeit, bevor "keine Sonne" ausgegeben wird
  5. Logik für optimierte Steuerung Hitzeschutz für Beschattungsbaustein (-> separater Zusatzbaustein für Beschattung)

Re: Baustein zur Erkennung von Sonnenschein, aktuell: V0.7

Verfasst: Sa Sep 07, 2019 7:19 pm
von Dragonos2000
Der Code ist experimentell.

########### V0.7 ###########

Code: Alles auswählen

{
    "Level":[
		["$Stat_Min","float",0],
		["$Stat_Max","float",0],
                ["$Stat_Mean","float",0],
		["$Stat_Median","float",0],
		["$Div_Quotient","float",0],
		["$Lim_Min","float",0.35],
		["$Darkness_limit","float",0],
		["$Sunshine","bool",false],
		["$TooDark","bool",false],
		["$Out","bool",false],
		["$ConstTrue","bool",true],
		["$WaitTime","float",1],
		["$VAR<Helligkeit!>","float",0],
		["$VAR<Inhibit?>","bool",false]
    ],
    "Module":[
                ["Break",["$VAR<Inhibit?>"]],
		["Monoflop","$ConstTrue","-$ConstTrue",0,"$WaitTime",1],
                ["Statistic",["$VAR<Helligkeit!>"],"$Stat_Min","$Stat_Max","$Stat_Mean","$Stat_Median"],
                ["Ratio","$Stat_Min","$Div_Quotient","$Stat_Max"],
		["Comparator","$Div_Quotient","-$Sunshine","$Lim_Min"],
		["Comparator","$Div_Quotient","$TooDark","$Darkness_limit"],
		["And",["$Sunshine","$TooDark"],"$Out"]
    ],
    "Input":[
                ["Helligkeit","Sensorwert","$VAR<Helligkeit!>","c"],
		["Wartezeit","Wartezeit nach Eingang des ersten Triggers bevor Ergebnis gesendet wird","$WaitTime","c"],
                ["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
    ],
    "Output":[
                ["Debug","Debug Ausgang (entfällt zu einem späteren Zeitpunkt)","$Div_Quotient","t"],
		["Sonne","Sonne scheint","$Out","t"]
    ]
}
Beschreibung
  • Der Baustein benötigt mindestens 2 Helligkeitswerte aus sich nicht überlappenden Sektoren
  • Es können beliebig viele Helligkeitssensoren zugeführt werden
  • Das Umschalten Sonne/keine Sonne erfolgt ohne Verzögerung
  • Der Ausgang "Debug" hat keine funktionale Bedeutung, dient nur mir zur Ermittlung der besten Werte
  • Der Ausgang "Sonne" muss so konfiguriert sein, dass er nur "on Timer" sendet (Option "T")
Die Verzögerung dient dem Zweck ein Umschalten des Ausgangs zu verhindern, solange nicht alle Werte aktualisiert wurden. Bei meiner Wetterstation kommen bspw. die Werte nacheinander innerhalb etwa 1s. Das hat dann mitunter zu falschem kurzzeitigem Umschalten geführt, weil neue mit alten Werten verglichen wurden. Im nächsten Baustein ist das etwas anders gelöst.

Re: Baustein zur Erkennung von Sonnenschein, aktuell: V0.8

Verfasst: Do Sep 26, 2019 11:39 pm
von Dragonos2000
Da nachgefragt wurde hier ein Bausteincode, um zu erkennen, ob die Sonne scheint. Ich werde hier immer die aktuelle Version posten, inhaltliche Diskussionen bitte in einem separaten Thread, daher ist hier für Beiträge gesperrt.

Zeit für ein Update :)

Changelog
  • Gezieltes durchschalten des Ausgangs (Ausgang muss nicht auf "on Timer" umgestellt werden)
  • Intern verarbeitete Helligkeitswerte sind geglättet
  • Ausgang für geglätteten max. Helligkeitswert
Der Code ist noch experimentell!

########### V0.8 ###########

Code: Alles auswählen

{
	"Level":[
		["$Stat_Min","float",0],
		["$Stat_Max","float",0],
		["$ConstZero","float",0],
		["$ConstTrue","bool",true],
		["$MinLux","float",0],
		["$MaxLux","float",0],
		["$MaxLuxOut","float",0],
		["$Div_Quotient_long","float",0],
		["$Lim_Min","float",0.35],
		["$Darkness_limit","float",1000],
		["$Sunshine","bool",false],
		["$Result","bool",false],
		["$Holddownsun","bool",false],
		["$Holddownlux","bool",false],
		["$LowpassPar","integer",60],
		["$MinCResult","bool",false],
		["$MaxCResult","bool",false],
		["$O_Lux","float",0],
		["$O_Sun","bool",false],
		["$P_WaitTimesun","float",1],
		["$P_WaitTimelux","float",10],
		["$P_Filtertime","integer",600],
		["$VAR<I_Helligkeit!>","float",0],
		["$VAR<Inhibit?>","bool",false]
	],
	"Module":[
		["Break",["$VAR<Inhibit?>"]],
		["Monoflop","$ConstTrue","-$ConstTrue","$Holddownsun","$P_WaitTimesun",1],
		["Monoflop","$ConstTrue","-$ConstTrue","$Holddownlux","$P_WaitTimelux",0],
		["Statistic",["$VAR<I_Helligkeit!>"],"$Stat_Min","$Stat_Max",0,0],
		["Lowpass","$Stat_Max","$MaxLux","$LowpassPar"],
		["Lowpass","$Stat_Min","$MinLux","$LowpassPar"],
		["Ratio","$MinLux","$Div_Quotient_long","$MaxLux"],
		["Comparator","$Div_Quotient_long","-$Sunshine","$Lim_Min"],
		["Comparator","$MinLux","$MinCResult","$ConstZero"],
		["Comparator","$MaxLux","$MaxCResult","$Darkness_limit"],
		["And",["$Sunshine","$MaxCResult","$MinCResult"],"$Result"],
		["Lowpass","$Stat_Max","$MaxLuxOut","$P_Filtertime"],
		["Multiplexer",["$Result","$O_Sun"],"$O_Sun","$Holddownsun"],
		["Multiplexer",["$MaxLuxOut","$O_Lux"],"$O_Lux","$Holddownlux"]
	],
	"Input":[
		["Helligkeit","Sensorwert","$VAR<I_Helligkeit!>","c"],
		["Verzoegerung","Verzoegerung in s, bis neue Helligkeit gesendet wird","$P_WaitTimelux","c"],
		["Filterzeit","Lowpass Zeitkonstante zur Glättung der Helligkeit des Ausgangs","$P_Filtertime","c"],
		["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
	],
	"Output":[
		["DebugOut1","Ausgang für Debugging","$Div_Quotient_long","c"],
		["MaxHelligkeit","Ausgang für geglätteten max. Helligkeitswert aller Eingänge","$O_Lux","c"],
		["Sonne","Erkennung Sonnenschein","$O_Sun","c"]
	]
}
Beschreibung
  • Der Baustein benötigt mindestens 2 Helligkeitswerte aus sich nicht überlappenden Sektoren
  • Es können beliebig viele Helligkeitssensoren zugeführt werden
  • Das Umschalten Sonne/keine Sonne benötigt etwa 2 Minuten
  • Die einstellbare Verzögerung dient dem Zweck, nicht bei bei jedem neuen Trigger durch geringfügig geänderte Helligkeiten, nachgelagerte Logiken ebenfalls sofort zu triggern
  • Der Ausgang "Debug" hat keine funktionale Bedeutung, dient nur mir zur Ermittlung der besten Werte