Alle Links zu einer Variablen finden

Hallo zusammen,

vielleicht könnt ihr mir ja helfen. Ich versuche zur Zeit auf einfache und in annehmbarer Laufzeit alle Links zu einer Variablen zu finden. Die Doku sagt dazu nichts, auch die Suche spuckt nicht wirklich etwas hilfreiches aus.

Könnt ihr mir sagen ob und vorallem wie das funktioniert ?

Es scheint mir so als kenne nur das Child seinen Parent, aber der Parent nicht seine Children… ORGS :rolleyes:

Eine iteration über alle Links im System mit anschließendem Vergleich der ParentID kann ja nicht die Lösung sein oder :confused:

Ist die Aussage aus dem Thread:

Immernoch der Status Quo ?

Danke!

Gruß
Daniel

Du wirfst da das durcheinander, oder ich habe dich falsch verstanden.

  1. Suchst du jetzt die Childs von einem Objekt und willst wissen ob es ein Link ist?
  2. Oder willst du von einem Objekt alle Links haben welche auf dieses Objekt zeigen ?

zu 1)


$ParentID = 12345; // Hier von die Childes prüfen
foreach (IPS_GetChildrenIDs($ParentID) as $objekt)
{
  if (IPS_GetObject($objekt)['ObjectType']==6)
  {
    // $objekt ist ID eines Link zu zeigt auf
    $linkTarget = IPS_GetLink($objekt)['TargetID'];
  }
}

zu 2)


$ObjectID= 12345; // Ziel auf das Geprüft wird
foreach (IPS_GetLinkList() as $link)
{
  if (IPS_GetLink($link)['TargetID']==$ObjectID)
  {
    // $link ist ID eines Link der auf $ObjectID zeigt
  }
}

Michael

PS: Habe den Syntax jetzt nicht gerpüft. Mal eben schnell zusammengetippt :wink:

Danke Michael!

Ich möchte ausgehend von $object alle Verlinkungen zu diesem $object haben haben.

Wie schon gesagt, Iteration durch Listen ist keine zufriedenstellende Lösung für mich, warum gibt es da nichts intelligenteres ? Die Beziehungen werden doch ohnehin in der Datenbank hinterlegt (schätze ich jetzt aus dem Bauch heraus mal) ? Unsinnige Iterationen sind so 1980er Stil und überhaupt nicht State of the Art.

Wenn der Link seine(n) Parent/Quelle kennen würde, wäre das in einer absolut akzeptablen Laufzeit herauszubekommen. Kennt er aber leider nicht.

Das Problem ist mir schon an X Ecken aufgefallen, dass immer nur eine Richtung bei der Implementierung berücksichtigt wurde aber nie der Rückweg, sodass man immer durch Listen iterieren muss…

Daniel

Edit:

Bestes Beispiel ist eine ID zu nem Identifier zu bekommen, ich habe nur dafür eine Hilfsfunktion gebastelt die ich jedes Mal wenn ich eine ID zur Variable mit einem Identifier haben will (ich arbeite damit fast ausschließlich) durch die komplette Variablen Liste gehen muss um sie zu finden … Das ist auf Dauer, mit gewisser aufgeblähter Anzahl an Variablen im System sicher nicht die geeignete Lösung.

Das wäre dann ja 2).

Was läßt dich annehmen das der Objektbaum eine Datenbank ist ?
Wenn du dir IPS genauer ansiehst, gibt es u.a. einen ObjektManager welche die Beziehung der Objekte zueinander beschreibt.
Links sind zwar auch Objekte aber deren Eigenschaften sind dort natürlich nicht enthalten.
Dafür gibt es dann auch einen LinkManager und Link-Funktionen.

Wir nicht Parent & Quelle bzw. Target/Ziel durcheinander.
Parent & Child beschreiben Objekt Abhängigkeiten im logischen Baum.
Ein Link (also Objekt betrachtet) kann beides sein und auch haben (egal ob es nun unsinnig ist das ein Link noch Childs hat :wink: ).
Aber ein Link kann nur (jetzt als Link betrachtet) auf ein Target zeigen.
Die Objekte wissen aber nichts von den Links die auf sie zeigen; wird auch nicht gebraucht…
Wenn du ein Objekt löscht, welche das Target eines Links ist, merkt das auch nur der Link (wird als Fehlerhaft makiert).

