Status vs. StatusVariable ???

Mag sein, dass ich da was komplett missverstanden hab oder bei den Update-Infos überlesen???

Ich habe FS20 Instanzen, da heisst die Status-Variable „StatusVariable“ und bei anderen heisst sie „Stauts“. Damit habe ich gerade beim Versuch, ein Script auf eine andere Instanz umzubiegen Stunden an Fehlersuche verbracht …

Woher kommt das und wie kriege ich das aufgeräumt?

Danke!
jwka

Umbenennen? Ich würde ja die IDs nutzen statt den Namen - Oder die internen Status-Variablen Namen, wenn du ein generische Skript entwickeln willst.

Guck dir dazu die IPS_GetStatusVariableIdents/IPS_GetStatusVariableID Funktionen mal an.

paresy

Hallo, Hallo!

Ich spreche da von einem Bug der Software!

Ich habe mit V2.0 angefangen und einfach Instanzen angelegtm OHNE jemals irgendetwas an Variablennamen oder ähnlichem geändert zu haben.

Nun ist es so, dass neuerdings - genau kann ich’s nicht eingrenzen - Statt wie bister „DataVariable“ eine „Daten“ angelegt wird.

Bei „IntensityVariable“ ist es noch elender: Da habe ich „Intensität“ und „Intensity“ im Angebot.

Sorry, aber das hat nix mit der Methode zu tun, wie ich programmiere!

Das hat was mit der Verwaltungskonsole zu tun und wie die ihre Instanzen anlegt. Und das wurde entweder geändert oder ist irgendwie von der Umgebung abhängig, ich habe keine Ahnung. Sauber ist das jedenfalls nicht.

Und jetzt nochmals, bitte:

Wie kann ich da eine Konsistenz reinbringen?

jwka

und nochwas: GERADE FÜR „IPS_GetStatusVariableID“ brauche ich KONSISTENTE Namen der Variablen, denn der zweite Parameter ist ja genau der Name der Variablen.

Und wenn die je nach dem, wann ich eine Instanz anlege jedesmal anders heißt (bei mir gibt’s „Intensity“, „IntensityVariable“ und „Intensität“ jeweils bei FS20 Instanzen), dann war’s das.

Nochmals die Frage: Kann ich die Variablennamen (Child Objekte) konsitent bringen, z.B. in dem ich die Settings.xml überarbeite, und wenn ja, auf was ist zu achten?

Danke
jwka

Und damit auch ganz klar ist, von was ich spreche, hier noch ein Bild von den verschiedenen Objekten.

Nochmals: Ich habe diese über den Objektbaum „Objekt hinzufügen“ erstellt und NICHTS besonderes gemacht oder geändert!

Greez
jwka

Und das wurde entweder geändert

Im Zuge der Lokalisierung der Variablennamen, ist dies geschenen. Wird es auch immer wieder geben.

Guck dir bitte noch einmal die Funktionen an, die ich genannt habe. Die Nutzen einen eindeutigen, vom System genutzen Ident. Das ist nicht unbedingt der Name den du siehst, kann aber sein. Dieser ist unabhängig vom Objektnamen. Und er ändert sich nie - sieht deswegen manchmal komisch aus, oder hat sogar hier und da nen Rechtschreibfehler :wink:

paresy

Wenn ich auf der Doku-page im Suchfeld eingebe „IPS_GetStatusVariableIdents“, dann finde ich viel links, die allesamt NICHT zur Dokumentation gehören.

Und die IPS_GetStatusVariableID wurde ja nach Angabe unter „Migration“ in IPS_GetStatusVariableIdents geändert???

Beim Aufruf der Übersichtsseite „Befehlsreferenz“ gibt es kein „IPS_GetStatusVariableIdents“.

WO kann ich darüber etwas nachlesen? Sorry, ich bin grad am verzweifeln!

By the way: Wann gibt es die Hilfe mit allen Inhalten wndlich als htm oder andere offline-Variante?

Danke
jwka

Was mache ich falsch??? Ichkaier’s nicht. folgender Code:


$Device_ID = 54725 /*[GG_01.Gang Licht Decke.UPS_01.FS20_1411.]*/;
 
$a = IPS_GetStatusVariableIdents($Device_ID);
 
print_r($a);

$Device_StateID = IPS_GetObjectIDByName("StatusVariable", $Device_ID );


wirft mir folgendes Ergebnis aus:


Array
(
    [0] => StatusVariable
    [1] => IntensityVariable
    [2] => TimerVariable
    [3] => DataVariable
)

Warning:  Objekt StatusVariable wurde nicht gefunden in [jw testscript toggle on/off] on line 16


Offenbar heisst doch die Variable „StatusVariable“

Und wennich sie mit der IPS_Get… ansprechen will, gibt es den Fehler.

Ich bin grad völlig daneben.

BITTE:

Sag mir klar, wie ich die Statusvariable eines beliebigen Aktors ZUVERLÄSSIG auslesen kann, OHNE dass ich die ID der Statusvariable direkt anspreche.

