Hi demel,
ich habe dein Script noch weiter erweitert. Jetzt prüfe ich auch ob alle Aktion-Scripte vorhanden sind, ob es überflüssige Scripte gibt und ob es fehlende Scripte gibt. Neben HTML erzeuge ich jetzt auch einen einfachen Text um ihn mir per Mail zu svhicken.
So sieht der umfangreichere Script jetzt aus:
<?php
declare(strict_types=1);
error_reporting(E_ERROR | E_PARSE | E_NOTICE);
// Array mit IDs von Instanzen füllen die ignoriert werden sollen, z.B. weil die Batterie entfernt wurde.
$ignore = array( 0 ) ;
//$ignore = array( 48618,
// 16529,
// 57977
// );
// Variable A: Typ String, Profil ~HTML-Box
// Variable B: Typ Integer
// Variable C: Typ Integer, Profil ~UnixTimestamp
$startTime = IPS_GetKernelStartTime();
$errorText = '';
$mailText = '';
$errorTotal = 0;
// Transactions
$now = time();
// Threads
$threadList = IPS_GetScriptThreadList();
$threadCount = 0;
foreach ($threadList as $t => $i) {
$thread = IPS_GetScriptThread($i);
$ScriptID = $thread['ScriptID'];
if ($ScriptID != 0) {
$threadCount++;
}
}
// Timer
$timerCount = 0;
$timer1MinCount = 0;
$timer5MinCount = 0;
$timerList = IPS_GetTimerList();
foreach ($timerList as $t) {
$timer = IPS_GetTimer($t);
$next_run = $timer['NextRun'];
if ($next_run == 0) {
continue;
}
$timerCount++;
$delay = $next_run - $now;
if ($delay < 60) {
$timer1MinCount++;
} elseif ($delay < 300) {
$timer5MinCount++;
}
}
$instanceStatusCodes = [
101 => 'Instanz wird erstellt',
102 => 'Instanz ist aktiv',
103 => 'Instanz wird gelöscht',
104 => 'Instanz ist inaktiv',
105 => 'Instanz wurde nicht erzeugt',
];
// Instanzen
$instanceList = IPS_GetInstanceList();
$instanceCount = count($instanceList);
$instanceError = 0;
$instanceError = 0;
foreach ($instanceList as $id) {
$key = array_search($id, $ignore);
if (is_bool($key)){
$instance = IPS_GetInstance($id);
if ($instance['InstanceStatus'] <= 104) {
continue;
}
if ($instanceError == 0) {
$errorText .= '<b>Defekte Instanzen:</b><br>' . PHP_EOL;
$mailText .= 'Defekte Instanzen:' . PHP_EOL;
}
$instanceError++;
$instanceStatus = $instance['InstanceStatus'];
if (isset($instanceStatusCodes[$instanceStatus])) {
$err = $instanceStatusCodes[$instanceStatus];
} else {
$err = 'Status ' . $instanceStatus;
}
$col = $instanceStatus >= 200 ? 'red' : 'grey';
$loc = IPS_GetLocation($id);
$errorText .= '<span style="color: ' . $col . ';"> #' . $id . ': ' . $loc . ': ' . $err . '</span><br>' . PHP_EOL;
$mailText .= 'ID:' . $id . ': ' . $loc . ': ' . $err . PHP_EOL;
}
}
if ($instanceError > 0) {
$errorText .= '<br>' . PHP_EOL;
$mailText .= PHP_EOL;
$errorTotal += $instanceError;
}
$pfad = IPS_GetKernelDir()."scripts";
$handle=opendir ($pfad);
while ($datei = readdir ($handle)) {
if(strpos($datei,".ips.php")!==false) {
$datei =explode(".",$datei);
$files[]=$datei[0];
}
}
closedir($handle);
// Scripte
$scriptList = IPS_GetScriptList();
$scriptCount = count($scriptList);
$scriptError = 0;
foreach ($scriptList as $id) {
$script = IPS_GetScript($id);
if (!$script['ScriptIsBroken']) {
continue;
}
if ($scriptError == 0) {
$errorText .= '<b>Defekte Skripte:</b><br>' . PHP_EOL;
$mailText .= 'Defekte Skripte:' . PHP_EOL;
}
$scriptError++;
$col = 'red';
$loc = IPS_GetLocation($id);
$errorText .= '<span style="color: ' . $col . ';"> #' . $id . ': ' . $loc . '</span><br>' . PHP_EOL;
$mailText .= 'ID:' . $id . PHP_EOL;
}
if ($scriptError > 0) {
$errorText .= '<br>' . PHP_EOL;
$mailText .= PHP_EOL;
$errorTotal += $scriptError;
}
// überlüssige Scripte
$scriptError = 0;
foreach($files as $file){
if ( is_numeric($file) ){
$key = array_search($file, $scriptList);
if ( $key === false ){
if ($scriptError == 0) {
$errorText .= '<b>überflüssige Skripte:</b><br>' . PHP_EOL;
$mailText .= 'überflüssige Skripte:' . PHP_EOL;
}
$scriptError++;
$col = 'red';
$errorText .= '<span style="color: ' . $col . ';"> #' . $file.'.ips.php wird nicht gebraucht</span><br>' . PHP_EOL;
$mailText .= 'ID:' . $file.'.ips.php wird nicht gebraucht' . PHP_EOL;
}
}
}
if ($scriptError > 0) {
$errorText .= '<br>' . PHP_EOL;
$mailText .= PHP_EOL;
$errorTotal += $scriptError;
}
// fehlende Scripte
$scriptError = 0;
foreach($scriptList as $id){
$key = array_search($id, $files);
if ( $key === false ){
if ($scriptError == 0) {
$errorText .= '<b>fehlende Skripte:</b><br>' . PHP_EOL;
$mailText .= 'fehlende Skripte:' . PHP_EOL;
}
$scriptError++;
$col = 'red';
$errorText .= '<span style="color: ' . $col . ';"> #' . $id.'.ips.php fehlt</span><br>' . PHP_EOL;
$mailText .= 'ID:' . $id.'.ips.php fehlt' . PHP_EOL;
}
}
if ($scriptError > 0) {
$errorText .= '<br>' . PHP_EOL;
$mailText .= PHP_EOL;
$errorTotal += $scriptError;
}
// Links
$linkList = IPS_GetLinkList();
$linkCount = count($linkList);
$linkError = 0;
foreach ($linkList as $id) {
$link = IPS_GetLink($id);
if (IPS_ObjectExists($link['TargetID'])) {
continue;
}
if ($linkError == 0) {
$errorText .= '<b>Defekte Links:</b><br>' . PHP_EOL;
$mailText .= 'Defekte Links:' . PHP_EOL;
}
$linkError++;
$col = 'red';
$loc = IPS_GetLocation($id);
$errorText .= '<span style="color: ' . $col . ';"> #' . $id . ': ' . $loc . '</span><br>' . PHP_EOL;
$mailText .= 'ID:' . $id . ': ' . $loc . PHP_EOL;
}
if ($linkError > 0) {
$errorText .= '<br>' . PHP_EOL;
$mailText .= PHP_EOL;
$errorTotal += $linkError;
}
// Objekte
$objectList = IPS_GetObjectList();
$objectCount = count($objectList);
$objectError = 0;
foreach ($objectList as $id) {
$obj = IPS_GetObject($id);
$ok = true;
$pid = $obj['ParentID'];
if ($pid != 0 && !IPS_ObjectExists($pid)) {
$ok = false;
}
$cids = $obj['ChildrenIDs'];
foreach ($cids as $cid) {
if (!IPS_ObjectExists($cid)) {
$ok = false;
}
}
if ($ok) {
continue;
}
if ($objectError == 0) {
$errorText .= '<b>Defekte Objekte:</b><br>' . PHP_EOL;
$mailText .= 'Defekte Objekte:' . PHP_EOL;
}
$objectError++;
$col = 'red';
$loc = IPS_GetLocation($id);
$errorText .= '<span style="color: ' . $col . ';"> #' . $id . ': ' . $loc . '</span><br>' . PHP_EOL;
$mailText .= 'ID:' . $id . ': ' . $loc . PHP_EOL;
}
if ($objectError > 0) {
$errorText .= '<br>' . PHP_EOL;
$mailText .= PHP_EOL;
$errorTotal += $objectError;
}
// Events
$eventList = IPS_GetEventList();
$eventCount = count($eventList);
$eventActive = 0;
$eventError = 0;
foreach ($eventList as $id) {
$event = IPS_GetEvent($id);
$active = $event['EventActive'];
if ($active) {
$eventActive++;
}
$err = 0;
$varID = $event['TriggerVariableID'];
if ($varID != 0 && IPS_ObjectExists($varID) == false) {
$err++;
}
$eventConditions = $event['EventConditions'];
foreach ($eventConditions as $eventCondition) {
$variableRules = $eventCondition['VariableRules'];
foreach ($variableRules as $variableRule) {
$varID = $variableRule['VariableID'];
if ($varID != 0 && IPS_ObjectExists($varID) == false) {
$err++;
}
}
}
if ($err == 0) {
continue;
}
if ($eventError == 0) {
$errorText .= '<b>Defekte Ereignisse:</b><br>' . PHP_EOL;
$mailText .= 'Defekte Ereignisse:' . PHP_EOL;
}
$eventError++;
$col = $active ? 'red' : 'grey';
$loc = IPS_GetLocation($id);
$errorText .= '<span style="color: ' . $col . ';"> #' . $id . ': ' . $loc . '</span><br>' . PHP_EOL;
$mailText .= 'ID:' . $id . ': ' . $loc .PHP_EOL;
}
if ($eventError > 0) {
$errorText .= '<br>' . PHP_EOL;
$mailText .= PHP_EOL;
$errorTotal += $eventError;
}
// Module
$moduleList = IPS_GetModuleList();
$moduleCount = count($moduleList);
// Variablen
$varList = IPS_GetVariableList();
$varCount = count($varList);
$varError = 0;
foreach ($varList as $id) {
$err = 0;
$variable = IPS_GetVariable($id);
$Varprofile = $variable['VariableProfile'];
if ($Varprofile != ''){
$profile = IPS_GetVariableProfile($Varprofile);
if ($profile == false){
$err++;
}
}
$Varprofile = $variable['VariableCustomProfile'];
if ($Varprofile != ''){
$profile = IPS_GetVariableProfile($Varprofile);
if ($profile == false){
$err++;
}
}
if ($err == 0) {
continue;
}
if ($varError == 0) {
$errorText .= '<b>Fehlende Profile:</b><br>' . PHP_EOL;
$mailText .= 'Fehlende Profile:' . PHP_EOL;
}
$varError++;
$col = $active ? 'red' : 'grey';
$loc = IPS_GetLocation($id);
$errorText .= '<span style="color: ' . $col . ';"> #' . $id . ': ' . $loc . ' entweder "' . $variable['VariableProfile'] . '" oder "' . $variable['VariableCustomProfile'] . '" fehlen ' . '</span><br>' . PHP_EOL;
$mailText .= 'ID:' . $id . ': ' . $loc . ' entweder "' . $variable['VariableProfile'] . '" oder "' . $variable['VariableCustomProfile'] . '" fehlen ' . PHP_EOL;
}
if ($varError > 0) {
$errorText .= '<br>' . PHP_EOL;
$mailText .= PHP_EOL;
$errorTotal += $varError;
}
// VariableAction
$varError = 0;
foreach ($varList as $id) {
$err = 0;
$variable = IPS_GetVariable($id);
$VarAction = $variable['VariableAction'];
if ($VarAction > 1){
$script = IPS_GetScript($VarAction);
$instanz = IPS_GetInstance($VarAction);
// var_dump($VarAction);
// var_dump($script);
// var_dump($instanz);
if (($script == false) && ($instanz == false)){
$err++;
}
}
$VarAction = $variable['VariableCustomAction'];
if ($VarAction > 1){
$script = IPS_GetScript($VarAction);
$instanz = IPS_GetInstance($VarAction);
if (($script == false) && ($instanz == false)){
$err++;
}
}
if ($err == 0) {
continue;
}
if ($varError == 0) {
$errorText .= '<b>Fehlende Aktions-Scripte:</b><br>' . PHP_EOL;
$mailText .= 'Fehlende Aktions-Scripte:' . PHP_EOL;
}
$varError++;
$col = $active ? 'red' : 'grey';
$loc = IPS_GetLocation($id);
$errorText .= '<span style="color: ' . $col . ';"> #' . $id . ': ' . $loc . ' entweder "' . $variable['VariableAction'] . '" oder "' . $variable['VariableCustomAction'] . '" fehlen ' . '</span><br>' . PHP_EOL;
$mailText .= 'ID:' . $id . ': ' . $loc . ' entweder "' . $variable['VariableAction'] . '" oder "' . $variable['VariableCustomAction'] . '" fehlen ' . PHP_EOL;
}
if ($varError > 0) {
$errorText .= '<br>' . PHP_EOL;
$mailText .= PHP_EOL;
$errorTotal += $varError;
}
$html = '';
$html .= '<head>' . PHP_EOL;
$html .= '<style>' . PHP_EOL;
$html .= 'body { margin: 1; padding: 0; font-family: "Open Sans", sans-serif; font-size: 20px; }' . PHP_EOL;
$html .= 'table { border-collapse: collapse; border: 0px solid; margin: 0.5em;}' . PHP_EOL;
$html .= 'th, td { padding: 1; }' . PHP_EOL;
$html .= 'thead, tdata { text-align: left; }' . PHP_EOL;
$html .= '#spalte_title { width: 160px; }' . PHP_EOL;
$html .= '#spalte_value { }' . PHP_EOL;
$html .= '</style>' . PHP_EOL;
$html .= '</head>' . PHP_EOL;
$html .= '<body>' . PHP_EOL;
$html .= '<table>' . PHP_EOL;
$html .= '<colgroup><col id="spalte_title"></colgroup>' . PHP_EOL;
$html .= '<colgroup><col id="spalte_value"></colgroup>' . PHP_EOL;
$html .= '<tr><td>Instanzen</td><td>' . $instanceCount . '</td></tr>' . PHP_EOL;
$html .= '<tr><td>Scripte</td><td>' . $scriptCount . '</td></tr>' . PHP_EOL;
$html .= '<tr><td>Links</td><td>' . $linkCount . '</td></tr>' . PHP_EOL;
$html .= '<tr><td>Objekte</td><td>' . $objectCount . '</td></tr>' . PHP_EOL;
$html .= '<tr><td>Ereignisse</td><td>' . $eventCount . ' (aktiv=' . $eventActive . ')</td></tr>' . PHP_EOL;
$html .= '<tr><td>Module</td><td>' . $moduleCount . '</td></tr>' . PHP_EOL;
$html .= '<tr><td>Variablen</td><td>' . $varCount . '</td></tr>' . PHP_EOL;
$html .= '<tr><td>Threads</td><td>' . $threadCount . '</td></tr>' . PHP_EOL;
$html .= '<tr><td>Timer</td><td>' . $timerCount . ' (1m=' . $timer1MinCount . ', 5m=' . $timer5MinCount . ')</td></tr>' . PHP_EOL;
$html .= '</table>' . PHP_EOL;
if ($errorTotal > 0) {
$html .= $errorText. '</body>' . PHP_EOL;
// vereinfachten Fehlertext als Mail verschiecken
$mailBetreff = "IPS Check"; //Betreff der E-Mail
SMTP_SendMail(33517, $mailBetreff, $mailText);
} else {
$html .= '<br>keine Fehler<br>' . PHP_EOL . '</body>' . PHP_EOL;
}
SetValueString(29692, $html);
SetValueInteger(11096, $errorTotal);
SetValueInteger(15191, $startTime);
?>
Gibt es noch etwas was man checken könnte?
Ralf