Das liegt einfach daran dass für die Funktion von IPS nicht wichtig ist (würde ich mal behaupten).
Wobei ich diese X Ecken nicht kenne. Meistens klappt es ohne die Listen. Außer du weißt wirklich nicht wo im Baum du suchen sollst…

Kommt immer auf deinen Objektbaum an… der Ident kann ja auch mehrfach vorkommen, er darf nur pro Ebene einmalig sein. Da ist es dann Unfug alles zu durchsuchen.
Dafür nutze ich z.B. Funktionen welche nur unterhalb vom Script oder auch gleicher Ebene suchen.
Bei der Link Suche geht das ja auch… war aber nicht deine Fragestellung.

Michael

Kennt eine Windows-Exe alle seine Verknüpfungen? :rolleyes:

Was auch immer du vor hast… ich glaube es nicht, wofür wir Links eingebunden haben.

Der einzige sinnvolle Einsatzzweck für das Herausfinden aller Links zu einem Objekt ist, um diese Information für ein Refactoring zu nutzen oder dem User Abhängigkeiten anzuzeigen. Für diesen Spezialfall ist die Laufzeit sehr zweitrangig und deswegen cached IP-Symcon diese Informationen auch nicht.

Wenn du uns deinen Anwendungsfall und die damit verbundene zeitkritische Komponente erklärst, können wir ja vielleicht etwas einbauen.

Zum Thema Ident: http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/objektverwaltung/ips-getobjectidbyident/
Zum Thema Children: http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/objektverwaltung/ips-getchildrenids/

paresy

Das Problem ist generell recht einfach erklärt, eventuell liegt das Problem auch im Design meiner Stuktur - kann sein.

Ich habe es folgendermaßen aufgebaut:


+ Steuerung (Kategorie)
   + Raum 1 (Kategorie)
      + Thermostat (Dummy)
         + Homematic Gerät A (Homematic Device, Hidden)
            + Homematic Variable A (mit Identifier versehen weil Variablenbezeichnung allein uneindeutig)
      + Link A von Variable Homematic Grät
      + Link B von Variable Skript A
+ Skripte (Kategorie, Hidden)  
   + Skript A (Skript)
      + Variable zu Skript A (Variable mit Identifier)

Die Variablen zu Skript A werden automatisch angelegt wenn nicht vorhanden und mit einem Identifier versehen (lasse ich alle meine Skripte so machen).

Wenn ich alle meine Skripte die Variablen unter dem Parent $IPS_SELF anlegen lasse wäre das rein Logisch korrekt und bildet eine sinnvolle, schicke und geordnete Sache. Jedoch müsste ich dann, wenn ich diese Variablen angezeigt haben möchte, Links innerhalb des Visualisierten Bereich auf diese Variablen erzeugen. Wenn ich beispielsweise diese Links innerhalb des Skriptes sichtbar/unsichtbar schalten möchte, reicht es nicht den Ursprung zu verändern sondern ich muss an den Link direkt ran. Um an diesen Link zu kommen brauche ich zwingend einen Parent wenn ich nicht iterien will. Den Parent kenne ich aber garnicht, weil sich dieser bei jeder Person an anderer Stelle im Baum befinden kann (Stichwort: wartbarer und wiederverwendbarer Code).

Gleiches Problem bekomme ich, wenn ich von einem anderen Skript B die Variablen von Skript A auslesen/verändern möchte. Ich kenne den Parent (im dynamischen Kontext) nicht.

Identifier sind per Definition immer eineindeutig - ansonsten bräuchte ich keine Identifier, so wäre es auch wieder nur ein Name der in einem gewissen Kontext gültig und eindeutig ist. Bei IP-Symcon scheint es so, dass die Suche als Tiefensuche implementiert wurde und das die Identifier nur auf die Parentebene bezogen eindeutig sind - die Frage ist, was bringt der Identifier dann dann wenn ich den Parent nicht eineindeutig aus o.g. Gründen identifizieren kann ? Meiner Meinung nach nicht viel.

Ich müsste so immer ausgehend von der Kategorie „Skripte“ über dessen untergeordnete Objekte rekursiv iterieren bis ich die passenden Variablen finde. Und das gleiche von der obersten Kategorie wo ich die Objekte ablege die angezeigt werden sollen. Das sind Worst-Case Laufzeiten von O(2*(n^m))…