Thanks!
jwka

Easy as that :wink:


 echo IPS_GetStatusVariableID($deviceid, "StatusVariable");

paresy

NEEEEE, Meister, eben nicht easy.

DAS ist ja grad das Problem.

Bei mir gibt mal

  echo IPS_GetStatusVariableID($deviceid, "StatusVariable"); 

ein Fehler und mal


 echo IPS_GetStatusVariableID($deviceid, "Status"); 

ein Fehler.

UND JEWEILS DAS ANDERE BRINGT DEN WERT!!!

Das ist ja genau der Mist! Es ist ganz offenbar so, dass bei verschiedenen Instanzen der zur Abfrage zu benutzende Text anders ist als IPS_GEtStatusVariableIdents ausgibt!

jwka

Solange es alles FS20 Instanzen sind - ganz sicher nicht.

Wenn du z.B. FS20 / LCN mischt, musst du natürlich gucken, was wie benannt ist. Nur bei LCN ist der Status intern auch mit „Status“ benannt.

Dann musst du anhand des Instanz-Modul-Typen ein switch/case machen.

paresy

Nochmals detailliert (siehe auch Screenshot):

der Befehl „IPS_GetObjectIDByName(“<name>" ; $id) bringt:

bei ID 54725 mit name=„Statusvariable“ einen Fehler, mit name=„Status“ eine (korrekte) ObjektID

bei ID 20887 mit name=„Statusvariable“ die korelkte ID, mit name=„Status“ hingegen einen Fehler

In beiden Fällen zeigt das per

     print_r(IPS_GetStatusVariableIdents(id))

ausgelesene Array für [0] ==> „StatusVariable“ an!!!

Da is was faul, oder?

Es sind ALLES FS20 instanzen, ausschliesslich.

der Befehl „IPS_GetObjectIDByName(“<name>" ; $id) bringt:

Das ist auch murks.

Warum nutzt nicht den Befehl, den ich gepostet habe!?



Poste doch einfach mal dein ganzes Skript.

paresy

Der Ident einer Statusvariable hat absolut nichts mit dem Objektnamen zu tun. Die Objektnamen der Variablen könnten jwka, paresy und Horst heißen, die kannst Du in der Konsole umbenennen, wie Du willst. Der Ident ist intern und gehört zur Instanz FS20 und ist und bleibt StatusVariable. Den kann man auch nicht ändern. Die Variablen-ID für die Statusvariable mit dem Ident „StatusVariable“ bekommst Du für eine Instanz zuverlässig mit IPS_GetStatusVariableID(INSTANZID, „StatusVariable“). Das darfst Du nicht mit IPS_GetObjectIDByName verwechseln.

Bitte schau nochmals das oben gepostete Screenshot an. Hier Scripte und Ergebnisse:

1.)
Skript:


$Device_ID = 54725 /*[AAA Sender Test #4311]*/;

print_r(IPS_GetStatusVariableIdents($Device_ID));

echo $Device_StateID = IPS_GetObjectIDByName("Intensity", $Device_ID );
echo $Device_StateID = IPS_GetObjectIDByName("IntensityVariable", $Device_ID );
echo $Device_StateID = IPS_GetObjectIDByName("Intensität", $Device_ID );

Ergebnis:


Array
(
    [0] => StatusVariable
    [1] => IntensityVariable
    [2] => TimerVariable
    [3] => DataVariable
)

Warning:  Objekt Intensity wurde nicht gefunden in D:\IPS\scripts\jwtest_toggle on line 17

Warning:  Objekt IntensityVariable wurde nicht gefunden in D:\IPS\scripts\jwtest_toggle on line 18
11749

2.)
Skript:


$Device_ID = 20887 /*[AA_01.Licht Aussen alles.xFG_01.FS20_4443.]*/;

print_r(IPS_GetStatusVariableIdents($Device_ID));

echo $Device_StateID = IPS_GetObjectIDByName("Intensity", $Device_ID );
echo $Device_StateID = IPS_GetObjectIDByName("IntensityVariable", $Device_ID );
echo $Device_StateID = IPS_GetObjectIDByName("Intensität", $Device_ID );

Ergebnis:


Array
(
    [0] => StatusVariable
    [1] => IntensityVariable
    [2] => TimerVariable
    [3] => DataVariable
)

Warning:  Objekt Intensity wurde nicht gefunden in D:\IPS\scripts\jwtest_toggle on line 17
16903
Warning:  Objekt Intensität wurde nicht gefunden in D:\IPS\scripts\jwtest_toggle on line 19

3.)
Skript:


$Device_ID = 33600 /*[OF_11.Office Stehlampe.STS_01.FS20_2133.]*/;

print_r(IPS_GetStatusVariableIdents($Device_ID));

echo $Device_StateID = IPS_GetObjectIDByName("Intensity", $Device_ID );
echo $Device_StateID = IPS_GetObjectIDByName("IntensityVariable", $Device_ID );
echo $Device_StateID = IPS_GetObjectIDByName("Intensität", $Device_ID );

Ergebnis:


