Log Messages im WebFront

Hi zusammen,

wollte schon immer gewisse Meldungen im WebFront haben, speziell wenn man Module entwickelt wollte ich wissen ob alles rund läuft. Habe jetzt mal eine Lösung für mich gebastelt die ich Euch nicht vorenthalten möchte.

So sieht es dann im WebFront aus …

Und das dazugehörige Script …


<?
################################################################################
# Scriptbezeichnung: System.StatusLog.ips.php
# Version: 1.0.20180401
# Author:  Heiko Wilknitz (@Pitti)
#
# Dieses Skript filtert aus dem IPS Logfile die gewünschten Einträge:  
#	0:ALL = (ERROR, WARNING, CUSTOM, NOTIFY, SUCCESS)
#	1:ERROR
#	2:WARNING
#	3:CUSTOM
#	4:NOTIFY
#	5:SUCCESS 
#
# Installation:
# -------------
#
# HINWEIS: NUR FÜR LINUX BASIIERTE SYSTEM!!!
#
# Dieses Skript richtet automatisch alle nötigen Objekte bei manueller
# Ausführung ein.
#
# - Neues Skript erstellen
# - Diesen PHP-Code hineinkopieren
# - Abschnitt 'Konfiguration' den eigenen Gegebenheiten anpassen 
# - Skript Abspeichern
# - Skript Ausführen
#
# ------------------------------ Konfiguration ---------------------------------
#
# Logfile, sollte nichts geändert werden
$logDir 	= IPS_GetLogDir();
$logFile	= 'logfile.log';
#
# A fast and powerful alternative to grep (https://github.com/svent/sift)
$useSift = false;
#
# Filter Profil 
$filter =  array(
	array(0,'ALL',		'', 8421631),
	array(1,'ERROR',	'', 16744576),
	array(2,'WARNING','', 16777088),
	array(3,'SUCCESS','', 8454016),
	array(4,'NOTIFY',	'', 16744703),
	array(5,'CUSTOM',	'', 12632256)
);
#  
################################################################################

// INSTALLATION
if ($_IPS['SENDER']=='Execute') {
	$pos = 0;
	// Filter
	$vpn = "IPS.Logging";
	$vid = CreateVariableByName($_IPS['SELF'], "Filter", 1);
	CreateProfileInteger($vpn, 'CloseAll', '', '', 0, 0, 0, 0, $filter);
	IPS_SetVariableCustomProfile($vid, $vpn);
	IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
	IPS_SetPosition($vid, $pos++);
	SetValue($vid, 0);	
	// Messages
	$vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
	IPS_SetVariableCustomProfile($vid, '~HTMLBox');
	IPS_SetIcon($vid, "Database");
	IPS_SetPosition($vid, $pos++);
}
// AKTION VIA WEBFRONT	
else if ($_IPS['SENDER'] == "WebFront") {
	// Speichern
   SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
	// Build command line
	$cmd = BuildExecute($useSift, $filter, $_IPS['VALUE'], $logDir.$logFile);
	// Filtern
	$html = GetLogMessages($cmd);
	// Anzeigen
	$vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
	SetValue($vid, $html);
}

# -------------------------------- FUNKTIONEN ----------------------------------

// Kommandozeile zusammenbauen
function BuildExecute($fast, $filter, $index, $log)
{
	$cmd = '';
	$len = count($filter);
	
	//SIFT => $cmd = 'sift -e " ERROR " -e " WARNING " -e " CUSTOM " -e " NOTIFY " -e " SUCCESS " '.$log; 
	if($fast == true) {
		$cmd = 'sift ';
		// ALL	
		if($index == 0) {
			foreach($filter as $key => $arr) {
				if ($key == 0) continue;
				$cmd .= '-e " '.$arr[1].' "';	
				if ($key != $len - 1) $cmd .= ' ';
			}
		}
		// SPECIFIC
		else {
			$cmd .= '-e " '.$filter[$index][1].' "';
		}
		$cmd .= ' ';
	}
	//GREP => $cmd = 'grep -E "( ERROR | WARNING | CUSTOM | NOTIFY | SUCCESS )" '.$log 
	else {
		$cmd = 'grep -E "(';
		// ALL	
		if($index == 0) {
			foreach($filter as $key => $arr) {
				if ($key == 0) continue;
				$cmd .= ' '.$arr[1].' ';	
				if ($key != $len - 1) $cmd .= '|';
			}
		}
		// SPECIFIC
		else {
			$cmd .= ' '.$filter[$index][1].' ';
		}
		$cmd .= ')" ';
	}
	$cmd .= $log;
	return $cmd;
};

// Daten über alle RSSI_DEVICE(s) holen und rendern
function GetLogMessages($cmd) 
{
   // Anzeige aufbereiten 
	$style = "";
	$style = $style.'<style type="text/css">';
	$style = $style.'table  {border-collapse: collapse; font-size: 14px; width: 100%; }';
	$style = $style.'td.fst {vertical-align: middle; text-align: left; padding: 5px; border-left: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
	$style = $style.'td.mid {vertical-align: middle; text-align: left; padding: 5px; border-top: 1px solid rgba(255, 255, 255, 0.1); }';
	$style = $style.'td.lst {vertical-align: middle; text-align: left; padding: 5px; border-right: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
	$style = $style.'tr:last-child {border-bottom: 1px solid rgba(255, 255, 255, 0.2); }';
	$style = $style.'tr:nth-child(even) {  background-color: rgba(0, 0, 0, 0.2); }';	  
	$style = $style.'.th { color: rgb(255, 255, 255); background-color: rgb(160, 160, 0); font-weight:bold; background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }';
	$style = $style.'</style>';
	// HTML zusammenbauen	
	$html = $style;
	// Exceute Command
	$ret = exec($cmd, $out, $rc); 

	$html .= '<table>';
	$html .= '<tr><td class="fst th" style="width:30px;">Typ</td><td class="mid th" style="width:150px;">Uhrzeit</td><td class="mid th" style="width:120px;">Sender</td><td class="lst th">Meldung</td></tr>'; 
	
	$out = array_reverse($out);
	foreach ($out as $line) { 
		$array = explode("|", $line);
		$html .= '<tr><td class="fst">'.'Typ'.'</td><td class="mid">'.$array[0].'</td><td class="mid">'.$array[3].'</td><td class="lst">'.$array[4].'</td></tr>'; 
	}
	$html.='</table>';
	// Zurück
	return $html;	
}

// Erzeugt eine Variable unterhalb {id} mit dem Namen {name} vom Typ [type}
// Existiert die Variable schon wird diese zurückgeliefert.
// Types: 0 = Boolean, 1 = Integer, 2 = Float, 3 = String
function CreateVariableByName($id, $name, $type) 
{ 
   $vid = @IPS_GetVariableIDByName($name, $id); 
   if($vid===false) { 
      $vid = IPS_CreateVariable($type); 
      IPS_SetParent($vid, $id); 
      IPS_SetName($vid, $name); 
   }
   return $vid; 
}

// Erzeugt ein Variablenprofil vom Typ {type} mit Name n{name} 
function CreateProfile($name, $type)
{
	if(!IPS_VariableProfileExists($name)) {
		IPS_CreateVariableProfile($name, $type);
	} 
	else {
	  $profile = IPS_GetVariableProfile($name);
	  if($profile['ProfileType'] != $type)
	    throw new Exception("Variable profile type does not match for profile ".$name);
	}
}

// Erzeugt ein Integer-Variablenprofil
function CreateProfileInteger($name, $icon, $prefix, $suffix, $minvalue, $maxvalue, $step, $digits, $asso = NULL)
{
	CreateProfile($name, 1);

	IPS_SetVariableProfileIcon($name, $icon);
	IPS_SetVariableProfileText($name, $prefix, $suffix);
	IPS_SetVariableProfileDigits($name, $digits);
	
	if(($asso !== NULL) && (sizeof($asso) !== 0)){
	  $minvalue = 0;
	  $maxvalue = 0;
	} 
	IPS_SetVariableProfileValues($name, $minvalue, $maxvalue, $step);
	
	if(($asso !== NULL) && (sizeof($asso) !== 0)){
	  foreach($asso as $ass) {
	    IPS_SetVariableProfileAssociation($name, $ass[0], $ass[1], $ass[2], $ass[3]);
	  }
	}         
}
################################################################################
?>

ACHTUNG … nur für LINUX! Wahrscheinlich auch einfach auf Windows umbaubar!

Schönen Sonntag noch
Pitti

Tolle Sache, Danke!

Super. Gefällt mir.
Klappt tadellos auf dem Raspberry.

Danke.
Grüße
Björn

Freut mich das es gefällt und funktioniert!

Anbei noch ein kleines Update! Die erste Spalte mit ‚Typ‘ war noch nicht fertig :smiley:

Und ein fix für Variablenmeldungen die die gleichen Wörter wie das Log verwenden :mad:


<?
################################################################################
# Scriptbezeichnung: System.StatusLog.ips.php
# Version: 1.1.20180402
# Author:  Heiko Wilknitz (@Pitti)
#
# Dieses Skript filtert aus dem IPS Logfile die gewünschten Einträge:  
#	0:ALL = (ERROR, WARNING, CUSTOM, NOTIFY, SUCCESS)
#	1:ERROR
#	2:WARNING
#	3:CUSTOM
#	4:NOTIFY
#	5:SUCCESS 
#
# Installation:
# -------------
#
# HINWEIS: NUR FÜR LINUX BASIIERTE SYSTEM!!!
#
# Dieses Skript richtet automatisch alle nötigen Objekte bei manueller
# Ausführung ein.
#
# - Neues Skript erstellen
# - Diesen PHP-Code hineinkopieren
# - Abschnitt 'Konfiguration' den eigenen Gegebenheiten anpassen 
# - Skript Abspeichern
# - Skript Ausführen
#
# ------------------------------ Konfiguration ---------------------------------
#
# Logfile, sollte nichts geändert werden
$logDir 	= IPS_GetLogDir();
$logFile	= 'logfile.log';
#
# A fast and powerful alternative to grep (https://github.com/svent/sift)
$useSift = false;
#
# Filter Profil 
$filter =  array(
	array(0,'ALL',		'', 8421631),
	array(1,'ERROR',	'', 16744576),
	array(2,'WARNING','', 16777088),
	array(3,'SUCCESS','', 8454016),
	array(4,'NOTIFY',	'', 16744703),
	array(5,'CUSTOM',	'', 12632256)
);
#  
################################################################################