Der Hintergrund ist folgender:
Ich will meine Skripte so dynamisch wie möglich programmieren, ohne das ich irgendwo die statischen ID’s von Objekten hinterlegen muss - das ist einfach unschön und nicht wiederverwendbar. Schließlich sollen andere ebenfalls von den Skripten profitieren können ohne sich erstmal durch die Parameterisierung des Skripes wühlen zu müssen (jedenfalls was die Basisfunktionen erstellen, zugreifen von $Objekten betrifft).

Bin da gerne für Anregungen offen, möglicherweise liegt in meinem Design auch das Problem.
Bitte zeigt mir in dem Fall doch Möglichkeiten auf einen schnellen, wiederverwendbar dynamischen Code zu schreiben, ohne Iteration und ohne Parentgemurkse.

Ich bin im Moment leider davon überzeugt dass dies so garnicht möglich ist - und das wäre dann nicht so wirklich toll :frowning:

Bitte das Ganze jetzt nicht falsch verstehen, es soll keine Kritik an der Entwicklung des Systems sein, sondern Primär eine Verständnisfrage die eventuell Sekundär auch zur Verbesserung des Systems beitragen kann.

Ich würde mir einen immer gleichen sprechenden Identifier wünschen, der immer eindeutig ist, und mit dessen Hilfe man auf das Objekt einfach zugreifen kann. Den identifier kann man auch gerne nur über das Skripting setzen.

Man könnte auch quasi Minimalinversiv eine Methode bereitstellen, mit der man anhand eines Identifier das Objekt bekommt, sollten mehrere Objekte den gleichen Identifier haben, wird nur das erste zurückgegeben - oder ein Array von treffern, je nach Implementierungsaufwand. Wichtig ist die eliminierung des Parent Kontextes.
So eine Hilfsmethode habe ich mir programmiert, jedoch iteriere ich immer über alle Objekte im System um den Identifier zu finden…

Daniel

Sobald ein Identifier komplett eindeutig im System ist, kannst du gleich wieder die ObjektID nutzen. Dass ein Identifier nur pro Ebene eindeutig ist, ist genau dafür gedacht, dass eine Variable normalerweise zu einer Instanz oder Skript zugehört ist, über welches es angesteuert wird. Der Parent beeinflusst die Children.

Wiederverwendbarkeit realisierst du über die $_IPS Systemvariablen, welche dir den Kontext liefern, ohne dass du irgendwo iterieren musst. Wenn du nicht über die $_IPS Variablen den Kotenxt bekommst, leitest du irgendwo den Kontext nicht korrekt weiter.

Ich verstehe den Vorteils deines Designs übrigens trotz mehrmaligem Lesen überhaupt nicht. Mag aber auch daran liegen, dass es 16h ist.

Magst du ein Beispiel dazu geben, was du steuerst?

Ganz simples, wiederverwendbares Design:

  • Leg alle Instanzen ab wo du willst. (Ich lege alles geordnet im Baum nach Ort ab)
  • Erstell ein Steuerskript.
  • Verlinke alle zu Steuernden Instanzen unterhalb des Steuerskripts.
  • Das Steuerskript löst Links auf und steuert die Instanz an.

paresy

Ich muß gestehen… ich verstehe es auch nicht; oder nicht den Sinn / Vorteil der sich daraus erschließt.

Außerdem solltest du aufpassen wenn du IDENTs von Hardware-Instanzen veränderst; es könnte sein dass die Instanz nicht nicht mehr korrekt funktioniert (oder jedesmal eine neue Variable anlegt).

Wie Paresy schon schrieb; er ist halt dazu da das ein Instanz (Parent) seine eigenen Variablen (Childs) welche zu ihm gehören identifizieren kann.
Es ist natürlich sinnvoll das ganze auch für eigene Scripte & Variablen zu nutzen, warum nicht. Aber solche Verknüpfungen quer durch das System… verstehe ich nicht.

Für die Visu hast du recht, dass du die Links verstecken mußt.
Darum habe ich Scripte welche Steuerungsaufgaben übernehmen und Scripte welche die Visu steuern.

Ich löse den Kontext auf vielen Wegen auf, je nachdem was das Skript machen soll.

  • Quelle als Trigger->Variable welche Trigger ausgelöst hat und Ziel z.B. der Name des Ereignisses (z.B. Summe Licht, Licht Erdgeschoß).
  • Ziel sind alle Links unterhalb der Instanz… die Paresy auch schon schrieb.
  • Quelle sind alle Quell-Variablen der Ereignisse unterhalb dieser Instanz, Ziel wieder per Name des Ereignisses.
  • Daten für Push-Nachrichten werden generiert aus - Name, Info & Icon des Ereignisses
    etc…

