Probleme bei Umstellung auf 2.5

Hallo liebe IPS-Gemeinde,

sicherlich haben einige von Euch die Umstellung auf die neue Version bereits vollzogen.

Ich wundere mich nur, dass es bei (fast) allen so reibungslos abgegangen ist. :eek:

Mein größtes Problem ist der Wegfall der namensgebundenen Variablenbehandlung. :mad: In fast allen Scripten habe ich generische Routinen, welche über die aufrufende Variable/Instanz eine ganze Reihe von Variablen behandeln, ohne jede einzelne bekannt zu machen.

Wenn ich die Umstellung durchführen will, muss ich die gesamte Konzeption, Aufteilung und Systematik in IPS ändern. Rund 70% aller Scripte bearbeiten Variablen über das Zerlegen und Zusammensetzen der Namen. (optimierter Code)

Ich habe als Alternative zu Rainers „Generalsuche“ quick & dirty eine rekursive (in der Tiefe begrenzte) Funktion zur Namenssuche als Ersatz für IPS_GetVariableID() geschrieben. Allerdings bedingt dies sinnvollerweise, dass die gesuchte Variable unterhalb des aufrufenden Scriptes zu finden ist.

Hier kommt das nächste Problem:
Die Instanzen sind nach räumlicher Aufteilung (Wohnungen/Arbeitsbereiche/Etagen usw.) angeordnet. Die Scripte liegen in „Aufgabenbereichen“ wie Beleuchtung, Heizung… da hierbei ein Script die Instanzen und Vars aus den verschiedenen räumlichen Kategorien bearbeitet. z. B. ein kleines Script für alle Heizungsregler.

Ich kann keinen konzeptionellen Ersatz für diese Möglichkeit erkennen, optimierten Code zu schreiben. Oder soll ich jetzt jede Variable mit jeder ID einzeln handhaben? Dazu müsste ich ca. 70% aller Scripte neu schrieben und wurde den Code extrem aufblähen. Außerdem müsste eine einzelne Änderung mehrfach ausgeführt werden. :confused: Dabei habe ich mir über die restlichen Änderungen noch keine Gedanken gemacht.

Auf Deutsch: diese Änderungen zerstören aus meiner Sicht die Möglichkeit, effizienten, zusammengefassten Code zu schreiben.

Wenn jemand ähnliche Probleme hat und ich denke, wer schon länger dabei ist hat sie ganz sicher, dann interesiert mich Eure Vorgehensweise.

Grüße
Fabian

PS: das Script im Anhang bearbeitet mehrere Variablen von 10 FHTs, hier würde sich der Aufwand potenziell vervielfachen…

Switch_Heizung.ips.zip (1.31 KB)

Das diese Funktionen wegfallen ist übrigens seit Release der 2.0 bekannt. Das war vor etlichen Jahren. Namen sind Schall und Rauch. Namen mit _ drin machen den Baum hässlich und es sieht im WebFront kacke aus :wink:

Übrigens das was du machst, ist ja im Prinzip schon korrekt. Denk es aber auf lokale/relative Strukturen um. Deine Namenssache agiert Global. Global verschwendet aber immer Ressourcen und ist Fehleranfällig.

Du wertest ja schon korrekt die $IPS_VARIABLE aus (übrigen neu: $_IPS[‚VARIABLE‘]). Merk dir doch diese und nutze sie für deine anderen Variablen in der Funktion IPS_GetVariableIDByName: IP-Symcon :: Automatisierungssoftware

Die Soll-Variaben werden sich ja, da du strukturiert arbeitest, auch relativ zur Quellvariable ($IPS_VARIABLE) befinden. Du sparst dir damit alle die ekeligen Namenstricks im Baum, und dein Skript wird noch einfacher, da du keine String-schnippeleien machen musst. Und es sieht aufgeräumter aus, das der DeviceName nicht überall drin ist.

Und: Es ist noch performanter und weniger Fehleranfällig.

paresy

Hallo Fabian,

paresy hat recht und der Wegfall der Namenskonvention ist nur konsequent.
Ich hatte allerdings auch einige Scripte in denen ich auf die Namen weiterhin zurückgreifen wollte.
Hier ein Beispiel wie es gehen kann:



   $log_menge 	= GetValueInteger($id_log_menge);
	$ParentID   = 58903 /*[Allgemein\Logging\Log Ausgabe\Filter]*/;

	$arr = IPS_GetChildrenIDs($ParentID);
	$anz = count($arr);

	//Welche Variable soll gefiltert werden?
  	for ($i = 1; $i<=$anz; $i++)
  	{
  	   $st                  = 'filter_'.$i;
   	$ObjektID 				= IPS_GetObjectIDByName($st, $ParentID);
     	$filter_status[$i] 	= GetValueBoolean($ObjektID);
	}

Ich habe das Thema schon ein paar mal angesprochen und für mich inzwischen so gelöst, dass ich überhaupt nicht mehr auf die ID’s zugreife, sondern mit einem Alias-Konzept arbeite (was prinzipiell einer eigenen implementierung von IPS_GetVariableID entspricht und sicher verpönt ist).

Hierbei werden für alle relevanten Objekte Alias Namen (gemäss meiner Konvention im Namen selbst durch | getrennt) angelegt.

Eine Routine sucht mir alle Aliasse raus, legt ein Alias Array an, welches ich grundsätzlich zulade (per unserialize geht das recht schnell).

Der Zugriff erfolgt dann statt


function(  ID ...)

via


function(  $_ENV['ALIAS']['<aliasname>'] )

Was die alten Funktion angeht, kannst Du ja mit diesem Vorgehen eine solche Funktion ganz leicht nachbauen.

Hinsichtlich der „Nach oben gehen“ Aussage von Paresy (relative Arbeitsweise) kann ich sagen, dass das - die entsprechende Struktur der Objekte vorausgesetzt (was nicht immer geht, denn man kann z.B. I/Os nicht in eine Kategorie nehmen und unter I/O’s auch keine Kategorien anlegen) gut funzt.

Ich würde mir da aber noch mehr Vererbung wünschen, sodass man eine Variable auch als Objekt.Variable ansprechen kann …

jwka