// INSTALLATION
if ($_IPS['SENDER']=='Execute') {
	$pos = 0;
	// Filter
	$vpn = "IPS.Logging";
	$vid = CreateVariableByName($_IPS['SELF'], "Filter", 1);
	CreateProfileInteger($vpn, 'CloseAll', '', '', 0, 0, 0, 0, $filter);
	IPS_SetVariableCustomProfile($vid, $vpn);
	IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
	IPS_SetPosition($vid, $pos++);
	SetValue($vid, 0);	
	// Messages
	$vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
	IPS_SetVariableCustomProfile($vid, '~HTMLBox');
	IPS_SetIcon($vid, "Database");
	IPS_SetPosition($vid, $pos++);
}
// AKTION VIA WEBFRONT	
else if ($_IPS['SENDER'] == "WebFront") {
	// Speichern
   SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
	// Build command line
	$cmd = BuildExecute($useSift, $filter, $_IPS['VALUE'], $logDir.$logFile);
	// Filtern
	$html = GetLogMessages($cmd);
	// Anzeigen
	$vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
	SetValue($vid, $html);
}

# -------------------------------- FUNKTIONEN ----------------------------------

// Kommandozeile zusammenbauen
function BuildExecute($fast, $filter, $index, $log)
{
	$cmd = '';
	$len = count($filter);
	
	//SIFT => $cmd = 'sift -e " ERROR " -e " WARNING " -e " CUSTOM " -e " NOTIFY " -e " SUCCESS " '.$log; 
	if($fast == true) {
		$cmd = 'sift ';
		// ALL	
		if($index == 0) {
			foreach($filter as $key => $arr) {
				if ($key == 0) continue;
				$cmd .= '-e " '.$arr[1].' "';	
				if ($key != $len - 1) $cmd .= ' ';
			}
		}
		// SPECIFIC
		else {
			$cmd .= '-e " '.$filter[$index][1].' "';
		}
		$cmd .= ' ';
	}
	//GREP => $cmd = 'grep -E "( ERROR | WARNING | CUSTOM | NOTIFY | SUCCESS )" '.$log 
	else {
		$cmd = 'grep -E "(';
		// ALL	
		if($index == 0) {
			foreach($filter as $key => $arr) {
				if ($key == 0) continue;
				$cmd .= ' '.$arr[1].' ';	
				if ($key != $len - 1) $cmd .= '|';
			}
		}
		// SPECIFIC
		else {
			$cmd .= ' '.$filter[$index][1].' ';
		}
		$cmd .= ')" ';
	}
	$cmd .= $log;
	return $cmd;
};

// Daten über alle RSSI_DEVICE(s) holen und rendern
function GetLogMessages($cmd) 
{
   // Anzeige aufbereiten 
	$style = "";
	$style = $style.'<style type="text/css">';
	$style = $style.'table  {border-collapse: collapse; font-size: 14px; width: 100%; }';
	$style = $style.'td.fst {vertical-align: middle; text-align: left; padding: 5px; border-left: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
	$style = $style.'td.mid {vertical-align: middle; text-align: left; padding: 5px; border-top: 1px solid rgba(255, 255, 255, 0.1); }';
	$style = $style.'td.lst {vertical-align: middle; text-align: left; padding: 5px; border-right: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
	$style = $style.'tr:last-child {border-bottom: 1px solid rgba(255, 255, 255, 0.2); }';
	$style = $style.'tr:nth-child(even) {  background-color: rgba(0, 0, 0, 0.2); }';	  
	$style = $style.'.th { color: rgb(255, 255, 255); background-color: rgb(160, 160, 0); font-weight:bold; background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }';
	$style = $style.'.dotE { width: 15px; height: 15px; clear: both; background: #ff8080; border-radius: 50%;  margin-top: 1px; margin-left:5px; }';
	$style = $style.'.dotW { width: 15px; height: 15px; clear: both; background: #ffff80; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
	$style = $style.'.dotS { width: 15px; height: 15px; clear: both; background: #80ff80; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
	$style = $style.'.dotC { width: 15px; height: 15px; clear: both; background: #c0c0c0; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
	$style = $style.'.dotN { width: 15px; height: 15px; clear: both; background: #ff80ff; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
	$style = $style.'</style>';
	// HTML zusammenbauen	
	$html = $style;
	// Exceute Command
	$ret = exec($cmd, $out, $rc); 

	$html .= '<table>';
	$html .= '<tr><td class="fst th" style="width:30px;">Typ</td><td class="mid th" style="width:150px;">Uhrzeit</td><td class="mid th" style="width:120px;">Sender</td><td class="lst th">Meldung</td></tr>'; 
	
	$out = array_reverse($out);
	foreach ($out as $line) { 
		$array = explode("|", $line);
		// Check LOG in LOG :-(
		if( trim($array[2]) == 'MESSAGE') continue; 
		$color = trim($array[2]);
		$html .= '<tr><td class="fst"><div class="dot'.$color[0].'"></div>'.'</td><td class="mid">'.$array[0].'</td><td class="mid">'.$array[3].'</td><td class="lst">'.$array[4].'</td></tr>'; 
	}
	$html.='</table>';
	// Zurück
	return $html;	
}

// Erzeugt eine Variable unterhalb {id} mit dem Namen {name} vom Typ [type}
// Existiert die Variable schon wird diese zurückgeliefert.
// Types: 0 = Boolean, 1 = Integer, 2 = Float, 3 = String
function CreateVariableByName($id, $name, $type) 
{ 
   $vid = @IPS_GetVariableIDByName($name, $id); 
   if($vid===false) { 
      $vid = IPS_CreateVariable($type); 
      IPS_SetParent($vid, $id); 
      IPS_SetName($vid, $name); 
   }
   return $vid; 
}

// Erzeugt ein Variablenprofil vom Typ {type} mit Name n{name} 
function CreateProfile($name, $type)
{
	if(!IPS_VariableProfileExists($name)) {
		IPS_CreateVariableProfile($name, $type);
	} 
	else {
	  $profile = IPS_GetVariableProfile($name);
	  if($profile['ProfileType'] != $type)
	    throw new Exception("Variable profile type does not match for profile ".$name);
	}
}

// Erzeugt ein Integer-Variablenprofil
function CreateProfileInteger($name, $icon, $prefix, $suffix, $minvalue, $maxvalue, $step, $digits, $asso = NULL)
{
	CreateProfile($name, 1);

	IPS_SetVariableProfileIcon($name, $icon);
	IPS_SetVariableProfileText($name, $prefix, $suffix);
	IPS_SetVariableProfileDigits($name, $digits);
	
	if(($asso !== NULL) && (sizeof($asso) !== 0)){
	  $minvalue = 0;
	  $maxvalue = 0;
	} 
	IPS_SetVariableProfileValues($name, $minvalue, $maxvalue, $step);
	
	if(($asso !== NULL) && (sizeof($asso) !== 0)){
	  foreach($asso as $ass) {
	    IPS_SetVariableProfileAssociation($name, $ass[0], $ass[1], $ass[2], $ass[3]);
	  }
	}         
}
################################################################################
?>

Ciao Pitti

Huhu,

hat sich das schon jemand für Windows angeschaut und umgebaut

Hallo Pitti,

cooles Teil :smiley:
bekomme aber eine Fehlermeldung wenn ich ich Webfront die Filter umschalte.
fehler.PNG
Funktion ist aber da.
Wenn ich den Script Ausführe, kommen keine Fehler.

IPS4.4 auf Ubuntu Server

Gruß

Bin gerade aus Urlaub zurück, schaue ich mir am Wochenende an.

Gesendet von iPad mit Tapatalk

Für Win10 habe ich die Zeilen 89 bis 109 und 146 eingefügt.

<?
################################################################################
# Scriptbezeichnung: System.StatusLog.ips.php
# Version: 1.1.20180402
# Author:  Heiko Wilknitz (@Pitti)
#
# Dieses Skript filtert aus dem IPS Logfile die gewünschten Einträge:  
#    0:ALL = (ERROR, WARNING, CUSTOM, NOTIFY, SUCCESS)
#    1:ERROR
#    2:WARNING
#    3:CUSTOM
#    4:NOTIFY
#    5:SUCCESS 
#
# Installation:
# -------------
#
# HINWEIS: NUR FÜR LINUX BASIIERTE SYSTEM!!!
#
# Dieses Skript richtet automatisch alle nötigen Objekte bei manueller
# Ausführung ein.
#
# - Neues Skript erstellen
# - Diesen PHP-Code hineinkopieren
# - Abschnitt 'Konfiguration' den eigenen Gegebenheiten anpassen 
# - Skript Abspeichern
# - Skript Ausführen
#
# ------------------------------ Konfiguration ---------------------------------
#
# Logfile, sollte nichts geändert werden
$logDir     = IPS_GetLogDir();
$logFile    = 'logfile.log';
#
# A fast and powerful alternative to grep (https://github.com/svent/sift)
$useSift = false;
#
# Filter Profil 
$filter =  array(
    array(0,'ALL',        '', 8421631),
    array(1,'ERROR',    '', 16744576),
    array(2,'WARNING','', 16777088),
    array(3,'SUCCESS','', 8454016),
    array(4,'NOTIFY',    '', 16744703),
    array(5,'CUSTOM',    '', 12632256)
);
#  
################################################################################

// INSTALLATION
if ($_IPS['SENDER']=='Execute') {
    $pos = 0;
    // Filter
    $vpn = "IPS.Logging";
    $vid = CreateVariableByName($_IPS['SELF'], "Filter", 1);
    CreateProfileInteger($vpn, 'CloseAll', '', '', 0, 0, 0, 0, $filter);
    IPS_SetVariableCustomProfile($vid, $vpn);
    IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
    IPS_SetPosition($vid, $pos++);
    SetValue($vid, 0);    
    // Messages
    $vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
    IPS_SetVariableCustomProfile($vid, '~HTMLBox');
    IPS_SetIcon($vid, "Database");
    IPS_SetPosition($vid, $pos++);
}
// AKTION VIA WEBFRONT    
else if ($_IPS['SENDER'] == "WebFront") {
    // Speichern
   SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
    // Build command line
    $cmd = BuildExecute($useSift, $filter, $_IPS['VALUE'], $logDir.$logFile);
    // Filtern
    $html = GetLogMessages($cmd);
    // Anzeigen
    $vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
    SetValue($vid, $html);
}

# -------------------------------- FUNKTIONEN ----------------------------------