Skripte sind auch bei mir nicht gesammelt an einem Ort, sonder dort wo sie funktionell wirken sollen.
Also Skripte für die Steuerung Verstärker sind unterhalb von root/Hardware/Verstärker/Onkyo Wohnzimmer(Dummy-Instanz)/ und hier liegen dann die Variablen & Skripte.
Zusätzlich gibt es dann noch einen Bereich wo per Dummy-Instanz & Links die Visu gebaut wird. Mit eigenen Skripten, welche bei bedarf Links oder andere Objekte verstecken.

Die eigentliche Variable zu verstecken halte ich für wenig zielführend. Ich habe im Webfront eine Übersicht und eine pro Raum. In der Übersicht sehe ich nur Fenster die offen sind. Ich der Raumansicht sehe ich aber immer den Fensterstatus. Das würde bei deiner Lösung gar nicht gehen.

Ist jetzt natürlich meine Meinung / Ansicht. Jeder muß hier auch sehen welchen Weg er gehen möchte/kann und ob er sich in 12 Monaten da noch mal reindenken kann. Gibt ja bekanntlich viele Wege nach Rom :smiley:

Was das ‚Parentgemurkse‘ angeht, verstehe ich deine Argumentation überhaupt nicht.
Entweder nutzt du den logischen Baum sinnvoll in deinen Skripten oder du läßt es und arbeitest mit IDs.
Was nützt uns denn noch eine zusätzliche Möglichkeit Objekte aufzufinden ?
Michael

Jain, die ist ja wieder von System zu System dynamisch.

Verstehe, leuchtet ein und habe ich mir schon so gedacht. Das Parent System ansich ist auch gut so und macht Sinn, nur leider gibt es keine Methoden ohne Parent. Erläuterung weiter unten im Beispiel.

Mag sein das es auch einfach nicht korrekt ist, ich bin ja IP-Symcon Anfänger. Implementierungstechnisch weiß ich was ich tue.

Gerne, mal ein einfaches Beispiel:

Ich habe einen Homematic Fenster ThreeState Sensor, dieser liegt samt seinen Variablen ausgeblendet in meinem Baum:


+ Steuerung (Kategorie)
	+ Überblick (Kategorie)
		+ Link zu Variable STATE von Fenstersteuerung
	+ Büro (Kategorie)
		+ Jalousie Büro (Dummy Instanz)
			+ SHUTTER_CONTACT (HM Device, hidden)
				+ STATE (Variable zu HM Device, Profil ~Window)
				+ weitere Variablen die mich nicht interessieren
			+ Link zu Variable STATE von SHUTTER_CONTACT

+ Skripte (Kategorie, hidden)
	+ Kategoriename A (Kategorie)
		+ Fenstersteuerung (Skript, Logik für seine STATE Variable)
			+ STATE Variable (TRUE=alle Fenster zu, FALSE=mind. 1 Fenster offen)
	+ Kategoriename B
		+ Geofency (Skript)

Nun möchte ich im Geofency Skript wenn das Haus verlassen ist, prüfen ob alle Fenster geschlossen sind, wenn nicht soll es ne Meldung geben:

[ul]
[li]Die erste Möglichkeit ist über alle Variablen mit dem Profil ~Window zu iterieren und prüfen ob mind. eines offen ist und dies dann melden. (Schlechte Lösung, da das Fensterskript das überwacht)[/li][li]Die nächste Möglichkeit wäre direkt auf die STATE Variable vom Fensterskript zuzugreifen, selbst wenn ich dieser Variable einen Identifier gegeben habe, müsste ich immernoch den Parent (Das Fensterskript) kennen, was ich aber im Geofency Skript nicht tue, noch viel weniger kenne ich die Parents vom Fensterskript und der Struktur darüber.[/li][li]Man könnte natürlich analog auch versuchen an den Link unter Steuerung\Überblick zu kommen, vorallem will man das wenn man die Variable ein/ausblenden will. Auch hier das gleiche Problem wie bei der Möglichkeit zuvor.[/li][/ul]

Ich muss, wenn ich direkt auf den Namen mittels IPS_GetVariableIDByName oder auf den Identifier mittels IPS_GetObjectIDByIdent einer Variablen zugreifen will, immer den Parent kennen. Wenn ich den Parent nicht kenne müsste ich mir diesen Suchen. Aber wie wenn ich den Namen des Parents nicht kenne(n will) ?

