Fehlerhafte Objekte / Skripte auflisten

Habt ihr eine Lösung, wie man fehlerhafte Objekte / Skripte (die mit einem roten Ausrufezeichen gekennzeichnet sind) in IPS per Skript auflisten kann?

Viele Grüße …

Mal kurz runter geschrieben. Mehr Objekt-Typen, die fehlerhaft sein können, sind mir gerade nicht eingefallen:

<?php
// -----------------------------------------------------------------------------
// WebFront-freundliche HTML-Ausgabe aller defekten Instanzen, Skripte und Links
// -----------------------------------------------------------------------------

$ContentVariableID = 12345;    // Variablen-ID zur Speicherung der Meldung.
                               // Wert 0 führt zur direkten Ausgabe.

// -----------------------------------------------------------------------------

$content = '';

$instanceStatusCodes = array(
    100 => 'module base status',
    101 => 'module is being created',
    102 => 'module created and running',
    103 => 'module is being deleted',
    104 => 'module is not beeing used',
    200 => 'instance error',
    201 => 'instance could not be created'
);

$errorCount = 0;

$ids = IPS_GetInstanceList();
foreach ($ids as $id)
{
    $instance = IPS_GetInstance($id);
    if ($instance['InstanceStatus'] > 103)
    {
        if ($errorCount == 0)
        {
            $content .= '<b>Defekte Instanzen:</b><br />'."
";
        }
        $errorCount++;
        $content .= '<span style="color: '.($instance['InstanceStatus'] >= 200 ? 'red' : 'grey').';">#'.$id.': '.IPS_GetLocation($id).': '.$instanceStatusCodes[$instance['InstanceStatus']].'</span><br />'."
";
    }
}

if ($errorCount > 0)
{
    $content .= '<br />'."
";
    $errorCount = 0;
}
$ids = IPS_GetScriptList();
foreach ($ids as $id)
{
    $script = IPS_GetScript($id);
    if ($script['IsBroken'])
    {
        if ($errorCount == 0)
        {
            $content .= '<b>Defekte Skripte:</b><br />'."
";
        }
        $errorCount++;
        $content .= '<span style="color: red;">#'.$id.': '.IPS_GetLocation($id).'</span><br />'."
";
    }
}

if ($errorCount > 0)
{
    $content .= '<br />'."
";
    $errorCount = 0;
}
$ids = IPS_GetLinkList();
foreach ($ids as $id)
{
    $link = IPS_GetLink($id);
    if (!IPS_ObjectExists($link['LinkChildID']))
    {
        if ($errorCount == 0)
        {
            $content .= '<b>Defekte Links:</b><br />'."
";
        }
        $errorCount++;
        $content .= '<span style="color: red;">#'.$id.': '.IPS_GetLocation($id).'</span><br />'."
";
    }
}

$printContent = true;

if (IPS_VariableExists((int)$ContentVariableID))
{
    $variable = IPS_GetVariable($ContentVariableID);
    if ($variable['VariableValue']['ValueType'] === 3)
    {
        $printContent = false;
        SetValueString($ContentVariableID, $content);
    }
}

if ($printContent)
{
    echo $content;
}
?>

… boah … danke Horst … ich probiers nachher gleich mal aus … :slight_smile:

Hab’s schon probiert :smiley: geht gut :stuck_out_tongue:

… Ich hab einen Moment gebraucht, um erst mal ein Fehler zu erzeugen … :wink: … rennt wie verrückt …

Danke, Horst, für deinen schnellen Einsatz :slight_smile:

Klasse & Danke an Horst,

das Script kommt mir wie gerufen. Habe auf diese Weise einen Fehler in meinem IPS gefunden nach dem ich schon seit Stunden gesucht habe (der Anwesenheitsmonitor machte nicht das was er sollte). Nur dass ich den Fehler nicht im bewussten Script vermutet, geschweige denn gefunden habe. Erst das „Fehler-Script“ hat mich drauf aufmerksam gemacht.

Danke, läuft prima.

Vielen Dank! Hat auf Anhieb funktioniert…:slight_smile:

Joachim

Moin…

Super Script! Was müßte man Ändern um einem nicht fürs Webfront formatierten String zu erhalten? Benutze ausschliesslich das Dashboard und bei solchen Scripten hört es bei mir mit PHP auf. :frowning:
Das bekomm ich nicht umgebaut!!

Vielleicht hat das ja jemand schon gemacht?
Grüße,

Peter

Hallo Peter,

Du kannst das Script genauso auch im Dashboard benutzen.

  1. Panel anlegen
  2. Webbrowser dahinein setzen
  3. „Source“ des Webbrowsers auf srcText stellen
  4. Die Variable unter „Content“ angeben.

Damit es farblich in mein Dashboard passt habe ich im Script die Zeile

$content = '';

noch mit einer Hintergrundfarbe ergänzt.

$content = '<body bgcolor="#0f2d4b">';

Fertig
Gruß

Hallo zusammen,
im script kommt bei mir die Fehlermeldung

undefined Offset

in dieser Zeile, kann mir jemand sagen was da nicht stimmt ?