// Kommandozeile zusammenbauen
function BuildExecute($fast, $filter, $index, $log)
{
    $cmd = '';
    $len = count($filter);
	
	
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    //echo 'This is a server using Windows!';
	// Beispiel findstr "SUCCESS ERROR"   logfile.log	
	
	$cmd = 'findstr "';
		        // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= ' '.$arr[1].' ';    
                if ($key != $len - 1) $cmd .= ' ';
            }
        }
        // SPECIFIC
        else {
            $cmd .= ' '.$filter[$index][1].' ';
        }
        $cmd .= '" ';	
		
		
} else {
     /* Linux - Anfang */    
    //SIFT => $cmd = 'sift -e " ERROR " -e " WARNING " -e " CUSTOM " -e " NOTIFY " -e " SUCCESS " '.$log; 
    if($fast == true) {
        $cmd = 'sift ';
        // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= '-e " '.$arr[1].' "';    
                if ($key != $len - 1) $cmd .= ' ';
            }
        }
        // SPECIFIC
        else {
            $cmd .= '-e " '.$filter[$index][1].' "';
        }
        $cmd .= ' ';
    }
    //GREP => $cmd = 'grep -E "( ERROR | WARNING | CUSTOM | NOTIFY | SUCCESS )" '.$log 
    else {
        $cmd = 'grep -E "(';
        // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= ' '.$arr[1].' ';    
                if ($key != $len - 1) $cmd .= '|';
            }
        }
        // SPECIFIC
        else {
            $cmd .= ' '.$filter[$index][1].' ';
        }
        $cmd .= ')" ';
    }
	/* Linux - ende */
  }
    $cmd .= $log;
    return $cmd;
};

// Daten über alle RSSI_DEVICE(s) holen und rendern
function GetLogMessages($cmd) 
{
   // Anzeige aufbereiten 
    $style = "";
    $style = $style.'<style type="text/css">';
    $style = $style.'table  {border-collapse: collapse; font-size: 14px; width: 100%; }';
    $style = $style.'td.fst {vertical-align: middle; text-align: left; padding: 5px; border-left: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'td.mid {vertical-align: middle; text-align: left; padding: 5px; border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'td.lst {vertical-align: middle; text-align: left; padding: 5px; border-right: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'tr:last-child {border-bottom: 1px solid rgba(255, 255, 255, 0.2); }';
    $style = $style.'tr:nth-child(even) {  background-color: rgba(0, 0, 0, 0.2); }';      
    $style = $style.'.th { color: rgb(255, 255, 255); background-color: rgb(160, 160, 0); font-weight:bold; background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }';
    $style = $style.'.dotE { width: 15px; height: 15px; clear: both; background: #ff8080; border-radius: 50%;  margin-top: 1px; margin-left:5px; }';
    $style = $style.'.dotW { width: 15px; height: 15px; clear: both; background: #ffff80; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotS { width: 15px; height: 15px; clear: both; background: #80ff80; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotC { width: 15px; height: 15px; clear: both; background: #c0c0c0; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotN { width: 15px; height: 15px; clear: both; background: #ff80ff; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'</style>';
    // HTML zusammenbauen    
    $html = $style;
    // Exceute Command
    $ret = exec($cmd, $out, $rc); 

    $html .= '<table>';
    $html .= '<tr><td class="fst th" style="width:30px;">Typ</td><td class="mid th" style="width:150px;">Uhrzeit</td><td class="mid th" style="width:120px;">Sender</td><td class="lst th">Meldung</td></tr>'; 
    
    $out = array_reverse($out);
    foreach ($out as $line) { 
        $array = explode("|", $line);
		
        // Check LOG in LOG :-(
        if( trim($array[2]) == 'MESSAGE') continue;
        $color = trim($array[2]);
		$html .= '<tr><td class="fst"><div class="dot'.$color[0].'"></div>'.'</td><td class="mid">'.$array[0].'</td><td class="mid">'.$array[3].'</td><td class="lst">'.$array[4].'</td></tr>'; 
    }
    $html.='</table>';
    // Zurück
    return $html;    
}

// Erzeugt eine Variable unterhalb {id} mit dem Namen {name} vom Typ [type}
// Existiert die Variable schon wird diese zurückgeliefert.
// Types: 0 = Boolean, 1 = Integer, 2 = Float, 3 = String
function CreateVariableByName($id, $name, $type) 
{ 
   $vid = @IPS_GetVariableIDByName($name, $id); 
   if($vid===false) { 
      $vid = IPS_CreateVariable($type); 
      IPS_SetParent($vid, $id); 
      IPS_SetName($vid, $name); 
   }
   return $vid; 
}

// Erzeugt ein Variablenprofil vom Typ {type} mit Name n{name} 
function CreateProfile($name, $type)
{
    if(!IPS_VariableProfileExists($name)) {
        IPS_CreateVariableProfile($name, $type);
    } 
    else {
      $profile = IPS_GetVariableProfile($name);
      if($profile['ProfileType'] != $type)
        throw new Exception("Variable profile type does not match for profile ".$name);
    }
}

// Erzeugt ein Integer-Variablenprofil
function CreateProfileInteger($name, $icon, $prefix, $suffix, $minvalue, $maxvalue, $step, $digits, $asso = NULL)
{
    CreateProfile($name, 1);

    IPS_SetVariableProfileIcon($name, $icon);
    IPS_SetVariableProfileText($name, $prefix, $suffix);
    IPS_SetVariableProfileDigits($name, $digits);
    
    if(($asso !== NULL) && (sizeof($asso) !== 0)){
      $minvalue = 0;
      $maxvalue = 0;
    } 
    IPS_SetVariableProfileValues($name, $minvalue, $maxvalue, $step);
    
    if(($asso !== NULL) && (sizeof($asso) !== 0)){
      foreach($asso as $ass) {
        IPS_SetVariableProfileAssociation($name, $ass[0], $ass[1], $ass[2], $ass[3]);
      }
    }         
}
################################################################################
?>

Schönes und nützliches Werkzeug

Wenn die Anzahl der Nachrichten zu groß wird kann keine Anzeige erfolgen.
Hier wäre es sinnvoll eine „Seiten Funktion“ einzubauen um die Begrenzung in Bezug auf die max. Stringlänge zu umgehen

Schönes Skript, danke dafür. Da sehe ich die offenen Baustellen gleich viel besser … :cool:

Eine kleine Bitte

Bitte den ersten Beitrag editieren und aktuell halten, dann muss nicht der ganze Fred auf evtl. Änderungen durchsucht werden. Weiss ja nicht, wie sich das noch entwickelt … :wink:

Schönes Wochenende
Bruno

Wenn die Anzahl der Nachrichten zu groß wird kann keine Anzeige erfolgen.
Hier wäre es sinnvoll eine „Seiten Funktion“ einzubauen um die Begrenzung in Bezug auf die max. Stringlänge zu umgehen

Vielleicht ist das eine Lösung:
Die Anzahl der Zeilen innerhalb der HTML Tabelle wurde begrenzt.
Das Anzeigen von Folgeseiten erfordert ein erneutes Anklicken der Auswahl innerhalb eines Zeitraums.
Die Anzahl der Tabelleneinträge kann über die Variable $maxlines und der Zeitraum, innerhalb dessen die Tabelle um eine Anzeigeseite hochgeschoben wird, kann über die Variable $pgdwntrg eingestellt werden.

<?
################################################################################
# Scriptbezeichnung: System.StatusLog.ips.php
# Version: 1.1.20180402
# Author:  Heiko Wilknitz (@Pitti)
#
# Dieses Skript filtert aus dem IPS Logfile die gewünschten Einträge:  
#    0:ALL = (ERROR, WARNING, CUSTOM, NOTIFY, SUCCESS)
#    1:ERROR
#    2:WARNING
#    3:CUSTOM
#    4:NOTIFY
#    5:SUCCESS 
#
# Installation:
# -------------
#
# HINWEIS: NUR FÜR LINUX BASIIERTE SYSTEM!!!
#
# Dieses Skript richtet automatisch alle nötigen Objekte bei manueller
# Ausführung ein.
#
# - Neues Skript erstellen
# - Diesen PHP-Code hineinkopieren
# - Abschnitt 'Konfiguration' den eigenen Gegebenheiten anpassen 
# - Skript Abspeichern
# - Skript Ausführen
#
# ------------------------------ Konfiguration ---------------------------------
#
# Logfile, sollte nichts geändert werden
$logDir     = IPS_GetLogDir();
$logFile    = 'logfile.log';
#
# A fast and powerful alternative to grep (https://github.com/svent/sift)
$useSift = false;
#
# Filter Profil 
$filter =  array(
    array(0,'ALL',        '', 8421631),
    array(1,'ERROR',    '', 16744576),
    array(2,'WARNING','', 16777088),
    array(3,'SUCCESS','', 8454016),
    array(4,'NOTIFY',    '', 16744703),
    array(5,'CUSTOM',    '', 12632256)
);
#  
# Hier ggf. die HTML Ausgabe anpassen
$maxlines = 10; /* Maximale Anzahl Zeilen in der HTML Tabellenanzeige */
$pgdwntrg = 3; /* Angabe in Sekunden - innerhalb dieser Zeitangabe muß die Auswahl erneut gedrückt werden um auf die nächste Tabellenseite zu blättern  */

################################################################################

// INSTALLATION
if ($_IPS['SENDER']=='Execute') {
    $pos = 0;
    // Filter
    $vpn = "IPS.Logging";
    $vid = CreateVariableByName($_IPS['SELF'], "Filter", 1);
    CreateProfileInteger($vpn, 'CloseAll', '', '', 0, 0, 0, 0, $filter);
    IPS_SetVariableCustomProfile($vid, $vpn);
    IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
    IPS_SetPosition($vid, $pos++);
    SetValue($vid, 0);    
    // Messages
    $vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
    IPS_SetVariableCustomProfile($vid, '~HTMLBox');
    IPS_SetIcon($vid, "Database");
    IPS_SetPosition($vid, $pos++);
	// LogMessages Info ***********
	IPS_SetInfo($vid, json_encode(array('key' => '', 'timestamp' => time(), 'maxlines' => $maxlines, 'lastkey' => '', 'lastline' => '', 'pgdwntrg' => $pgdwntrg)));
	// $LogMsgProp=array('key' => '', 'timestamp' => time(), 'maxlines' => '', 'pgdwntrg' => '');
}
// AKTION VIA WEBFRONT    
else if ($_IPS['SENDER'] == "WebFront") {
    // Speichern
   SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
    // Build command line
    $cmd = BuildExecute($useSift, $filter, $_IPS['VALUE'], $logDir.$logFile);
    // Filtern
    $html = GetLogMessages($cmd);
    // Anzeigen
    $vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
    SetValue($vid, $html);
	// Objekt Info aktualisieren
	$objArray=IPS_GetObject($vid);
	$LogMsgInf = json_decode($objArray['ObjectInfo'], true);
	$LogMsgInf['key'] = $_IPS['VALUE'];
	IPS_SetInfo($vid, json_encode($LogMsgInf));
}

# -------------------------------- FUNKTIONEN ----------------------------------

// Kommandozeile zusammenbauen
function BuildExecute($fast, $filter, $index, $log)
{
    $cmd = '';
    $len = count($filter);
    
    
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    //echo 'This is a server using Windows!';
    // Beispiel findstr "SUCCESS ERROR"   logfile.log    
    
    $cmd = 'findstr "';
                // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= ' '.$arr[1].' ';    
                if ($key != $len - 1) $cmd .= ' ';
            }
        }
        // SPECIFIC
        else {
            $cmd .= ' '.$filter[$index][1].' ';
        }
        $cmd .= '" ';    
        
        
} else {
     /* Linux - Anfang */    
    //SIFT => $cmd = 'sift -e " ERROR " -e " WARNING " -e " CUSTOM " -e " NOTIFY " -e " SUCCESS " '.$log; 
    if($fast == true) {
        $cmd = 'sift ';
        // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= '-e " '.$arr[1].' "';    
                if ($key != $len - 1) $cmd .= ' ';
            }
        }
        // SPECIFIC
        else {
            $cmd .= '-e " '.$filter[$index][1].' "';
        }
        $cmd .= ' ';
    }
    //GREP => $cmd = 'grep -E "( ERROR | WARNING | CUSTOM | NOTIFY | SUCCESS )" '.$log 
    else {
        $cmd = 'grep -E "(';
        // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= ' '.$arr[1].' ';    
                if ($key != $len - 1) $cmd .= '|';
            }
        }
        // SPECIFIC
        else {
            $cmd .= ' '.$filter[$index][1].' ';
        }
        $cmd .= ')" ';
    }
    /* Linux - ende */
  }
    $cmd .= $log;
    return $cmd;
};

