Status von Events abfragen

Das Modul setzt auch auf alle konfigurierten Variablen eine Referenz.
Teste doch ob das reicht.
Michael

ja, das brauch potentiell viel speicher, dann musst du das vermutlich deaktivieren.

komisch, schaue ich mir nochmal an. da beide ausgaben auf der gleiche info basieren ist das schon merkwürdig

jedes modul sollte alle id‘s als referenz bekannt geben, die es benutzt. aber eben nur die id‘s, keine weitere information.
gibt es das objekt noch, kommt man so an weitere info‘s. ist das objekt zu der id nicht mehr da, wird es schwieriger. ich würde mal in dem jew. indmstanz-konfugurations-formular schauen, ob da was auffällig ist

da bin ganz bei @Nall-chan - was gibt es an information über deine prüfung, die über die referenz-prüfung hinausgeht?

das script verstehe ich primär so, das es prüft, was interne inkonsistenten vorliegen und darauf aufmerksam macht

demel

Moin Demel,
hattest mal wieder recht:-( Alexa ist auch in dem Referenzcheck enthalten.

Mit Speicherproblemen bin ich schon öfter in Kontakt gekommen. SnapShot habe ich deaktiviert.

Wegen Mail: Mit

if ($errorTotal > 0 && $smptID != false) {
    // Mail-Text aufbauen
    $mailText = '';
    foreach ($errorList as $tag => $errEntries) {
        foreach ($errEntries as $err) {
            $lvl = $err['Level'];
            if ($lvl == $SymconHealth_Error){
                $id = $err['ID'];
                if ($id != 0) {
                    $mailText .= '#' . $id;
                    $loc = @IPS_GetLocation($id);
                    if ($loc != false) {
                        $mailText .= '(' . $loc . ')';
                    }
                    $mailText .= ': ';
                }
                $mailText .= $err['Msg'];
                $mailText .= PHP_EOL;
            }
        }
        $errorText .= PHP_EOL;
    }
//    var_dump($mailText);
    SMTP_SendMail($smptID, "IPS-Check", $mailText);
}

werden beide fehlenden Referenzen auch in der Mail angezeigt.

Ralf

Hallo,

so, ich habe das Script hier nochmal etwas angepasst

a) ich habe das mit den „snapshot“ rausgenommen, war eh völliger Mist (keine Ahnung, was ich mir damals dabei gedacht habe)
b) es gibt nun neu

// Kommentar mit Schlüsselwort, der besagt, das in dieser Zeile eines Scriptes ID's nicht auf Gülrigkeit geprüft werden sollen
$no_id_check = '/*NO_ID_CHECK*/';

jede Zeile in einem Script, wo dieser Kommentar drin steht wird nicht berücksichtigt bei der Prüfung auf gültige Objekt-IDs.

Es gibt ja in einem Script gerne mal auch Zahlen, die keine IPS-Objekt-ID’s sind und dann angemeckert werden.

demel

Moin Demel,
Du solltest das Script vielleicht in einem neuen Thread veröffentlichen denn der aktuelle Titel stimmt ja nur noch bedingt. Wenige Leute, die es vielleicht brauchen könnten, werden es hier finden. Mittlerweile sollte es ziemlich komplett sein.

Ralf

Moin @demel42, moin @HarmonyFan,

ich baue gerade Teile des Skriptes in mein eigenes System ein. Dabei ist mir ein Tippfehler aufgefallen. Statt $objectectID soll es wohl $objectID heißen. Ansonsten ein tolles Skript :slightly_smiling_face:

Vielleicht noch ein Hinweis auf diesen alten Thread von 2016, wo ich mal nach einer Cross Referenz bzw. nicht benutzte Variable gefragt hatte Anzeige nicht benutzter Variablen in den Scripten (Cross Referenz) - #14 von ransi

Vielleicht etwas für @HarmonyFan der sich selbst als Kontrollfreak bezeichnet hat :slight_smile:

Gruß
Hans

danke, das ist sicher ein Tippfehler
den Verweis habe ich angeschaut, so wie ich das verstehe haben wir das bereits drin(„Script ist überflüssig“), oder

demel

Hi,
ungenutzte Variablen wäre auch noch etwas was man suchen könnte. Da ist aber die Frage ob alle Module ihre Variablen als direktes Kind einer Instanz erstellen?

Ralf

Moin,

mir ging es damals vor allen Dingen um die Cross Referenz für die Variablen :wink:

Gruß
Hans

