Variablen-/ Parameter- /Rollendefinition

Ich komme da leider auch nicht weiter…
Bei mir hat der Wandthermostat die id 2, und der Raum ist ebenfalls id 2
Die ersten 3 Eingaben funktionieren noch wie im Grundlagenartikel beschrieben.

# homegear -e rc '$hg->setRoomMetadata(2, array("icon" => "sofa_1"));'

# homegear -e rc 'print_v($hg->addVariableToRoom(2,1,"ACTUAL_TEMPERATURE",2));'
(Boolean) 1

# homegear -e rc 'print_v($hg->addRoleToVariable(2,1,"ACTUAL_TEMPERATURE",201001));'
(Boolean) 1

addUIElement geht dann aber krachen :frowning:

# homegear -e rc '$hg->addUiElement(2, 1, "ACTUAL_TEMPERATURE", "Raumtemperatur");'
PHP Fatal error:  Uncaught Homegear\HomegearException: Role has no UI definition. in
/var/libhomegear/scripts/inline.php:7
Stack trace:
#0 /var/lib/homegear/scripts/inline.php(7): Homegear\Homegear->__call('addUiElement', Array)
#1 {main}
thrown in /var/lib/homegear/scripts/inline.php on line 7

@Sim
Wie bekomme ich denn heraus, welche Variablen / Rollen ich definieren muss?
Bzw. welche ich überhaupt definieren kann.
Meine Intention war so minimalistisch wie möglich vorzugehen und erst mal nur die aktuelle Temperatur anzuzeigen …
Und mehr wurde ja im Grundlagenartikel auch nicht gemacht, nur mit dem Unterschied, das dort STATE als Varaible angegeben wurde.
Und mit STATE funktioniert es auch nicht!

Und was genau ist den eigentlich eine Rolle, sprich wie die Definiton für Rolle?

So, habe ein stable 0.7.48 noch mal neu aufgesetzt, um alle Zweifel auszuräumen.
Das Beispiel aus https://forum.homegear.eu/t/grundlagen-homegear-starter-guide/1143/17 funktioniert auch auf einem frisch augesetzten pi4 mit Raspian Buster nicht …

$ sudo homegear -e rc '$hg->addVariableToRoom(1, 1, "STATE", 1);'
$ sudo homegear -e rc '$hg->addRoleToVariable(1, 1, "STATE", 100001);'
$ sudo homegear -e rc '$hg->addUiElement(1, 1, "STATE", "Balkontuere");'
PHP Fatal error:  Uncaught Homegear\HomegearException: Error getting variable description.
Are you authorized to access the variable? in /var/lib/homegear/scripts/inline.php:7
Stack trace:
#0 /var/lib/homegear/scripts/inline.php(7): Homegear\Homegear->__call('addUiElement', Array)
#1 {main}
homegear -e rc '$hg->addVariableToRoom(1, 1, "STATE", 1);'

Hast du gemacht?
Hat das Gerät 1, Kanal 1 denn überhaupt eine Variable State?

Hallo,

ja ich habe die Befehle genau so ausgeführt. Bei den Angaben handelt es sich genau um die Eingaben bzw. Ausgaben, die ich in der Kommandozeile sehe.
Wenn die Variable nicht mit dem Befehl “addRoleToVariable” dem “peer” nicht zugeordnet werden kann, hätte ich doch hoffentlich eine Fehlermeldung erhalten. Oder werden die Eingaben blind akzeptiert?
Wenn das des Fall wäre, würde ich eine Erweiterung der Fehlerbehandlung für sinnvoll erachten.

Der Hinweis, ob es die Variable “STATE” überhaupt gibt, hat mich ins Grübeln gebracht.
Ich habe nirgends eine Doku bzw. eine Definition für den Begriff “Variable” gefunden. Das scheint mir aber essentiell zu sein.

Daher möchte ich hier erst mal versuchen zu beschreiben, was ich inzwischen meine verstanden zu haben. Sonst reden wir bestimmt aneinander vorbei.

Variablen:
Variablen sind typisierte Elemente. Eine Variable kann, ebenso wie ein Parameter, nur Werte innerhalb des ihr zugeordneten Wertebereiches enthalten.
Zulässige Typen sind: Enumeration, Boolean, Interger und Float.
Die Wertebereiche schränken die zulässigen Werte innerhalb eines Typen ein.

- Systemvariablen
??? Bislang keine Ahnung wie die funktionieren, definiert sind und wofür sie gut sind ???

- Gerätevariablen
Bei Gerätevariablen handelt es sich um Elemente, die gerätespezifisch definiert werden.
Welche Variable für ein Gerät definiert ist, kann in der Device Referenz für jedes physisch verfügbare Gerät in den Abschnitten “Variables” nachgelesen werden.
Jeder gerätespezifisch definierte Channel (Link einfügen zu: Was ist ein channel?) kann einen Block “Variables” enthalten.