// Daten über alle RSSI_DEVICE(s) holen und rendern
function GetLogMessages($cmd) 
{
   // Anzeige aufbereiten 
    $style = "";
    $style = $style.'<style type="text/css">';
    $style = $style.'table  {border-collapse: collapse; font-size: 14px; width: 100%; }';
    $style = $style.'td.fst {vertical-align: middle; text-align: left; padding: 5px; border-left: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'td.mid {vertical-align: middle; text-align: left; padding: 5px; border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'td.lst {vertical-align: middle; text-align: left; padding: 5px; border-right: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'tr:last-child {border-bottom: 1px solid rgba(255, 255, 255, 0.2); }';
    $style = $style.'tr:nth-child(even) {  background-color: rgba(0, 0, 0, 0.2); }';      
    $style = $style.'.th { color: rgb(255, 255, 255); background-color: rgb(160, 160, 0); font-weight:bold; background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }';
    $style = $style.'.dotE { width: 15px; height: 15px; clear: both; background: #ff8080; border-radius: 50%;  margin-top: 1px; margin-left:5px; }';
    $style = $style.'.dotW { width: 15px; height: 15px; clear: both; background: #ffff80; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotS { width: 15px; height: 15px; clear: both; background: #80ff80; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotC { width: 15px; height: 15px; clear: both; background: #c0c0c0; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotN { width: 15px; height: 15px; clear: both; background: #ff80ff; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'</style>';
    // HTML zusammenbauen    
    $html = $style;
    // Exceute Command
    $ret = exec($cmd, $out, $rc); 

    $html .= '<table>';
    $html .= '<tr><td class="fst th" style="width:30px;">Typ</td><td class="mid th" style="width:150px;">Uhrzeit</td><td class="mid th" style="width:120px;">Sender</td><td class="lst th">Meldung</td></tr>'; 

    $out = array_reverse($out);
	// print_r($out);

	$vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3); 
    
	$objArray=IPS_GetObject($vid);
	$LogMsgInf = json_decode($objArray['ObjectInfo'], true);
	
	// HTML Tabellenanzeige definieren
	if ($LogMsgInf['lastkey'] == $LogMsgInf['key']){
	   if ((time()-$LogMsgInf['pgdwntrg']) < $LogMsgInf['timestamp']){
	                     $firstline = $LogMsgInf['lastline']+1;
						 $lastline = $firstline + $LogMsgInf['maxlines'];
	   }else{
	      $firstline = 0;
		  $lastline = $firstline + $LogMsgInf['maxlines'];
	   }
						 
	}else{
	   $firstline = 0;
	   $lastline = $firstline + $LogMsgInf['maxlines'];
	}
	
	
	
	
    foreach ($out as $outIdx => $line) { 
        $array = explode("|", $line);
		
		
        // Check LOG in LOG :-(
        if( trim($array[2]) == 'MESSAGE') continue;
		If( $outIdx >= $firstline and $outIdx <= $lastline){
        $color = trim($array[2]);
        $html .= '<tr><td class="fst"><div class="dot'.$color[0].'"></div>'.'</td><td class="mid">'.$array[0].'</td><td class="mid">'.$array[3].'</td><td class="lst">'.$array[4].'</td></tr>';
		}
		if($outIdx>=$lastline) {
		    //echo $htmlTBLlimit." Einträge erreicht"; 
		    $html .= '<tr><td class="fst"><div class="dot'.$color[0].'"></div>'.'</td><td class="mid">*</td><td class="mid">*</td><td class="lst"> *** max. Tabellengröße von '. $LogMsgInf['maxlines'] .' Zeilen erreicht ***<br />*** erneutes anklicken der gleichen Auswahl innerhalb von '.$LogMsgInf['pgdwntrg'].' Sek. zeigt die nächsten '. $LogMsgInf['maxlines'] .' Zeilen an ***</td></tr>';
		    break ;
		    }  
		
    }
    $html.='</table>';
	
	// LogMsgInf aktualisieren
	
	$LogMsgInf['timestamp'] = time();
	$LogMsgInf['lastline'] = $lastline;
	$LogMsgInf['lastkey'] = $LogMsgInf['key'];
	IPS_SetInfo($vid, json_encode($LogMsgInf));
	
    // Zurück
    return $html;    
}

// Erzeugt eine Variable unterhalb {id} mit dem Namen {name} vom Typ [type}
// Existiert die Variable schon wird diese zurückgeliefert.
// Types: 0 = Boolean, 1 = Integer, 2 = Float, 3 = String
function CreateVariableByName($id, $name, $type) 
{ 
   $vid = @IPS_GetVariableIDByName($name, $id); 
   if($vid===false) { 
      $vid = IPS_CreateVariable($type); 
      IPS_SetParent($vid, $id); 
      IPS_SetName($vid, $name); 
   }
   return $vid; 
}

// Erzeugt ein Variablenprofil vom Typ {type} mit Name n{name} 
function CreateProfile($name, $type)
{
    if(!IPS_VariableProfileExists($name)) {
        IPS_CreateVariableProfile($name, $type);
    } 
    else {
      $profile = IPS_GetVariableProfile($name);
      if($profile['ProfileType'] != $type)
        throw new Exception("Variable profile type does not match for profile ".$name);
    }
}

// Erzeugt ein Integer-Variablenprofil
function CreateProfileInteger($name, $icon, $prefix, $suffix, $minvalue, $maxvalue, $step, $digits, $asso = NULL)
{
    CreateProfile($name, 1);

    IPS_SetVariableProfileIcon($name, $icon);
    IPS_SetVariableProfileText($name, $prefix, $suffix);
    IPS_SetVariableProfileDigits($name, $digits);
    
    if(($asso !== NULL) && (sizeof($asso) !== 0)){
      $minvalue = 0;
      $maxvalue = 0;
    } 
    IPS_SetVariableProfileValues($name, $minvalue, $maxvalue, $step);
    
    if(($asso !== NULL) && (sizeof($asso) !== 0)){
      foreach($asso as $ass) {
        IPS_SetVariableProfileAssociation($name, $ass[0], $ass[1], $ass[2], $ass[3]);
      }
    }         
}
################################################################################
?>

Sehr schön, herzlichen Dank.

Noch zwei Anmerkungen : Bei der maximalen Anzahl Zeilen gibt es eine harte Grenze 50

Es scheint so zu sein das alleine der Text error dazu ausreicht als error angezeigt zu werden. Wie man aus dem beigefügten Screenshot erkennen kann handelt es sich hier aber meistens nicht um Fehler. Der Filter sollte daher wirklich nur Error im Sinne von Fehler herausfiltern

Bei der maximalen Anzahl Zeilen gibt es eine harte Grenze 50

:confused: - Ich kann nur WIN10 nachstellen. Wenn ich 500 Zeilen eingestellt habe bekomme ich auch am Ende der Tabelle folgendes angezeigt.


Drücke ich zweimal den Filter „ALL“ hintereinander, bin ich zeitlich am Anfang bzw. am Ende der Tabelle ( ich habe den PC erst um 07:28 eingeschalten)

Es scheint so zu sein das alleine der Text error dazu ausreicht als error angezeigt zu werden. Wie man aus dem beigefügten Screenshot erkennen kann handelt es sich hier aber meistens nicht um Fehler. Der Filter sollte daher wirklich nur Error im Sinne von Fehler herausfiltern

… works as designed:D Ich kann mir vorstellen bei der Ausgabe nochmal einen zusätzlichen Filter einzubauen.

Alles OK (Anzahl Zeilen), der Fehler war wie üblich vor dem Bildschirm :frowning:

Vielen Dank für die Umsetzung auf WIN10.

Es läuft soweit nur bekomme ich immer eine Box mit Fehler angezeigt.
Hab schon mal die Variablen gelöscht und neu anlegen lassen.
Hat nichts geholfen. Irgendeine Idee was da bei mir nicht passt?

Edit:
hat sich erledigt.
Hab mich gerade erinnert das da immer mal was war mit Zeichen vor oder nach den PHP Zeichen.
War ein Leerzeichen vor <?.

BestEx:
Es scheint so zu sein das alleine der Text error dazu ausreicht als error angezeigt zu werden. Wie man aus dem beigefügten Screenshot erkennen kann handelt es sich hier aber meistens nicht um Fehler. Der Filter sollte daher wirklich nur Error im Sinne von Fehler herausfiltern

Erweiterung integriert:.

