ich möchte meine Rollos zum beschatten herunter fahren wenn 25000 Lux für 10 Minuten überschritten sind.
Bis jetzt setze ich bei 25000Lux eine Bool Variable auf true und ich löse ein Skript aus das einen Verzögerungstimer von 10 Minuten hat.
Jetzt fährt natürlich mein Rollo auch wenn 2 Minuten nach überschreiten von 25000Lux wieder eine Wolke den Wert unter 25000Lux fallen lässt.
Die Bool Variable setze ich erst bei einem Wert unter 8000Lux wieder zurück auf false, was zum hoch fahren der Rollos führt.
Ich steh leicht auf dem Schlauch wie ich das in IPS lösen kann.
Werte doch aus, wann das Rollo das letzte Mal gefahren ist und setze keinen erneuten Fahrbefehl ab, wenn es z.B. vor vier Minuten gerade erst gefahren ist.
Ich möchte das runter fahren um 10 Minuten verzögern solange der Grenzwert überschritten ist. Fällt der Wert während der Timer läuft unter den Grenzwert soll der Timer wieder auf 0 gesetzt werden.
du hast ja eine Variable sobald die 25000 überschritten werden.
Hier ein Beispiel:
<?
$status = GetValue(12345); // deine Variable
$time = 600; // Zeit in Sekunden für den Timer
If ($_IPS['SENDER'] == "Variable")
{
If ($status == true)
{
IPS_SetScriptTimer($_IPS['SELF'],$time);
}
else
{
//mach nix
}
}
else
{
echo "Dieses Sript kann nur entweder durch eine Variable oder ein Timerevent gestartet werden";
}
If ($_IPS['SENDER'] == "TimerEvent") // Wenn das Script durch den Timer gestartet wird
{
If ($status == true)
{
//Befehl für Beschattung
IPS_SetScriptTimer($_IPS['SELF'],0); // Timer ausschalten
}
else
{
IPS_SetScriptTimer($_IPS['SELF'],0); // Timer ausschalten
}
}
else
{
}
?>
Erreigniss hinzufügen: Wenn deine Variable „true“ ist (also über 25000) soll dieser Script ausgeführt werden.
Einfach mal testen
so ähnlich sieht mein Skript im Moment aus. Wenn das Skript einmal läuft werden nach 10 Minuten die Rollos gefahren. Abbruch währe nur möglich wenn der Luxwert unter 8000 sinkt
Das Skript ist mein fahre ohne Sonne hoch Skript, bei meinem fahre runter Skript habe ich im Moment alles mit dem Timer aus kommentiert, sieht aber sonst gleich aus nur das natürlich alle Bedingungen gedreht sind.
<?
$verzoegerung = "10"; //in Minuten
$Sonne = GetValueBoolean(54025 /*[Sonne\Sensor West]*/);
$Tag = GetValueBoolean(24029 /*[Location\Ist es Tag]*/);
print "Sonne ist $Sonne";
if($_IPS['SENDER'] == "TimerEvent")
{
// Ist noch Sonne vorhanden oder kein Tag mehr, dann Skript abbrechen
if ($Sonne == true or $Tag == false)
{
//Timer ausschalten
IPS_SetScriptTimer($_IPS['SELF'], 0);
return;
}
// Rollos hoch fahren
HP_SetPosition(55011 /*[Rollos\ROL Kueche]*/, 0);
HP_SetPosition(17823 /*[Rollos\ROL Kueche Tuer]*/, 0);
//Timer ausschalten
IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
//Timer anschalten
IPS_SetScriptTimer($_IPS['SELF'], $verzoegerung*60);
}
?>
In einer SPS würde das Netzwerk so aussehen
-----|Vergleicher >25000|----------|Timer|---------(Merker Sonne setzen)
der Merker wird erst gesetzt wenn der Vergleicher die gesamte Zeit des Timers True setzt.
Ganz Allgemein würde ich so was mal unter Funktionswünsche eintragen, das lässt sich mit Skripten realisieren, es wäre aber aus meiner Sicht sehr wünschenswert, so was als bedingtes Ereignis bei Ereignissen in IP-Symcon zu ergänzen.
…so was ähnliches suche ich auch:D: Meine Rolladen sollen erst hinauffahren, wenn eine bestimmte Luxanzahl eine gewisse Zeit unterschritten ist (nicht bei jeder kleinen Wolke rauf und runter)
Wie schon eingangs geschrieben habe ich eine Variable die Sonne true oder false meldet
Ich habe ein Ereignis das bei Grenzwertüberschreitung von 25000 Lux auslöst und die Variable Sonne auf true setzt
Das runter fahr Skript hat eine Scripttimer von 10 Minuten und eine Abfrage ob die Sonne false ist, wenn ja macht es nichts und setzt den Skripttimer auf 0
weiter habe ich eine Variabel die Beschattung true oder false meldet. Hat das runterfahr Skript seine Arbeit getan und das Rollo ist in Beschattungsposition wird die Variable Beschattung true, solange der Skripttimer läuft ist die Variable Beschattung noch false.
Wird der Grenzwert von 25000 Lux unterschritten wird folgender Code ausgeführt.
Ist noch nicht beschattet wird die Variable Sonne auf false gesetzt und das Skript bricht wie oben beschrieben ab wenn es durch den noch laufenden Spripttimer gestartet wird.
Bei Grenzwert unter 8000 Lux findet alles in umgekehrter Reihenfolge statt.
Ich hoffe das man mit meiner Erklärung was anfangen kann.
Ich würde es über Mittelwertbildung, wie hier beschrieben regeln. So hab ichs zumindest gelöst und 10 Min finde ich relativ knapp. Das kann nerven an einem wechselhaft bewölktem Tag
Hi,
Ich würde so etwas über einen Zeitlich Gewichteten Mittelwert machen. Hat den Charme, das bei relativ sonnigem Wetter die RL runterfahren und wenn dann mal kurz ne Wolke vorbeikommt nicht gleich reagieren. Steigert sich die „Wolkenrate“ fährt der RL wieder hoch.
Funktioniert recht simpel:
Einen Script anlegen, der regelmäßig aufgerufen wird, Bspw. Alle 30 Sekunden.
Das ganze nennt sich Verzögerungsglied, PT1-Glied usw. kommt aus der Regelungstechnik. Den richtigen Wert von K kann man berechnen. Das halte ich aber für sehr kompliziert und überhaupt nicht nötig.
Die Formel funktioniert relativ einfach. Im Prinzip kannst du dir das so vorstellen, dass du eine Variable hast, die dir den Zustand deiner Helligkeit abbildet (=$templux) und zwar mit einer gewissen Trägheit. Jeder neue Messwert ($curlux) verändert diesen inneren Zustand. Das besondere ist, dass jeder neue Wert nur geringen Einfluss auf den neuen inneren Wert hat ($k*$curlux).
Damit sich der innere Wert irgendwann auf den tatsächlichen Wert einpendelt muss nur noch er aktuelle innere Wert mit 1-$k multipliziert werden und dazu addiert werden.
So genug der Vorrede.
Je größer $k ist, desto schneller reagiert der neue innere Wert auf die aktuelle tatsächliche Helligkeit. (setz mal im Extremfall $k=1).
Als Faustformel kannst Du annehmen, dass dein innerer Wert ($templux) nach 1/$k Zyklen fast ausgeglichen ist.
Mit anderen Worten: Je öfter (Zyklen pro Minute) Du berechnest, desto kleiner muss $k sein, je schneller Du Dein System machen willst desto größer muss $k sein. Je träger es sein soll, desto kleiner muss es sein.
Am einfachsten Du beginnst bei 0,1 und tastest Dich in den nächsten Tagen immer weiter an Dein gewünschtes Verhalten ran.