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?
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
Viele Wege führen nach Rom
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
}
?>
<?
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.