Status von Events abfragen

tja, aber das ist ja nur, weil es kein define SCRIPTTYPE_FLOW gibt und er es daher als String interpretieren will (was falsch ist)

vermutlich ist die docker-Version nicht ganz so aktuell, auf meinen test-IPS steht das: IP-Symcon 6.0, Ubuntu, 22.07.2021, 8b4de2b37ff0

ist die Folge deiner Änderung

ich mach das define jetzt nun optional doch (->update)

ok, das verstehe ich noch weniger

das ist das angemeckerte Code-Fragment

        $len = strlen($str);
        if ($len > $maxLength) {
            $s = '[cut=' . $maxLength . '/' . $len . ']';
            $str = substr($str, 0, $maxLength - strlen($s)) . $s;
        }

und hier hast du was genau gemacht?

demel

Moin,
ich habe jetzt auf Docker 146 (6.0 #51905cbd9f6c) und auch die letzte Version von dir aktualisiert. Wie Du vermutlich erwartet hast kommt SCRIPTTYPE_FLOW jetzt nicht mehr mit einer Warnung. Als ich vorhin auf Terrasse gegangen bin kam mir auch schon die Idee.

Mit

$str = substr($str, 0, $maxLength - strlen($s)) . $s;

bekomme ich so immer noch Fehlermeldung und kein Ergebnis erst mit

$str = substr($str, 0, (int)($maxLength - strlen($s)) ). $s;

habe ich auch wieder Ergebnisse. Fehlermeldung lautete ja das INT erwartet wurde also habe ich ihm INT gegeben. Aktuell läuft es auch wieder bei mir so wie es aussieht.

Ralf

Hallo,

ist schon komisch, $maxLength ist ein int und strlen() auch …

ich habe noch etwas debug (temporär) in die Funktion LimitOutput() reingepackt.

Kannst du nochmal aktualisieren und schauen, was da raus kommt?

Es muss auf jeden Fall so sein, das du einen sehr langen strings dabei hats. in em Debugfenster kannst du ja mal Suchern nach dem Wort cut. Das sieht man den Anfang des Strings wobei nach cut die max. Ausgabelänge sowie die Länge des Strings.
Wenn man den Filter dann löscht ist man glaube ich noch an der passenden Stelle im Debug.

Wenn der Debug zuviel Zeilen sind (1000), ggfs im Debugfenster das Limit erhöhen.

demel

Moin Demel,
log hat ca. 36.000 Zeilen, wegen des Parser für 5stellige Zahlen, und es gibt nur 2 Strings bei dem cut zuschlägt und das ist die Ausgabe der beiden FileListen. Statt 150KB werden nur noch 100KB ausgegeben.

Was das INT angeht wird es jetzt noch komischer. Ich habe den ursprünglichen Code jetzt wieder rein gesetzt und auch kein Problem mehr. Ich habe mir in 40 Jahren ein wenig abgewöhnt drüber nachzudenken was ein Compiler/Interpreter warum macht. Ich habe auch ein bisschen Updateangst denn man weiß nicht was anderes (vielleicht schlechter) gemacht wird und welche neuen Fehler es gibt.

Ralf

ich habe in der Funktion, die die Ausgabe limitiert, einfach ScriptOutputBufferLimit / 10 geteilt, daher die 100KB. Aber auch 150KB sind ja viel wenige als das zulässige 1MB, selbst wenn durch den internen Aufbau der Meldung noch ein paar Bytes dazu kämen.

Hast du meine aktuelle Version installiert? Mir war aufgefallen, das die Berechnung von ScriptOutputBufferLimit / 10 eine Zahl mit Nachkommastellen ergibt (und damit auch das Ergebnis der Längenberechnung) daher habe ich das etwas geändert.

Wie ich jetzt nach weiteren Tests herausgefunden habe lag da der Hase im Pfeffer, da ich keine Message habe, die so lang ist, kam ich ja nie an diese Stelle und für meine Test habe ich ganzzahlige Größen angegeben. Aber kaum habe ich nicht durch 10 sondern 1000 geteilt und war in passender Größenordnung) trat genau dieser Fehler auf. Insofern war dein intval() genau richtig.

D.h. die aktuell Beta-Version sollte nun ohne Problem laufen.

Was offen bleibt ist natürlich die Frage, was den ursprünglichen Fehler hervorgerufen hat. die 150KB können es nicht gewesen sein.

Also, sollte es nochmal auftreten, werden wir weiter suchen müssen.

demel

Nicht schlecht… Da werde ich ja mit Meldungen überschüttet…muss wohl mal aufräumen!
Was mir auffällt: alle meine Timer Duration Einstellungen ( z.B.: 15000 für 15 Sekunden) melden sich als nicht existente ID.
Auch auskommentierte Zeilen werden bearbeitet und ev. nicht mehr vorhandene ID‘s als Fehler angezeigt.
Gruß Michael

das musst du mir etwas genauer erklären. Meinst du Timer in einem Script? Meldungen aus Scrioten kann man ja auf 3 arten ausschliessen, das ganze Objekt, eine bestimmte ID oder durch Kommentieren der Zeile mit dem Kommentar aus der Kknfiguration.

wenn kein Script gemeint ist, wo genau findet man das?

ja, das Parsen des PHP-Codes nimmt keine Rücksicht darauf. Da fejlt mir noch der richtige Ansatz, wie man das vernünftig parsen könnte.

demel

Ja, ich übergebe einem Timer die zuvor definierte Dauer ,…$duration = 15000; # 15 Sekunden Wartezeit …‘

Kommentare… prüfen ob am Anfang der Zeile ein entsprechendes Kommentarzeichen steht ?

ok, dann kannst du ja entweder den Wert 15000 ausschliessen oder in die Zeile mit diesem Werte den Kommentar /NO_ID_CHECK/ einfügen - Zeilen mit dem Kommentar werden ignoriert.