Achtung, Achtung:
Über den Namen eines Elementes kann keinerlei Rückschluss darauf gezogen werden, ob es sich um eine Variable oder einen Parameter handelt. Selbst wenn es sich inhaltlich um die gleiche Funktionalität handelt, und es vom gleichen Typus ist.
Beispiel: BOOST_TIME_PERIOD
In dem MAX! Basic Thermostat BC-RT-TRX-CyN ist das Element BOOST_TIME_PERIOD unter Channel 1 -> Variables definiert. Es handelt sich also um eine Variable.

Im Homematic Thermostat HM-CC-RT-DN ist das Element BOOST_TIME_PERIOD unter Channel 0 -> Device Configuration Parameters abgelegt.
Hier handelt es sich also nicht um eine Variable, sondern um einen Parameter!

Damit ergibt sich natürlich gleich eine Folge-Frage:
Worin unterscheiden sich Parameter und Variablen?

Hallo,

ich wünsche Allen ein frohes neues Jahr 2021.

Es wäre schön, wenn jemand meine Gedanken zu Variablen erweitern, korrigieren oder bestätigen könnte.

Auch eine Info was es denn Systemvariablen auf sich hat, könnte helfen.

VG
Henning

Niemand der dazu was sagen kann?

Ich versuchs mal…

(Geraete-)Variablen sind einfach die Stellen, an denen die aktuellen Daten des Geraetes “gespeichert” sind (z.B. aktueller Status eines Schalters, aktuelle Temperatur, Soll-Temperatur, etc.pp.). Diese Daten koennen sich dynamisch durch einfache pysikalische oder virtuelle Interaktion mit dem Geraet aendern.

Parameter sind “Gereaeteeinstellungen” die sich normalerweise nicht dynamisch durch einfache physikalische/virtuelle Interaktion am Geraet oder einer Programmierung aendern lassen. Normalerweise deshalb, weil Ausnahmen die Regel bestaetigen. So kann es auch durchaus sein, dass (von der Logik her) Parameter als Variablen deklariert werden. Manchmal laesst sich bei der Implementierung auch gar nicht unterscheiden, ob es sich um einen Parameter oder eine Variable handelt. Ich denke, das ganze ist einfach historisch bedingt, da Homegear damals™ mit Homematic als erste Familie angefangen hat, und es dort die strikte Unterscheidung zwischen Parameter & Variable gibt.

Systemvariablen sind wie Geraetevariablen, nur ohne Bezug zu einem wirklich Geraet. Darueber koennen z.B. globale Dinge gespeichert werden (Anwesenheit, Alarmanlage …).

– Micha

1 Like

Habe die ersten Begriffe für mich mal zusammengefasst.
Es fehlt mir aber noch einiges. z.B. Rollen, Variablenprofile, Gruppen …

Variablen:
Variablen sind typisierte Elemente, die einen Speicherplatz für aufzunehmende Daten benennen. Eine Variable kann, ebenso wie ein Parameter, deshalb auch nur Werte innerhalb des ihr zugeordneten Wertebereiches enthalten.
Zulässige Typen sind: Enumeration, Boolean, Interger und Float.
Die Wertebereiche schränken die zulässigen Werte innerhalb eines Typen ein.
Die Inhalte von Variablen können durch das System, ein Gerät oder durch einfache pysikalische oder virtuelle Interaktion verändert werden. Die Lebensdauer eines Wertes einer Variablen ist üblicherweise eher kurz.
(z.B. aktueller Status eines Schalters, aktuelle Temperatur, Soll-Temperatur, etc.pp.)

- Systemvariablen
Bei Systemvariablen handelt es sich um Elemente, die unabhängig von einem Gerät definiert werden. Sie stellen also Speicherplatz bereit, der systemweit zur Verfügung steht.
(z.B. Uhrzeit des Sonnenaufgangs am aktuellen Tag)

- Gerätevariablen
Bei Gerätevariablen handelt es sich um Elemente, die gerätespezifisch definiert sind, und daher nur im Kontext der Interaktion mit einem Gerät verwendet werden können.
Welche Variable für ein Gerät definiert ist, kann in der Device Referenz für jedes physisch/virtuell verfügbare Gerät in den Abschnitten “Variables” nachgelesen werden.
Jeder gerätespezifisch definierte Channel (siehe unten) kann einen Block “Variables” und “Parameters” enthalten.
(z.B. Soll Temperatur eines Thermostaten)

