Die Seriennummer des virtuellen CUxD-Gerätes, aus der danach die Adressen der Datenpunkte berechnet werden. Diese wird in der Geräteliste angezeigt
Eine nette Fingerübung: Die IP-Adresse der CCU in einer Systemvariablen speichern
Auf dieser Seite
Es gibt sicher keinen großen Bedarf dafür, die IP-Adresse der CCU zu bestimmen. Aber es ist ein gutes Beispiel dafür, wie ein Programm vom CUx-Daemon ausgeführt wird und die Bildschirmausgabe zurück in die CCU kommt.
Strings in HomeMatic-Scripten
Durch String-Verwendung in HomeMatic-Scripten kann die CCU fehlerhaft arbeiten, instabil werden oder sogar abstürzen. Grundsätzlich gilt: Je öfter mit Strings hantiert wird, desto eher führt dies zu Problemen.
Ich empfehle daher, nach Umsetzung dieser Anleitung die CCU unter Beobachtung zu halten.
Die Shell ist die Kommandozeile eines Linux-Systems. Auf der CCU erreicht man sie per Telnet (CCU 1) bzw. SSH (CCU 2). Dort probiere ich die Befehle aus, die ich später vom CUx-Daemon ausführen lassen möchte.
Zunächst starte ich ifconfig für die normale Netzwerkschnittstelle der CCU. Diese heißt eth0 und ifconfig liefert dieses Ergebnis:
~ # ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:00 inet addr:192.168.178.14 Bcast:192.168.178.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:119410 errors:0 dropped:0 overruns:0 frame:0 TX packets:64389 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:22900160 (21.8 MiB) TX bytes:15350466 (14.6 MiB) Interrupt:24 Base address:0xc000 ~ #
Die gesuchte Information findet sich in der zweiten Zeile der Ausgabe hinter „inet addr“. Alles andere brauche ich nicht.
Ich wende darum ein wenig awk-Magie auf die Ausgabe an und bekomme genau das, was ich suche – nicht mehr und nicht weniger.
gesamtes Script markieren / kopieren
~ # ifconfig eth0 | awk '/inet addr/ && match ($0, /[0-9\.]+/) { printf substr ($0, RSTART, RLENGTH); }' 192.168.178.14~ #
Was hier passiert, ist folgendes:
Ein Zeilenumbruch am Ende würde mit in der Systemvariablen gespeichert – das brauchen wir nicht.
Die Systemvariable, in der die IP-Adresse gespeichert wird, nenne ich ganz fantasielos IP-Adresse und es ist eine simple Zeichenkette.
Das WebUI-Programm ist ebenso simpel. Es gibt nicht einmal eine Bedingung.
Im Normalfall sollte sich die Adresse im laufenden Betrieb niemals ändern. Es reicht also, wenn das Script bei jedem Systemstart ausgeführt wird – die Wenn … -Bedingung kann entsprechend der Logik von WebUI-Programmen frei bleiben.
Das eigentliche Programm ist ein Fünfzeiler und demonstriert, wie der CUx-Daemon diese Aufgabe bewältigen kann.
gesamtes Script markieren / kopieren
! HomeMatic-Script ! IP-ADRESSE HERAUSFINDEN ! http://www.christian-luetgens.de/homematic/cuxd/ipadresse/IP-Adresse.htm string s_cuxd = "CUxD.CUX2801001:2."; string s_cmd = "ifconfig eth0 | awk '/inet addr/ && match ($0, /[0-9\.]+/) { printf substr ($0, RSTART, RLENGTH); }'"; dom.GetObject (s_cuxd # "CMD_SETS").State (s_cmd); dom.GetObject (s_cuxd # "CMD_QUERY_RET").State (1); dom.GetObject ("IP-Adresse").State (dom.GetObject (s_cuxd # "CMD_RETS").State()); ! Ende des Scripts
Zeile 1
Die Seriennummer des virtuellen CUxD-Gerätes, aus der danach die Adressen der Datenpunkte berechnet werden. Diese wird in der Geräteliste angezeigt
Wie man sieht, habe ich den virtuellen Kanal umbenannt – solange ich genug Kanäle übrig habe, bekommt jede Aufgabe ihren eigenen Kanal, so dass sie sich nicht ins Gehege kommen. Im Script spielt der Name freilich keine Rolle, dort geht es streng nach Seriennummer.
Zeile 2
Hier setze ich meinen Shell-Befehl in eine String-Variable.
Die CCU stellt sich manchmal etwas an, wenn man komplexe Strings direkt an .State() oder andere Funktionen übergibt. Darum – und für die Übersichtlichkeit – gehe ich über einen String.
Zeile 3
Im Datenpunkt CMD_SETS wird dem CUx-Daemon mitgeteilt, welcher Befehl auf diesem Kanal ausgeführt werden soll.
Zeile 4
Der Datenpunkt CMD_QUERY_RET steuert, wie der CUx-Daemon mit dem anschließenden Befehl CMD_RETS umgehen soll.
Klingt alles etwas wurstig, aber die Möglichkeiten sind halt begrenzt, eine solche Funktionalität in der WebUI abzubilden. Insofern hat der Programmierer des CUx-Daemons das Beste aus einer schlechten Ausgangslage gemacht. Meinen Dank hat er dafür!
Zeile 5
Wie in Zeile 4 schon beschrieben, wird mit CMD_RETS der Befehl ausgeführt und die Ausgabe (also dank awk die reine IP-Adresse) zurückgeliefert. Die speichere ich dann gleich ohne Umwege in meiner Systemvariablen.
ifconfig ist ein Programm, das keine lange Laufzeit hat. Insofern macht es auch nichts, dass die Logikschicht der CCU steht, bis der Befehl abgearbeitet wurde.
Meine IP-Adresse kann ich mir jetzt auf dem Startbildschirm der CCU anzeigen lassen, indem ich sie unter Einstellungen / Benutzerverwaltung bei meinem Benutzer hinzufüge.
Das ist auch absolut sinnvoll, denn wenn man etwas wissen möchte, nachdem man ein Gerät über seine IP-Adresse im Browser aufgerufen hat, dann ist es doch die IP-Adresse, die man gerade in die Adresszeile geschrieben hat …