Dann muss ich nochmal nachfragen: was ist mit „Crossreferenz“ gemeint?
demel

Hmm, wie definiert sich eine „ungenutzte Variable“ - finde ich ziemlich schwierig und es berührt ja auch nicht die Integrität des System, oder?
Wir prüfen ja auch nicht auf „ungenutzte Scripte“, also Script, die nicht als Aktion etc eingetragen sind.
oder?
demel

Moin @demel42,

Cross Refenzen sind nichts anderes als eine Liste mit den Skripten in denen eine Variable benutzt wird. Das kann man für einzelne Variablen problemlos mit „Suchen in allen Skripten“ machen.

49708	Ziffer 1	Zeit-Scripte\Keypad	 >>Setze Popup(31564) >>Setze Popup Tempsicherung(32340) >>Keypad Verarbeitung(33177) >>Keypad Verarbeitung Tempsicherung(52327)	

Bei Compiler Sprachen wie FORTRAN oder COBOL ist/war das ein Schalter mit dem man diese Cross Referenzen am Ende des Listings wahlweise erhielt. @ransi, der Autor der Skripte, hatte diese zu Zwecken der Dokumentation für sich entwickelt.

Gruß
Hans

Hi,
überflüssige Scripte stören ja auch nicht machen aber den Code sauberer. Ungenutzte Variablen ist aber wirklich schwieriger deswegen die Frage nach den Instanzen denn viele Variablen von Instanzen sind eigentlich „ungenutzt“ sollten aber trotzdem bleiben.

Ralf

Hi,
eine Cross-Referenz bekommt man mit den Teil „// Objekt-ID’s in Scripten“ ja auch. Aktuell werden fehlende Objekte ausgegeben aber man kann ja zu jedem Script auch die benutzten Objekte ausgeben.

Ralf

Moin Nachbar,

ja, das ist der Vorteil bei Skripten im Gegensatz zu Modulen, dass man als Entwickler diese leicht an die eigenen Bedürfnisse anpassen kann. Für Benutzer, die nicht programmieren können, sind natürlich die Module von Vorteil :wink:

Gruß
Hans

Nun ja, das ist dann aber eine lange Liste … ich habe mal geschaut, ich habe in einem sehr großen Teil meiner Script eine Verwendung von Objekten (Variablen oder Instanzen) eingebaut und in jedem Script min. ein

require_once IPS_GetScriptFile(xxxx);

für die Hilfsscripte.