$content .= ‚<span style=„color: ‚.($instance[‚InstanceStatus‘] >= 200 ? ‚red‘ : ‚grey‘).‘;“>#‘.$id.’:’.IPS_GetLocation($id).’: ‚.$instanceStatusCodes[$instance[‚InstanceStatus‘]].‘</span><br />’."
";

Hi,

ich hab es angepasst, ist ja schon ein paar Tage her wo das Script geschrieben wurde. Da hat sich ja einiges in IPS getan.
bzw., ich mein ich hab das Thema schonmal irgendwo gesehen … mhhh keine Ahnung aber so sollte es gehen …

Gruß


<?php
// -----------------------------------------------------------------------------
// WebFront-freundliche HTML-Ausgabe aller defekten Instanzen, Skripte und Links
// -----------------------------------------------------------------------------

// Variablen-ID zur Speicherung der Meldung.
$ContentVariableID = 12345;  // Wert 0 führt zur direkten Ausgabe.

// -----------------------------------------------------------------------------

$content = '<body bgcolor="#0f2d4b">';  

$instanceStatusCodes = array(
    100 => 'module base status',
    101 => 'module is being created',
    102 => 'module created and running',
    103 => 'module is being deleted',
    104 => 'module is not beeing used',
    200 => 'instance error',
    201 => 'instance could not be created'
);

$errorCount = 0;

$ids = IPS_GetInstanceList();
foreach ($ids as $id)
{
    $instance = IPS_GetInstance($id);
    if ($instance['InstanceStatus'] > 103)
    {
        if ($errorCount == 0)
        {
            $content .= '<b>Defekte Instanzen:</b><br />'."
";
        }
        $errorCount++;
        $content .= '<span style="color: '.($instance['InstanceStatus'] >= 200 ? 'red' : 'grey').';">#'.$id.': '.IPS_GetLocation($id).': '.$instanceStatusCodes[$instance['InstanceStatus']].'</span><br />'."
";
    }
}

if ($errorCount > 0)
{
    $content .= '<br />'."
";
    $errorCount = 0;
}

$ids = IPS_GetScriptList();

foreach ($ids as $id)
{
    $script = IPS_GetScript($id);
	
    if ($script['ScriptIsBroken'])
    {
        if ($errorCount == 0)
        {
            $content .= '<b>Defekte Skripte:</b><br />'."
";
        }
        $errorCount++;
        $content .= '<span style="color: red;">#'.$id.': '.IPS_GetLocation($id).'</span><br />'."
";
    }
}

if ($errorCount > 0)
{
    $content .= '<br />'."
";
    $errorCount = 0;
}

$ids = IPS_GetLinkList();

foreach ($ids as $id)
{
    $link = IPS_GetLink($id);
	
    if (!IPS_ObjectExists($link['LinkID']))
    {
        if ($errorCount == 0)
        {
            $content .= '<b>Defekte Links:</b><br />'."
";
        }
        $errorCount++;
        $content .= '<span style="color: red;">#'.$id.': '.IPS_GetLocation($id).'</span><br />'."
";
    }
}

$printContent = true;

if (IPS_VariableExists((int)$ContentVariableID))
{
    $variable = IPS_GetVariable($ContentVariableID);
	
    if ($variable['VariableType'] === 3)
    {
        $printContent = false;
        SetValueString($ContentVariableID, $content);
    }
}

if ($printContent)
{
    echo $content;
}
?>

danke dir,
ich hatte danach immer noch den Fehler

jetzt hab ich das mal ergänzt

    202 => 'instance error',
    214 => ' ? '

weiß zwar nicht was Status 214 ist aber es läuft

Die Status-Codes > 200 sind Modul-spezifisch, d.h. dazu kann man den korrekten Text nicht ermitteln

demel

Hallo,

damit das allgemeingültig funktioniert, würde ich diese Zeile:


        $content .= '<span style="color: '.($instance['InstanceStatus'] >= 200 ? 'red' : 'grey').';">#'.$id.': '.IPS_GetLocation($id).': '.$instanceStatusCodes[$instance['InstanceStatus']].'</span><br />'."
";

so umformulieren:


	$instanceStatus = $instance['InstanceStatus'];
	if (isset($instanceStatusCodes[$instanceStatus])) {
		$s = $instanceStatusCodes[$instanceStatus];
	} else {
		$s = 'unknown status ' . $instanceStatus;
	}
        $content .= '<span style="color: '.($instanceStatus >= 200 ? 'red' : 'grey').';">#'.$id.': '.IPS_GetLocation($id).': '.$s.'</span><br />'."
";

Dann braucht man in dem array $instanceStatusCodes nicht alle Codes aller Modul eintragen#

demel

Hi,
mittlerweile gibt es auch den Index 105. Mit


    105 => 'Instanz wurde nicht erstellt',

läuft es auch mit aktuellem IPS.

Ralf

Hatte das Script bis jetzt nur so in meiner Administrations-Ecke zu liegen und selten genutzt.

Wollte es jetzt mal automatisieren und dabei ist mir ein Fehler im Script aufgefallen (beim Link Check):

Die Zeile …


    if (!IPS_ObjectExists($link['LinkID']))

sollte doch bestimmt …


    if (!IPS_ObjectExists($link['TargetID']))

heißen, oder? Also nicht ‚LinkID‘ sondern ‚TargetID‘!

Gruß Heiko