Parameter:
Parametern unterscheiden sich von Gerätevariablen lediglich auf organisatorischer Ebene.
Inhaltlich handelt es sich um "Geräteeinstellungen”, die sich im Gegensatz zu einer Variablen normalerweise nicht regelmäßig oder dynamisch ändern.
Als Beispiel könnte die Einstellung für die Temperatur eines Thermostaten zur Nachtabsenkung dienen. Dieser Parameter wird üblicherweise im Rahmen einer Einrichtung des Systems eingestellt und dann dauerhaft so verwendet.
Im Rahmen einer Neukonfiguration kann der zugeordnete Wert selbstverständlich verändert werden.
Je nach Device, Protokoll und Hersteller erfolgt die Aufteilung in Parameter und Variablen durchaus fließend.
In Ausnahmefällen kommt es daher vor, das in Gerätedefinitionen Variablen als Parameter oder Parameter als Variablen deklariert werden (müssen).

** Achtung, Achtung:**
Auch über den Namen eines Elementes kann keinerlei Rückschluss darauf gezogen werden, ob es sich um eine Variable oder einen Parameter handelt. Selbst wenn es sich inhaltlich um die gleiche Funktionalität handelt, und es vom gleichen Typus ist.
Beispiel: BOOST_TIME_PERIOD
In dem MAX! Basic Thermostat BC-RT-TRX-CyN ist das Element BOOST_TIME_PERIOD unter Channel 1 -> Variables definiert. Es handelt sich also um eine Variable.

Im Homematic Thermostat HM-CC-RT-DN ist das Element BOOST_TIME_PERIOD unter Channel 0 -> Device Configuration Parameters abgelegt.
Hier handelt es sich also nicht um eine Variable, sondern um einen Parameter!

Channel
Ein Channel definiert ein Subband, also eine Untermenge innerhalb eines Frequenzbereiches. Der Hersteller eines ShortRangeDevices verwendet häufig mehrere Kanäle.
Der nutzbare, bzw. der für eine spezifische Interaktion zu nutzende Kanal ist daher gerätespezifisch und kann ebenfalls in der Device Referenz nachgeschlagen werden.

Henning

1 Like

Zum Thema Rolle habe ich außer einem Hinweis im Grundlagenartikel nichts brauchbares gefunden.

2.3 Rollen

Die verfügbaren Rollen finden sich in der Admin-UI oder hier auf Git . Unsere Testumgebung kann man auf test.homegear.eu einsehen und ausprobieren. Folgend ein paar Beispiele:

Wenn man in die Admin-UI schaut, bekommt man bereits definierte Rollen angezeigt.
Allerdings beschränkt sich das auf wenige Elemente:

  • ID = eindeutige Nummer einer Rolle
  • Name = Freitext in Deutsch und 'Englisch

Läßt man sich eine ID auf der CLI anzeigen, gibt es je nach ID mehr oder weniger Daten.

homegear -e rc 'print_v($hg->getRoleMetadata(100001));'
homegear -e rc 'print_v($hg->getRoleMetadata(201002));'

Auch im Reference Guide findet man zum Inhalt außer den Übersetzungen nur “arbitrary metada”.

Folgt man dem Grundlagenartikel und versucht sich vorhandene UI Elemente anzuzeigen (die haben wohl irgendwas mit Rollen zu tun) landet man bei einer Fehlermeldung:

pi@homegear(ro):~$ sudo homegear -e rc 'print_v($hg->getAllUiElements(“de-DE”));'
PHP Fatal error:  Uncaught Error: Undefined constant "“de" in /var/lib/homegear/scripts/inline.php:7
Stack trace:
#0 {main}
  thrown in /var/lib/homegear/scripts/inline.php on line 7

Und aus den Namen der Rollen kann man auch nichts herauslesen.
Was z.B. bedeutet “Beschattung hoch” ?
Handelt es sich dabei um einen Status im Sinne von “Der Rolladen befindet sich im hochgefahrenen Zustand” ?
Oder ist damit der Befehl “Signal zum Hochfahren” gemeint.
Oder ist es “Der Rolladen fährt gerade hoch”?
Oder, oder, oder?

Manches kann man direkt über die Kommandozeile erahnen. Bei “Sicherheit Fensterzustand” gibt es scheinbar “geöffnet” und “geschlossen”.
Aber warum gibt es keinen Eintrag für “gekippt” oder “gekippt und abgeschlossen”?

Mir fällt es überaus schwer zu erahnen, was die Intention der/des Erfinder(s) von Rollen war.

Wäre schön, wenn jemand mal erklären könnte was denn nun eine Rolle ist…

Die Hochkommas sind falsch. So sollte es heißen: homegear -e rc 'print_v($hg->getAllUiElements("de-DE"));'