<?
################################################################################
# Scriptbezeichnung: System.StatusLog.ips.php
# Version: 1.1.20180402
# Author:  Heiko Wilknitz (@Pitti)
#
# Dieses Skript filtert aus dem IPS Logfile die gewünschten Einträge:  
#    0:ALL = (ERROR, WARNING, CUSTOM, NOTIFY, SUCCESS)
#    1:ERROR
#    2:WARNING
#    3:CUSTOM
#    4:NOTIFY
#    5:SUCCESS 
#
# Installation:
# -------------
#
# HINWEIS: NUR FÜR LINUX BASIIERTE SYSTEM!!!
#
# Dieses Skript richtet automatisch alle nötigen Objekte bei manueller
# Ausführung ein.
#
# - Neues Skript erstellen
# - Diesen PHP-Code hineinkopieren
# - Abschnitt 'Konfiguration' den eigenen Gegebenheiten anpassen 
# - Skript Abspeichern
# - Skript Ausführen
#
# ------------------------------ Konfiguration ---------------------------------
#
# Logfile, sollte nichts geändert werden
$logDir     = IPS_GetLogDir();
$logFile    = 'logfile.log';
#
# A fast and powerful alternative to grep (https://github.com/svent/sift)
$useSift = false;
#
# Filter Profil 
$filter =  array(
    array(0,'ALL',        '', 8421631),
    array(1,'ERROR',    '', 16744576),
    array(2,'WARNING','', 16777088),
    array(3,'SUCCESS','', 8454016),
    array(4,'NOTIFY',    '', 16744703),
    array(5,'CUSTOM',    '', 12632256)
);

#  
# Hier ggf. die HTML Ausgabe anpassen
$maxlines = 10; /* Maximale Anzahl Zeilen in der HTML Tabellenanzeige */
$pgdwntrg = 3; /* Angabe in Sekunden - innerhalb dieser Zeitangabe muß die Auswahl erneut gedrückt werden um auf die nächste Tabellenseite zu blättern  */

################################################################################

// INSTALLATION
if ($_IPS['SENDER']=='Execute') {
    $pos = 0;
    // Filter
    $vpn = "IPS.Logging";
    $vid = CreateVariableByName($_IPS['SELF'], "Filter", 1);
    CreateProfileInteger($vpn, 'CloseAll', '', '', 0, 0, 0, 0, $filter);
    IPS_SetVariableCustomProfile($vid, $vpn);
    IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
    IPS_SetPosition($vid, $pos++);
    SetValue($vid, 0);    
    // Messages
    $vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
    IPS_SetVariableCustomProfile($vid, '~HTMLBox');
    IPS_SetIcon($vid, "Database");
    IPS_SetPosition($vid, $pos++);
	// LogMessages Info ***********
	IPS_SetInfo($vid, json_encode(array('key' => '', 'timestamp' => time(), 'maxlines' => $maxlines, 'lastkey' => '', 'lastline' => '', 'pgdwntrg' => $pgdwntrg,'filteropt'=>$filter )));
	// $LogMsgProp=array('key' => '', 'timestamp' => time(), 'maxlines' => '', 'pgdwntrg' => '');
}
// AKTION VIA WEBFRONT    
else if ($_IPS['SENDER'] == "WebFront") {
    // Speichern
   SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
    // Build command line
    $cmd = BuildExecute($useSift, $filter, $_IPS['VALUE'], $logDir.$logFile);
    // Filtern
    $html = GetLogMessages($cmd);
    // Anzeigen
    $vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
    SetValue($vid, $html);
	// Objekt Info aktualisieren
	$objArray=IPS_GetObject($vid);
	$LogMsgInf = json_decode($objArray['ObjectInfo'], true);
	$LogMsgInf['key'] = $_IPS['VALUE'];
	IPS_SetInfo($vid, json_encode($LogMsgInf));
}

# -------------------------------- FUNKTIONEN ----------------------------------

// Kommandozeile zusammenbauen
function BuildExecute($fast, $filter, $index, $log)
{
    $cmd = '';
    $len = count($filter);
    
    
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    //echo 'This is a server using Windows!';
    // Beispiel findstr "SUCCESS ERROR"   logfile.log    
    
    $cmd = 'findstr "';
                // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= ' '.$arr[1].' ';    
                if ($key != $len - 1) $cmd .= ' ';
            }
        }
        // SPECIFIC
        else {
            $cmd .= ' '.$filter[$index][1].' ';
        }
        $cmd .= '" ';   
		// echo "Befehl: ".$cmd."
"; 
        
        
} else {
     /* Linux - Anfang */    
    //SIFT => $cmd = 'sift -e " ERROR " -e " WARNING " -e " CUSTOM " -e " NOTIFY " -e " SUCCESS " '.$log; 
    if($fast == true) {
        $cmd = 'sift ';
        // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= '-e " '.$arr[1].' "';    
                if ($key != $len - 1) $cmd .= ' ';
            }
        }
        // SPECIFIC
        else {
            $cmd .= '-e " '.$filter[$index][1].' "';
        }
        $cmd .= ' ';
    }
    //GREP => $cmd = 'grep -E "( ERROR | WARNING | CUSTOM | NOTIFY | SUCCESS )" '.$log 
    else {
        $cmd = 'grep -E "(';
        // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= ' '.$arr[1].' ';    
                if ($key != $len - 1) $cmd .= '|';
            }
        }
        // SPECIFIC
        else {
            $cmd .= ' '.$filter[$index][1].' ';
        }
        $cmd .= ')" ';
    }
    /* Linux - ende */
  }
    $cmd .= $log;
    return $cmd;
};

// Daten über alle RSSI_DEVICE(s) holen und rendern
function GetLogMessages($cmd) 
{
   // Anzeige aufbereiten 
    $style = "";
    $style = $style.'<style type="text/css">';
    $style = $style.'table  {border-collapse: collapse; font-size: 14px; width: 100%; }';
    $style = $style.'td.fst {vertical-align: middle; text-align: left; padding: 5px; border-left: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'td.mid {vertical-align: middle; text-align: left; padding: 5px; border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'td.lst {vertical-align: middle; text-align: left; padding: 5px; border-right: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'tr:last-child {border-bottom: 1px solid rgba(255, 255, 255, 0.2); }';
    $style = $style.'tr:nth-child(even) {  background-color: rgba(0, 0, 0, 0.2); }';      
    $style = $style.'.th { color: rgb(255, 255, 255); background-color: rgb(160, 160, 0); font-weight:bold; background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }';
    $style = $style.'.dotE { width: 15px; height: 15px; clear: both; background: #ff8080; border-radius: 50%;  margin-top: 1px; margin-left:5px; }';
    $style = $style.'.dotW { width: 15px; height: 15px; clear: both; background: #ffff80; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotS { width: 15px; height: 15px; clear: both; background: #80ff80; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotC { width: 15px; height: 15px; clear: both; background: #c0c0c0; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotN { width: 15px; height: 15px; clear: both; background: #ff80ff; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'</style>';
    // HTML zusammenbauen    
    $html = $style;
    // Exceute Command
    $ret = exec($cmd, $out, $rc); 

    $html .= '<table>';
    $html .= '<tr><td class="fst th" style="width:30px;">Typ</td><td class="mid th" style="width:150px;">Uhrzeit</td><td class="mid th" style="width:120px;">Sender</td><td class="lst th">Meldung</td></tr>'; 

    $out = array_reverse($out);
	
	$vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3); 
    	
	$objArray=IPS_GetObject($vid);
	$LogMsgInf = json_decode($objArray['ObjectInfo'], true);

	// HTML Tabellenanzeige definieren
	if ($LogMsgInf['lastkey'] == $LogMsgInf['key']){
	   if ((time()-$LogMsgInf['pgdwntrg']) < $LogMsgInf['timestamp']){
	                     $firstline = $LogMsgInf['lastline']+1;
						 $lastline = $firstline + $LogMsgInf['maxlines'];
	   }else{
	      $firstline = 0;
		  $lastline = $firstline + $LogMsgInf['maxlines'];
	   }
						 
	}else{
	   $firstline = 0;
	   $lastline = $firstline + $LogMsgInf['maxlines'];
	}
	
    foreach ($out as $outIdx => $line) { 
        $array = explode("|", $line);

	   // zusätzlicher Filter in der Tabellenausgabe. Es wird z.B. bei der Auswahl ERROR keine Ausgabe gemacht wenn ERROR in einer Meldung steht.
	   if($LogMsgInf['filteropt'][$_IPS['VALUE']][1] != 'ALL'  ){
	      if( $LogMsgInf['filteropt'][$_IPS['VALUE']][1] != trim($array[2])){continue;}
	   }
		
		
        // Check LOG in LOG :-(
        if( trim($array[2]) == 'MESSAGE') continue;
		If( $outIdx >= $firstline and $outIdx <= $lastline){
        $color = trim($array[2]);
        $html .= '<tr><td class="fst"><div class="dot'.$color[0].'"></div>'.'</td><td class="mid">'.$array[0].'</td><td class="mid">'.$array[3].'</td><td class="lst">'.$array[4].'</td></tr>';
		}
		
		if($outIdx>=$lastline) {
		    // $maxlines erreicht. Ausgabe letzte Tabellenzeile 
		    $html .= '<tr><td class="fst"><div class="dot'.$color[0].'"></div>'.'</td><td class="mid">*</td><td class="mid">*</td><td class="lst"> *** max. Tabellengröße von '. $LogMsgInf['maxlines'] .' Zeilen erreicht ***<br />*** erneutes anklicken der gleichen Auswahl innerhalb von '.$LogMsgInf['pgdwntrg'].' Sek. zeigt die nächsten '. $LogMsgInf['maxlines'] .' Zeilen an ***</td></tr>';
		    break ;
		} 
		
    }
	

    $html.='</table>';
	
	// LogMsgInf aktualisieren
	$LogMsgInf['timestamp'] = time();
	$LogMsgInf['lastline'] = $lastline;
	$LogMsgInf['lastkey'] = $LogMsgInf['key'];
	IPS_SetInfo($vid, json_encode($LogMsgInf));
	
    // Zurück
    return $html;    
}

// Erzeugt eine Variable unterhalb {id} mit dem Namen {name} vom Typ [type}
// Existiert die Variable schon wird diese zurückgeliefert.
// Types: 0 = Boolean, 1 = Integer, 2 = Float, 3 = String
function CreateVariableByName($id, $name, $type) 
{ 
   $vid = @IPS_GetVariableIDByName($name, $id); 
   if($vid===false) { 
      $vid = IPS_CreateVariable($type); 
      IPS_SetParent($vid, $id); 
      IPS_SetName($vid, $name); 
   }
   return $vid; 
}

// Erzeugt ein Variablenprofil vom Typ {type} mit Name n{name} 
function CreateProfile($name, $type)
{
    if(!IPS_VariableProfileExists($name)) {
        IPS_CreateVariableProfile($name, $type);
    } 
    else {
      $profile = IPS_GetVariableProfile($name);
      if($profile['ProfileType'] != $type)
        throw new Exception("Variable profile type does not match for profile ".$name);
    }
}

