Zugriff auf die Werte von Items

Das Lesen eines Itemwertes und das Zuweisen/Schreiben eines Item Wertes werden im folgenden beschrieben.


Lesen einer Item Wertes

Der Syntax um den Wert eines Items in Logiken oder in eval-Ausdrücken zu lesen, ist folgender:

myvar = sh.<Pfad des Items>()

Pfad des Items beschreibt den vollständigen Pfad eines Items. Wenn ein Item vom Typ String folgendermaßen konfiguriert ist:

Oma:
    Papa:
        Kind:
            type: str

ist für das Item Kind der Pfad Oma.Papa.Kind. Auf den Wert kann folglich über sh.Oma.Papa.Kind() zugegriffen werden.

Wenn ein Item einen komplexen Datentyp (type: list oder type: dict) hat, ist außer dem Zugriff auf den gesamten Item Wert (also die komplette Liste oder das komplette dict) auch der Zugriff auf einzelne Elemente dieser Item Werte möglich.


Zugriff auf ein Listen-Element neu

Wenn ein Item als Liste konfiguriert ist, kann auf die einzelnen Elemente der Liste über ihre Position zugegriffen werden, wobei 0 die erste Position kennzeichnet. Um z.B. auf das dritte Element einer Liste zuzugreifen, ist der Syntax folgender:

myvar = sh.Oma.Papa.Kind(index=2)

Es ist auch möglich, auf die Liste vom Ende her zu zugreifen, wobei -1 das letze Element der Liste bezeichnet, -2 das vorletzte Element usw.


Zugriff auf ein Dict-Element neu

Wenn ein Item als Dict konfiguriert ist, kann auf die einzelnen Elemente des Dicts über ihren Key zugegriffen werden. Um z.B. auf das Element mit dem Key meinWert eines Dicts zuzugreifen, ist der Syntax folgender:

myvar = sh.Oma.Papa.Kind(key='myKey')

Schreiben eines Item Wertes

Der Syntax um den Wert (value) eines Items in Logiken oder in eval-Ausdrücken zu setzen, ist folgender:

sh.<Pfad des Items>(<value>)

Pfad des Items beschreibt den vollständigen Pfad eines Items. Wenn ein Item vom Typ String folgendermaßen konfiguriert ist:

Oma:
    Papa:
        Kind:
            type: str

ist für das Item Kind der Pfad Oma.Papa.Kind. Den Wert kann folglich über sh.Oma.Papa.Kind(<value>) gesetzt werden.


Wenn ein Item einen komplexen Datentyp (type: list oder type: dict) hat, ist außer dem Setzen des gesamten Item Wertes (also die komplette Liste oder das komplette dict) auch das Setzen einzelner Elemente dieser Item Werte durch Angabe eines weiteren Parameters möglich. Wichtig ist, dass der zu setzende Wert der erste Parameter ist. Alle weiteren (namentlich benannten) Parameter dürfen erst danach folgen.


Schreiben eines Listen-Elements neu

Wenn ein Item als Liste konfiguriert ist, kann auf die einzelnen Elemente der Liste über ihre Position zugegriffen werden, wobei 0 die erste Position kennzeichnet. Um z.B. das dritte Element einer Liste zu setzen, ist der Syntax folgender:

sh.Oma.Papa.Kind(<value>, index=2)

Es ist auch möglich, auf die Liste vom Ende her zu zugreifen, wobei -1 das letze Element der Liste bezeichnet, -2 das vorletzte Element usw.

Wenn eine Liste vergrößert werden soll, so gibt es die Möglichkeit das neue Item am Anfang oder am Ende der Liste anzufügen.

Um einen Wert am Ende der Liste anzufügen, ist als index der String ‚append‘ anzugeben.

sh.Oma.Papa.Kind(<value>, index='append')

Um einen Wert am Anfang der Liste einzufügen, ist als index der String ‚prepend‘ anzugeben.

sh.Oma.Papa.Kind(<value>, index='prepend')

Schreiben eines Dict-Elements neu

Wenn ein Item als Dict konfiguriert ist, kann auf die einzelnen Elemente des Dicts über ihren Key zugegriffen werden. Um z.B. auf das Element mit dem Key myKey eines Dicts zu setzen, ist der Syntax folgender:

sh.Oma.Papa.Kind(<value>, key='myKey')

Falls der Key im dict noch nicht existiert, wird ein neuer Eintrag hinzugefügt.


Weitere Parameter Item Zugriff

Außer den oben beschriebenen Parametern (value, index und key), gibt es noch weitere Parameter.

Der ineressanteste unter ihnen ist der Parameter caller. Mit ihm wird beeinflusst, was bei einer Zuweisung zu einem Item als Update durch und Änderung durch zum Beispiel in der Admin GUI zu einem Item angezeigt wird.

sh.Oma.Papa.Kind(<value>, caller='Meine eigene Logik')

Damit wird der standardmäßige Eintrag von Update durch und Änderung durch durch den gewählten Eintrag ersetzt.

Ein weiterer Parameter ist source. Dieser wird im allgemeinen in Gateway Plugins genutzt, um zu kennzeichnen von welchem externen Device ein Itemwert verändert wurde.

