Ident

Hallo,

ich hätte mal eine Frage zu der IDENT-Philosopie in IPS :

Eine IDENT ist, wenn ich es richtig verstanden habe, einzigartig innerhalb einer Stufe, d.h., eine IDENT kommt bei Variablen mit der selben ParentID nur einmal vor. So wie ich das sehe, werden diese IDENTs jedoch nur bei System- bzw- Homematic-Variablen, welche die Instanz mitbringt gefüllt. Also haben vor allem selbst erstellte Variablen keine IDENT und lässt sich auch nicht über den Objektbaum erstellen, oder habe ich was übersehen ?
Wenn ich nun diese Abfrage in ein Script implementiere

if (IPS_GetObjectIDByIdent ($Quelle_Obj['ObjectIdent'], $Ziel_Parent_ID))

bekomme ich bei allen selbst angelegten (und vlt. denen wo ich es noch nicht weiß) Variablen eine Fehlermeldung (IDENT darf nicht leer sein), die auch schön im log und im IPSLOGGER im WF auftaucht.
Ist das so beabsichtigt oder wie kann man das verhindern ?

grüße chrissiboy

Du musst bei selbst erstellten Objekten den Ident erst füllen, mit IPS_SetIdent.
Sonst kannst du sie so nicht ermitteln.
Was ist den bei deinem Beispiel $Quelle_Obj ?
Michael

Hi Michael,

sorry, aber ich war die Tage unterwegs und konnte nicht reinschauen.
Ich habe mich mal an das Thema „Kopieren von Objekten/Strukturen“ gewagt und bin dabei auf das Problem gestoßen, dass z.B. bei Homematic-Instanzen die abhängigen Variablen darunter automatisch angelegt werden. Wenn nun das Script sich daran macht, die Struktur unter der Instanz zu kopieren, gibt es hierbei Dupletten. Da die Homematic-Variablen auch automatisch einen Ident bekommen, habe ich es daran festgemacht, ob eine Variable darunter kopiert wird oder ob nur die Attribute von der Quelle übernomen werden. Daher kommt die Abfrage, ob ein IDENT mit diesem Namen bereits vorhanden ist.
Ich würde das Script gerne im Forum zu Verfügung stellen, aber zum einen habe ich das beschriebene Problem, das bereits bei der Abfrage nach dem IDENT ein Fehler generiert wird :confused: und zum anderen „trau“ ich mich nicht so recht, weil es nicht bis ins Letzte ausgetestet ist und ich nicht möchte, dass sich jemand vlt. sein Objektbaum ruiniert, weil noch ein Fehler enthalten ist. :smiley:
Ich habe das Script bei mir getestet und eigentlch hat es soweit geklappt … NEIN, WFs kopiert es nicht :stuck_out_tongue:

Wenn es jemand interessiert, stelle ich es gerne ohne Gewährleistungen ein…und wenn jemand eine Idee hat, wie ich es vermeiden kann, dass dieser Fehler kommt, würde ich mich sehr freuen.

lg Frank

Schau dir mal den Project Exporter von RS an. Ich glaube der macht genau das, was du suchst.

IPS RS Project Exporter

Außerdem kannst du seit der 3.3 Objekte duplizieren. Das sollte schon einiges an Arbeit abnehmen :smiley:

paresy

Das Duplizieren habe ich schon gesehen, aber das geht mir nicht weit genug. Das was ich gebastelt habe kopiert beliebig tiefe Strukturen einschließlich aller Variablen und Scripts und biegt auch Links und Events um, die auf die Struktur selbst verweisen.

Der Exporter ist natürlich einige Nummern größer als mein Kopier-Script - werde ich mir gerne mal anschauen…muss nur noch rauskriegen, ab wann man ein registriertes Mitglied ist :smiley:

Gab das nicht ein ReadOnly Flag bei Statusvariablen ?!
Finde das gerade nicht mehr von unterwegs. Das könntest du sonst auswerten.
Alles was als Variable einen Ident hat nicht zu kopieren ist schlecht, normale Script nutzen das auch um Variablen zu finden.
Michael