// Erzeugt ein Integer-Variablenprofil
function CreateProfileInteger($name, $icon, $prefix, $suffix, $minvalue, $maxvalue, $step, $digits, $asso = NULL)
{
    CreateProfile($name, 1);

    IPS_SetVariableProfileIcon($name, $icon);
    IPS_SetVariableProfileText($name, $prefix, $suffix);
    IPS_SetVariableProfileDigits($name, $digits);
    
    if(($asso !== NULL) && (sizeof($asso) !== 0)){
      $minvalue = 0;
      $maxvalue = 0;
    } 
    IPS_SetVariableProfileValues($name, $minvalue, $maxvalue, $step);
    
    if(($asso !== NULL) && (sizeof($asso) !== 0)){
      foreach($asso as $ass) {
        IPS_SetVariableProfileAssociation($name, $ass[0], $ass[1], $ass[2], $ass[3]);
      }
    }         
}
################################################################################
?>

Herzlichen Dank funktioniert prima :slight_smile:

Ergänzungen :

1.) Kleinere Fehlerbehebungen um sicherzustellen das Index Keys auch vorhanden sind

2.) Erweiterung um zwei weitere String Variable über die bei der Auswahl von „Custom“ sowie bei „ALL“ das Filtern nach einem Schlüsselwort im Feld „Sender“ bzw. Meldungen ermöglicht wird (wird nur bei der Auswahl von Custom bzw. ALL angezeigt)

Was ich mir noch vorstellen könnte wäre eine Auswahl der Zeitspanne für die Log Meldungen angezeigt werden

<?
################################################################################
# Scriptbezeichnung: System.StatusLog.ips.php
# Version: 1.2
# Author:  Heiko Wilknitz (@Pitti) kleine Ergänzungen N22 + BESTEX
#
# Dieses Skript filtert aus dem IPS Logfile die gewünschten Einträge:  
#    0:ALL = (ERROR, WARNING, CUSTOM, NOTIFY, SUCCESS)
#    1:ERROR
#    2:WARNING
#    3:CUSTOM
#    4:NOTIFY
#    5:SUCCESS 
#
# Installation:
# -------------
#
# HINWEIS: NUR FÜR LINUX BASIIERTE SYSTEM!!!
#
# Dieses Skript richtet automatisch alle nötigen Objekte bei manueller
# Ausführung ein.
#
# - Neues Skript erstellen
# - Diesen PHP-Code hineinkopieren
# - Abschnitt 'Konfiguration' den eigenen Gegebenheiten anpassen 
# - Skript Abspeichern
# - Skript Ausführen
#
# ------------------------------ Konfiguration ---------------------------------
#
# Logfile, sollte nichts geändert werden
$logDir     = IPS_GetLogDir();
$logFile    = 'logfile.log';
#
# A fast and powerful alternative to grep (https://github.com/svent/sift)
$useSift = false;
#
# Filter Profil 
$filter =  array(
    array(0,'ALL',        '', 8421631),
    array(1,'ERROR',    '', 16744576),
    array(2,'WARNING','', 16777088),
    array(3,'SUCCESS','', 8454016),
    array(4,'NOTIFY',    '', 16744703),
    array(5,'CUSTOM',    '', 12632256)
);

#  
# Hier ggf. die HTML Ausgabe anpassen
$maxlines = 1500; /* Maximale Anzahl Zeilen in der HTML Tabellenanzeige Wird nur initialisiert wenn dieses script in der Konsole ausgeführt wird. Speichern reicht nicht !*/
$pgdwntrg = 10; /* Angabe in Sekunden - innerhalb dieser Zeitangabe muß die Auswahl erneut gedrückt werden um auf die nächste Tabellenseite zu blättern  */

################################################################################

// INSTALLATION
if ($_IPS['SENDER']=='Execute') {
    $pos = 0;
    // Filter
    $vpn = "IPS.Logging";
    $vid = CreateVariableByName($_IPS['SELF'], "Filter", 1);
    CreateProfileInteger($vpn, 'CloseAll', '', '', 0, 0, 0, 0, $filter);
    IPS_SetVariableCustomProfile($vid, $vpn);
    IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
    IPS_SetPosition($vid, $pos++);
    SetValue($vid, 0); 
	
	// select CUSTOM
	$vid = CreateVariableByName($_IPS['SELF'], "Select Sender", 3);
    IPS_SetVariableCustomProfile($vid, '~String');
    IPS_SetIcon($vid, "Gear");
    IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
    IPS_SetPosition($vid, $pos++);
    SetValue($vid, '');    
	
	// select ALL 
	$vid = CreateVariableByName($_IPS['SELF'], "Message Filter", 3);
    IPS_SetVariableCustomProfile($vid, '~String');
    IPS_SetIcon($vid, "Gear");
    IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
    IPS_SetPosition($vid, $pos++);
    SetValue($vid, '');    
   
   
    // Messages
    $vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
    IPS_SetVariableCustomProfile($vid, '~HTMLBox');
    IPS_SetIcon($vid, "Database");
    IPS_SetPosition($vid, $pos++);
    // LogMessages Info ***********
    IPS_SetInfo($vid, json_encode(array('key' => '', 'timestamp' => time(), 'maxlines' => $maxlines, 'lastkey' => '', 'lastline' => '', 'pgdwntrg' => $pgdwntrg,'filteropt'=>$filter )));
    // $LogMsgProp=array('key' => '', 'timestamp' => time(), 'maxlines' => '', 'pgdwntrg' => '');
}
// AKTION VIA WEBFRONT    
else if ($_IPS['SENDER'] == "WebFront") {
	
    // Speichern
    SetValue($_IPS['VARIABLE'],$_IPS['VALUE'] );
	$filter_key = GetValueInteger( IPS_GetObjectIDByName ("Filter",$_IPS['SELF']  ));
	$sender = GetValueString( IPS_GetObjectIDByName ("Select Sender",$_IPS['SELF']  ));
	$message_key_word = GetValueString( IPS_GetObjectIDByName ("Message Filter",$_IPS['SELF']  ));

	if($filter_key  == 5)
	{
		IPS_SetHidden ( IPS_GetObjectIDByName ("Select Sender",$_IPS['SELF']  ), false);
	}
	else
	{
		IPS_SetHidden ( IPS_GetObjectIDByName ("Select Sender",$_IPS['SELF']  ), true);
	}
	if($filter_key  == 0)
	{
		IPS_SetHidden ( IPS_GetObjectIDByName ("Message Filter",$_IPS['SELF']  ), false);
	}
	else
	{
		IPS_SetHidden ( IPS_GetObjectIDByName ("Message Filter",$_IPS['SELF']  ), true);
	}

    // Build command line
    $cmd = BuildExecute($useSift, $filter, $filter_key, $logDir.$logFile);
    // Filtern
    $html = GetLogMessages($cmd);
    // Anzeigen
    $vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
    SetValue($vid, $html);
    // Objekt Info aktualisieren
    $objArray=IPS_GetObject($vid);
    $LogMsgInf = json_decode($objArray['ObjectInfo'], true);
    $LogMsgInf['key'] = $filter_key;
    IPS_SetInfo($vid, json_encode($LogMsgInf));
}

# -------------------------------- FUNKTIONEN ----------------------------------

// Kommandozeile zusammenbauen
function BuildExecute($fast, $filter, $index, $log)
{
    $cmd = '';
    $len = count($filter);
    
    
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    //echo 'This is a server using Windows!';
    // Beispiel findstr "SUCCESS ERROR"   logfile.log    
    
    $cmd = 'findstr "';
                // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= ' '.$arr[1].' ';    
                if ($key != $len - 1) $cmd .= ' ';
            }
        }
        // SPECIFIC
        else {
            $cmd .= ' '.$filter[$index][1].' ';
        }
        $cmd .= '" ';   
        // echo "Befehl: ".$cmd."
"; 
        
        
} else {
     /* Linux - Anfang */    
    //SIFT => $cmd = 'sift -e " ERROR " -e " WARNING " -e " CUSTOM " -e " NOTIFY " -e " SUCCESS " '.$log; 
    if($fast == true) {
        $cmd = 'sift ';
        // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= '-e " '.$arr[1].' "';    
                if ($key != $len - 1) $cmd .= ' ';
            }
        }
        // SPECIFIC
        else {
            $cmd .= '-e " '.$filter[$index][1].' "';
        }
        $cmd .= ' ';
    }
    //GREP => $cmd = 'grep -E "( ERROR | WARNING | CUSTOM | NOTIFY | SUCCESS )" '.$log 
    else {
        $cmd = 'grep -E "(';
        // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= ' '.$arr[1].' ';    
                if ($key != $len - 1) $cmd .= '|';
            }
        }
        // SPECIFIC
        else {
            $cmd .= ' '.$filter[$index][1].' ';
        }
        $cmd .= ')" ';
    }
    /* Linux - ende */
  }
    $cmd .= $log;
    return $cmd;
};

