Links ohne Namen erben den Namen nicht mehr

In der Mobile App werden Links ohne (eigenen) Namen nicht korrekt dargestellt. Ich meine, früher erbten sie den Namen vom verlinkten Objekt.

Mir ist es aufgefallen, da noch nicht alle Mitglieder der Familie die neue Visu nutzen und bei denen nun vereinzelt „Löcher“ auftauchen.

Ist das Problem schon bekannt?

1 „Gefällt mir“

Mittlerweile haben wir es umgebaut, dass unbenannte Objekte tatsächlich einen leeren Namen haben anstatt „Unnamed Object (ID: 12345)“ heißen. Aber die alte App schaut halt auf den Namen und prüft ob da die ID drin steckt. Falls ja, gilt die Variable als unbenannt. Um das auf die alte App zu münzen müsstest du also einfach die ID in den Namen hängen.

Und wie geht dann die Visu damit um, filtert sie die ID wieder raus?

Nicht, dass ich mir die Visu „kaputt“ mache.

Das Legacy-Handling ist aktuell noch überall drin, sodass eine ID im Namen als unbenannt gewertet wird.

1 „Gefällt mir“

Also in der Visu funktioniert es halbwegs. Zum Beispiel „47210“ als Name wird ignoriert und der Name des verlinkten Objekts genommen.

Aber was muss ich genau eintragen, damit die App zufrieden ist? Da sind meine Versuche bislang gescheitert:

EDIT:

Da die Umbenennung eine ganz blöde Aufgabe ist, habe ich mir ein Skript geschrieben:

<?php

declare(strict_types=1);

const START_CATEGORY = 20827;

foreach (findUnnamedLinks(START_CATEGORY) as $linkId) {
    IPS_SetName($linkId, sprintf('Unnamed Object (ID: %d)', $linkId));
}

/*
foreach (findLegacyNamedLinks(START_CATEGORY) as $linkId) {
    IPS_SetName($linkId, '');
}
/*


/**
 * Ein Generator, der rekursiv alle unbenannten Links findet.
 * @return Generator<int>
 */
function findUnnamedLinks(int $parentId): Generator
{
    $children = IPS_GetChildrenIDs($parentId);

    foreach ($children as $id) {
        $object = IPS_GetObject($id);

        // Wenn es ein unbenannter Link ist, geben wir die ID zurück
        if ($object['ObjectType'] === OBJECTTYPE_LINK && $object['ObjectName'] === '') {
            yield $id;
        }

        // Rekursion: Wenn Kinder da sind, delegieren wir an den Generator der nächsten Ebene
        if ($object['HasChildren']) {
            yield from findUnnamedLinks($id);
        }
    }
}

/**
 * Ein Generator, der rekursiv alle Links findet, die dem Schema
 * "Unnamed Object (ID: 12345)" entsprechen.
 *
 * @return Generator<int>
 */
function findLegacyNamedLinks(int $parentId): Generator
{
    $children = IPS_GetChildrenIDs($parentId);

    foreach ($children as $id) {
        $object = IPS_GetObject($id);

        // Prüfung: Ist es ein Link UND passt der Name zum Legacy-Muster?
        if ($object['ObjectType'] === OBJECTTYPE_LINK &&
            preg_match('/^Unnamed Object \(ID: \d+\)$/', $object['ObjectName'])
        ) {
            yield $id;
        }

        // Rekursion: Wenn Kinder da sind, delegieren wir an den Generator der nächsten Ebene
        if ($object['HasChildren']) {
            yield from findLegacyNamedLinks($id);
        }
    }
}

Momentan bin ich noch nicht am Ziel :frowning:


Der Fehler ist, dass du die Ziel-ID des Links in den Namen packst und nicht die ObjektID. Wenn du in der Hauptschleife einfach $linkId statt $targetId verwendest, dann sollte alles passen.

Tatsächlich. Da habe ich viel zu kompliziert gedacht :banghead:

Ich habe das Skript oben entsprechend korrigiert. Vielen Dank!

@paresy: wäre es nicht besser, die Überprüfung in der alten App um leere Namen zu erweitern? Das würde diese Art von Irritationen erst gar nicht aufkommen lassen.

Ich habe gerade gemerkt, dass beim Verlinken von Variablen die Links mit dem Namen „Unnamed Object (ID: 12345)“ angelegt werden und bin nun komplett verwirrt.

Sollten und wurden sie nicht mit einem leeren Namen angelegt?

Dann wurde Verlinken wahrscheinlich einfach nicht angepasst :wink: Wie gesagt, Unnamed Object war früher immer die Variante, wir haben das „kürzlich“ erst auf einen leeren String angepasst. Und scheinbar einfach da einen Fall übersehen.

So sieht es aus. Nur wenn ich einen Link neu anlege über „Objekt hinzufügen“ ist der Name wohl leer. Mich hat nur gewundert, dass bei mir so viele dieser Fälle auftraten, obwohl ich den diesen Weg fast nie nutze.

Die leeren Namen kamen mit der 8.1


Eventuell wurden bei der Konvertierung die Linknamen geleert?

Aber egal. Schön wäre, wenn es durchgehend korrekt wäre und auch die alte App mit leeren Namen umgehen könnte.

Der Unterschied ist hier technisch:

  • Beim Anlegen über „Objekt hinzufügen“ wird bei leerem Namensfeld IPS_SetName mit einem leeren String aufgerufen. Früher gab es dafür einen Fallback, sodass auf „Unnamed Object“ zurückgesprungen wird, den gibt es nicht mehr
  • Beim Verlinken wird einfach kein Name gesetzt und der Standardname der bei der Erstellung gesetzt wird bleibt halt einfach. Und da ist halt noch „Unnamed Object“ drin.

Wir sind aber dran

1 „Gefällt mir“

Fix kommt zur 8.2 :slight_smile:

paresy

Prima. Vielleicht lässt es sich auch in der alten App noch einbauen, dass leere Objektnamen wie „Unnamed …“ behandelt werden.