Nun ja, Kommentare fangen ja nicht zwangsläufig am Anfang der Zeile an und was ist mit mehrzeiligen Kommentaren oder Kommentaren in einer Zeile …um das halbwegs richtig zu machen müsste man einen Weg finde, php-Code richtig zu parsen … nichg so svhoicht

demel

Ich gebe die Dauer einfach nicht mehr mit 15000 ein sondern 5000 * 3 (als Beispiel)
Ja, sehe ich ein, dass das korrekte parsen etwas zu viel des Guten wäre… muss man halt auch in den Altlasten besser aufräumen!
Danke für das Modul!!!
Gruß Michael

klar, so geht es auch, absolut.
Es geht grundsätzlich auch so: $duration = intval('15000') (weil String) … aber das wären echte Klimmzüge.

demel

Hallo,
ich habe das script (Beitrag 59) fehlerfrei zum laufen bekommen. Super!! Es kommt eine lange (sehr lange) Liste mit Meldungen raus.
Könnte mir jemand verraten ob bzw. wie ich diese Liste mal ausgedruckt bekomme??

Alfred

Moin,

ich hatte nur den Teil nach if geändert und den Teil vorher nicht richtig angeschaut. Schön das Du den Grund gefunden hast. Warum die Limit-Meldung schon bei „nur“ 150KB kommt kann vermutlich nur paresy erklären.

Ralf

Moin Hamsterbacke,
Du könnest das BeispielScript für den Mailversand benutzen und nicht nur, wie im Beispiel, die Fehler sondern auch Warnungen verschicken lassen dann hast Du reinen Text den Du ausdrucken kannst.

Ralf

Moin Demel,
ich hatte (wirklich hatte:-)) ein Problem mit 2 IDs in einer Zeile wobei die 2. ID nicht mehr existiert. Ich habe da mal was gemacht:-)

    private function parseText4ObjectIDs($file, $text, $objectList, $ignoreNums)
    {
        $no_id_check = $this->ReadPropertyString('no_id_check');

        $ret = [];
        $lines = explode(PHP_EOL, $text);
        $row = 0;
        foreach ($lines as $line) {
            $row++;
            if (preg_match('/' . preg_quote($no_id_check, '/') . '/', $line)) {
                continue;
            }
            while (strlen($line) > 5){
		    if (preg_match('/[^!=><]=[\t ]*([0-9]{5})[^0-9]/', $line, $r)) {
		        $this->SendDebug(__FUNCTION__, 'script/object-id - match#1 id=' . $r[1] . ': file=' . $file . ', line=' . $this->LimitOutput($line), 0);
		        $id = $r[1];
		    } elseif (preg_match('/\([\t ]*([0-9]{5})[^0-9]/', $line, $r)) {
		        $this->SendDebug(__FUNCTION__, 'script/object-id - match#2 id=' . $r[1] . ': file=' . $file . ', line=' . $this->LimitOutput($line), 0);
		        $id = $r[1];
		    } else {
		        break;
		    }
		    if (in_array($id, $ignoreNums)) {
		        break;
		    }
		    if (!in_array($id, $objectList)) {
		        $ret[] = [
		            'id' => $id,
		            'row'=> $row,
		        ];
		    }
		    $pos = strpos($line, $id) + 5;
		    $line = substr($line, $pos, strlen($line) - $pos);
		}
        }
        return $ret;
    }

es wurde ja immer nur die erste vermeintlich ID in einer Zeile gefunden. Also mache ich den Rest der Zeile als neue Zeile solange die Länge > 5 ist und noch eine ID gefunden wird.

Dann hatte ich noch den Fehler das Instanz in Zeile 356 nicht vorhanden ist. Da habe ich einfach

 $refIDs = @IPS_GetReferenceList($instanceID);

den Klammeraffen davor gepackt.

Ralf

Hallo,

Oh sorry, da hatte ich bereits was vorbereitet, das alle Treffer in einer Zeile findet, aber noch nicht commitet. Weiterhin habe ich eine zusätzlichen regulären Ausdruck hinzugefügt, der so etwas finden: $Id = 123456, wobei 123456 eine ungültige ID sein, also auch einfache Zuweisung von Zahlen.

Ok, hier prüfen ich nun vorher, aber verstehe tu ich es nicht, das bedeutet ja, das IPS_GetInstanceList() auch ungültige Werte zurück liefert.

Was bedeutet genau „Instanz ist nicht vorhanden“?

die Änderungen stehen im Beta zur Verfügung

demel

Moin Demel,
als ich mit der Schleife experimentiert hatte war der erste Versuch eine Endlosschleife. Man kann einzelne Threads wohl nicht von außen beenden. Ich habe IPS neu gestartet und dann habe ich immer eine defekte Instanz. Die Instanz ist zwar in der Liste vorhanden aber es kann nichts mit ihr gemacht werden. Bei Konfiguration kommt z.B. Instanz-Interface ist nicht verfügbar oder so. Ich schätze durch diesen Defekt kommt es bei IPS_GetReferenceList zu einem PHP-Fehler. In der aktuellen Beta ist es Zeile 359.

Ralf

tritt der Fehler immer noch auch? Ich teste ja auch die Existenz der Instanz …

demel

Ich nehme an, das Problem tritt bei inaktiven Instanzen auf. Daher habe ich nun Dein Fix eingebaut, das fängt alles ab.

demel

Moin Demel,
in der 1. Version gabs noch den Fehler. Der Fehler trat bei mir auf wenn die Instanz zwar schon angezeigt wurde aber z.B. beim Start von IPS der Fehler kam „Die Instanz wurde nicht erzeugt“. 2. Version soweit alles IO.

Ralf