// Daten über alle RSSI_DEVICE(s) holen und rendern
function GetLogMessages($cmd) 
{
	global $filter_key,$sender,$message_key_word;
   // Anzeige aufbereiten 
    $style = "";
    $style = $style.'<style type="text/css">';
    $style = $style.'table  {border-collapse: collapse; font-size: 14px; width: 100%; }';
    $style = $style.'td.fst {vertical-align: middle; text-align: left; padding: 5px; border-left: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'td.mid {vertical-align: middle; text-align: left; padding: 5px; border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'td.lst {vertical-align: middle; text-align: left; padding: 5px; border-right: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'tr:last-child {border-bottom: 1px solid rgba(255, 255, 255, 0.2); }';
    $style = $style.'tr:nth-child(even) {  background-color: rgba(0, 0, 0, 0.2); }';      
    $style = $style.'.th { color: rgb(255, 255, 255); background-color: rgb(160, 160, 0); font-weight:bold; background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }';
    $style = $style.'.dotE { width: 15px; height: 15px; clear: both; background: #ff8080; border-radius: 50%;  margin-top: 1px; margin-left:5px; }';
    $style = $style.'.dotW { width: 15px; height: 15px; clear: both; background: #ffff80; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotS { width: 15px; height: 15px; clear: both; background: #80ff80; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotC { width: 15px; height: 15px; clear: both; background: #c0c0c0; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotN { width: 15px; height: 15px; clear: both; background: #ff80ff; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'</style>';
    // HTML zusammenbauen    
    $html = $style;
    // Exceute Command
    $ret = exec($cmd, $out, $rc); 

    $html .= '<table>';
    $html .= '<tr><td class="fst th" style="width:30px;">Typ</td><td class="mid th" style="width:150px;">Uhrzeit</td><td class="mid th" style="width:120px;">Sender</td><td class="lst th">Meldung</td></tr>'; 

    $out = array_reverse($out);
    
    $vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3); 
        
    $objArray=IPS_GetObject($vid);
    $LogMsgInf = json_decode($objArray['ObjectInfo'], true);

    // HTML Tabellenanzeige definieren
    if ($LogMsgInf['lastkey'] == $LogMsgInf['key']){
       if ((time()-$LogMsgInf['pgdwntrg']) < $LogMsgInf['timestamp']){
                         $firstline = $LogMsgInf['lastline']+1;
                         $lastline = $firstline + $LogMsgInf['maxlines'];
       }else{
          $firstline = 0;
          $lastline = $firstline + $LogMsgInf['maxlines'];
       }
                         
    }else{
       $firstline = 0;
       $lastline = $firstline + $LogMsgInf['maxlines'];
    }
    
    foreach ($out as $outIdx => $line) { 
        $array = explode("|", $line);
		if(array_key_exists(1 ,$LogMsgInf['filteropt'][$filter_key]))
		{
		
			if(array_key_exists(2,$array))
			{
				
				// zusätzlicher Filter in der Tabellenausgabe. Es wird z.B. bei der Auswahl ERROR keine Ausgabe gemacht wenn ERROR in einer Meldung steht.
				if($LogMsgInf['filteropt'][$filter_key][1] != 'ALL'  )
				{
		  			if( $LogMsgInf['filteropt'][$filter_key][1] != trim($array[2]))
					{continue;}
					
				}
				if(
					($LogMsgInf['filteropt'][$filter_key][1] == 'CUSTOM'  )
					AND
					($sender != '')
				  )
				{
					if( !strpos($array[3], $sender))
					{continue;}
					
				}
				if(
					($LogMsgInf['filteropt'][$filter_key][1] == 'ALL'  )
					AND
					($message_key_word != '')
				  )
				{
					if( !strpos($array[4], $message_key_word))
					{continue;}
					
				}
		
		
				// Check LOG in LOG :-(
				if( trim($array[2]) == 'MESSAGE') continue;
				If( $outIdx >= $firstline and $outIdx <= $lastline){
				$color = trim($array[2]);
				$html .= '<tr><td class="fst"><div class="dot'.$color[0].'"></div>'.'</td><td class="mid">'.$array[0].'</td><td class="mid">'.$array[3].'</td><td class="lst">'.$array[4].'</td></tr>';
				}
		
				if($outIdx>=$lastline) {
		    	// $maxlines erreicht. Ausgabe letzte Tabellenzeile 
		    		$html .= '<tr><td class="fst"><div class="dot'.$color[0].'"></div>'.'</td><td class="mid">*</td><td class="mid">*</td><td class="lst"> *** max. Tabellengröße von '. $LogMsgInf['maxlines'] .' Zeilen erreicht ***<br />*** erneutes anklicken der gleichen Auswahl innerhalb von '.$LogMsgInf['pgdwntrg'].' Sek. zeigt die nächsten '. $LogMsgInf['maxlines'] .' Zeilen an ***</td></tr>';
		    		break ;
			}
			}
        }
		  
        
    }
    

    $html.='</table>';
    
    // LogMsgInf aktualisieren
    $LogMsgInf['timestamp'] = time();
    $LogMsgInf['lastline'] = $lastline;
    $LogMsgInf['lastkey'] = $LogMsgInf['key'];
    IPS_SetInfo($vid, json_encode($LogMsgInf));
    
    // Zurück
    return $html;    
}

// Erzeugt eine Variable unterhalb {id} mit dem Namen {name} vom Typ [type}
// Existiert die Variable schon wird diese zurückgeliefert.
// Types: 0 = Boolean, 1 = Integer, 2 = Float, 3 = String
function CreateVariableByName($id, $name, $type) 
{ 
   $vid = @IPS_GetVariableIDByName($name, $id); 
   if($vid===false) { 
      $vid = IPS_CreateVariable($type); 
      IPS_SetParent($vid, $id); 
      IPS_SetName($vid, $name); 
   }
   return $vid; 
}

// Erzeugt ein Variablenprofil vom Typ {type} mit Name n{name} 
function CreateProfile($name, $type)
{
    if(!IPS_VariableProfileExists($name)) {
        IPS_CreateVariableProfile($name, $type);
    } 
    else {
      $profile = IPS_GetVariableProfile($name);
      if($profile['ProfileType'] != $type)
        throw new Exception("Variable profile type does not match for profile ".$name);
    }
}

// Erzeugt ein Integer-Variablenprofil
function CreateProfileInteger($name, $icon, $prefix, $suffix, $minvalue, $maxvalue, $step, $digits, $asso = NULL)
{
    CreateProfile($name, 1);

    IPS_SetVariableProfileIcon($name, $icon);
    IPS_SetVariableProfileText($name, $prefix, $suffix);
    IPS_SetVariableProfileDigits($name, $digits);
    
    if(($asso !== NULL) && (sizeof($asso) !== 0)){
      $minvalue = 0;
      $maxvalue = 0;
    } 
    IPS_SetVariableProfileValues($name, $minvalue, $maxvalue, $step);
    
    if(($asso !== NULL) && (sizeof($asso) !== 0)){
      foreach($asso as $ass) {
        IPS_SetVariableProfileAssociation($name, $ass[0], $ass[1], $ass[2], $ass[3]);
      }
    }         
}
################################################################################
?>

Durch den zusätzlichen Filter in der Tabellenausgabe bzgl. ERROR war ein logischer Fehler beim Zählen der Ausgabezeilen entstanden. Dabei wurden „ERROR - Zeilen“ nicht angezeigt und die Meldung „Maximale Tabellengröße von … erreicht“ kam als letzte Zeile.

Geändert wurde die Zeile:
255 foreach ($out as $line) {

Hinzugefügt wurde die Zeilen:
254 $outIdx =0;
307 $outIdx++;

<?
################################################################################
# Scriptbezeichnung: System.StatusLog.ips.php
# Version: 1.2
# Author:  Heiko Wilknitz (@Pitti) kleine Ergänzungen N22 + BESTEX
#
# Dieses Skript filtert aus dem IPS Logfile die gewünschten Einträge:  
#    0:ALL = (ERROR, WARNING, CUSTOM, NOTIFY, SUCCESS)
#    1:ERROR
#    2:WARNING
#    3:CUSTOM
#    4:NOTIFY
#    5:SUCCESS 
#
# Installation:
# -------------
#
# HINWEIS: NUR FÜR LINUX BASIIERTE SYSTEM!!!
#
# Dieses Skript richtet automatisch alle nötigen Objekte bei manueller
# Ausführung ein.
#
# - Neues Skript erstellen
# - Diesen PHP-Code hineinkopieren
# - Abschnitt 'Konfiguration' den eigenen Gegebenheiten anpassen 
# - Skript Abspeichern
# - Skript Ausführen
#
# ------------------------------ Konfiguration ---------------------------------
#
# Logfile, sollte nichts geändert werden
$logDir     = IPS_GetLogDir();
$logFile    = 'logfile.log';
#
# A fast and powerful alternative to grep (https://github.com/svent/sift)
$useSift = false;
#
# Filter Profil 
$filter =  array(
    array(0,'ALL',        '', 8421631),
    array(1,'ERROR',    '', 16744576),
    array(2,'WARNING','', 16777088),
    array(3,'SUCCESS','', 8454016),
    array(4,'NOTIFY',    '', 16744703),
    array(5,'CUSTOM',    '', 12632256)
);

#  
# Hier ggf. die HTML Ausgabe anpassen
$maxlines = 1500; /* Maximale Anzahl Zeilen in der HTML Tabellenanzeige Wird nur initialisiert wenn dieses script in der Konsole ausgeführt wird. Speichern reicht nicht !*/
$pgdwntrg = 10; /* Angabe in Sekunden - innerhalb dieser Zeitangabe muß die Auswahl erneut gedrückt werden um auf die nächste Tabellenseite zu blättern  */

################################################################################

// INSTALLATION
if ($_IPS['SENDER']=='Execute') {
    $pos = 0;
    // Filter
    $vpn = "IPS.Logging";
    $vid = CreateVariableByName($_IPS['SELF'], "Filter", 1);
    CreateProfileInteger($vpn, 'CloseAll', '', '', 0, 0, 0, 0, $filter);
    IPS_SetVariableCustomProfile($vid, $vpn);
    IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
    IPS_SetPosition($vid, $pos++);
    SetValue($vid, 0); 
    
    // select CUSTOM
    $vid = CreateVariableByName($_IPS['SELF'], "Select Sender", 3);
    IPS_SetVariableCustomProfile($vid, '~String');
    IPS_SetIcon($vid, "Gear");
    IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
    IPS_SetPosition($vid, $pos++);
    SetValue($vid, '');    
    
    // select ALL 
    $vid = CreateVariableByName($_IPS['SELF'], "Message Filter", 3);
    IPS_SetVariableCustomProfile($vid, '~String');
    IPS_SetIcon($vid, "Gear");
    IPS_SetVariableCustomAction($vid, $_IPS['SELF']);
    IPS_SetPosition($vid, $pos++);
    SetValue($vid, '');    
   
   
    // Messages
    $vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
    IPS_SetVariableCustomProfile($vid, '~HTMLBox');
    IPS_SetIcon($vid, "Database");
    IPS_SetPosition($vid, $pos++);
    // LogMessages Info ***********
    IPS_SetInfo($vid, json_encode(array('key' => '', 'timestamp' => time(), 'maxlines' => $maxlines, 'lastkey' => '', 'lastline' => '', 'pgdwntrg' => $pgdwntrg,'filteropt'=>$filter )));
    // $LogMsgProp=array('key' => '', 'timestamp' => time(), 'maxlines' => '', 'pgdwntrg' => '');
}
// AKTION VIA WEBFRONT    
else if ($_IPS['SENDER'] == "WebFront") {
    
    // Speichern
    SetValue($_IPS['VARIABLE'],$_IPS['VALUE'] );
    $filter_key = GetValueInteger( IPS_GetObjectIDByName ("Filter",$_IPS['SELF']  ));
    $sender = GetValueString( IPS_GetObjectIDByName ("Select Sender",$_IPS['SELF']  ));
    $message_key_word = GetValueString( IPS_GetObjectIDByName ("Message Filter",$_IPS['SELF']  ));

    if($filter_key  == 5)
    {
        IPS_SetHidden ( IPS_GetObjectIDByName ("Select Sender",$_IPS['SELF']  ), false);
    }
    else
    {
        IPS_SetHidden ( IPS_GetObjectIDByName ("Select Sender",$_IPS['SELF']  ), true);
    }
    if($filter_key  == 0)
    {
        IPS_SetHidden ( IPS_GetObjectIDByName ("Message Filter",$_IPS['SELF']  ), false);
    }
    else
    {
        IPS_SetHidden ( IPS_GetObjectIDByName ("Message Filter",$_IPS['SELF']  ), true);
    }

    // Build command line
    $cmd = BuildExecute($useSift, $filter, $filter_key, $logDir.$logFile);
    // Filtern
    $html = GetLogMessages($cmd);
    // Anzeigen
    $vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3);
    SetValue($vid, $html);
    // Objekt Info aktualisieren
    $objArray=IPS_GetObject($vid);
    $LogMsgInf = json_decode($objArray['ObjectInfo'], true);
    $LogMsgInf['key'] = $filter_key;
    IPS_SetInfo($vid, json_encode($LogMsgInf));
}

