Ein kleines Programm für den CCU-Bot, um die IP-Adresse des Internetanschlusses zu ermitteln
Auf dieser Seite
Aus Schaden wird man klug, wie es so schön heißt.
Der Schaden entstand in diesem Fall durch einen Stromausfall von wenigen Minuten. Danach ist im Prinzip alles wieder ordnungsgemäß hochgefahren, was bei mir so an Elektrik in Schränken und Regalen steht (oder im Fall der CCU an der Wand hängt). Bei der HomeMatic hat es einen Tür-/Fensterkontakt und zwei Schaltaktoren erwischt, die noch einen weiteren Neustart brauchten, und meine Jalousien standen nicht mehr ganz so, wie sie sollten, aber ansonsten alles Gold.
Allerdings hat meine FritzBox eine neue IP-Adresse bekommen und sich nicht beim Dyndns-Anbieter registriert. Dadurch konnte ich meinen Internetanschluss nicht mehr in den Weiten des Internets wiederfinden. Ich kam nicht mehr in mein lokales Netz und damit letztlich auch nicht mehr auf die Weboberfläche der CCU.
Da saß ich nun in Budapest und alles, was ich noch von meiner HomeMatic hatte, war der CCU-Bot. Sch… ade.
Ich habe alle fünf Minuten meine Raumthermostate abgefragt, aber befriedigend war das nicht.
Wenn es doch nur eine Möglichkeit gäbe, einen Befehl irgendwo einzugeben, auf den die CCU dann reagiert und mir ihre IP-Adresse verrät … Ich hätte dann die Adresse manuell registrieren können und wäre wieder Herr im Haus gewesen.
Variablen in HomeMatic-Scripten
Die CCU hatte früher ein Limit von maximal 200 Variablen, das mit Firmware-Version 2.29.18 aufgehoben wurde. Dieses Limit bezog sich auf alle Variablen, die in allen Scripten verwendet werden. Gemeint sind Variablen, die direkt im Script definiert werden: object x; object y; var z;
Wenn Scripte nicht mehr funktionieren und bei der Prüfung unerklärliche Syntax-Fehler auftreten, sollte versuchsweise dieses Programm wieder gelöscht oder deaktiviert werden – oder, noch besser, auf die aktuelle Firmware-Version aktualisiert werden.
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.
Benennung von Systemvariablen
Prinzipiell kann man Systemvariablen – so wie allen Objekten in der CCU – beliebige Namen geben, also z. B. auch Umlaute und Sonderzeichen verwenden. Ich empfehle jedoch, sich auf reguläre Buchstaben (a-z, A-Z) zu beschränken: Bei Umlauten und Sonderzeichen besteht die Gefahr, dass Systemvariablen in Scripten nicht überall gefunden werden.
Wer seine CCU über irgendwelche Cloud-Dienste anspricht, hat natürlich nicht diese von mir beschriebenen Probleme. In diesem Fall kümmert sich der Cloud-Anbieter (hoffentlich) darum, dass die CCU jederzeit erreichbar ist.
Nun hatte ich den sicheren Zugriff auf meine CCU schon eingerichtet, als es noch praktisch keine Cloud-Dienste samt passender Apps gab. Ich habe also keinen Grund, mich in die Arme eines Dienstleisters zu begeben.
Davon abgesehen bin ich auch kein großer Fan von Clouds. Ein bisschen Telegram geht klar, aber irgendjemandem letztlich Vollzugriff auf meine Haustechnik zu gewähren, widerstrebt mir.
Getreu den Mottos „never touch a running system“ und „was nicht kaputt ist, muss man auch nicht reparieren“ bleibe ich bei meinem bewährten Gebastel. Nur den Zauberer, der mir meine IP-Adresse verrät, den hätte ich dann doch gerne.
Ein kleines Programm für den CCU-Bot zu schreiben, das den Befehl /ip mit der aktuellen IP-Adresse beantwortet, ist im Prinzip Kinderkram. Aber woher bekommt man die IP-Adresse?
Die Fritzbox kennt natürlich ihre Internet-Adresse (WAN-IP). Man kann sie sogar abfragen, allerdings sprengt das etwas den Rahmen eines CCU-Scriptes. Zudem wäre diese Lösung auch nicht besonders portabel: Wer keine Fritzbox hat (oder seine Fritzbox nicht passend konfiguriert), kann damit nichts anfangen.
Es gibt aber verschiedene Anbieter im Internet, die die IP-Adresse zurückliefern, von der ihre Seiten aufgerufen werden. Wie ist meine IP.de ist vom Namen her am naheliegendsten, aber ifconfig.me hat den entscheidenden Vorteil, bei Aufruf über wget oder curl schnörkellos die reine IP-Adresse zurückzuliefern.
# wget --quiet --output-document - ifconfig.me 31.18.33.27#
Auch regfish, über die ich meine Domains registriert habe, bietet einen solchen Dienst. Das ist sinnvoll, weil man per Dyndns direkt bei regfish die IP-Adressen seiner Domains (und Subdomains) aktualisieren kann:
# wget --quiet --output-document - dyndns.regfish.de/show_myip.php 31.18.33.27#
Möglichkeiten gibt es also genug.
Experten werden es bemerkt haben: Ich befasse mich hier nur mit IPv4-Adressen. Da diese Adressen begrenzt sind, bekommen die Geräte im LAN die Adressen aus dem Subnet des Routers, also zum Beispiel der Fritzbox. Der Router setzt dann bei Zugriffen ins Internet die LAN-IPs so um, dass jedes Gerät mit derselben IP-Adresse im Internet auftritt – der des Routers. Man nennt diese Technik NAT (Network Address Translation).
Daraus kann man jetzt messerscharf den Schluss ziehen, dass auch die CCU zwei IP-Adressen zurückmelden könnte: Die eigene, lokale LAN-IP, und die externe WAN-IP des Routers.
Ich illustriere den Zusammenhang anhand folgender graphischer Aufbereitung:
Wenn man das Problem hat, in Mitteleuropa nicht in sein Heimnetz zu kommen, dann ist die eigene Adresse der CCU in der Regel eher uninteressant. Aber wenn wir schon mal dabei sind …
# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:1A:22:02:B2:D4 inet addr:192.168.178.10 Bcast:192.168.178.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2720308 errors:0 dropped:4282 overruns:0 frame:0 TX packets:1218769 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:278652006 (265.7 MiB) TX bytes:591750275 (564.3 MiB) #
eth0 ist das erste (und einzige) Ethernet-Interface der CCU. Die Adresse der CCU steht unter inet addr 192.168.178.10. Diese Adresse findet sich – ebenso wie die WAN-IP 31.18.33.27 aus dem vorigen Abschnitt – in der obigen Graphik wieder.
In dieser Form kann man mit dem Ergebnis nicht viel anfangen. Als Fan von awk verwende ich natürlich awk, um das Passende herauszufiltern:
# ifconfig eth0 | awk '/inet addr:([0-9:]+)/ { printf gensub (".*:", "", "", $2) ; }' 192.168.178.10#
Ich lasse awk die Zeile suchen, in der inet addr: mit ein paar Zahlen auftaucht. Da schneide ich dann aus dem zweiten Feld alles vor dem Doppelpunkt weg und bekomme genau das, was ich brauche. Wer es genauer wissen möchte, kann sich die Doku zu awk durchlesen und regex lernen. Lohnt sich! Kann man immer brauchen!
Für uns ist an dieser Stelle nur relevant, dass ich jetzt auch die lokale IP-Adresse der CCU herausfinden kann.
Um Befehle auszuführen, brauche ich den CUxD. Man könnte es auch mit system.Exec() realisieren, aber die Vorteile des CUx-Daemons sind bekannt.
Ich reserviere mir also einen Kanal für die IP-Abfrage:
Das Programm fügt sich dann nahtlos in den CCU-Bot ein. Es reagiert wie immer auf die Systemvariable Telegram.Command und führt ein Script aus, wenn die Systemvariable nicht leer ist.
Als Verzögerung habe ich hier 15 Sekunden gewählt. Eilig sollte ich es bei meinem Bot ohnehin nicht haben.
Das Script, welches dann ausgeführt wird, enthält die beiden oben beschriebenen Befehle, um die IP-Adressen herauszufinden, und macht daraus einen hübschen Text für das Telegram-Framework.
gesamtes Script markieren / kopieren
! HomeMatic-Script ! PEILSENDER ! http://www.christian-luetgens.de/homematic/ccubot/ifconfig/Wie_ist_meine_IP.htm object o = dom.GetObject ("Telegram.Command"); if (o.Value() == "/ip") { object telegram = dom.GetObject ("Telegram"); dom.GetObject ("CUxD.CUX2801001:6.CMD_SETS").State ("wget --quiet --output-document - ifconfig.me"); dom.GetObject ("CUxD.CUX2801001:6.CMD_QUERY_RET").State (1); string extern = dom.GetObject ("CUxD.CUX2801001:6.CMD_RETS").State(); dom.GetObject ("CUxD.CUX2801001:6.CMD_SETS").State ("ifconfig eth0 | " # "awk '/inet addr:([0-9:]+)/ { printf gensub (\".*:\", \"\", \"\", $2) ; }'"); dom.GetObject ("CUxD.CUX2801001:6.CMD_QUERY_RET").State (1); string lokal= dom.GetObject ("CUxD.CUX2801001:6.CMD_RETS").State(); telegram.State ("*IP-Adressen*\nextern " # extern # "\nlokal " # lokal); o.State (""); } ! Ende des Scripts
Der Ablauf des Programms ist im Prinzip sehr einfach.
Und das war’s. Ein kurzer Test vermeldet Erfolg:
Es ist ja immer gut, wenn man sein zu Hause wiederfindet, egal wo man ist. Falls ich es mal aus den Augen verliere, kann meine HomeMatic mir ab jetzt weiterhelfen – sofern sie Internet hat und der CCU-Bot läuft.