Ich hab mich mit dem Thema schon länger befasst. Ich hatte Domotz im Einsatz. Es funktioniert toll, aber warum soll ich dafür bezahlen, wenn ich das selber auch machen kann. Meine Ansprüche sind ja nicht sehr hoch. Gut, IPS erkennt keine neuen Geräte, aber egal.
Ich hab mir dann den „Device Monitor“ in IPS installiert. Funktioniert auch. Geräte hinzugefügt und auch Benachrichtigungen eingebaut, wenn mal ein Device nicht geantwortet hat. Leider ist es aber so, dass es nichts heißt, wenn mal ein Ping verloren geht. Das passiert schon mal. Auch bei zwei Pings mach ich mir noch keine Sorgen. Also war diese Lösung unbefriedigend, weil ich zugemüllt wurde.
Auch bin ich kein Fan von Hardcodierung im Backend. Das ist unflexibel. Also musste etwas anderes her.
Ich überlegte mir also, wie ich es mit den Möglichkeiten von IPS und PHP anstellen könnte, einen einfachen aber doch funktionalen Monitor zu machen. Es sollte möglich sein, im Webfront Geräte hinzufügen, ändern und löschen. Eine Übersicht braucht es auch und natürlich eine Benachrichtigung, wenn ein als wichtig markiertes Gerät nicht antwortet.
Und ja, ich habe es mit meinen beschränkten PHP Kenntnissen geschafft.
Zentrale Basis ist eine Stringvariable, die mir einen JSON String vorhält, wo meine Geräte mit allen notwendigen Informationen wie IP, Name, Letzte Änderung, Ping Status und ob es wichtig ist oder nicht gespeichert sind.
Weiters brauhte ich noch deine Dummy-Instanz unter derer ich diverse Variablen für die Erfassung der Daten definiert hab
Das Aktionskript beim Button Aktion speichert alles ab
<?php
include(IPS_GetScriptFile(31314/*Skript Netzwerkstatus*/));
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
if (getvalue(50396/*IP Adresse ist nicht leer*/) != "" and getvalue(57084/*Name ist nicht leer*/) !="")
{
Switch ($_IPS['VALUE']){
case 1: DevEintragen (getvalue(50396/*IP*/),getvalue(57084/*Name*/),getvalue(14117/*Benachrichtigen bei Fehler*/),true);
break;
case 2: DevEintragen (getvalue(50396/*IP*/),getvalue(57084/*Name*/),getvalue(14117/*Benachrichtigen bei Fehler*/),false);
break;
case 3: DevLoeschen (getvalue(50396/*IP*/));
break;
}
/*Wenn alles gespeichert ist, IP und Name zurücksetzen*/
setvalue(50396/*IP*/,"192.168.32.");
setvalue(57084/*Name*/,"");
DevListe();/*HTML Tabelle aufbauen*/
}
else
{
WFC_SendNotification(56676/*Home*/,"Device Monitor","IP oder Gerätename fehlt!","",0);/*Fehlermeldung bei leerer IP oder leerem Namen*/
}
Das Skript „Netzwerkstatus“ enthält alle Funktionen
<?php
/*Neues Device eintragen und ändern*/
function DevEintragen ($IP,$Beschreibung,$Wichtig,$Neu)
{
IPS_SetEventActive(32486,false);/*Ereignis für Ping während dem Eintragen deaktivieren*/
$Liste=json_decode(getvalue(32307/*GerätelisteJSON*/),true);
$Liste[$IP]["IP"]=$IP;
$Liste[$IP]["Name"]=$Beschreibung;
if ($Wichtig)
{
$Liste[$IP]["Wichtig"]="J";
}
else
{
$Liste[$IP]["Wichtig"]="N";
}
if ($Neu) $Liste[$IP]["LastChange"]=0;
if ($Neu) $Liste[$IP]["Status"]="NA";
if ($Neu) $Liste[$IP]["Meldung"]="N";
ksort($Liste);/*nach IP sortieren*/
setvalue(32307/*GerätelisteJSON*/,json_encode($Liste));
IPS_SetEventActive(32486,true);/*Ping wieder aktivieren*/
}
/*Device löschen*/
function DevLoeschen ($IP)
{
IPS_SetEventActive(32486,false);/*Ereignis für Ping während Löschen deaktiveren*/
$Liste=json_decode(getvalue(32307/*GerätelisteJSON*/),true);
unset($Liste[$IP]);
ksort($Liste);/*nach IP sortieren*/
setvalue(32307/*GerätelisteJSON*/,json_encode($Liste));
IPS_SetEventActive(32486,true);/*Ping wieder aktivieren*/
}
/*HTML Tabelle erstellen*/
function DevListe()
{
$Zeile=1;
$Farbe="";
$FarbeWichtig="";
$Text="";
$Liste=json_decode(getvalue(32307)/*GerätelisteJSON*/,true);
$Liste_HTML = "";
$Liste_HTML = $Liste_HTML."<table border=\"1\" style=\"width:100%\">";
$Liste_HTML = $Liste_HTML."<tr>";
$Liste_HTML = $Liste_HTML."<th><center>Zeile</center></th><th><center>IP</center></th><th><center>Gerät</center></th><th><center>Letzte Änderung</center></th><th><center>Ping</center></th><th><center>Status</center></th>";
$Liste_HTML = $Liste_HTML."</tr>";
foreach ($Liste as $Device)
{
switch ($Device["Status"]){
case "NA": $Farbe=""; $Text="";
break;
case "OK": $Farbe="green"; $Text="Ok";
break;
case "NOK": $Farbe="red"; $Text="Fehler";
break;
}
if ($Device["Wichtig"] == "J") {
$FarbeWichtig="blue";
}
else
{
$FarbeWichtig="";
}
$Liste_HTML = $Liste_HTML."<tr>";
$Liste_HTML = $Liste_HTML. "<td style=\"background-color:".$FarbeWichtig."\">".$Zeile."</td>
<td style=\"background-color:".$FarbeWichtig."\">".$Device["IP"]."</td>
<td style=\"background-color:".$FarbeWichtig."\">".$Device["Name"]."</td>
<td style=\"background-color:".$FarbeWichtig."\"><center>".date("d.m.Y H:i:s",$Device["LastChange"])."</center></td>
<td style=\"background-color:".$Farbe."\"><center>".$Text."</center></td>";
if ($Device["Status"] == "NOK")
{
$DownTime = time()-$Device["LastChange"];
if ($DownTime<=60){$Text="HBL"; $Farbe="blue";}/*Heartbeat lost - noch kein Problem*/
if ($DownTime>=61 and $DownTime<=90){$Text="CL";$Farbe="orange";}/*noch immer keine Verbindung - keine Panik*/
if ($DownTime>=91){$Text="DWN";$Farbe="red";}/*nach 90 Sekunden ist das Ding Down*/
}
else
{
$Text="UP";
$Farbe="green";
}
$Liste_HTML = $Liste_HTML."<td style=\"background-color:".$Farbe."\"><center>".$Text."</center></td>";
$Zeile++;
}
$Liste_HTML = $Liste_HTML."</table>";
setvalue(55639/*Netzwerkstatus HTML Variable*/,$Liste_HTML);
}
/*Ping ausführen*/
function DevPing()
{
IPS_SetDisabled(34099,true);/*Button zum Speichern deaktivieren*/
$Liste=json_decode(getvalue(32307/*GerätelisteJSON*/),true);
$Timeout=getvalue(55711/*Pingtimeout lesen*/);
foreach ($Liste as &$Device)
{
$AktuellerStatus=$Device["Status"];
if (sys_ping($Device["IP"],$Timeout))/*sys_ping ist eine Symcon Funktion*/
{
$Device["Status"]="OK";
if ($AktuellerStatus != $Device["Status"]) $Device["LastChange"]=time();
if ($Device["Meldung"] == "J") Telegram_SendTextToAll(58283,$Device["Name"]. " antwortet wieder!"); /*Meldung wenn Device wieder erreichbar*/
$Device["Meldung"] = "N";/*Meldungserkennung zurücksetzen*/
}
else
{
$Device["Status"]="NOK";
if ($AktuellerStatus != $Device["Status"]) $Device["LastChange"]=time();
if (time()-$Device["LastChange"] >90 and $Device["Wichtig"] == "J" and $Device["Meldung"] == "N")
{
Telegram_SendTextToAll(58283,$Device["Name"]. " antwortet nicht!"); /*Meldung Device ist nicht erreichbar*/
$Device["Meldung"] = "J";/*Meldung auf J ändern, damit nur einmal gemeldet wird*/
}
}
if ($Device["Wichtig"]=="") $Device["Wichtig"] = "N";
if ($Device["Meldung"]=="") $Device["Meldung"] = "N";
}
unset($Device);
setvalue(32307/*GerätelisteJSON*/,json_encode($Liste));
IPS_SetDisabled(34099,false);/*Button wieder aktivieren*/
}
Das letze Skript ist ein Dreizeiler. Das startet den Ping und aktualisiert die HTML-Tabelle
<?php
include(IPS_GetScriptFile(31314/*Skript Neztwerkstatus*/));
DevPing();
DevListe();
Für dieses Skript hab ich eine Ereignis alle 30 Sekunden definiert.
Im Webfront schaut es dann so aus
Eingabe und Änderung von Geräten
Blau hinterlegte Zeilen zeigen „wichtige“ Geräte an. Ist so ein Gerät nicht erreichbar, bekomme ich eine Meldung.
Kommentare sind jederzeit gerne willkommen!