# -------------------------------- FUNKTIONEN ----------------------------------

// Kommandozeile zusammenbauen
function BuildExecute($fast, $filter, $index, $log)
{
    $cmd = '';
    $len = count($filter);
    
    
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    //echo 'This is a server using Windows!';
    // Beispiel findstr "SUCCESS ERROR"   logfile.log    
    
    $cmd = 'findstr "';
                // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= ' '.$arr[1].' ';    
                if ($key != $len - 1) $cmd .= ' ';
            }
        }
        // SPECIFIC
        else {
            $cmd .= ' '.$filter[$index][1].' ';
        }
        $cmd .= '" ';   
        // echo "Befehl: ".$cmd."
"; 
        
        
} else {
     /* Linux - Anfang */    
    //SIFT => $cmd = 'sift -e " ERROR " -e " WARNING " -e " CUSTOM " -e " NOTIFY " -e " SUCCESS " '.$log; 
    if($fast == true) {
        $cmd = 'sift ';
        // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= '-e " '.$arr[1].' "';    
                if ($key != $len - 1) $cmd .= ' ';
            }
        }
        // SPECIFIC
        else {
            $cmd .= '-e " '.$filter[$index][1].' "';
        }
        $cmd .= ' ';
    }
    //GREP => $cmd = 'grep -E "( ERROR | WARNING | CUSTOM | NOTIFY | SUCCESS )" '.$log 
    else {
        $cmd = 'grep -E "(';
        // ALL    
        if($index == 0) {
            foreach($filter as $key => $arr) {
                if ($key == 0) continue;
                $cmd .= ' '.$arr[1].' ';    
                if ($key != $len - 1) $cmd .= '|';
            }
        }
        // SPECIFIC
        else {
            $cmd .= ' '.$filter[$index][1].' ';
        }
        $cmd .= ')" ';
    }
    /* Linux - ende */
  }
    $cmd .= $log;
    return $cmd;
};

// Daten über alle RSSI_DEVICE(s) holen und rendern
function GetLogMessages($cmd) 
{
    global $filter_key,$sender,$message_key_word;
   // Anzeige aufbereiten 
    $style = "";
    $style = $style.'<style type="text/css">';
    $style = $style.'table  {border-collapse: collapse; font-size: 14px; width: 100%; }';
    $style = $style.'td.fst {vertical-align: middle; text-align: left; padding: 5px; border-left: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'td.mid {vertical-align: middle; text-align: left; padding: 5px; border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'td.lst {vertical-align: middle; text-align: left; padding: 5px; border-right: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'tr:last-child {border-bottom: 1px solid rgba(255, 255, 255, 0.2); }';
    $style = $style.'tr:nth-child(even) {  background-color: rgba(0, 0, 0, 0.2); }';      
    $style = $style.'.th { color: rgb(255, 255, 255); background-color: rgb(160, 160, 0); font-weight:bold; background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }';
    $style = $style.'.dotE { width: 15px; height: 15px; clear: both; background: #ff8080; border-radius: 50%;  margin-top: 1px; margin-left:5px; }';
    $style = $style.'.dotW { width: 15px; height: 15px; clear: both; background: #ffff80; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotS { width: 15px; height: 15px; clear: both; background: #80ff80; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotC { width: 15px; height: 15px; clear: both; background: #c0c0c0; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'.dotN { width: 15px; height: 15px; clear: both; background: #ff80ff; border-radius: 50%; float:left; margin-top: 2px; margin-right:10px; }';
    $style = $style.'</style>';
    // HTML zusammenbauen    
    $html = $style;
    // Exceute Command
    $ret = exec($cmd, $out, $rc); 

    $html .= '<table>';
    $html .= '<tr><td class="fst th" style="width:30px;">Typ</td><td class="mid th" style="width:150px;">Uhrzeit</td><td class="mid th" style="width:120px;">Sender</td><td class="lst th">Meldung</td></tr>'; 

    $out = array_reverse($out);
    
    $vid = CreateVariableByName($_IPS['SELF'], "LogMessages", 3); 
        
    $objArray=IPS_GetObject($vid);
    $LogMsgInf = json_decode($objArray['ObjectInfo'], true);

    // HTML Tabellenanzeige definieren
    if ($LogMsgInf['lastkey'] == $LogMsgInf['key']){
       if ((time()-$LogMsgInf['pgdwntrg']) < $LogMsgInf['timestamp']){
                         $firstline = $LogMsgInf['lastline']+1;
                         $lastline = $firstline + $LogMsgInf['maxlines'];
       }else{
          $firstline = 0;
          $lastline = $firstline + $LogMsgInf['maxlines'];
       }
                         
    }else{
       $firstline = 0;
       $lastline = $firstline + $LogMsgInf['maxlines'];
    }
    $outIdx =0;
    foreach ($out as $line) { 
        $array = explode("|", $line);
        if(array_key_exists(1 ,$LogMsgInf['filteropt'][$filter_key]))
        {
        
            if(array_key_exists(2,$array))
            {
                
                // zusätzlicher Filter in der Tabellenausgabe. Es wird z.B. bei der Auswahl ERROR keine Ausgabe gemacht wenn ERROR in einer Meldung steht.
                if($LogMsgInf['filteropt'][$filter_key][1] != 'ALL'  )
                {
                      if( $LogMsgInf['filteropt'][$filter_key][1] != trim($array[2]))
                    {continue;}
                    
                }
                if(
                    ($LogMsgInf['filteropt'][$filter_key][1] == 'CUSTOM'  )
                    AND
                    ($sender != '')
                  )
                {
                    if( !strpos($array[3], $sender))
                    {continue;}
                    
                }
                if(
                    ($LogMsgInf['filteropt'][$filter_key][1] == 'ALL'  )
                    AND
                    ($message_key_word != '')
                  )
                {
                    if( !strpos($array[4], $message_key_word))
                    {continue;}
                    
                }
        
        
                // Check LOG in LOG :-(
                if( trim($array[2]) == 'MESSAGE') continue;
                If( $outIdx >= $firstline and $outIdx <= $lastline){
                $color = trim($array[2]);
                $html .= '<tr><td class="fst"><div class="dot'.$color[0].'"></div>'.'</td><td class="mid">'.$array[0].'</td><td class="mid">'.$array[3].'</td><td class="lst">'.$array[4].'</td></tr>';
                }
        
                if($outIdx>=$lastline) {
                // $maxlines erreicht. Ausgabe letzte Tabellenzeile 
                    $html .= '<tr><td class="fst"><div class="dot'.$color[0].'"></div>'.'</td><td class="mid">*</td><td class="mid">*</td><td class="lst"> *** max. Tabellengröße von '. $LogMsgInf['maxlines'] .' Zeilen erreicht ***<br />*** erneutes anklicken der gleichen Auswahl innerhalb von '.$LogMsgInf['pgdwntrg'].' Sek. zeigt die nächsten '. $LogMsgInf['maxlines'] .' Zeilen an ***</td></tr>';
                    break ;
            }
            }
        }
      
		$outIdx++;      
        
    }
    

    $html.='</table>';
    
    // LogMsgInf aktualisieren
    $LogMsgInf['timestamp'] = time();
    $LogMsgInf['lastline'] = $lastline;
    $LogMsgInf['lastkey'] = $LogMsgInf['key'];
    IPS_SetInfo($vid, json_encode($LogMsgInf));
    
    // Zurück
    return $html;    
}

// Erzeugt eine Variable unterhalb {id} mit dem Namen {name} vom Typ [type}
// Existiert die Variable schon wird diese zurückgeliefert.
// Types: 0 = Boolean, 1 = Integer, 2 = Float, 3 = String
function CreateVariableByName($id, $name, $type) 
{ 
   $vid = @IPS_GetVariableIDByName($name, $id); 
   if($vid===false) { 
      $vid = IPS_CreateVariable($type); 
      IPS_SetParent($vid, $id); 
      IPS_SetName($vid, $name); 
   }
   return $vid; 
}

// Erzeugt ein Variablenprofil vom Typ {type} mit Name n{name} 
function CreateProfile($name, $type)
{
    if(!IPS_VariableProfileExists($name)) {
        IPS_CreateVariableProfile($name, $type);
    } 
    else {
      $profile = IPS_GetVariableProfile($name);
      if($profile['ProfileType'] != $type)
        throw new Exception("Variable profile type does not match for profile ".$name);
    }
}

// Erzeugt ein Integer-Variablenprofil
function CreateProfileInteger($name, $icon, $prefix, $suffix, $minvalue, $maxvalue, $step, $digits, $asso = NULL)
{
    CreateProfile($name, 1);

    IPS_SetVariableProfileIcon($name, $icon);
    IPS_SetVariableProfileText($name, $prefix, $suffix);
    IPS_SetVariableProfileDigits($name, $digits);
    
    if(($asso !== NULL) && (sizeof($asso) !== 0)){
      $minvalue = 0;
      $maxvalue = 0;
    } 
    IPS_SetVariableProfileValues($name, $minvalue, $maxvalue, $step);
    
    if(($asso !== NULL) && (sizeof($asso) !== 0)){
      foreach($asso as $ass) {
        IPS_SetVariableProfileAssociation($name, $ass[0], $ass[1], $ass[2], $ass[3]);
      }
    }         
}
################################################################################
?>

Hallo,

danke für das Script.
Ich mochte mich zum einen Buno’s Bemerkung (#10) anschließen, zum anderen anmerken, dass es auch auf Win7 läuft: der Hinweis in Zeile 18 könnte also weg.
Bei der Installation bekomme ich die Meldung (und die wird dann auch gleich angezeigt!!): Profile ~String is not available since IPS 5.0. Use an empty Profile (für die Variablen ‚Select Sender‘, ‚Message Filter‘ und ‚LogMessages‘).

Grüße, Gerhard