Hinweis für Erreichbarkeit aus dem Internet
Das, was ich jetzt zu sagen habe, gilt nicht nur für SmServer sondern für alle Geräte, die über das Internet kommunizieren.
Die Technik entwickelt sich immer weiter und wird schneller, was gut ist.
Leider nutzen diese immer schneller werdende Technik nicht nur gute Menschen. Man versucht Daten zu bekommen, die denen gar nichts angehen, Schaden anzurichten oder gar Systeme zum Absturz zu bringen. Bei letzderem kann es sogar sein, dass du ungewollt dabei hilfst. Einmal was angeklickt und du machst mit. Beobachte die CPU-Belastung deines Gerätes.
Natürlich ist das seit Jahren schon bekannt. Deshalb sollte die Software von Geräten, die im Internet kommunizieren, ab und zu aktualisiert werden.
Wie gesagt, die Entwickung geht weiter, das bedeutet auch, das sehr Altes nicht mehr gepflegt wird.
Nun (September 2025) sind wir an dem Punkt angekommen, wo es keine neuen Versionen von Linux-Debian für 32-Bit-Systeme mehr geben wird. Und schätzungsweise kann man ab 2030 solche Systeme nicht mehr aktualisieren.
Für die Planung von Geräten mit Internet empfehle ich ein 64-Bit-System. Derzeit braucht man dazu mindestens ein Raspberry PI 3B. So ist sichergestellt, dass man noch viele Jahre aktualisieren kann.
Soll das Gerät nur im vertrauenswürdigem Heimnetz kommunizieren, kann man weiter 32-Bit-Systeme nutzen.
Inhalt
SmServer über das Internet ansprechen
Für Nutzer die nicht direkt den SmServer aus dem Internet ansprechen wollen, ist dieser Artikel uninteresant. Die Web-Oberfläche hat damit nichts zu tun.
Möchte man ExternSm-Objekte (Objekte auf anderen SmServern) nutzen, sollte man diesen Artikel lesen.
Standardmäßig laucht SmServer auf Port 6963 für veschlüsselte Verbindungen. Um eine gewisse Zugriffsgeschwindigkeit zu erreichen, werden die Daten synchron verschlüsselt.
Was ist synchrone Verschlüsselung?
Synchron bedeutet, das Sender und Empfänger den gleichen Schlüssel zum Kodieren und Dekodieren benutzen.
Bei einer "asynchron" Verschlüsselung gibt es 2 Schlüssel: privat und öffentlich. Was mit dem privaten Schlüssel kodiert wurde, kann nur mit dem öffentlichen Schlüssel dekodiert werden. Was mit dem öffentlichen Schlüssel kodiert wurde, kann nur mit dem privaten Schlüssel dekodiert werden.
Asynchrone Verschlüsselungen brauchen CPU-Leistung Faktor 10 und mehr gegenüber synchrone Verschlüsselungen. Deshalb nutzt man sie nur bei wenig Datenmengen.
Dehalb werden heute bisynchrone Verschlüsselungen genutzt. Beispiel: Du gibtst in deinem Browser https://www.ukswitch.de ein, dann passiert folgendes:
- Dein Browser verbindet sich mit der Zertifizierungstelle und erhält den öffentlichen Schlüssel von www.ukswitch.de.
- Dein Browser erstellt eine Verbindung zu www.ukswitch.de und prüft Gültigkeit und ob der Schlüssel zur Adresse passt.
- Dein Browser sagt zu meinem Webserver asynchron verschlüsselt "Hallo ich will was."
- Darauf hin wird per Zufall ein Schlüssel für eine synchrone Verschlüsselung ausgetauscht.
- Dein Browser sendet nun synchron verschlüsselt zu meinem Server "GET index.html HTTP/1.1".
- Mein Webserver antwortet synchron verschlüsselt "Status: 200 ok" und schickt die Datei index.html synchron verschlüsselt hinterher.
Im Endeffekt wird doch die Datenmenge synchron verschlüsselt übertragen. Und brauchen wir diese Prozedur für "Stehlampe on"?
Derzeit wird für synchrone Verschlüsselungen das AEDS-Verfahren genutzt, was schnell, sicher und stabil ist.
Ich habe jedoch ein anderes Verfahren entwickelt, wo die Bits hin- und hergeschoben werden. Der Grund dafür ist, dass die Datenmenge sehr klein ist und sich oft wiederholt. Bei AEDS wären es immer die gleichen Bytes, Bei meinem Verfahren ändern sie sich. Dafür sorgt auch ein rotierender Schlüssel, der nach jeder Antwort vom Server neu nach Primzahlen generiert wird.
Problem Schlüsselaustausch
Die Stärke der Verschlüsselung liegt nicht im Verfahren des Kodierens und Dekodirends sondern im Schlüssel selbst.
Deshalb sollte ein Schlüssel folgende Eigenschaften haben:
- mindestens 12 Zeichen lang
- Großbuchstaben und Kleinbuchstaben
- Zahlen und Sonderzeichen
- Er sollte allerdings nicht mit # beginnen, da sonst Clients den Schlüssel als Kommentar werten.
Der Schlüssel wird in der Datei /home/ukswitch/.smserver/key.txt hinterlegt. Auf diese Datei sollte auch nur der Benutzer ukswitch zugreifen können.
sudo chown ukswitch /home/ukswitch/.smserver/key.txt && sudo chmod 0600 /home/ukswitch/.smserver/key.txt
Beispiel für einen guten Schlüssel: s5H76MZopuwg06f6wy/';cMnZ5C:g-zN#;,eZGi
Clients benötigen diesen Schlüssel, um mit SmServer kommunizieren zu können. Doch diesen Salat kann sich doch keiner merken. Das ist ja Sinn und Zweck der Sache.
Und hier liegt die Schwäche einer synchronen Verschlüsselung. Deshalb benötigt man gesunden Menschenverstand und Vertrauen.
Wie ihr den Schlüssel nicht übertragen dürft, ansonsten könnt ihr auch den Autoschlüssel auf dem Dach des Autos ablegen:
- Mittels WhatsApp, Telegram, Facebook, etc. Oder wisst ihr genau, was die ganzen Server machen?
- Mittels SMS.
- Mittels nicht von dir verschlüsselter Mail. Auch wenn deine Mails angeblich verschlüsselt sind, kann der Provider sie lesen.
Und wie kann man den Schlüssel weiter geben? Ganz einfach: persönlich.
- Zettel und Stift
- USB-Stick, wenn man bei der Übergabe dabei ist
- Asynchron verschlüsselte Mails, dazu benötigtst du den öffentlichen Schlüssel des Empfängers.
Der Key ist einfach gesagt der Haustürschlüssel. Und so muss man damit umgehen.
Inhalt
SmServer konfigurieren
Der Server muss wissen, welche Objekte er verwalten soll und wo er auf Verbindungen lauschen soll.
Neben der Datei /home/ukswitch/.smserver/key.txt nutzt er dazu die Datei /home/ukswitch/.smserver/config.txt.
Diese config.txt ähnelt einer XML-Datei, ist aber keine. Sie enthält alle Informationen, die der SmServer benötigt.
Als Hilfsmittel gibt es die Weboberfläche /cgi-bin/ukswitch/editObjects, die dann diese config.txt generiert. Mehr dazu später.
Grundkonfiguration des SmServers
Der grundlegende Syntax der Datei config.txt sieht wie folgt aus:
# config.txt - Konfiguration für smserver
# Kommentare können mit # angelegt werden. smserver ignoriert dann alle Zeichen bis zum Zeilenende.
# Leerzeichen in Namen und Beschreibungen müssen als " " (HTML-Leerzeichen) notiert werden, sonst entstehen Fehler beim Parsen der Datei.
<server>
# --------- Attribute des Servers ----------
# Name des Servers, hat derzeit keinen Einfluss auf den Betrieb
ServerName smserver1
# Kurze Beschreibung zum SmServer, hat derzeit auch keinen Einfluss
ServerDescription SmServer zu Hause
# Port für unverschlüsselte TCP- und UDP-Verbindungen aus dem Heimnetz
ListenPort 6961
# Port für verschlüsselte TCP-Verbindungen
EListenPort 6963
# Breiten- und Längengrade sind für die Berechnung der Sonnenzeiten notwendig,
# werden aber niemals übermittelt.
Lat 50.84326
Lon 11.01972
# --- Hier folgen die angelegten Objekte. ---
</server>
Die gesamte Konfiguration befindet sich im Bereich von <server> bis </server>.
Die Attribute ServerName (Name des Servers) und ServerDescription (Beschreibung des Servers) werden zwar gelesen und gesetzt, haben aber auf den weiteren Betrieb keinen Einfluss. Der Server wird mittels IP-Adresse bzw. DNS-Name angesprochen.
Geografische Koordinaten werden als Dezimalgrad angegeben. Hier ist nicht die Position des Servers gemeint sondern die mitllere Position der zu schaltenden Objekte. Der Server kann sich z.Bsp. in München befinden, die zu schaltenden Objekte im Ferienhaus an der Nordsee. Also sollte die Position des Ferienhauses angegeben werden.
Lat steht für Latitude (Breitengrad). Breitengrade nördlich des Äquators werden positiv angegeben, südliche negativ. Lon steht für Longitude (Längengrad). Längengrade östlich vom Greenwich-Null-Meridian werden positiv angegeben, westliche negativ.
Beachtet bitte Groß- und Kleinschreibungen bei den Attributsnamen, sonst liest der Server diese nicht.
WLan-Module anlegen
# config.txt - Konfiguration für smserver
<server>
ServerName smserver1
ServerDescription SmServer zu Hause
ListenPort 6961
EListenPort 6963
Lat 50.84326 Lon 11.01972
# --- WLan-Module ---
<wlanmodule>
WmName Stehlampe
WmDescription Stehlampe im Wohnzimmer
WmAddress fd00::cf8:e0fa:fe43:6236
WmPort 49112
Device 0
pictureFileOn /bilder/smarthome/lichtAn.png
pictureFileOff /bilder/smarthome/lichtAus.png
smooth
attacksafe
nowontime 7200
pumpperformance 0
pumpflowrate 0
power 6.4
</wlanmodule>
</server>
Für jedes WLan-Modul wird ein Bereich von <wlanmodule> bis </wlanmodule> angelegt. Die Attribute im Einzelnen:
| Attribut | Beschreibung |
| WmName | Das ist der Name des Gerätes, mit dem man dieses ansprechen möchte. Leider müssen hier Leerzeichen mit (HTML-Leerzeichen) angegeben werden. Wer Geräte oft aus einer Konsole ansprechen möchte, sollte vielleicht auf Leerzeichen im Namen verzichten. |
| WmDescription | Hier kann eine kurze Beschreibung zum Gerät angegeben werden. Diese wird in einigen Clients und auf der Weboberfläche angezeigt. |
| WmAddress |
Die Netzwerkadresse des WLan-Moduls kann in 3 Varianten angegeben werden:
- IPV4-Adresse, z.Bsp. 192.168.2.126
- IPV6-Heimnetzadresse, diese beginnt immer mit fd00::, z.Bsp. fd00::cf8:e0fa:fe43:6226
- Gerätename, Hostname, das ist der Name, mit dem das Gerät am Router angemeldet ist.
|
| WmPort | Hier wird der Port angegeben, auf dem das WLan-Modul auf Verbindungen lauscht. Standardmäßig ist dieser 49112. |
| Device | Ein WLan-Modul kann 7 Ausgänge schalten (0 bis 6). Ist nur ein Verbraucher angeschlossen so ist Device meist 0. Gibt man Device 7 an, wird die kleine blaue LED des WLan-Moduls geschaltet. |
| pictureFileOn | Bilddatei, die auf der Weboberfläche angezeigt wird, wenn das Gerät eingeschaltet ist. Der Pfad muss hier ab dem DocumentRoot-Verzeichnis des Webservers angegeben werden. |
| pictureFileOff | Bilddatei, die auf der Weboberfläche angezeigt wird, wenn das Gerät ausgeschaltet ist. Für den Pfad gilt das gleiche wie eben. |
| smooth | Ist dieses Attribut angegeben, wird das Gerät "sanft" geschaltet. Die Erklärung: Oft werden Solid-State-Relays oder Optokoppler als Leistungsverstärker für die Schaltfähigkeit angeschlossen. Als Beispiel nehme ich mal ein SSR mit einer Schaltfähigkeit von 240V und max 2A. Das ergibt theoretisch eine Leistung 480W. Für mein Gerät mit ca. 20W Leistungsaufnahme ideal. Einschalten prima geht, Ausschalten auch super, nochmal Einschalten, Klasse und wieder Ausschalten. Und nochmal Einschalten, he geht nicht? 2A-Feinsicherung kaputt? Das Gerät braucht doch nur ca. 0,1A Stromstärke? Dieses Phänomen tritt vor allem bei LED-Glühlampen auf. Sie besitzen ein Netzteil, was den Strom umwandelt. Wechselstrom ändert seinen Zustand von ganz negativ bis ganz positiv und zurück 50 mal in der Sekunde. Schaltet man nun ein Netzteil bei dem Zustand ganz negativ oder ganz positiv ein, zieht es kurzzeitig das 100-fache an Stromstärke, die flinke Feinsicherung geht kaputt. Flinke Sicherungen haben eine Auslösezeit von max. 0.03s. Gibt man das Attribut smooth an, sieht das Einschalten wie folgt aus: Das SSR wird für 1ms eingeschaltet, danach bleibt es 24ms aus. Dann wird es für 2,7ms eingeschaltet und bleibt nun 21ms aus. Und so geht es mit Faktor 2,717 (natürliche Eulersche Konstante) weiter, bis die Ausschaltzeit 0 beträgt. Das Einschalten dauert so ca. 0,4s. Das Ausschalten wird analog dazu rückwärts durchgeführt. Benutzung von smooth auf eigene Gefahr! Selbst schalte ich fast alle meine Geräte mit diesem Attribut, bisher ist alles super. |
| attacksafe | Wird attacksafe angegeben, so gilt für das Gerät ein Attackenschutz. Das bedeutet, dass sich das Gerät frühestens 3s nach dem letzten Ausschalten wieder einschaltet. Viele Geräte mögen ständiges Ein- und Ausschalten nicht und gehen kaputt. SmServer kann aber bis zu mehreren Tausend Schaltungen pro Sekunde durchführen. Der Grund für dieses Attribut liegt nicht in erster Linie auf bösen Attacken aus dem Internet sondern bei den Anwendern selbst. SmServer kann mehrere Verbindungen von Clients gleichzeitig verarbeiten. Somit können mehrere Personen gleichzeitig auf ein Gerät zugreifen. Person 1 schaltet das Gerät aus, und wie es der Teufel so will, Person 2 schaltet das Gerät zur gleichen Zeit ein. Bumm. |
| nowontime | Hier kann eine maximale Einschaltzeit in Sekunden angegeben werden. Danach schaltet SmServer dieses Gerät selbstständig aus. Gedacht ist dieses Attribut z.Bsp. für Treppenhausschaltungen. Wird nowontime auf 0 gesetzt oder nicht angegeben, bleibt das Gerät bis zum manuellen Ausschalten eingeschaltet. |
pumpperformance pumpflowrate | Diese Attribute wurden mal für automatisches Gießen von Pflanzen gewünscht. Hierzu wird kurzzeitig eine kleine Gießpumpe eingeschaltet. Beim Attribut pumpperformance gibt man die Leistung der Wasserpumpe in l/min (Liter pro Minute) an. Das Attribut pumpflowrate definiert die gewünschte Wassermenge in ml (Milliliter). Letztendlich errechnet SmServer aus diesen 2 Attributen das Attribut nowontime. Deshalb können diese 2 Attribute nicht vom SmServer ausgeben werden. |
| power | Hier kann eine durchschnittliche elektrische Leistungsaufnahme des Gerätes in Watt angegeben werden. Daraus kann SmServer einen grob geschätzen Energieverbrauch in Wattsekunden errechnen. Clients können diesen Wert in kWh (Kilowattstunden) umrechnen. Bei Geräten, die nur sehr kurz eingeschaltet werden, entstehen hier aber große Abweichungen. |
Hinweise zu WLan-Module
WLan-Module sollten nur in vertrauenswürdigen Heimnetzten eingesetzt werden. Die Kommunikation mit ihnen erfolgt unverschlüsselt.
Ich empfehle sogar, in den Router-Einstellungen WLan-Module den Zugang zum Internet zu verbieten (Kindersicherung).
Hat man ein WLan-Modul in Betrieb genommen, erstellt es eine Heimnetz-Webseite, wo ihr IP-Adressen, Port und Hostname erfahren könnt. Es erstellt sogar ein Textfeld mit einer Beispielkonfiguration, was man mit Kopieren und Einfügen in die Datei config.txt einfügen und anpassen kann.
Als WmAddress empfehle ich, die moderne IPV6-Heimnetzadresse zu nutzen. Damit wären theoretisch 2 hoch 64 (das sind mehr als 18.446.744.073.700.000.000 Stück, also über 18 Trillionen) WLan-Module minus ein paar Heimnetzgeräte möglich. Das schafft SmServer natürlich nicht und der Router wahrscheinlich auch nicht. Benutzt man IPV4-Adressen oder Hostnames, so stehen nur etwa 240 Möglichkeiten gegenüber. Das Ansprechen eines WLan-Modules mittels IP-Adresse ist immer schneller als das Ansprechen mittels Hostname, da der Router den Hostname nicht in eine IP-Adresse umgewandeln muss.
Wie wird eine Schaltung an einem WLan-Modul durchgefürt?
Auf dem WLan-Modul befindet sich ein Server, der bis zu 8 TCP-Verbindungen annehmen kann, deren Anweisungen aber nacheinander abgearbeitet werden. Schließlich gibt es nur eine CPU, die maximal 160 MHz Betriebsfrequenz hat.
Wenn SmServer auf ein WLan-Modul zugreft, agiert er selber als Client. Er erstellt eine Verbindung zum Server des WLan-Moduls, sendet die Anfrage und empfängt die Antwort. SmServer hält die Verbindung zum WLan-Modul, falls noch weitere Anweisungen folgen.
Im SmServer läuft ein Thread, der, wenn 8 Minuten kein Datenverkehr mehr war, die Verbindung zum WLan-Modul schließt.
Einen GPIO-Ausgang anlegen
Wie schon gesagt wurde dieser Server ursprünglich für die Nutzung von GPIOs an einem Raspberry Pi erschaffen.