Plugins setzen einen Item Wert normalerweise so:

sh.Oma.Papa.Kind(<value>, caller=<Plugin Name>)

Damit wird der Plugin Name in der Admin GUI in den Feldern Update durch und Änderung durch angezeigt.

Bei einem Gateway Plugin, bei dem das Plugin mehrere externe Geräte unterstützt, wird der Wert des Items folgendermaßen gesetzt:

sh.Oma.Papa.Kind(<value>, caller=<Plugin Name>, source=<Device ID>)

Dadurch wird in der Admin GUI in den Feldern Update durch und Änderung durch <Plugin Name>:<Device ID> angezeigt.


Erweiterter Zugriff auf List- und Dict-Items neu

Mit den Erweiterungen wird der Zugriff auf Items vom Typ list oder dict noch mehr dem „normalen“ Handling von Python angepasst.

Ein Item vom Typ List erhält ein Item-Attribut list, vom Typ Dict erhält analog das Attribut dict. Diese Attribute besitzen typspezifische Methoden zum Zugriff auf und Ändern von den jeweiligen Item-Werten.

Mit Ausnahme der (nur lesenden) Methode get für dict-Items unterstützen alle Methoden die optionalen Parameter caller, source und dest, die - wie beim normalen Zugriff auf Items - entsprechend gesetzt werden können.

Bemerkung

Alle Methoden sind im Wesentlichen mit den entsprechenden Methoden der list- bzw. dict-Klassen identisch; das genaue Verhalten kann bei Bedarf in der Python-Dokumentation nachgelesen werden.

Ausnahmen sind die Methode prepend (existiert so in Python nicht) und delete, welche das Verhalten von del nachbildet, aus Syntaxgründen aber anders benannt werden musste.

Analog zu den Python-Funktionen ist keine zusätzliche Fehlerbehandlung implementiert, so dass ungültige Indizes oder Keys nicht abgefangen werden. Die Behandlung dieser Fehler obliegt - wie beim normalen Umgang mit Listen und Dicts - dem Nutzer.

List-Items

Die Methode append hängt Werte an die Liste an:

..code-block:: python

sh.Oma.Papa.Kind.list.append(‚foo‘)

Die Methode prepend fügt Werte am Beginn der List ein:

..code-block:: python

sh.Oma.Papa.Kind.list.prepend(bar‘)

Die Methode insert fügt Werte an der angegebenen Stelle index ein:

..code-block:: python

sh.Oma.Papa.Kind.list.insert(2, ‚baz‘)

Die Methode pop entfernt den letzten (bzw. angegebenen) Wert der Liste und gibt ihn zurück:

..code-block:: python

value = sh.Oma.Papa.Kind.list.pop() value = sh.Oma.Papa.Kind.list.pop(2)

Die Methode extend hängt die Elemente der übergebenen Liste an die Liste des Items an: def extend(self, value, caller=‘Logic‘, source=None, dest=None):

..code-block:: python

sh.Oma.Papa.Kind.list.extend([‚foo‘, ‚bar‘])

Die Methode clear leert die Liste:

..code-block:: python

sh.Oma.Papa.Kind.list.clear()

Die Methode delete entspricht dem Python-Befehl del list[x[:y]] und löscht das bzw. die angegebenen Elemente der Liste. Aus Syntaxgründen heißt die Methode delete statt del und der Index bzw. der Index-Bereich muss als String übergeben werden:

..code-block:: python

sh.Oma.Papa.Kind.list.delete(2) sh.Oma.Papa.Kind.list.delete(„1:3“)

Die Methode remove entfernt das angegebene Element aus der Liste:

..code-block:: python

sh.Oma.Papa.Kind.list.remove(‚foo‘)

Dict-Items

Die Methode get gibt den Wert für den angegebenen Key zurück. Wenn der Key im dict nicht existiert, wird None oder der übergebene Default-Wert zurückgegeben:

..code-block:: python

value1 = sh.Oma.Papa.Kind.dict.get(‚foo‘)

..code-block:: python

value2 = sh.Oma.Papa.Kind.dict.get(‚bar‘, 42)

Die Methode delete entspricht dem Python-Befehl del dict[key] und lösche den angegebenen Key aus dem dict:

..code-block:: python

sh.Oma.Papa.Kind.dict.delete(‚foo‘)

Die Methode clear leert das dict:

..code-block:: python

sh.Oma.Papa.Kind.dict.clear()

Die Methode pop entfernt den angegebenen Key aus dem dict und liefert den entfernten Wert zurück:

..code-block:: python

value = sh.Oma.Papa.Kind.dict.pop(‚bar‘)

Die Methode popitem entfernt den zuletzt hinzugefügten Key aus dem dict und liefert das Set (key, value) zurück:

..code-block:: python

(key, value) = sh.Oma.Papa.Kind.dict.popitem()

Die Methode update aktualisiert das dict mit dem Inhalt des übergebenen dict:

..code-block:: python

sh.Oma.Papa.Kind.dict.update({‚foo‘: 42, ‚bar‘: 23})