GetIDForIdent liefert nicht immer false, wenn keine Variable mit dem Ident vorhanden ist

Ich habe eine seltsame Situation. Bei einigen Usern der gibt es im Denon Modul Fehlermeldungen der Art:

Hier wird versucht, mit SetValue eine Variable zu schreiben, die nicht existiert.

Ursache ist, dass in der vorhergehenden Abfrage $this->GetIDForIdent($Ident) nicht mit false zurückkommt.

Seltsamerweise tritt es nicht auf allen Systemen auf. Aber bei @DerGolo konnten wir es schließlich nachvollziehen indem ich zum Test die kritische Stelle etwas erweitert habe

            $VarID = @$this->GetIDForIdent($Ident);

            if ($VarID === false) {
                $this->Logger_Dbg(__FUNCTION__, sprintf('%s: Info: Keine Variable mit dem Ident %s gefunden (GetIDForIdent === false).', $this->InstanceID, $Ident));
                continue;
            }

            if ($VarID === 0) {
                $this->Logger_Dbg(__FUNCTION__, sprintf('%s: Info: Keine Variable mit dem Ident %s gefunden (GetIDForIdent === 0).', $this->InstanceID, $Ident));
                continue;
            }

            if ($VarID === NULL) {
                $this->Logger_Dbg(__FUNCTION__, sprintf('%s: Info: Keine Variable mit dem Ident %s gefunden (GetIDForIdent === NULL).', $this->InstanceID, $Ident));
                continue;
            }

            $VarID = @IPS_GetObjectIDByIdent($Ident, $this->InstanceID);

            if ($VarID === false) {
                $this->Logger_Dbg(__FUNCTION__, sprintf('%s: Info: Keine Variable mit dem Ident %s gefunden (IPS_GetObjectIDByIdent === false).', $this->InstanceID, $Ident));
                continue;
            }

            if ($VarID === 0) {
                $this->Logger_Dbg(__FUNCTION__, sprintf('%s: Info: Keine Variable mit dem Ident %s gefunden (IPS_GetObjectIDByIdent === 0).', $this->InstanceID, $Ident));
                continue;
            }

Auf Golos System kommt als Debugausgabe

TXT: 25.04.2026, 13:42:11 |       UpdateVariable | Data Telnet: {"PW":{"VarType":0,"Value":true,"Subcommand":"ON"}}
TXT: 25.04.2026, 13:42:11 |       UpdateVariable | 46314: Info: Keine Variable mit dem Ident PW gefunden (IPS_GetObjectIDByIdent === false).

Wie kann das sein? Das Beispiel zeigt, dass hier GetIDForIdent weder false, noch 0 oder NULL liefert.

Erst IPS_GetObjectIDByIdent liefert schließlich ‚false‘.

Auf dem betroffenen System läuft

Version 9.0 (Wed, 15 Apr 2026 14:57:46 +0200), Plattform: Ubuntu, Revision: ac13fd5faf313d929fb28b8bd9c8f519c9578ad0

Auf meinem eigenen System (gleiche Version unter Windows) liefert GetIDForIdent korrekterweise false.

Ich habe ein Debian mit Symcon 9.0 gerade mal getestet:

$this->SendDebug("TEST", @$this->GetIDForIdent('test1234'), 0);

Bei mir kommt ein “False” zurück, wenn es die ID nicht gibt. Bist du im Modul mit IPSModuleStrict oder IPSModule unterwegs? Schon probiert was im $Ident wirklich übergeben wird? Selbst wenn ich den Ident leer lasse kommt ein False.

Vergessen zu erwähnen: bei mir ist es IPSModuleStrict.

Ja, man sieht es auch im Debug: „PW“

Ich nutze auch strict.

ob_start();
var_dump($this->GetIDForIdent('test1234'));
$output = ob_get_clean();
$this->SendDebug("TEST", $output, 0);

kommt bei mir:

25.04.2026, 17:31:07 | TEST | <LF>Warning: Objekt mit Ident test1234 wurde nicht gefunden in /var/lib/symcon/modules/......../module.php on line 125<LF>bool(false)<LF>

Durch den Hinweis von @dixi00 konnte ich es nun auf der Symbox reproduzieren.

Die Geschichte muss nun anders geschrieben werden. Es hat überhaupt nichts mit GetIDForIdent zu tun :slight_smile:

Es zeigte sich auf der Symbox (Linux), dass die Variable $VarID zwar als false (Boolean) geloggt wurde, aber die anschließende if ($VarID === false) Abfrage wurde übersprungen, was dazu führte, dass der Code weiterlief und erst später bei einer redundanten Prüfung abbrach. Auf einem Windows System funktionierte derselbe Vergleich hingegen korrekt.

Daraufhin habe ich auf der Symbox mal OpCache deaktiviert und damit war der Fehler weg. :thinking: Also muss bei OpCache etwas schieflaufen.

Sehr interessant ist dabei auch, dass

echo "PHP Version: " . PHP_VERSION . PHP_EOL;

auf der Symbox

PHP Version: 8.5.0

liefert.

Unter Windows erhalte ich dagegen

PHP Version: 8.5.3

Vermutlich sind mit 8.5.3 diese Optimierungsprobleme des OpCache bereits behoben worden.

Das passt zu meiner Installation unter Ubuntu:

PHP Version: 8.5.0

In der aktuell 9.0.x Beta ist überall PHP 8.5.5 drin. Ist das Problem damit immer noch aktuell?

paresy

Ja, es ist unverändert. Unter Windows läuft der Code korrekt, auf anderen Systemen nur, wenn OPcache abgeschaltet ist.

Danke für’s Testen! Fix kommt im nächsten Beta Update mit.

paresy