Entprellung

Ich stehe gerade irgendwie auf dem Schlauch:

Ich habe einen Regenmesser (1-Wire) der alle 30s abgepollt wird und entweder Regen oder kein Regen als Ergebnis hat.
Ich bekomme bei Statusänderung eine Push Message aufs iPhone.

Dieses führt bei leichtem Regen dazu, dass ich, wenn es dumm läuft, im Grunde alle 30s eine Nachricht „Regen“ und dann 30s später eine „Kein Regen“ bekomme.

Ich würde diese Meldung gerne entprellen, dass heisst sobald einmal der Status gesetzt ist, diesen für x Minuten „verriegeln“. Klar, ich könnte die Pollzeit des 1W Sensors erhöhen, würde aber es gerne im Skript lösen.

Über die Aktualisierungszeit der Variable vielleicht ?

Gruß
Martin

Das wäre ja quasi den Sensor mit einer geringeren Frequenz abzupollen, wenn ich Dich richtig verstehe.

Ich denke eher so in Richtung eine IPS Variable erstellen, on update den Wert aus der 1W sensor Variable einlesen, Zeit vergleichen und wenn länger als x die IPS Variable updaten, sonst -> exit.

Ich kriegs nur nicht in ein Skript…

Ich dachte mehr an sowas wie „wenn die Variable sich in den letzen X Sekunden geändert hat, dann ignoriere die Änderung“, also schon das was Du auch dachtest :slight_smile:

Bin grad auf Arbeit und hab’s nicht im Kopf parat, aber es gibt doch die ‚UpdateTime‘ (http://www.ip-symcon.de/service/dokumentation/vorgehensweisen/wie-kann-ich/) - das sollte doch eigentlich klappen

ja, da schaue ich mal. Danke.

Ich komme irgendwie nicht weiter. Mit dem kleinen Skript schaffe ich es (klar, ist copy und paste) die aktuelle Zeit der Skriptausführung zu speichern.

Wo ich hänge ist, die aktuelle Zeit zu ermitteln (ok, das geht noch: $uhrzeit = date(„H:i“,$time):wink: aber dann einen Pufferwert (Bspw. 10min) hinzuzuaddieren und dann zu vergleichen, ob die last update Zeit früher ist als "jetzt plus die Pufferzeit.

Mal auf die Schnelle mit 5min Entprellung:


$var = IPS_GetVariable(ID);
if (time() - $var['VariableUpdated'] > 1000*60*5) {
  //mach was
}

So siehts jetzt aus:


<?

if($_IPS['SENDER'] != "Variable")
return;

$var = IPS_GetVariable(41097 /*[Umwelt\Garten\Niederschlagssensor\Niederschlag]*/);
$status=getvalueboolean(41097 /*[Umwelt\Garten\Niederschlagssensor\Niederschlag]*/);
SetValue(CreateVariableIDByName($_IPS['VARIABLE'], 'Updated', 3), date("d.m.y H:i:s"));

if ($status == true){
	$meldung = "Regenstart";
	} else{
	$meldung = "Regenstopp";
	}
if (time() - $var['VariableUpdated'] > 1000*60*5) {

WFC_PushNotification (12579 /*[WebFront]*/,'Änderung Niederschlag',$meldung,'',59138 /*[Notifications]*/);
}
 
 

function CreateVariableIDByName($id, $name, $type)
{
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid===false) {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "This Variable was created by Script #".$_IPS['SELF']);
    }
    return $vid;
}
?>

Warten wir mal auf Regen…Danke für die Hilfen.

Wenn ich das Script richtig lese, bekommst Du die PushNotification frühestens 5 Minuten nach Regenbeginn - etwas spät. Ich dachte, nur die Regnende Meldung sollte sozusagen verzögert kommen.

Ich würde nur die PushNotification Regenende mit 5 Minuten „Hysterese“ losschicken, Regenbeginn aber sofort.

Hierzu brauchst Du noch eine weitere Variable, die die letzte Pushnotification speichert. Dann in PHP die folgende „Logik“ reinzimmern:

–> Wenn der Sensor regen meldet und die letzte Pushnotification war „Regenbeginn“ -> dann passiert nichts
–> Wenn der Sensor regen meldet und die letzte Pushnotification war „Regenende“ -> dann Pushnotification „Regenbeginn“
–> Wenn der Sensor trocken meldet und die letzte Pushnotification war „Regenbeginn“ -> dann NUR wenn der Sensor mehr als 5 Minuten trocken meldet Pushnotification „Regenende“
–> Wenn der Sensor trocken meldet und die letzte Pushnotification war „Regenende“ -> dann passiert nichts

Gruß Rolf

Da hast Du recht:


<?
$last_push = 14533 /*[Umwelt\Garten\Niederschlagssensor\regen Status push\Last_Push]*/;
$var = IPS_GetVariable(41097 /*[Umwelt\Garten\Niederschlagssensor\Niederschlag]*/);
$status=getvalueboolean(41097 /*[Umwelt\Garten\Niederschlagssensor\Niederschlag]*/);
$last_message = getvalue ($last_push);


	if ($status == true && $last_message == "Regenende"){
		$meldung = "Regenstart";
		WFC_PushNotification (12579 /*[WebFront]*/,'Änderung Niederschlag',$meldung,'',59138 /*[Notifications]*/);
	   setvalue ($last_push, $meldung);
	}

	if ($status == false && $last_message == "Regenstart"){
	$meldung = "Regenstopp";
   	if (time() - $var['VariableUpdated'] > 1000*60*5) {
			WFC_PushNotification (12579 /*[WebFront]*/,'Änderung Niederschlag',$meldung,'',59138 /*[Notifications]*/);
			setvalue ($last_push, $meldung);
		}
	}
	else
	{
}
?>

Das letzte else kann man sich sparen, ist nur wegen der Übersichtlichkeit drin.
Erste if ist Regenmeldung an und letzte Push war Regenende (Also neuer Regen) -> Push und dann in $last_push „Regenstart“ schieben
Zweites if ist, Regen hört auf und die letzte Message war Regen startet -> dann eine Push, aber nur entprellt und $last_push wird Regenstopp.
Alle anderen Fälle -> do nothing.