Die Nutzung von GPIO-Ausgängen hat aber ein Nachteil. GPIOs geben ein Signal mit 3,3V und max. 10mA aus, das entspricht etwa 0,03W. Deshalb ist es notwendig, dieses Signal mittels Solid-State-Relay oder Optokoppler auf die gewünscht Schaltleistung zu verstärken. An Entwicklung entsprechender vorgertigten Modulen dafür arbeiten wir derzeit. Aber eine Elektroinstallation lässt sich nicht umgehen.
Der Vorteil von GPIO-Ausgängen liegt in der sehr schnellen Zugreifbarkeit bei wenig CPU-Last, so sind mehrere tausend Schaltungen pro Sekunde möglich.
Folgende 14 GPIOs können vom SmServer an einem Raspberry Pi genutzt werden:
- GPIO 5, Anschluss 29
- GPIO 6, Anschluss 31
- GPIO 12, Anschluss 32
- GPIO 13, Anschluss 33
- GPIO 16, Anschluss 36
- GPIO 17, Anschluss 11
- GPIO 18, Anschluss 12
- GPIO 20, Anschluss 38
- GPIO 21, Anschluss 40
- GPIO 22, Anschluss 15
- GPIO 24, Anschluss 18
- GPIO 25, Anschluss 22
- GPIO 26, Anschluss 37
- GPIO 27, Anschluss 13
Wichtig: GPIO-Ausgänge dürfen in der config.txt erst nach den WLan-Modulen und ExternSm-Objekten angelegt werden. Irgendwie scheint libgpiod bei der Initialisierung ein Problem mit anderen Objekten zu haben, die eine Netzwerkverbindung benutzen.
Um einen GPIO-Ausgang in der config.txt anzulegen, notiert man folgendes:
# config.txt - Konfiguration für smserver
<server>
ServerName smserver1
ServerDescription SmServer zu Hause
ListenPort 6961
EListenPort 6963
Lat 50.84326 Lon 11.01972
# --- GPIO-Ausgänge ---
<output>
OutputName Fernseher
OutputDescription Fernseher GPIO 17
OutputGpioNumber 17
pictureFileOn /bilder/smarthome/green_on.png
pictureFileOff /bilder/smarthome/green_off.png
smooth
attacksafe
nowontime 0
pumpperformance 0
pumpflowrate 0
power 110
</output>
</server>
Die Attribute eines GPIO-Ausganges werdem im Bereich von <output> bis </output> notiert.
Soll ich alle Attribute nochmal erklären? OK ich mache es, ist ja nur Text:
| Attribut | Beschreibung |
| OutputName | Das ist der Name des Gerätes, mit dem man dieses ansprechen möchte. Leider müssen hier Leerzeichen mit (HTML-Leerzeichen) angegeben werden. Wer Geräte oft aus einer Konsole ansprechen möchte, sollte vielleicht auf Leerzeichen im Namen verzichten. |
| OutputDescription | Hier kann eine kurze Beschreibung zum Gerät angegeben werden. Diese wird in einigen Clients und auf der Weboberfläche angezeigt. |
| OutputGpioNumber | Hier gibt man die Nummer des GPIOs an, der für den Ausgang genutzt werden soll. |
| pictureFileOn | Bilddatei, die auf der Weboberfläche angezeigt wird, wenn das Gerät eingeschaltet ist. Der Pfad muss hier ab dem DocumentRoot-Verzeichnis des Webservers angegeben werden. |
| pictureFileOff | Bilddatei, die auf der Weboberfläche angezeigt wird, wenn das Gerät ausgeschaltet ist. Für den Pfad gilt das gleiche wie eben. |
| smooth | Ist dieses Attribut angegeben, wird das Gerät "sanft" geschaltet. Die Erklärung: Oft werden Solid-State-Relays oder Optokoppler als Leistungsverstärker für die Schaltfähigkeit angeschlossen. Als Beispiel nehme ich mal ein SSR mit einer Schaltfähigkeit von 240V und max 2A. Das ergibt theoretisch eine Leistung 480W. Für mein Gerät mit ca. 20W Leistungsaufnahme ideal. Einschalten prima geht, Ausschalten auch super, nochmal Einschalten, Klasse und wieder Ausschalten. Und nochmal Einschalten, he geht nicht? 2A-Feinsicherung kaputt? Das Gerät braucht doch nur ca. 0,1A Stromstärke? Dieses Phänomen tritt vor allem bei LED-Glühlampen auf. Sie besitzen ein Netzteil, was den Strom umwandelt. Wechselstrom ändert seinen Zustand von ganz negativ bis ganz positiv und zurück 50 mal in der Sekunde. Schaltet man nun ein Netzteil bei dem Zustand ganz negativ oder ganz positiv ein, zieht es kurzzeitig das 100-fache an Stromstärke, die flinke Feinsicherung geht kaputt. Flinke Sicherungen haben eine Auslösezeit von max. 0.03s. Gibt man das Attribut smooth an, sieht das Einschalten wie folgt aus: Das SSR wird für 1ms eingeschaltet, danach bleibt es 24ms aus. Dann wird es für 2,7ms eingeschaltet und bleibt nun 21ms aus. Und so geht es mit Faktor 2,717 (natürliche Eulersche Konstante) weiter, bis die Ausschaltzeit 0 beträgt. Das Einschalten dauert so ca. 0,4s. Das Ausschalten wird analog dazu rückwärts durchgeführt. Benutzung von smooth auf eigene Gefahr! Selbst schalte ich fast alle meine Geräte mit diesem Attribut, bisher ist alles super. |
| attacksafe | Wird attacksafe angegeben, so gilt für das Gerät ein Attackenschutz. Das bedeutet, dass sich das Gerät frühestens 3s nach dem letzten Ausschalten wieder einschaltet. Viele Geräte mögen ständiges Ein- und Ausschalten nicht und gehen kaputt. SmServer kann aber bis zu mehreren Tausend Schaltungen pro Sekunde durchführen. Der Grund für dieses Attribut liegt nicht in erster Linie auf bösen Attacken aus dem Internet sondern bei den Anwendern selbst. SmServer kann mehrere Verbindungen von Clients gleichzeitig verarbeiten. Somit können mehrere Personen gleichzeitig auf ein Gerät zugreifen. Person 1 schaltet das Gerät aus, und wie es der Teufel so will, Person 2 schaltet das Gerät zur gleichen Zeit ein. Bumm. |
| nowontime | Hier kann eine maximale Einschaltzeit in Sekunden angegeben werden. Danach schaltet SmServer dieses Gerät selbstständig aus. Gedacht ist dieses Attribut z.Bsp. für Treppenhausschaltungen. Wird nowontime auf 0 gesetzt oder nicht angegeben, bleibt das Gerät bis zum manuellen Ausschalten eingeschaltet. |
pumpperformance pumpflowrate | Diese Attribute wurden mal für automatisches Gießen von Pflanzen gewünscht. Hierzu wird kurzzeitig eine kleine Gießpumpe eingeschaltet. Beim Attribut pumpperformance gibt man die Leistung der Wasserpumpe in l/min (Liter pro Minute) an. Das Attribut pumpflowrate definiert die gewünschte Wassermenge in ml (Milliliter). Letztendlich errechnet SmServer aus diesen 2 Attributen das Attribut nowontime. Deshalb können diese 2 Attribute nicht vom SmServer ausgeben werden. |
| power | Hier kann eine durchschnittliche elektrische Leistungsaufnahme des Gerätes in Watt angegeben werden. Daraus kann SmServer einen grob geschätzen Energieverbrauch in Wattsekunden errechnen. Clients können diesen Wert in kWh (Kilowattstunden) umrechnen. Bei Geräten, die nur sehr kurz eingeschaltet werden, entstehen hier aber große Abweichungen. |
ExternSm-Objekt anlegen
ExternSm-Objekte, sind Objekte, die auf anderen SmServern angelegt wurden. Daei spielt es keine Rolle, ob sie dort als WLan-Modul, GPIO-Output oder gar auch als ExternSm-Objekt angelegt wurden.
Das ist alles nicht ganz ohne, deshalb spreche ich jetzt "dieser SmServer" und "andere SmServer".
Gedacht ist die ganze Sache für Zugreifbarkeit auf ein Ferienhaus oder einer entfernten Werkstatt.
Die Datenübertragung erfolgt immer synchron verschlüsselt mittels Schlüssel des anderen SmServers. Dieser SmServer agiert dabei als Client.
Anlegen eines ExternSm-Ojektes:
# config.txt - Konfiguration für smserver
<server>
ServerName smserver1
ServerDescription SmServer zu Hause
ListenPort 6961
EListenPort 6963
Lat 50.84326 Lon 11.01972
# ----- ExternSmObkekte -----
<externsm>
SmName Heizung Ferienhaus
EsmName Heizung
SmDescription Heizung im Ferienhaus
SmAddress ferienhaus.ukswitch.de
SmPort 6963
SmKey n*v*sDICb:1?Z*120QmiaZ<w$ksDLnaKK6d*
pictureFileOn /bilder/smarthome/lichtAn.png
pictureFileOff /bilder/smarthome/lichtAus.png
attacksafe
nowontime 0
</externsm>
</server>
Die Attribute:
| Attribut | Beschreibung |
| SmName | Das ist der Name des Gerätes, mit dem man dieses auf diesem Server ansprechen möchte. Leider müssen hier Leerzeichen mit (HTML-Leerzeichen) angegeben werden. Wer Geräte oft aus einer Konsole ansprechen möchte, sollte vielleicht auf Leerzeichen im Namen verzichten. |
| EsName | Das ist der Name,mit welchem das Objekt am anderen SnServer angelegt wurde. |
| SmDescription | Eine kurze Beschreibung zum Objekt, die dieser SmServer an Clients ausgibt. |
| SmAdress | Der andere SmServer muss erreichbar sein, was im Internet Probleme geben kann. Ihr könnt folgendes nutzen:
- IPV4-Adresse des Routers im Ferienhaus, wenn der Provider diese nicht ändert.
- IPV6-Adresse des Gerätes im Ferienhaus, wenn der Provider diese nicht ändert.
- Internetadresse: z.Bsp. smserver.meinferienhaus.de, dafür muss man aber bezahlen. Vielleicht gibt es noch kostenlose Anbieter von Dyn-DNS-Adressen.
|
| SmPort | Port auf dem der andere SmServer auf verschlüsselte TCP-Verbindungen lauscht. |
| SmKey | Wenn dieser SmServer eine verschlüsselte Verbindung zu dem anderen SmServer herstellen soll, benötigt er den Schlüssel des anderen SmServers. Sonst klappt das nicht. |
| pictureFileOn | Bilddatei, die auf der Weboberfläche angezeigt wird, wenn das Gerät eingeschaltet ist. Der Pfad muss hier ab dem DocumentRoot-Verzeichnis des Webservers angegeben werden. |
| pictureFileOff | Bilddatei, die auf der Weboberfläche angezeigt wird, wenn das Gerät ausgeschaltet ist. Für den Pfad gilt das gleiche wie eben. |
| attacksafe | Wird attacksafe angegeben, so gilt für das Gerät ein Attackenschutz. Das bedeutet, dass sich das Gerät frühestens 3s nach dem letzten Ausschalten wieder einschaltet. Viele Geräte mögen ständiges Ein- und Ausschalten nicht und gehen kaputt. SmServer kann aber bis zu mehreren Tausend Schaltungen pro Sekunde durchführen. Der Grund für dieses Attribut liegt nicht in erster Linie auf bösen Attacken aus dem Internet sondern bei den Anwendern selbst. SmServer kann mehrere Verbindungen von Clients gleichzeitig verarbeiten. Somit können mehrere Personen gleichzeitig auf ein Gerät zugreifen. Person 1 schaltet das Gerät aus, und wie es der Teufel so will, Person 2 schaltet das Gerät zur gleichen Zeit ein. Bumm. Ist attacksafe auf dem anderen SmServer zu diesem Objekt gesetzt, hat das Priorität und lässt sich nicht umgehen. |
| nowontime | Hier kann eine maximale Einschaltzeit in Sekunden angegeben werden. Danach schaltet SmServer dieses Gerät selbstständig aus. Gedacht ist dieses Attribut z.Bsp. für Treppenhausschaltungen. Wird nowontime auf 0 gesetzt oder nicht angegeben, bleibt das Gerät bis zum manuellen Ausschalten eingeschaltet. Ist nowontime auf dem anderen SmServer gesetzt, so gilt dieses. Also sollte dieses Attribut kleiner als der dortige sein oder weggelassen werden. |
| power | Dieses Attribut ist absolut unzuverlässig, da das Objekt von dem anderen SmServer geschaltet werden kann. Dieser Smserver aktualisiert den Status des Objektes etwa alle 12 Minuten. Hier kann eine durchschnittliche elektrische Leistungsaufnahme des Gerätes in Watt angegeben werden. Daraus kann SmServer einen grob geschätzen Energieverbrauch in Wattsekunden errechnen. Clients können diesen Wert in kWh (Kilowattstunden) umrechnen. Bei Geräten, die nur sehr kurz eingeschaltet werden, entstehen hier aber große Abweichungen. |
Das Attribut smooth (sanft schalten) gibt es hier nicht, dieser kann nur an dem SmServer definiert werden, der das Engerät direkt anspricht.
Pseudo-Objekt anlegen
Ein Pseudo-Objekt ist ein Objekt, dass ein- aus- und umgeschaltet werden kann. Aber es passiert nichts. Es ist ein virtuelles Objekt.
Im folgendenden Absatz werden Links beschrieben, wie man Geräteschaltungen miteinander verknüpfen kann. Aber sind diese Verknüpfungen auch immer wirklich gewünscht?
Wenn "nein" kann man ein Pseudo-Objekt nutzen, wo diese Verknüpfung(en) anschließend angelegt werden. So bleiben Geräte einzeln schaltbar oder mittels diesem Objekt zusammen schaltbar.
Bei Pseudo-Objekten ist grundsätzlich der Attackenschutz gesetzt. Das Attribut power beträgt 0,0, da ein Pseudo-Objekt keine elektrische Leistungsaufnahme hat.
Beispiel für das Anlegen eines Pseudo-Objektes:
# ----- Pseudo-Objekte -----
<pseudo>
PsName Wohnzimmer
PsDescription schaltet Schreibtischlampe und Stehlampe
pictureFileOn /bilder/smarthome/lichtAn.png
pictureFileOff /bilder/smarthome/lichtAus.png
nowontime 0
</pseudo>
Die Attribute im Einzelnen:
| Attribut | Beschreibung |
| PsName | Ein Name für das Pseudo-Objekt. Er sollte so gewählt werden, was damit geschaltet wird. |
| PsDescription | Eine kurze Beschreibung zu diesem Pseudo-Objekt, vielleicht, was alles damit geschaltet wird. |
| pictureFileOn | Bilddatei, die auf der Weboberfläche angezeigt wird, wenn das Pseudo-Objekt eingeschaltet ist. Der Pfad muss hier ab dem DocumentRoot-Verzeichnis des Webservers angegeben werden. |
| pictureFileOff | Bilddatei, die auf der Weboberfläche angezeigt wird, wenn das Pseudo-Objekt ausgeschaltet ist. Für den Pfad gilt das gleiche wie eben. |
| nowontime | Klar, automatisches Ausschalten nach x Sekunden. Bitte aufpassen: Hier kommt es darauf an, wie ihr das Pseudo-Objekt verknüpfen wollt:
- Nur zum Einschalten von Geräten: Da kann nowontime auf 0.3s gesetzt werden.
- Zum Ein- und Ausschalten von Geräten: Hier sollte nowontime auf 0 (ewig) gesetzt sein.
Ein Pseudo-Objekt braucht keine Energie, aber beim automatischem Ausschalten werden verknüpfte Geräte geschaltet.
|
Links, Verknüpfungen
Links bzw. Verknüpfungen sind Verkettungen von Schaltungen. Sie sollen das Leben vereinfachen und helfen, Energie zu sparen.
Allerdings sollte man vorher in Ruhe überlegen, wie man sie anlegt. Verknüpfungen werden immer beim Schalten eines Gerätes ausgeführt. Da kann es auch nerven, wenn ein zweites Gerät immer mit geschaltet wird..
Da Verknüpfungen auch so angelegt werden können, dass man z.Bsp. 12 Geräte gleichzeitig eingeschaltet werden können, erfolgt vor jeden folgenden Schaltung ein Warten von 12ms, um Stromspitzen zu vermeiden.
Bei einer Verknüpfung werden 2 Objekte angegeben, das "ausgeführte Objekt" und das "auszuführende Objekt". Beide Objekte werden mit dem Namen angesprochen, der in den vorher angelegten Objekten definiert wurde. Leerzeichen in diesen Namen müssen leider wieder als (HTML-Leerzeichen) notiert werden. Beispiele:
# config.txt - Konfiguration für smserver
<server>
ServerName smserver1
ServerDescription SmServer zu Hause
ListenPort 6961
EListenPort 6963
Lat 50.84326 Lon 11.01972
# ----- Wlan-Module -----
# ----- ExternSm-Obkekte -----
# ----- GPIO-Outputs -----
# ----- Pseudo-Objekte -----
# ------- Links, Verknüpfungen -------
<links>
when Stehlampe 1 Schreibtischlampe off
when Schreibtischlampe 1 Stehlampe off
when Fernseher 1 Audioanlage on
when Fernseher 0 Audioanlage off
</links>
</server>
Alle Verknüpfungen werden im Bereich von <links> bis </links> notiert. Dieser Bereich wird nur einmal angelegt.
Der Syntax ist eigentlich sehr einfach:
when "ausgeführtes Objekt" Zustand "auszuführendes Objekt" Komanndo
Dabei bedeuten:
| when | Einleitung einer Verknüpfung |
| "ausgeführtes Objekt"" | Name des Objektes, bei dem eine Schaltung durchgeführt wurde. |
| Zustand | Art der Schaltung des ausgeführtem Objektes: 0 - wurde ausgeschaltet, 1 - wurde eingeschaltet |
| "auszuführendes Obbjekt" | Name des Objektes, bei dem automatisch eine Schaltung erfolgen soll. |
| Komanndo | Was das auszuführende Objekt machen soll: on (einschalten), off (ausschalten) oder toggle (umschalten, negieren) |
Die ersten zwei Verknüpfungen in diesm Beispiel bedeuten, dass nur die Stehlampe oder die Schreibtischlampe eingeschaltet sein kann. Die nächsten zwei Verknüpfungen sorgen dafür, dass immer, wenn der Fernseher ein- bzw. ausgeschaltet wird, die Audioanlage mit dem tollen Sound mit ein- bzw. ausgeschaltet wird.
Vermeidet Loops
Sonst rennt sich SmServer zu tode. Was ist denn ein Loop:
when Objekt1 1 Objekt2 on
when Objekt2 1 Objekt3 on
when Objekt3 1 Objekt1 on
So versucht SmServer immer und immer wieder alle 3 Objekte einzuschalten.
Also gut nachdenken: Was soll das "ausgeführte Objekt" sein? Was soll das "auszuführende Objekt" sein? Wie will ich die Verkettung schalten?
Das sieht auf dem ersten Blick doch sehr umfangreich und kompliziert aus, wenn man ein neues Objekt anlegen möchte. Aber mittels Kopieren, Einfügen und die Attribute anpassen geht es doch recht schnell. Eine auskommentierte Version der config.txt könnt iht hier herunterladen und euch anpassen.
Bitte beachtet, das Syntaxfehler bei Attributnamen einfach ignoriert und damit die Attribute nicht gelesen werden. Sie werden auf Standardwerte gesetzt.
Damit Änderungen in der Datei /home/ukswitch/.smserver/config.txt übernommen werden ist es nötig, den SmServer neu zu starten, wie es im folgenden Absatz beschrieben wird.
Hinweise zu einigen Attributen
Namen
Objektnamen dürfen nur einmal vergeben werden, sonst klappt das nicht mit dem Zugriff auf das gewünschte Objekt.
Besitzen z.Bsp. ein WLan-Modul, ein GPIO-Ausgang und ein ExternSm-Objekt den gleichen Namen, werden alle Objekte von den Clients auch angezeigt. Möchte man nun eins dieser Objekte einschalten, so wird immer das WLan-Modul geschaltet, da es SmServer zuerst findet.
Werden viele Objekte im SmServer angelegt, muss man etwas kreativ sein. Auf der einen Seite dürfen sich Namen nicht wiederholen, auf der anderen Seite sollten sie eindeutig zu einem Endgerät passen. Man will sich doch nicht viel merken müssen.
attacksafe
Dieses Attribut schützt ein Endgerät vor ungewolltem häufigen Schalten und kann standardmäßig immer notiert werden. Damit wartet SmServer vor dem Einschalten eine Zeit von mindestens 3s bis nach dem letzten Ausschalten des Objektes. Somit sind noch nicht mal 20 Ein- und Asschaltungen pro Minute möglich.
Soll ein Objekt von Clients sehr häufig geschaltet werden (z.Bsp. mehrmals pro Sekunde), darf dieses Attribut nicht notiert sein, oder man kommentiert es mit # aus.
smooth
Dieses Attribut schützt die Feinsicherungen in der Hardware vor ungewolltem Auslösen beim Ansteuern von Geräten mit Netzteil. Somit beträgt die Zeit für das Ein- und Ausschalten jeweils etwa 0,4s.
Für häufiges Schalten (mehrmals pro Sekunde) darf dieses Attribut nicht aktiv sein.
Beispiel: 230V-LED-Lampen besitzen ein Netzteil. Das WLan-Modul kann 460W schalten, LED-Glühlampe braucht 12W elektrische Leistung. Alles gut? Schaltet man diese LED-Glühlampe zu einem ungüstigen Zeitpunkt ein, kann sie 1200W und mehr elektrische Leistung kurzzeitig ziehen. Feinsicherung ist nun kaputt.
Deshalb eignen sich 230V-LED-Glühlampen nicht für sehr schnelle Schaltungen.
power
Mit diesem Attribut wird eine durchschnittlich elektrische Leistungsaufnahme angegeben, damit SmServer daraus einen grob geschätzen Energieverbrauch errechnen kann. Da der errechnete Energieverbrauch nur grob geschätzt ist, kann er nicht als Nachweis z.Bsp. für Klagen oder vor Gericht verwendet werden.
Mit dem errechneten Energieverbrauch soll der Anwender ein Gefühl bekommen, welches Gerät etwa wieviel an elektrischer Energie verbraucht.
Bei kurzen Einschaltzeiten entstehen hier größere Abweichungen, da sich Geräte beim Aus- und Einschalten anders verhalten, siehe eben 230V-LED-Glühlampe.
Herstellerangaben zu benötigten elektrischen Leistungen von Geräten werden meist im Labor unter idealen Bedingungen ermittelt und vielleicht abgrundet an den Kunden weitergegeben. Dabei werden die Geräte vor den Messungen schon einige Stunden laufen gelassen. Nutzt man diese Angaben für dieses Attribut, empfehle ich ca. 10% aufzuschlagen.
Wie bekommt man das relativ genau hin? Beispiel Kühlschrank im Ferienhaus
- Man installiert vorher ein Enrgiemessgerät zwischen Stromversorgung und Kühlschrank im Fereinhaus, welches selbst elektrische Energie benötigt.
- Wir wollen vom 2. Mai bis 18. Mai ins Ferienhaus. Die Frau hat schon Wurst und Gemüse eingekauft. Per SmServer schalte ich das den Kühlschrank am 1. Mai 18 Uhr ein, damit wir sofot die Lebensmittel in den Kühlschrank legen können, Energiemessung läuft.
- Am Abreisetag, alles ist schon im Auto ordentlich verladen, schalte ich den Kühlschrank per SmServer aus.
- Das Energiemessgerät hat eine durchschnittlich elektrische Leistungsaufnahme von 24,3276W errechnet, die ich bei power eintragen werde.
Jetzt habe ich eine zuverlässige Energieangabe, oder doch nicht? Dazu müssten im Folgejahr folgende Bedingungen vorliegen:
- Die Frau kauft exakt auf das Gramm genau die gleichen Lebensmittel, Kühlschrank wird am 1. Mai exakt 18 Uhr eingeschaltet.
- Ab dieser Zeit müssen Temperatur und Luftfeuchtigkeit bis zum Abreisetag exakt den Werten des Vorjahres sein, das geht nicht.
- Alle Lebensmittel, die im Vorjahr in den Kühlschrank getan oder herausgenommen wurden, müssen dieses Jahr die gleiche Masse, den gleichen Wasseranteil, die gleiche Temperatur und zur selben Zeit hinein- bzw. herausgenommen werden. Das wird ja ein schöner Urlaub.
- Die Anlage des Kühlschranks muss exakt dem des Vorjahres sein. Die Kühlrippen sind genauso verschmutzt, das Kältemittel besitzt noch exakt die gleichen Eigenschaften, Mechanik im Motor und Kompressor ebenso.
Ich hoffe, ihr seht, worauf ich hinaus will und warum ich dieses Attribut als grob geschätzt einstufe.
Inhalt
Key, Schlüssel
Hinweis vorweg: Hier geht es nicht darum, seinen SmServer mittels Weboberfläche zu bedienen. Hier geht es um ein direktes Ansprechen des SmServers über das Internet, z.Bsp. Ferienhaus.
Das Leben könnte so schön und einfach sein, wenn die Menschen Respekt und Anstand hätten. Aber nein, es muss gehäckt und es müssen Daten geklaut werden. Das passiert im Internet ständig rund um die Uhr, immer und immerzu. Da hängen sogar wirtschaftliche und politische Interessen dran.
Es wird ein irrsinnig riesen großer Aufwand betrieben, damit Daten geschützt vom Sender zum Empfänger übertragen werden.
Als Beispiel ihr besucht die Seite https://dok.ukswitch.de:
- Falls euer System noch kein Zertifikat von dok.ukswitch.de hat, verbindet sich euer Browser mit WebOfThrust-Servern (vertrauenswürdige Server, die strengen Regeln unterliegen) und erhält so das Zertifikat, falls vorhanden. In dem Zertifikat sind Webadresse, Besitzer, ein öffentlicher Schlüssel und weitere Daten vorhanden.
- Nun erstellt euer Browser eine Verbindung zu dok.ukswitch.de, und verschlüsselt die Anfrage mit dem öffentlichen Schlüssel aus dem Zertifikat. Meist wird dazu das RSA-Verfahren (also mit 100-stelligen Primzahlen, ist doch einfach) genutzt. Die Anfrage wird so gesendet.
- dok.ukswitch.de besitzt selbst einen privaten Schlüssel, nur mit dem kann er die Anfrage entschlüsseln (asynchrone Verschlüsselung).
- Da asynchrone Verschlüsselungen sehr zeitaufwendig sind und Energie kosten, erstellt dok.ukswitch.de einen zufälligen Schlüssel für eine synchrone Verschlüsselung. Dieser Schlüssel wird mit dem privatem Schlüssel asynchron verschlüsselt (also wieder 100-stellige Primzahlen) und gesendet.
- Euer Browser entschlüsselt diesen Schlüssel mit dem öffentlichen Schlüssel (immer noch asynchron).
- Mit dem neu erhaltenen Schlüssel kann nun euer Browser seine Anfrage synchron verschlüsseln (meist DSA-Verfahren) und senden. dok.ukswitch.de entschlüsselt die Anfrage mit dem gleichen Schlüssel, bastelt die Antwort, veschlüsselt die wieder synchron und sendet sie.
Mal ganz ehrlich: Brauchen wir sowas für "Licht on"? Und wenn die Quantencomputer kommen, ist sowieso alles umsonst.
Aufgrund von Geschwindigkeit und Energieverbrauch habe ich mich für eine rein synchronische Verschlüsselung entschieden.
Ursprünglich wollte ich das anerkannte DSA-Verfahren nutzen, da aber bei wiederkehrenden Daten der gleiche Datensalat übermittelt wird, den Sniffer abfangen und selbst senden könnten, habe ich selbst ein Verfahren geschrieben, wo die Bits hin- und hergeschoben werden. Nach jeder Antwort des SmServers wird ein neuer Schlüssel erstellt, mit dem die nächsten Daten verschlüsselt werden müssen.
Sicherheit einer Verschlüsselung
Die Sicherheit einer Verschlüsselung liegt nicht im Verfahren, im Gegenteil, denn Sender und Empfänger müssen das Verfahren kennen.
Die Sicherheit liegt nur im Schlüssel selbst. Deshalb sollte ein Schlüssel folgende Eigenschaften haben:
- Derzeit mindestens 12 Zeichen lang, länger ist expotentiell besser.
- Großbuchstaben
- Kleinbuchstaben
- Zahlen
- Sonderzeichen
- Niemals Wortlaute aus privatem oder geschäftlichem Umfeld
Es laufen irgendwo auf der Welt laufen tausende Programme, die versuchen, Passwörter und Schlüssel zu knacken. Hierfür werden sogar GPUs (CPUs von Grafikkarten) eingesetzt, weil die das schneller können. Man probiert anfangs komplette Wörterbücher mit Zahlenkombinationen durch. Um 123456 zu knacken, brauchen die weniger als 0,1 Sekunden. Bei Nissan385 könnte es schon 2 bis 6 Sekunden dauern. Haltet ihr euch an die obrigen Angaben, dauert es etwa 100 Jahre, da jeder Punkt expotentiell mehr Möglichkeiten darstellt.
Der Schlüssel des Sm-Servers und nur dieser wird in der Datei /home/ukswitch/.smserver/key.txt notiert.
Wird diese Datei angelegt, muss sie geschützt werden:
sudo chown ukswitch:ukswitch /home/ukswitch/.smserver/key.txt
sudo chmod 0600 /home/ukswitch/.smserver/key.txt
Somit hat nur der Benutzer ukswitch und root Zugriff auf diese Datei.
Problem Schlüsselaustausch
Bei synchronen Verschlüsselungen besteht grundsätzlich das Problem des Weitergebens des Schlüssels. Zu viele können mitleseen. Der Schlüssel darf niemals veröffentlicht werden.
Deshalb gelten folgende Regeln für die Weitergabe des Schlüssels:
- Niemals per Social-Media wie WhatsApp, Telegram, Facebook u.a.
- Niemals auf eigener Webseite ausgeben.
- Per Mail nur, wenn die Nachrichten asynchron (mittels GPG) verschlüsselt werden, machen heute leider nur sehr wenige Menschen.
- Zettel und Stift, persönliche Übergabe, ok, da darf es auch ein USB-Stick sein.
Inhalt