Selbst wenn ich so statisch sein will und den Parent (die Kategorie „Überblick“) kennen will, und die Parent ID davon herausfinden möchte, müsste ich wieder dessen Parent kennen :rolleyes: weil die Methode IPS_GetCategoryIDByName wieder einen Parent haben möchte, und an dem Punkt dreht sich das Parent Karussell immer weiter…

Ist Etwas klarer geworden was ich meine ?

Ich persönlich finde es besser, Variablen bei seinem Parent einzusortieren. Skript Variablen bleiben bei seinem Skript, wenn ich diese irgendwo Angezeigt haben möchte, verlinke ich sie in einen Bereich der angezeigt wird. So wie ich deinen Post verstanden habe sollte es aber eher anders herum sein ?

Daniel

Wenn ich euch richtig verstehe, mache ich es genau andersherum ?

Könntet ihr mir das eventuell noch einmal genau erklären, vielleicht auch mit einem Screenshot oder so ? Fällt mir gerade schwer das Gedanklich zu adaptieren.

Danke
Daniel

Edit:
OK die Variante von paresy habe ich glaube ich verstanden:

Ausgehend davon das ich ein Skript habe, sagen wir mal es ist das Fenstersteuerskript.
Dieses Skript legt automatisch eine Variable unter sich selbst an, welche den globalen Fensterzustand anzeigen soll.
Diese Variable würde ich dann in das Geofency Skript verlinken und würde aus dem Geofency Skript über den Link auf die Variable zurückgreifen ?
Der Aufruf wäre ja dann solche Monster:

GetValueBoolean(IPS_GetLink(IPS_GetObjectIDByName("Status", $_IPS['SELF']))['TargetID']);
GetValueBoolean(IPS_GetLink(IPS_GetLinkIDByName("Status", $_IPS['SELF']))['TargetID'])

Denn direkt über IPS_GetObjectByIdentifier gehts nicht, da der Link nicht den Identifier von der Quelle mitbekommt :frowning:
Aber ich will partou nicht über Namen selektieren, die sind versehentlich zu einfach abzuändern, und dann läuft nichts mehr.

Habe ich das richtig verstanden ?
Wo legt ihr denn den Sensor ansich hin ? Den will man ja aufgrund der Variablen die er hat oftmals garnicht alles sehen ?

Edit2:

Ja Okay, ich denke ich habe es jetzt verstanden wie ihr euch das gedacht habt. Ich habe es tatsächlich andersherum aufgezogen.
Aber so wirklich gefallen will es mir leider noch nicht. Ich möchte euch auch sagen warum:

Nach eurer Variante muss Ich als Maintainer eines Skriptes sicherstellen, das der Link vorhanden ist und das er valide ist bevor darauf Aktionen stattfinden dürfen. So muss der Link existieren (manuelle Aufgabe) und der Name muss stimmen, wenn eines davon nicht zutrifft ist die Funktionalität beeinträchtigt.

Nach meiner Vorgehensweise hingegen, muss der Maintainer eines beliebigen Skriptes nur den Identifier global passend eindeutig bei der Anlage seiner Variablen wählen. So kann dann ein weiterer Maintainer in einem anderen Skript sich die Identifier anschauen, und einfach darauf zugreifen ohne vorher Links zu erstellen und Namen zu checken. Ich meine irgendwann ist das System auch mal voll mit Links und Variablen und wird undurchsichtig. Je weniger man da erstellen muss desto besser, oder nicht?
Zudem finde ich meine Variante um einiges Wartungsfreundlicher und Fehlerunanfälliger.

Hm… ich weiß nicht, ich weiß nicht.

Dein Fensterstatus-Skript könnte man mit meinem Licht-Geschoß Script vergleichen (nur dass dies auch Steuern kann -> Licht geschossweise ausschalten).

Das funktioniert so:

[ul]
[li]Ein Ereigniss lößt das Script aus durch Änderung der Variable vom Aktor.[/li][li]Der Name des Event legt das Geschoß fest.[/li][li]Suche eine Ebene oberhalb vom Script die Variable welche das Geschoß darstellst (per Ident)[/li][li]Durchsuche alle Events vom Script und …[/li][li]… prüfe ob es das gleiche Geschoß ist (Name vom Event)[/li][li]… hole die ID der einzelnen Licht Variablen aus den Events…[/li][li]… prüfe auf Variablentyp und…[/li][li]… führe einen Vergleich durch ob Licht an oder aus ist.[/li][li]Wenn Licht an ist, wird eine PHP-Variable ($newvalue) auf True gesetzt.[/li][li]Schreibe Geschoß-Variable (wurde am Anfang ermittelt)[/li][/ul]