Im Pfad /etc/homegear/devices/uiBase/de-DE/ findest du die bislang definierten UI-Elemente. Darunter auch einen doorHandle, welcher auch gekippt anzeigen kann. Für abgeschlossen hatten wir noch keinen Anwendungsfall.

Man nehme an man hat eine Variable State, welche visualisiert werden soll. Sie kann true oder false annehmen. Diese Variable kann ein Fenster, eine Türe, ein Dachfenster, eine geschaltete Steckdose, ein Licht, etc. sein. Irgendwie muss ja nun festgelegt sein, wie diese Variable visualisiert werden muss, beziehungsweise in welcher Gruppe/ Kategorie sie sich befinden soll. Diese Aufgabe erfüllen derzeit die Rollen.

Ok, hier gab es scheinbar ein Problem beim kopieren. Ich hatte das per cut&paste übernommen.
Die einfachen Hochkommata wurden zu Backticks. Das hatte ich ziemlich schnell gemerkt.
Die doppelten Anführungszeichen habe ich nicht gerafft. :frowning:

Bis dahin ist alles klar und klingt für mich auch überaus logisch. Aber jetzt…

Mit dem Satz kann ich dann nicht wirklich etwas anfangen.

Wie wird denn die Verbindung von einer Rolle, bzw deren ID (Ist ja wohl Schlüssel oder zumindest Schlüsselkandidat) hergestellt?

Im ersten Schritt werden mit 1-n “addVariableToRoom” Befehlen, alle gewünschten Variablen einem Raum zugeordnet. Dabei kann es sich sowohl um Systemvariablen handeln, oder um Gerätevariablen (Parameter dito?). Diese werden jeweils durch die PeerID, den Kanal und ihren Namen spezifiziert! Der Erfolg der Zuweisung wird mit einem “(Boolean) 1” quittiert.
Ein Mißerfolg mit “(Boolean) 0” oder einem “PHP Fatal Error”
Beispiel:

 pi@homegear(rw):~$ sudo homegear -e rc 'print_v($hg->addVariableToRoom(2,1,"CONTROL_MODE",2));'
 (Boolean) 1
 pi@homegear(rw):~$ sudo homegear -e rc 'print_v($hg->addVariableToRoom(2,1,"BLABLUBB",2));'
 (Boolean) 0

pi@homegear(rw):~$ sudo homegear -e rc ‘print_v($hg->addVariableToRoom(2,1,“CONTROL_MODE”,88));’
PHP Fatal error:

Bei mir wäre das also analog zum Grundlagenartikel folgendes:

pi@homegear(rw):~$ sudo homegear -e rc 'print_v($hg->addVariableToRoom(2,1,"ACTUAL_TEMPERATURE",2));'
(Boolean) 1
pi@homegear(rw):~$ sudo homegear -e rc 'print_v($hg->addVariableToRoom(2,1,"SET_TEMPERATURE",2));'
(Boolean) 1
pi@homegear(rw):~$ sudo homegear -e rc 'print_v($hg->addVariableToRoom(2,1,"CONTROL_MODE",2));'
(Boolean) 1

Mit dem RPC addRoleToVariable wird die gewünschte Variable eines devices dann mit einer Rolle bzw. deren ID verknüpft.
“addRoleToVariable” suggeriert, das es sich um eine Variable handeln muss. Da es keine analoge Funktion für Parameter gibt, hoffe ich doch mal, das man auf die gleiche Art und Weise auch einen Parameter mit einer Rolle verknüpfen kann.

Bei mir wäre das also:

pi@homegear(rw):~$ sudo homegear -e rc 'print_v($hg->addRoleToVariable(2, 1, "ACTUAL_TEMPERATURE", 201001));'
(Boolean) 0
pi@homegear(rw):~$ sudo homegear -e rc 'print_v($hg->addRoleToVariable(2, 1, "SET_TEMPERATURE", 201002));'
(Boolean) 0
pi@homegear(rw):~$ sudo homegear -e rc 'print_v($hg->addRoleToVariable(2, 1, "CONTROL_MODE", 201003));'
(Boolean) 0

Auffällig ist dabei, das hier “(Boolean) 0” als Antwort kommt.

Schließlich würde noch mit “addUiElement” die Rolle, bzw. die ID der Rolle der UI zugeordnet.
Abgesehen davon, das es zu einer Fehlermeldung kommt…
Wie kommt denn die Verbindung der Rolle mit dem UI-Device zustande?

pi@homegear(rw):~$ sudo homegear -e rc 'print_v($hg->addUiElement(2, 1, "SET_TEMPERATURE", "Heizung"));' 
PHP Fatal error:  Uncaught Homegear\HomegearException: Could not find a matching variable set. in /var/lib/homegear/s