Ich bin leider aus deinem Beispiel nicht so recht schlau geworden … soll das dargestellt werden

  • aus Sicht der Scripte ( also die Scripte untereinander und hinter jedem Script alle im Script verwendeten Objekte )
    oder
  • aus Sicht der Variablen ( also alle (bzw. die mit Objekt-Referenz) Variablen untereinander und dazu die Scripte dahinter?

demel

Hmm , warum stören „ungenutzte“ Variablen? (Ausser, wenn man nur eine Limitierung hat)
Sicher herauszubekommen, ob eine Variable zu einer Instanz gehört ist m.E. gar nicht so einfach. Vermutlich die Kombination aus

  1. Variable ist Child der Instanz
  2. Variable hat ein ObjektIdent gesetzt

Der Indent ist ja durch die Konsole nicht änderbar, sondern nur indirekt durch IPS_SetIdent() - in Modulen muss die Variable ein Ident bekommen - der Zugriff sollte immer über den Ident laufen.

demel

Moin demel,

ich wollte eigentlich nur auf die Skripte und deren Möglichkeiten hinweisen :wink:

Hier die Beispiele mit Überschrift für Skriptinfo

SkriptID	SkriptName	Kategorie	aufgerufen in:

37428	Telefonbuch & AB-Abfrage & Invers-Suche	FritzBox Project\Scripte	 >>Event-Script Anrufmonitor(21255) >>FritzBox Project (Quell-ID: 31068) 2018_02_25-14_14, Ziel-ID: 10767 InstallProtocol(31127) >>Telefonbuch & AB-Abfrage & Invers-Suche(37428) >>FritzBox Project (Quell-ID: 31068) 2018_03_11-19_29, Ziel-ID: 10767 InstallProtocol(41974) >>Auslese-Script Telefonbücher(42467) >>Auslese-Script Anruferliste(47415) >>Aktions & Auslese-Script Anrufbeantworter(52966)

und Variableninfo

VarID	VarName	Kategorie	Pfad	Ereignis

16514	POWER	Kueche\Geschirrspueler\Kueche LM Geschirrspueler Powermeter	 >>GS ueberwachen(14558) >>Abwesenheit beide Ventilkontrolle(48756) >>Abwesenheit Start(50604)	28081: GS ueberwachen, 47766: GS starten

Das Problem mit den include Dateien habe ich natürlich auch. Aber wenn man mal was suchen will ist das recht hilfreich. Ich selbst habe mir die Ausgabe der Variablen auch als csv Datei angepasst, so dass die großen Dateien direkt in Excel eingelesen werden können.

Ich denke nicht, dass mein ein globales Skript schaffen kann was alles abdeckt. So habe ich z. B. noch die Abfrage der Location der Skripte implementiert, damit alles was unter ZZ_ liegt gar nicht erst berücksichtigt wird (Testprogramme u. ä.). Bei unbekannten Objekten gebe ich die gesamte Zeile dahinter aus, da man dann auf einen Blick erkennen kann, ob das Objekt auch wirklich ein Objekt im Sinne von IPS ist. Und so wird es sicherlich noch weitere Ideen geben :slight_smile:

Gruß
Hans

Moin Demel,

ist halt nur überflüssig.

Wie Du aber schon schreibst:

  1. man kann ja auch mit eigenen Scripten Variablen einer Instanz zuweisen. Wenn man das Script dann löschen würde wäre diese Variable überflüssig aber immer noch Child einer Instanz.
  2. Ist auch nicht eindeutig. Wenn ich ein Script schreibe das Variablen braucht erzeuge ich die Variablen manchmal als Child des Scriptes mit einer ObjectIdent damit ich es wiederfinde. Es scheint also wirklich nicht einfach es SICHER feststellen zu können.

P.S.
hier vielleicht etwas was einigen Leuten helfen könnte die mit Variablen und Profilen Probleme haben:


// ID einer Stringvariablen mit Profil ~HTML-Box
$htmlString = @IPS_GetObjectIDByIdent("ScriptCheckHTMLString", $_IPS['SELF']);
if ($htmlString == false){
    $htmlString = IPS_CreateVariable(3);
    IPS_SetName($htmlString, "Script Check HTML Text"); // Variable benennen
    IPS_SetParent($htmlString, $_IPS['SELF']); 
    IPS_SetIdent($htmlString, "ScriptCheckHTMLString"); 
    IPS_SetVariableCustomProfile($htmlString, '~HTMLBox');
}

// ID einer Integervariablen für Fehleranzahl
$checkErrorCount = @IPS_GetObjectIDByIdent("ScriptCheckErrorCount", $_IPS['SELF']);
if ($checkErrorCount == false){
    $checkErrorCount = IPS_CreateVariable(1);
    IPS_SetName($checkErrorCount, "Script Check Fehleranzahl"); // Variable benennen
    IPS_SetParent($checkErrorCount, $_IPS['SELF']); 
    IPS_SetIdent($checkErrorCount, "ScriptCheckErrorCount"); 
}

// ID einer Intergervariablen mit Profil ~UnixTimeStamp
$kernelStart = @IPS_GetObjectIDByIdent("ScriptCheckKernelStart", $_IPS['SELF']);
if ($kernelStart == false){
    $kernelStart = IPS_CreateVariable(1);
    IPS_SetName($kernelStart, "Script Check Kernel Start"); // Variable benennen
    IPS_SetParent($kernelStart, $_IPS['SELF']); 
    IPS_SetIdent($kernelStart, "ScriptCheckKernelStart"); 
    IPS_SetVariableCustomProfile($kernelStart, '~UnixTimestamp');
}


Ralf

Hi,
dies besser als separaten Post. Ich habe IPS eben aktualisiert und da wurde eine Instanz nicht erstellt und dann gibt es Probleme mit den Referenzen. Mit

// Referenzen der Instanzen
foreach ($instanceList as $instanceID) {
    if (in_array($instanceID, $ignoreIDs)) {
        continue;
    }
    $instance = IPS_GetInstance($instanceID);
    if ($instance['InstanceStatus'] != 105){
        $refIDs = IPS_GetReferenceList($instanceID);
        foreach ($refIDs as $refID) {
            if (!IPS_ObjectExists($refID)) {
                addEnt($errorList, 'Instanzen', $instanceID, 'referenziertes Objekt mit ID ' . $refID . ' ist unbekannt', $SymconHealth_Error);
            }
        }
    }
}

kann man das umgehen. Ob es auch Probleme gibt wenn der Status >=200 ist weiß ich noch nicht.

Ralf