Und hier das Script für die Auswertung der Ereignisse (Schalten habe ich mal weggelassen).


<?
if ($_IPS['SENDER']=="Variable") // ausgelöstes Ereignis einer Variable
{
	$suche=IPS_GetName($_IPS['EVENT']);
	$targetvalueid= IPS_GetObjectIDByIdent($suche,IPS_GetParent($_IPS['SELF']));
	$newvalue=false;
	foreach (IPS_GetChildrenIDs($_IPS['SELF']) as $trigger)
	{
		if ((IPS_GetName($trigger)==$suche) && (IPS_GetObject($trigger)['ObjectType']==4)) // nur Ereignisse
		{
			$TriggerVariableID = IPS_GetEvent($trigger)['TriggerVariableID'];
			switch (IPS_GetVariable($TriggerVariableID)['VariableValue']['ValueType'])
			{
				case 0: //bool
				if (GetValueBoolean($TriggerVariableID)) $newvalue=true;
				break;
				case 1: // int
					if (GetValueInteger($TriggerVariableID) > 0) $newvalue=true;
				break;
				case 2: //float
					if (GetValueFloat($TriggerVariableID) > 0) $newvalue=true;
				break;
			}
		}
	}
	SetValueBoolean($targetvalueid,$newvalue);
}
?>

Da die Ereignisse nicht visualisiert werden, kann ich den Namen für die Zuordnung ‚missbrauchen‘.
Die Geschoß-Variable wird über den Ident gefunden, und kann somit umbenannt werden.
Den Namen oder Fundort im Baum, der Aktoren und Statusvariablen ist ebenfalls egal.
Es wird ja nur die ObjektID aus dem Ereignis gezogen.

Ich Screenshot oben jetzt nicht zu sehen ist die Hardware, die liegt ganz woanders im Baum.
Hier mal meine drei wichtigsten Kategorien. Darunter ist es sehr unterschiedlich aufgebaut und verzweigt.
HW-Scripte liegen mit Dummy-Modulen unter Hardware.
Scripte welche z.B. andere SW abfragen (PRTG, Kalender etc) oder eigene Kofig-Dateien mit ObjektIDs haben; liegen unter Program.
Auch dort viel gemixt vom Aufbau unterhalb der einzelnen Kategorien, da einiges aus dem Forum (wie das Einstellen der Zeitprogramme per WebFront) kopiert ist und teilweise sehr unterschiedliche Strukturen folgt.

Das einfachste um ‚Statische‘ Scripte welche mit festen IDs arbeiten, in andere Systeme zu kopieren ist der RS Script Exporter :slight_smile: Auch davon sind hier einige dabei.

Michael

PS: Von meinen Hardware-Instanzen habe ich gar nicht versteckt. Die Visu besteht dort nur aus Links :slight_smile:

Ich habe einen recht ähnlichen Aufbau wie Michael.

> 0_TEST
> Hardware (Kategorien mit Unterkategorien (HomeMatic, Denon, RGBW868, …) mit Instanzen und den zugehörigen Variablen)
> Program (IPSLibrary)
> Skripte & Variablen (Kategorien mit eigenen Skripte und zugehörige Variablen/Events/Timern)
> Visualization (Kategorien die nur mit Unterkategorien, Dummy Modulen und Links gefüllt sind)

Grüße,
Chris

Ja, danke euch beiden. Ich denke das wird mir jetzt schon etwas klarer. Mal gucken wie ich das bei mir so hinbekomme.
Melde mich wieder :slight_smile:

Okay, ich habe das jetzt mal nach eurem Beispiel umgebaut.
Gefällt mir von der Ordnung und der Übersicht her gut.

Jetzt muss ich mich nur mit den Links anfreunden, mal gucken in wie weit ich das automatisieren kann.

Meine simple Idee ist wie folgt:
Überprüfen, ob ein Fenster geöffnet ist (via Links)

Die Idee von Michael ist natürlich etwas komplexer als meine, aber dafür genialer :smiley:

paresy

Dankeschön, ihr habt mir sehr geholfen!
Ich denke das Problem ist damit gelöst :slight_smile: