Zum Hauptinhalt springen

Relative Ziele und Lookups

info

Relative Ziele und Lookups stehen ab NeuroomNet Version 2026.3 zur Verfügung.

Normalerweise ist das Ziel einer Komponenten-Aktion fest: Man wählt im Skript-Block eine bestimmte Komponente oder Gruppe aus. Bei vielen gleichartigen Stationen führt das zu sehr vielen fast identischen Blöcken, etwa einem Block je RFID-Reader, der jeweils „sein“ Exponat ansteuert.

Mit relativen Zielen wird das Ziel erst bei der Ausführung ermittelt, ausgehend von der Komponente, deren Ereignis den Block ausgelöst hat. Ein einziger Block reicht dann für alle Stationen, und neue Stationen funktionieren ohne Änderung am Skript, sobald sie in der Gruppenhierarchie richtig eingeordnet sind.

Grundlage: die Gruppenhierarchie​

Relative Ziele nutzen die Gruppen, Gruppenarten und Ebenen aus dem Modul Setup (siehe Gruppenebenen und -arten). Im dortigen Beispiel liegen auf der Ebene „Technik“ Gruppen der Gruppenart „Exponat“, darüber die Ebenen „Raum“ und „Gebäude“.

Dabei sind zwei Arten der Zugehörigkeit zu unterscheiden:

  • Direkte Gruppe: die Gruppe, der eine Komponente zugeordnet ist, z. B. das Exponat, zu dem der RFID-Reader gehört. Über die Oberfläche ist eine Komponente genau einer Gruppe zugeordnet.
  • Übergeordnete Gruppen: alle Gruppen darüber, also der Raum, in dem das Exponat steht, das Gebäude usw. Zu diesen gehört die Komponente indirekt.

Ein relatives Ziel umfasst immer die gewählte Gruppe samt aller Untergruppen. Deaktivierte Gruppen werden wie bei Gruppenaktionen samt ihrer Untergruppen ausgelassen.

tipp

Damit relative Ziele über Ebenen funktionieren, müssen die Gruppen Gruppenarten haben, die Ebenen zugeordnet sind. Fehlen die Ebenen, gilt als direkte Gruppe einfach die Gruppe, der die Komponente zugeordnet ist.

Ein Block für alle Komponenten einer Art​

Damit ein Block bei jedem RFID-Reader auslöst, wählt man als Ereignis nicht einen einzelnen Reader aus, sondern eine Gruppe und dann das Ereignis des Readers, z. B. TagRead. Der Block löst dann bei jedem Reader dieser Art aus, der irgendwo unterhalb der Gruppe liegt. Wählt man die oberste Gruppe, etwa das Gebäude, sind das praktisch alle Reader.

Alle relativen Ziele beziehen sich auf den Reader, der das Ereignis tatsächlich ausgelöst hat.

Ziel einer Komponenten-Aktion​

Bei einer Komponenten-Aktion legt das Feld Ziel fest, wohin die Aktion geht:

ZielDie Aktion geht an …
Ausgewählte Komponente oder Gruppedie im Skript-Block ausgewählte Komponente oder Gruppe (wie bisher)
Auslösende Komponente selbstdie Komponente, deren Ereignis den Block ausgelöst hat, z. B. eine Antwort an den RFID-Reader
Direkte Gruppe der auslösenden Komponentealle passenden Komponenten in der direkten Gruppe der auslösenden Komponente, z. B. das Exponat am selben Reader
Gruppe der auslösenden Komponente auf Ebene …alle passenden Komponenten in der übergeordneten Gruppe dieser Ebene, z. B. alle Exponate im selben Raum
Aus lokaler Variablealle Komponenten oder Gruppen aus einer lokalen Variable, z. B. dem Ergebnis eines Lookups

Passend heißt: Die Komponente hat dieselbe Schnittstelle wie die ausgewählte Aktion und, falls die Aktion für einen bestimmten Komponententyp ausgewählt wurde, auch diesen Typ. Die auslösende Komponente selbst gehört bei „Direkte Gruppe“ und „Gruppe auf Ebene“ nie dazu.

Direkte Gruppe oder Gruppe auf Ebene? Liegt die direkte Gruppe der auslösenden Komponente auf der Ebene, die man auswählen würde (z. B. Reader und Exponat gemeinsam in einer Station), liefern beide dasselbe. Der Unterschied:

  • Direkte Gruppe ist immer die eigene Gruppe der Komponente, gleich auf welcher Ebene sie liegt. Hängt ein Reader ausnahmsweise direkt in einem Raum, ist das eben der Raum. Diese Variante braucht keine Ebene und passt deshalb auch nach dem Übertragen in eine andere Installation.
  • Gruppe auf Ebene … ist genau die Gruppe dieser Ebene, gesucht von der eigenen Gruppe aufwärts. Liegt die eigene Gruppe schon höher als die gewählte Ebene, gibt es keinen Treffer, und die Aktion wird übersprungen.

Für „die Station, zu der der Auslöser gehört“ ist daher Direkte Gruppe die Regel. „Gruppe auf Ebene …“ ist für höhere Ebenen gedacht, etwa alle Exponate im selben Raum.

Gibt es mehrere Treffer, geht die Aktion an alle. Wer das nicht möchte, gliedert die Gruppen feiner, z. B. mit einer eigenen Gruppe je Arbeitsplatz.

Die Aktion selbst wählt man wie gewohnt über eine beliebige Komponente der gewünschten Art aus. Bei einem relativen Ziel dient diese Komponente nur dazu, Aktion und Schnittstelle festzulegen; angesprochen wird sie nicht.

Beispiel: RFID-Reader am Exponat​

Ein Besucher hält seine Karte an einen beliebigen RFID-Reader. Das Exponat an diesem Reader soll den Besucher begrüßen, und der Reader selbst soll eine Bestätigung anzeigen. Außerdem soll die zuletzt gelesene Karte in einer globalen Variable stehen.

  • Ereignis: Gruppe „Gebäude“, Ereignis TagRead des RFID-Readers. Den Parameter mit der Kartennummer in die globale Variable CurrentTag übernehmen.
  • Aktion 1: StartAnimation mit dem Wert login am RFID-Reader, Ziel Auslösende Komponente selbst.
  • Aktion 2: VisitorDetected am Exponat mit der Kartennummer, Ziel Direkte Gruppe der auslösenden Komponente.

Dieser eine Block ersetzt einen Block je Reader. Kommt ein weiteres Exponat mit Reader hinzu, muss am Skript nichts geändert werden.

Zum Ausprobieren lässt sich der Block mit Testdaten ausführen und dabei der auslösende Reader auswählen.

Lookups: Ziele in einer Variable sammeln​

Manchmal soll das Ergebnis der Suche weiterverwendet werden, etwa um zu prüfen, ob überhaupt etwas gefunden wurde, oder um mehrere Aktionen auf dieselben Ziele anzuwenden. Dafür gibt es drei Skript-Aktionen, die ihr Ergebnis in eine lokale Listen-Variable (Text) schreiben:

Skript-AktionErgebnis
Lookup Related ComponentsKomponenten, die mit einer Komponente über die Gruppen verbunden sind: in ihrer direkten Gruppe oder in der übergeordneten Gruppe einer Ebene, optional nur bestimmte Schnittstellen
Lookup Components for Groupsalle Komponenten in den gewählten Gruppen samt Untergruppen, optional nur bestimmte Schnittstellen
Lookup Groups for Componentalle Gruppen einer Komponente, also die direkte Gruppe und alle übergeordneten

Bleibt das Feld für die Komponente leer, geht die Suche von der auslösenden Komponente aus.

Das Ergebnis verwendet man anschließend in einer Komponenten-Aktion mit dem Ziel Aus lokaler Variable. Die Liste darf Komponenten verschiedener Schnittstellen enthalten: Jede Aktion erreicht nur die Komponenten, die zu ihr passen, die übrigen werden still übergangen.

Mit der Variablen-Operation Get List Length lässt sich die Anzahl der gefundenen Einträge ermitteln, etwa um mit einer IF-Bedingung auf „nichts gefunden“ zu reagieren.

hinweis

In der Variable stehen technische Kennungen der Komponenten und Gruppen, keine Anzeigenamen.

