Frage zu Regensensor-Skript

Hallo,
ich mühe meine erst entstehenden Programmierkenntnisse gerade mit einem Regenmeldungsskript ab. Es soll auf der Basis der Meldungen eines FS20 Regensensors drei Dinge leisten:

  1. Einen Befehl (z.B. Rolläden schließen) ausführen, wenn es anfängt zu regnen.
  2. Nichts tun, wenn es nur mal kurz aufhört zu regnen.
  3. Einen Befehl ausführen, wenn es „dauerhaft“ aufgehört hat zu regnen (wählbare Zeit, z.B. 15 Min. seit letzter Regenmeldung).

Dazu habe ich auch diversen Posts folgendes Script zusammengestellt, dass über Statusänderung des Regensensors getriggert wird (hier vereinfacht):

<?
$regenwarnung = GetValueBoolean (44227);  // soll ueberhaupt gewarnt werden?
$regen      = GetValueBoolean (36123);        // Aktueller Status des Sensors
$time       = time();                                  // Aktuelle Zeit
$totzeit = 900;                                        // Zeit seit letztem Regen ohne Alarm (15min)
$lastrain = GetValueInteger(52048);            // Zeitpunkt des letzten Regens

// FALL 1:
// Es regnet dauerhaft nicht (mehr)
if ($regenwarnung == true and $regen == false and $lastrain + $totzeit < $time) 
	{
		echo "Man knnte z.B. die Rollden ffnen"; // hier kommt der Befehl rein
	}

// FALL 2:
// Es hrt kurz auf zu regnen, aber es soll keine vorschnelle Aktion vorgenommen werden
if ($regenwarnung == true and $regen == false and  $lastrain + $totzeit > $time) 
	{
		echo "Nichts tun, da das mglicherweise nur mal kurze Regenpause war";
	}

// FALL 3:
//Es beginnt zu regnen
if ($regenwarnung == true and $regen == true)
	{
		echo "Man knnte z.B. die Rollden schlieen"; // hier kommt der Befehl rein
		SetValueInteger("LastRain",$time); 		// Zeit fr Regenbeginn wird gesetzt
	}
?>

Als Anfänger fehlt mir aber nun die Idee, wie ich den Schritt von der „kurzen Regenpause“ zum „dauerhaften Regenende“ vollziehen kann, d.h. wie kann ich IPS ohne Setzen eines weiteren, zyklischen Ereignisses mitteilen: „Wenn Du seit x Minuten nichts mehr vom Regensensor gehört hast, hat es zu regnen aufgehört“. Wenn der Status des Sensors sich nach einer Minute Trockenheit auf FALSE zurücksetzt kommt da ja bei anhaltender Trockenheit nichts mehr, was das Skript triggern könnte.

Ich meine, mal etwas Ähnliches in einem Regenskript von Toro im Forum gesehen zu haben, das ich aber trotz Suchen nicht mehr finde.

Habt Ihr einen Tipp?
Dank & Grüße
Martin

Hallo Martin,

abfragen wann die Variable das letzte mal upgedatet wurde.

$zeit = IPS_GetVariable(12345);
$zeit = date("H:i:s - d.m.y", $zeit['VariableUpdated']);  

Vielen Dank, Rainer,
Ich habe dennoch ein Fragezeichen auf dem Gesicht:

[ol]
[li]Es beginnt zu regnen, Status des Regensensors geht auf TRUE und triggert das Skript.
[/li][li]Nach einer Weile hört es auf zu regnen, und nach 60 sec. setzt sich der Status des Regensensors auf FALSE zurück und triggert dadurch erneut das Script. Das entscheidet „Vorläufig kein Regen“
[/li][li]Nun bleibt der Status auf FALSE, weil es nicht erneut anfängt zu regnen.
[/li][/ol]
Wie bekomme ich das Skript dazu (ohne es beispielsweise minütlich zu triggern), den Regenstatus dennoch auf „Regenende“ zu setzen? Dazu müsste ich es ja irgendwie erneut „anwerfen“. Hier ist mir noch nicht klar, wie ich das über die letzte Update-Zeit der Variable hinbekommen könnte.
Grüße
Martin

zur Ergänzung meiner Frage: Wenn ich das Skript über einen Timer z.B. alle 60 sec. ausführen lasse, dann könnte ich das sowohl über die $Lastrain Variable aus meinem ersten Skript erreichen als auch über die Abfrage des letzten Updates. Das wäre dan, vrmute ich, so etwas Einfaches wie:

<?
$regenwarnung = GetValueBoolean (44227); // soll ueberhaupt gewarnt werden?
$regen      = GetValueBoolean (36123);         // Aktueller Status des Sensors
$time       = time();                               // Aktuelle Zeit
$totzeit = 900;                                     // Zeit seit letztem Regen ohne Alarm (15min)
$trockenzeit = IPS_GetVariable(36123);
$trockenzeit = date("H:i:s - d.m.y", $trockenzeit['VariableUpdated']);

//Es beginnt zu regnen
if ($regenwarnung == true and $regen == true)
	{
		echo "Man knnte z.B. die Rollden schlieen"; // hier kommt der Befehl rein
	}

// Es regnet dauerhaft nicht (mehr)
if ($regenwarnung == true and $regen == false and $time - $trockenzeit > $totzeit)
	{
		echo "Man knnte z.B. die Rollden ffnen."; // hier kommt der Befehl rein
	}
?>

Möglicherweise bin ich da noch nicht abgebrüht genug, aber irgendwie schreckte mich die Idee ab, dass bei monatelanger Trockenheit im Sommer jede Minute ein Skript ausgeführt werden soll, das abfragt, ob es regnet, daher suchte ich nach eine Lösung, die das allein über die Meldungen des RS arbeitet, sozusagen nur bei Bedarf.

Du könntest den Timer auch so setzen, das er nur bei regen triggert also Status true, und bei change variable true das script triggern lassen…
Allerdings würde ich, ein sooo kleines script wohl minütlich triggern lassen.
Kannst es ja auch in ein anderes mit einbauen, welches du sowieso minütlich triggerst… Bei mir währe das das Sonnenaufgangs/untergangs script…
Das wird bei mir minuetlich getriggert.

mfg
korny

Habe [edit: habe wohl abendliche Wahnvorstellungen: nicht Toros, sondern] STEINERS Script wiedergefunden.

Das würde bei mir so aussehen:

<?
// Trigger: OnUpdate > Regensensor
// "Es ist regnerisch" wird nach xx Minuten False nach dem letzen Tropfen
$regen = GetValue(36123);

if(($IPS_SENDER == "Variable") and ($regen == True)) {
   IPS_SetScriptTimer($IPS_SELF, 15*60);     // xx Minuten
    if(GetValue(55964) == False){
 echo "das wird feucht";
       SetValue(55964, True);
       SetValue(45668, "Es ist beginnt zu regnen");
    }else{
       SetValue(45668 /*[5 Wetter\Regen Bericht]*/, "Es ist regnerisch");
    }
}

if(($IPS_SENDER == "TimerEvent") and ($regen == False)) {
   IPS_SetScriptTimer($IPS_SELF, 0);
     SetValue(55964, False);
     SetValue(45668, "Es ist trocken");
     echo "staubtrocken";
}

Kann das noch nicht richtig ausprobieren, da es momentan nicht aufhört zu tröpfeln. Was meint Ihr dazu?
Grüße
Martin