Array
(
    [0] => StatusVariable
    [1] => IntensityVariable
    [2] => TimerVariable
    [3] => DataVariable
)
33376
Warning:  Objekt IntensityVariable wurde nicht gefunden in D:\IPS\scripts\jwtest_toggle on line 18

Warning:  Objekt Intensität wurde nicht gefunden in D:\IPS\scripts\jwtest_toggle on line 19

DAS ZEIGT DOCH EINDEUTIG: Mal muss ich „Intensity“, mal „Intensität“ und mal „IntensityVariable“ nutzen. Und jedesmal gibt die Arrayzeile exact dieselben (falschen) Werte zurück.

Und nochmals: ALLES FS20 Komponenten, alle per Objekt hinzufügen erstellt, aber mit unterschiedlichen IPS Versionen und an unterschiedlichen Rechnern.

Un nu?

Liest du überhaupt was wir schreiben?

IPS_GetObjectIDByName <- DU SOLLST DIESE FUNKTION NICHT VERWENDEN!

paresy

@Horst:

Ok. Ich scheine es kapiert zu haben.

AAABER:
(Siehe Bild)

Wie kann ich - und das war ja eigentlich meine Eingangsfrage - mein System den Namen „Status“ des Objekt 32947 in „StatusVariable“ umbenennen, sodass es im Objektbaum auch so dargestellt wird und mein System wieder konsistent ist, also das, was im Objektbaum angezeigt wird, auch dem entspricht, mit dem ich mittels „IPS_GetStatusVariableID()“ zugreife.

Und: Wer bzw was hat mir den Salat gemacht? Ich jedenfalls habe nirgeds etwas umbenannt.

DENN DANN ist auch der Zugriff mittels IPS_GetObjectIDByName „identisch“ mit „IPS_GetStatusVariableID()“.

Nur noch ein kleiner Schritt …

Die Variablennamen sind je nach Stand der Übersetzung anders. Wenn Du Deine FS20-Instanzen zu unterschiedlichen Zeitpunkten angelegt hast, werden die nach diesem Stand benannt. IntensityVariable muss noch zu früheren Beta-Zeiten gewesen sein. Dann kam die angenehme englische Version Intensity. Schließlich gegen Release müsste auch die deutsche Übersetzung Intensität gekommen sein.

$guid = "{48FCFDC1-11A5-4309-BB0B-A0DB8042A969}";
$ids = IPS_GetInstancesByModuleID($guid);
foreach($ids as $id)
{
    IPS_SetName(IPS_GetStatusVariableID($id, "StatusVariable"), "Status");
    IPS_SetName(IPS_GetStatusVariableID($id, "IntensityVariable"), "Intensität");
}

Sollte alles wieder hübsch benennen. „IntensityVariable“ als Objektname finde ich als WebFront-Programmierer nicht ansprechend ;).

@Horst:
Danke für die klärenden Worte.

Danke für die Info, wie ich das wieder umbenennen kann.

Ich finde IntensityVariable auch nicht gelungen. Itensität ist aber noch blöder weil es auch Leute gibt (wie ich mit einigen amerikanischen Laptops), die äöü nicht haben.

Es dürfte auch keinen Design Preis dafür geben, in den Namen einer Funktion, mit der man ID’s von BELIEBIGEN (also nicht nur Status-)Variablen abfragen kann, das Wort „Status“ einzubauen …

Ich kann nur hoffen, dass nicht noch weitere Umbenennungsarien kommen. Immerhin kann ich jetzt ein Script bauen, das mir über alle Objekte geht, und das Verbogege wieder gerade rückt.

Danke.

@Paresy:

das Problem ist nun geklärt. trotzdem noch ein paar Sätze:

1.) hättest Du das ja auch gleich so wie Horst erklären können, statt zu schreiben „sieh Dir mal … an“, wozu es m.E. übrigens gar keine vernünftige Doku gibt.

2.) Ja, ich hatte inzwischen schon verstanden, dass ich diese Funktion nicht verwenden soll. Es bleibt die Frage, warum es eine solche Funktion gibt, wenn sie doch - bei neu angelegten Instanzen verfehlt.

3.) Das ganze Dilemma ist aufgetreten, weil am Produkt etwas geändert wurde, das die alte Funktion potenziell zur Falle macht, in die ich gerade getappt bin UND DIE M.E. EINFACH NICHT RICHTIG DOKUMENTIERT IST!

4.) Vielleicht darf ich noch folgendes anmerken:
NICHT ICH HABE DISES DURCHEINANDER ANGERICHTET SONDERN EIN PRODUKT, DAS IPSYMCON HEISST. Es kostst aber gerade MEINE Zeit, diesen Mist aufzuräumen!

SOWAS GEHÖRT IN DIE (etwas umfangreichere als vorliegende) DOKU FÜR EIN UPDATE!

Da muss man nicht pampig werden, wenn Benutzer, die über so einen Mist stolpern, „blöde“ Fragen stellen, Paresy!

Trotzdem Danke für Deine geopferte Zeit …