IP-Adresse herausfinden

Eine nette Fingerübung: Die IP-Adresse der CCU in einer Systemvariablen speichern

5410 Zeichen
Score aktualisiert
100%
Code: 1aab10cb2e814980825a173e6537bf31
Token in Entwicklung nicht aktualisiert
img-Tag in Entwicklung deaktiviert

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.

Shell

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.

~ # 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.

Systemvariable

Die Systemvariable, in der die IP-Adresse gespeichert wird, nenne ich ganz fantasielos IP-Adresse und es ist eine simple Zeichenkette.

WebUI-Programm

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.

Script

Das eigentliche Programm ist ein Fünfzeiler und demonstriert, wie der CUx-Daemon diese Aufgabe bewältigen kann.

! 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.

  • Wird CMD_QUERY_RET auf 1 gesetzt und innerhalb der nächsten 10 Sekunden CMD_RETS abgefragt, so wird durch die Abfrage der Befehl in CMD_SETS ausgeführt und der Output des Programms zurückgeliefert. Das Script – und damit die gesamte CCU – bleibt stehen, bis der Befehl abgearbeitet wurde.
  • Wird CMD_QUERY_RET nicht auf 1 gesetzt, bewirkt die Abfrage von CMD_RETS keine Programmausführung. Stattdessen kann dort der Exitcode des Programms abgerufen werden, wenn dieses mit CMD_SETS ausgeführt wurde.

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.

Anwendungsbeispiel

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 …

Navigation