Alle Variablen unterhalb von Instanzen (außer Dummy Instanzen) zu Filtern wäre die „beste“ Option, auch wenn diese nicht 100% sicher ist.

Korrekt wäre es die Ziel-Instanz zu erstellen, und zu erkennen welche Variablen dann fehlen und nur die Fehlenden zu duplizieren.

paresy

Ich kopiere ja nur die Variablen nicht, die den gleichen IDENT haben und da dieser eindeutig ist, kann nichts schief laufen.
Zuerst wird die Instanz angelegt und damit auch die abhängigen Variablen mit eindeutigem IDENT. Beim Kopieren der Variablen wird verglichen, ob es den Quell-IDENT im Ziel schon gibt. Wenn ja, werden nur noch die Quell-Attribute übernommen. So werden die automtisch angelegten Variablen nur mit Attributen versorgt und die selbst erstellten werden 1:1 kopiert.
Also wenn es von Interesse ist, stelle ich das gerne hier mal ein - nur bitte nicht den Kopf herunter reißen, wenn noch ne Macke drin ist :smiley:

Ja das wäre auch die Lösung welche mir durch den Kopf ging :smiley:
Michael

so, dann komme ich noch mal auf mein ursprüngliches Anliegen zurück - wie kann ich verhindern, dass ich bei der Abfrage nach dem Vorhandensein eines IDENTS bereits eine Fehlermeldung bekomme :slight_smile:

Zum Beispiel so:


 $obj_id = @IPS_GetObjectIDByIdent($ident,$parent);
 if ($obj_id === false)
 {
    // Objekt existiert nicht, tu was.... 
 }

Vorher solltest du aber prüfen ob $ident (oder bei dir $Quelle_Obj[‚ObjectIdent‘] ) auch wirklich nicht leer ist.
Sonst macht das Ganze wenig Sinn.
Michael

Danke, Michael,
der Tipp mit dem @-Zeichen hat mein Problem sofort gelöst.
Die Logik, warum die Meldung kommt ist mir allerdings nicht klar. Zum einen besagt die Meldung, dass der IDENT nicht leer sein darf, zum anderen werden die Variablen ohne IDENT erstellt. Da müsste doch eigtl. schon beim create ein Fehler kommen, oder ?

Frank

Nein, das verstehst du falsch. Der Befehl GetByIdent darf keinen leeren Ident übergeben bekommen. Daher sie Fehlermeldung.
Nur die Statusvariablen haben ‚ab Werk‘ einen Ident. Aber jedes Objekt könnte einen haben, muss aber nicht.
Und was sollte dann ByIdent zurückliegen, wenn du einen leerem Ident übergibst? Da kann der Befehl nur false zurückgeben, da er ja nicht das Objekt anhand eines leeren Ident identifizieren kann.
Bei dem Erstellen von Objekten per PHP wird auch kein Ident vergeben.
Und beim erstellen von Instanzen (egal ob PHP oder per Console) regelt Diese das erstellen ihre Childs und das setzen der Ident.
Michael

ok - der IDENT darf fehlen, aber die Funktion greift quasi ins Nirvana, wenn kein IDENT vorhanden ist. Und mit dem @ wird die Fehlermeldung unterdrückt. Ist zwar ein bischen Holzhammermethode, denn damit unterdrückt man ja sicher sämtlichen mögliche Meldungen, aber die Exist-Funktionen zu den Statusvariablen wird ja nicht mehr unterstützt und eine andere Lösung habe ich nicht gefunden, um erst mal herauszubekommen, ob ein IDENT vorhanden ist. Daher vielen Dank - mein Problem ist gelöst.

?
Um prüfen ob einer vorhanden / nicht vorhanden ist, brauchst du doch nur if ($Quelle_Obj[‚ObjectIdent‘] == ‚‘) oder ähnlich nutzen…
Michael