Wenn kein Ziel gefunden wird​

Lässt sich ein relatives Ziel nicht auflösen, wird nur diese eine Aktion übersprungen; der Block läuft weiter. Das passiert, wenn

  • keine passende Komponente gefunden wurde (z. B. weil die Gruppe deaktiviert ist),
  • der Block nicht durch eine Komponente ausgelöst wurde (z. B. durch einen Timer),
  • die auslösende Komponente nicht zur Aktion passt (z. B. eine Exponat-Aktion mit dem Ziel „Auslösende Komponente selbst“ bei einem Reader-Ereignis),
  • eine Variable unbekannte Komponenten oder Gruppen enthält (diese werden ausgelassen, die übrigen Ziele werden bedient).

Die übersprungene Aktion erscheint im Traffic als Fehler, mit dem Grund und den beteiligten Angaben (auslösende Komponente, Schnittstelle, Ebene).

Schon beim Bearbeiten weist der Skript-Block auf einen fehlenden Auslöser hin: Braucht eine Aktion die auslösende Komponente, der Block hat aber kein Ereignis von einer Komponente oder Gruppe, erscheint eine Warnung bei der Aktion, und die Aktionskarte trägt ein Warnsymbol.

Aktion oder Komponente austauschen​

Wählt man bei einer Aktion oder einem Ereignis eine andere Komponente oder eine andere Aktion aus, bleiben passende Einstellungen erhalten: feste Werte, Formeln, Variablenzuordnungen und das relative Ziel. Übernommen wird ein Parameter, wenn die neue Auswahl einen Parameter mit gleichem Namen und gleichem Datentyp hat. Was nicht übernommen werden konnte, nennt ein Hinweis direkt unter der Auswahl.

So lässt sich z. B. ein Gerät austauschen, ohne alle Parameter neu zuzuordnen, oder von VisitorDetected zu VisitorLeft wechseln, ohne das Ziel neu festzulegen.

Gut zu wissen​

Wann lohnen sich relative Ziele?​

Der eigentliche Gewinn entsteht, wenn ein Ereignis für mehrere Komponenten steht, also bei einem Ereignis auf einer Gruppe, einer Schnittstelle oder einem Komponententyp. Erst dann ist bei der Ausführung offen, welche Komponente ausgelöst hat, und nur ein relatives Ziel kann darauf reagieren.

Auch bei einem Ereignis einer einzelnen Komponente können relative Ziele sinnvoll sein:

  • Wartung: Wird das Exponat in der Gruppe ausgetauscht oder die Station umgebaut, muss am Skript nichts geändert werden.
  • Übertragbarkeit: Ein Block mit relativem Ziel enthält keine fest eingetragene Ziel-Komponente. Beim Übertragen in eine andere Installation muss nur der Auslöser zugeordnet werden.

„Auslösende Komponente selbst“ bringt bei einem einzelnen Auslöser dagegen nichts, denn der steht ja schon fest.

Unterschied zur „Dynamic Component or Group Action“​

Beide lösen verschiedene Aufgaben und ergänzen sich:

Dynamic Component or Group ActionRelative Ziele und Lookups
FrageWelche Komponenten innerhalb einer Gruppe?Wo, ausgehend von der auslösenden Komponente?
Bezugspunktfest: eine im Skript-Block gewählte Gruppeergibt sich erst bei der Ausführung
Auswahl nachSchlagworten und Gruppenart der Untergruppen, Schlagworten und Status der KomponentenGruppenhierarchie: direkte Gruppe, übergeordnete Gruppe einer Ebene, Auslöser selbst, Variable
Beispiel„Alle Beamer mit dem Schlagwort Foyer ausschalten, die online sind“„Das Exponat am RFID-Reader, der gerade gelesen hat“

Die dynamische Aktion geht immer von derselben Gruppe aus, gleich welche Komponente den Block ausgelöst hat. Bei einem Ereignis „alle Reader“ würde sie bei jedem Reader dieselben Komponenten ansprechen.

Umgekehrt filtern relative Ziele nicht nach Schlagworten oder Status. Beides lässt sich derzeit nicht kombinieren: Bei einem relativen Ziel wird ein dynamischer Filter nicht berücksichtigt.