Gerätekategorie im Script ermitteln

Hallo,

sorry, ich muss für meine Frage etwas ausholen:

ich habe mir für IPS-v1 ein Vista-Sidebar-Widget gebaut. Dieses holt via Ajax regelmäßig aus dem IPS eine Geräteliste mit Stati und Schaltmöglichkeiten in HTML-Form. Das ganze erfüllt eine ähnliche Funktion wie der Quickswitch, nur über die Sidebar bequemer zu bedienen.

Natürlich soll sich die Geräteliste im Widget automatisch auf Grundlage der IPS-Konfiguration erzeugen.

Im alten IPS lag dazu ein Script, dass beim ersten Aufruf über die Instanzen iteriert (IPS_GetInstanceIDs) und über ‚GetModuleInstance‘ das Stück XML aus der settings.xml abholt. Das habe ich mit dem PHP-XML-Parser zerlegt, in PHP-Objekte für meine unterschiedlichen FS20-Geräte umgewandelt und in der HTTP-Session abgelegt. Zur Unterscheidung der Gerätetypen habe ich den MODULENAME ausgewertet („FS20TX“, „FHT“, …).

So weit - so hässlich :frowning:

Jetzt versuche ich die IPS-V2-Migration, wo es den „GetModuleInstance“ nicht mehr gibt. Jetzt iteriere ich also über die ‚IPS_GetObjectList‘ und hole mir mit ‚IPS_GetObject‘ die Instanzen mit Typ 1=Instanz. (Wenn ich die Doku richtig verstehe, muss ich dann durch die IPS_GetChildren-Liste mit Objekt-Typ 2 und habe die Variable-IDs für die Weiterverarbeitung …)

Das ist schon wesentlich schöner :slight_smile:

Die Schleife liefert also alle Instanzen, obwohl nur bestimmte Gerätekategorien im Widget erscheinen sollen.

Bislang war der MODULENAME statisch, jetzt kann ich bei Einrichung einer Instanz einen Namen vergeben. Gebe ich also statt dem Default ‚FHT80b‘ ‚Heizung‘ ein, kann ich im Script nicht mehr erkennen, was es für eine Gerätekategorie ist.

Wie kann ich also die Gerätegattung rausfinden, auch wenn der Name keiner Konvention entspricht ?

(Danke übrigens für das neue Bemerkungsfeld pro Instanz, in dem ich jetzt eine schöne Beschreibung abspeichern kann. Leider kann ich das Feld nur bei der Anlage der Instanz befüllen, im Änderungsmodus wurde das Feld dafür vergessen und sollte noch aufgenommen werden !!!)

Viele Grüße
mts75

Hi Markus,

dein Post hat mich auf eine Idee gebracht bzw. auf die passenden Ideen gebracht, da ich gerade für einen anderen Zweck eine ähnliche Funktionalität brauchte. Habe eigentlich nur V2 im Einsatz, da ich erst seit 2 Tagen stolzer IPS-Besitzer bin :wink:
Meine PHP-Kenntnisse sind auch nicht mehr auf dem neusten Stand, daher das Skript wohl eher nach dem Motto: Nicht schön, aber selten.
Funktioniert bei mir in V2 soweit problemlos.

EDIT: Bitte keine Scripte posten, die direkt auf die XML zugreifen oder gar manipulieren.

Suchen hilft :slight_smile:

@Tobias: Auf die XML zugreifen scheint auf den ersten Blick verlockend.

Früher oder später, wenn IPS und dein Skript gleichzeitig darauf zugreifen, kann es Interessante Fehler geben. Ich würde dringend Empfehlen, die in V2 vorhandenen Befehle zu nutzen, die eigentlich alles anbieten, was auch in der XML steht.

Ich habe deinen Code-Schnippsel mal entfernt.

Btw: Die Doku für die restlichen IPS_* Befehle wird Mitte nächster Woche fertig sein :slight_smile:

paresy

Habe die Forensuche ausgiebig genutzt und auch vorhin mehrmals alle mir möglichen Begriffe benutzt, allerdings kam der Thread dabei nicht zum Vorschein…

Die Wahrscheinlichkeit dürfte wohl eher gering sein, aber man muss ja nichts provozieren wenn es auch anders geht. Vielleicht wäre da noch ein dicker Hinweis irgendwo angebracht, das niemand wieder auf die selbe glorreiche Idee kommt und die Settings zum einlesen von Daten benutzt.

<?
  $cModulID_FHT = "{A89F8DFA-A439-4BF1-B7CB-43D047208DDD}";

 	foreach (IPS_GetInstancesByModuleID($cModulID_FHT) as $InstanzID)
 	{
		//Alle StatusVariablen holen
		foreach (IPS_GetStatusVariables($InstanzID) as $StatusVar)
		{
		   $StatusVarID = $StatusVar[VariableID];
		}
 	}
?>

Dann hoffe ich mal das der hier jetzt absolut V2 gerecht ist und hab da auch noch ein paar Fragen die ich mit Hilfe des Forums und der Hilfe nicht wirklich eindeutig klären konnte.
Konnte nichts in der Art IPS_GetModulByName finden, daher über den GUID-String. Der dürfte sich ja auch in den zukünftigen Versionen nicht ändern, so das der so drin bleiben kann oder?
Hab dann etwas mit IPS_GetInstance und IPS_GetObject experementiert.
Geh ich richtig in der Annahme das Children bei Instance jeweils nur Instances aufweisen sowie bei Object dementsprechend Objects usw.?
Bei IPS_GetChildren bekomme ich nur: Fatal error: Call to undefined function IPS_GetChildren()

Dann gibts für mich mehr zu lesen :wink:

Es muss IPS_GetChildrenIDs heißen. Ist ein Fehler in der Doku.

Die GUID der Module wird sich nicht ändern. Da bist du auf der sicheren Seite. Die Namen können sich jederzeit ändern.

Das mit den Children ist etwas anders.

IPS_GetChildrenIDs() gibt dir immer alle Objekte (=Instanzen, Variablen…) wieder, so wie du es in der logischen Baumansicht siehst. Du musst dann anhand des Typs selber filtern, wenn du bestimmte Objekte nicht haben willst und dann die gewollten nochmal per IPS_GetInstance/IPS_GetVariable… abfragen, falls du die spezifischen Daten brauchst. (Das selbe Resultat hast du übrigens, wenn du IPS_GetObject aufrufst und dort auf die Eigentschaft ChildrenIDs zugreifst)

IPS_GetInstance() -> Children sind nur ausgefüllt bei I/O + Splitter Instanzen und geben die unterliegeden, verbundenen Instanzen zurück. Sind also für eine Visu nicht wirklich relevant, außer man will anzeigen, welches Gerät an welchem I/O Port hängt. (Im Prinzip ist das für die pysikalische Baumansicht wichtig) Children ist das selbe Resultat wie von IPS_GetInstanceChildrenIDs.

Grüße, paresy