Upstream > x % über einen gewissen Zeitraum danach Nachicht

Hallo zusammen,

ich seh wahrscheinlich mal wieder nicht den Wald vor lauter Bäumen (und mein PHP…).
Ich weiß das mein Upstream meistens nicht größer wie x ist, ausser mal eine kleien Spitze.
Nun wollte ich mit einem Ereignis ein script ausführen, was sagen wir mal 5 Minuten läuft.
Dabei soll nach 5 Minuten der Wert nochmal geprüft werden.
Wenn der Wert dann immernoch so hoch ist, möchte ich eine Info darüber bekommen.

Das mit dem zweiten Wert haut nicht hin irgendwie.


<?
$UpstreamMax = 15;
$UpstreamValue1 = GetValue(17752 /*[Hardware\FritzBox\WAN Interface\Last Upstream]*/);
SetValue(29412 /*[Program\PushNotification\Upstream-Ueberwachung\UploadZeitraumTest\UpstreamTemp]*/,$UpstreamValue1);
Echo "$UpstreamValue1, Upstream";
IPS_LogMessage("UpstreamTest", "vor ersten if");
if ($_IPS['SENDER']!="TimerEvent")
	{
		if ($UpstreamValue1 >= $UpstreamMax)
		{
		echo "$UpstreamValue1,";
		IPS_LogMessage("UpstreamTest", "timer setzen");
		IPS_SetScriptTimer($_IPS['SELF'],10);	// Timer auf voreingestellte Zeit setzen
		}
		else
		{
		echo "der wert ist kleiner 15, ich dürfte garnicht laufen!";
		}
		}
		else
		{
		IPS_LogMessage("UpstreamTest", "vorm abholen des neuen wert");
		$UpstreamValue2 = GetValue(17752 /*[Hardware\FritzBox\WAN Interface\Last Upstream]*/); 
		IPS_LogMessage("UpstreamTest", "vorm ausgeben dieser werte");
		SetValue(45671 /*[Program\PushNotification\Upstream-Ueberwachung\UploadZeitraumTest\UpstreamValue2]*/,$UpstreamValue2);
		IPS_LogMessage("UpstreamTest", "SetValue2");
		echo "$UpstreamValue2, zweiter UpstreamValue2  echo";
		IPS_LogMessage("UpstreamTest", "timer abschaltung");
		IPS_SetScriptTimer($_IPS['SELF'], 0); // Timer ausschalten
		IPS_LogMessage("UpstreamTest", "nach timer abschaltung");
		if ($UpstreamValue2 >= $UpstreamMax)
		{
		IPS_LogMessage("UpstreamTest", "war eine spitze");
		echo "der wert ist kleiner 15, war eine Spitze";
		}
		else
		{
		IPS_LogMessage("UpstreamTest", "nachricht versenden!");
		echo "nachricht versenden!";
		}
		}
?>


Sieht vieleicht jemand meinen Fehler und kann mir helfen?

Herzlichen Dank im Voraus

Grüße

Sascha

Hi Sascha!

Es gibt verschiedene Varianten diese Überwachung zu realisieren.
Du kannst ein Script einfach alle 5 Minuten laufen lassen und mit einer Temp-Variable arbeiten (dazu folgt unten ein Beispiel), dann kannst du die Upstream-Variable loggen und mit den geloggten Werten arbeiten - z.B. mit einem Mittelwert über X Minuten, oder du kannst das Script bei Variablenänderung durch ein Ereignis ausführen lassen, oder durch ein Ereignis bei Grenzüberschreitung + ScriptTimer :smiley:
Viele Wege führen nach Rom :slight_smile:

Hier das Beispiel mit - Script alle 5 Minuten ausführen lassen mit Temp-Variable (nicht getestet, sollte aber gehen g):

<? 

// SCRIPT EINMAL MANUELL AUSFÜHREN, DAMIT DER TIMER GESTARTET WIRD!

$UpstreamMax = 15;				 // Wert vom Upstream der als "Warnschwelle" genommen wird
$UpstreamAktuell_VarID = 11111;  // ID der Variable die den aktuellen Upstream beinhaltet
$UpstreamTEMP_VarID = 22222;	 // ID einer Temp-Variable zum Zwischenspeichern des Upstream


if ($_IPS["SENDER"] === "TimerEvent")
{
	$UpstreamAktuell = GetValue($UpstreamAktuell_VarID);
	$UpstreamTEMP = GetValue($UpstreamTEMP_VarID);
	SetValue($UpstreamTEMP_VarID, $UpstreamAktuell);
	
	// Prüfen, ob der alte und der neue Wert über der "Warnschwelle" liegen
	if (($UpstreamAktuell > $UpstreamMax) AND ($UpstreamTEMP > $UpstreamMax))
	{
		IPS_LogMessage("UPSTREAM-KONTROLLE", "WARNUNG // Der Upstream war bei 2 Prüfungen über der Warnschwelle! // Letzter Wert = ".$UpstreamTEMP." // Aktueller Wert = ".$UpstreamAktuell);
	}
	elseif (($UpstreamTEMP > $UpstreamMax) AND ($UpstreamAktuell <= $UpstreamMax))
	{
		IPS_LogMessage("UPSTREAM-KONTROLLE", "INFO // Der Upstream war bei der letzten Prüfung über dem Schwellwert, liegt jetzt aber wieder darunter. // Letzter Wert = ".$UpstreamTEMP." // Aktueller Wert = ".$UpstreamAktuell);
	}
	elseif (($UpstreamTEMP <= $UpstreamMax) AND ($UpstreamAktuell > $UpstreamMax))
	{
		IPS_LogMessage("UPSTREAM-KONTROLLE", "INFO // Der Upstream liegt aktuell über der Warnschwelle, der letzte Wert lag aber darunter. // Letzter Wert = ".$UpstreamTEMP." // Aktueller Wert = ".$UpstreamAktuell);
	}
	else
	{
		// Upstream war beim letzten Wert unter der Warnschwelle und liegt auch aktuell darunter
	}
}
elseif ($_IPS["SENDER"] === "Execute")
{
	IPS_SetScriptTimer($_IPS["SELF"], 300);  // Timer auf 5 Minuten stellen
	SetValue($UpstreamTEMP_VarID, GetValue($UpstreamAktuell_VarID)); // Aktuellen Upstream in Temp-Variable schreiben
}

?>

Grüße,
Chris

Super Herzlichen Dank!

werde es nachher testen.

eine Frage hab ich noch :rolleyes:
warum verwendest Du hier 3x =


if ($_IPS["SENDER"] === "TimerEvent")

ich kenne nur ==; !=

grüße

Sascha

Sascha

Hi!

Siehe hier:
PHP: Vergleichs-Operatoren - Manual

Beispiel:

<?

if ("123" == 123)
{
	echo "A".PHP_EOL;
}

if ("123" === 123)  // hier wird nicht nur geprüft, ob "123" gleich 123 ist ... sondern auch String und Integer mit einbezogen, deshalb geht das Script in den ELSE Zweig
{
	echo "B".PHP_EOL;
}
else
{
	echo "C".PHP_EOL;
}

?>

Wäre an der Stelle die du genannt hast wohl eher nicht notwendig, aber habe es mir angewöhnt bei IF alles richtig zu prüfen.

Grüße,
Chris