Dokumentation UKSwitch-SmServer

Aufgabe des SmServers

Unter einem Server stellen sich viele Menschen einen Computer mit ganz vielen Kabeln dran vor. Das ist auch so richtig, sollte aber besser Servergerät heißen, da es hier um die Hardware geht.

Es gibt auch Software-Server, das sind Programme, die auf einem Computer ausgeführt werden. Bei den meisten Computern, die man täglich nutzt, laufen mehrere solcher Software-Server im Hintergrund. Der eine kümmert sich um die grafische Darstellung und der andere verwaltet das Drucken von Dokumenten usw.

SmServer ist so ein Software-Server, der für Linux-Debian-Systeme programmiert ist. Als Hardware reicht hier bereits ein Raspberry Pi Zero für unter 20€.

Aufgaben des SmServers sind:

  1. Verwalten und Ansprechen von WLan-Modulen (ideal für Mietswohnungen)
  2. Verwalten und Schalten von GPIO-Ausgängen
  3. Verwalten und Schalten von Objekten auf anderen SmServern (z.Bsp. Ferienhaus, Werkstatt, etc.)
  4. Bereitstellen von Interfaces für den Zugriff von Clients, die da wären:
    1. Mehrere unverschlüsselte TCP-Verbindungen für das Heimnetz mittels IPV4- und IPV6-Adressierung für Kommunikation bereitstellen.
    2. Eine unverschlüsselte UDP-Verbindung für das Heimnetz mittels IPV4- und IPV6-Adressierung bereitstellen, die mit mehreren Clients gleichzeitig kommunizieren kann.
    3. Mehrere verschlüsselte TCP-Verbindungen für Kommunikation aus dem Internet mittels IPV4- und IPV6-Adressierung bereitstellen.

Der SmServer ist also eine Interface (eine Schnittstelle) zwichen Anwendern und den zu schaltenden Objekten.

Inhalt

Der SmServer im Linux-System

Meist braucht man beim Konfigurieren oder Ausführen von Servern Root-Rechte (Administratorrechte).

SmServer braucht diese Rechte nicht. Er läuft als Benutzer ukswitch. Dieser Benutzer hat keinerlei Root-Rechte. Somit hat SmServer keinerlei Rechte, am Grundsystem was zu ändern.

Aus diesem Grund liegt das Programm nicht wie gewohnt im Verzeichnis /usr/bin/ sondern in /home/ukswitch/bin/.

Werden von uns vorkonfigurierte Geräte erworben, hat der Benutzer ukswitch dass Passwort ukswitch. Ihr könnt es jederzeit mittels

sudo passwd ukswitch

ändern.

GPIO-Ausgänge nutzen

Ursprünglich wurde SmServer zum Schalten von GPIOs auf einem Raspberry Pi erschaffen. WLan-Module und ExternSm-Objekte kamen später.

Um GPIOs nutzen zu können, braucht man standardmäßig Root-Rechte. SmServer soll aber nicht als root laufen. Deshalb sind einmalig folgende Schritte notwendig:

  1. sudo addgroup gpio
  2. sudo adduser ukswitch gpio
  3. Man erstellt mit Root-Rechten die Datei /etc/systemd/system/gpiochip.service mit folgendem Inhalt:
    
    [Unit]
    Description=GPIO-Chips für Gruppe gpio freigeben
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    Nice=0
    User=root
    ExecStartPre=/usr/bin/chown root:gpio /dev/gpiochip0
    ExecStart=/usr/bin/chmod 0660 /dev/gpiochip0
    
    [Install]
    WantedBy=multi-user.target
                 
  4. sudo systemctl enable gpiochip.service
  5. sudo systemctl start gpiochip.service

Wenn sich nun der Benutzer ukswitch neu anmeldet, darf er GPIOs nutzen. Da der Dienst (service) aktiviert ist, gilt das auch nach einem neuen Starten des Systems.

Was noch zu sagen wäre: Bis Debian 12 (bookworm) benötigt SmServer das Packet libgpiod2 , um auf GPIOs zugreifen zu können. In Debian 13 (trixie) wurde libgpiod2 durch libgpiod3 ersetzt. Das bedeutete für mich, dass ich die Konfiguration eines GPIO-Ausganges komplett umschreiben und aufwendige Tests (Stabilität, Geschwindigkeit, Langlebigkeit) durchführen musste. Deshalb gibt es nun SmServer Version 2 und SmServer Version 3.

Inhalt

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:

  1. Dein Browser verbindet sich mit der Zertifizierungstelle und erhält den öffentlichen Schlüssel von www.ukswitch.de.
  2. Dein Browser erstellt eine Verbindung zu www.ukswitch.de und prüft Gültigkeit und ob der Schlüssel zur Adresse passt.
  3. Dein Browser sagt zu meinem Webserver asynchron verschlüsselt "Hallo ich will was."
  4. Darauf hin wird per Zufall ein Schlüssel für eine synchrone Verschlüsselung ausgetauscht.
  5. Dein Browser sendet nun synchron verschlüsselt zu meinem Server "GET index.html HTTP/1.1".
  6. 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:

  1. mindestens 12 Zeichen lang
  2. Großbuchstaben und Kleinbuchstaben
  3. Zahlen und Sonderzeichen
  4. 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:

Und wie kann man den Schlüssel weiter geben? Ganz einfach: persönlich.

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&nbsp;zu&nbsp;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&nbsp;zu&nbsp;Hause
  ListenPort 6961
  EListenPort 6963
  Lat 50.84326 Lon 11.01972

  # --- WLan-Module ---
  <wlanmodule>
    WmName Stehlampe
    WmDescription Stehlampe&nbsp;im&nbsp;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:

AttributBeschreibung
WmNameDas ist der Name des Gerätes, mit dem man dieses ansprechen möchte.
Leider müssen hier Leerzeichen mit &nbsp; (HTML-Leerzeichen) angegeben werden. Wer Geräte oft aus einer Konsole ansprechen möchte, sollte vielleicht auf Leerzeichen im Namen verzichten.
WmDescriptionHier 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:
  1. IPV4-Adresse, z.Bsp. 192.168.2.126
  2. IPV6-Heimnetzadresse, diese beginnt immer mit fd00::, z.Bsp. fd00::cf8:e0fa:fe43:6226
  3. Gerätename, Hostname, das ist der Name, mit dem das Gerät am Router angemeldet ist.
WmPortHier wird der Port angegeben, auf dem das WLan-Modul auf Verbindungen lauscht. Standardmäßig ist dieser 49112.
DeviceEin 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.
pictureFileOnBilddatei, 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.
pictureFileOffBilddatei, die auf der Weboberfläche angezeigt wird, wenn das Gerät ausgeschaltet ist.
Für den Pfad gilt das gleiche wie eben.
smoothIst 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.
attacksafeWird 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.
nowontimeHier 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.
powerHier 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.

GPIOS

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:

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&nbsp;zu&nbsp;Hause
  ListenPort 6961
  EListenPort 6963
  Lat 50.84326 Lon 11.01972

  # --- GPIO-Ausgänge ---
  <output>
    OutputName Fernseher
    OutputDescription Fernseher&nbsp;GPIO&nbsp;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:

AttributBeschreibung
OutputNameDas ist der Name des Gerätes, mit dem man dieses ansprechen möchte.
Leider müssen hier Leerzeichen mit &nbsp; (HTML-Leerzeichen) angegeben werden. Wer Geräte oft aus einer Konsole ansprechen möchte, sollte vielleicht auf Leerzeichen im Namen verzichten.
OutputDescriptionHier kann eine kurze Beschreibung zum Gerät angegeben werden. Diese wird in einigen Clients und auf der Weboberfläche angezeigt.
OutputGpioNumberHier gibt man die Nummer des GPIOs an, der für den Ausgang genutzt werden soll.
pictureFileOnBilddatei, 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.
pictureFileOffBilddatei, die auf der Weboberfläche angezeigt wird, wenn das Gerät ausgeschaltet ist.
Für den Pfad gilt das gleiche wie eben.
smoothIst 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.
attacksafeWird 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.
nowontimeHier 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.
powerHier 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&nbsp;zu&nbsp;Hause
  ListenPort 6961
  EListenPort 6963
  Lat 50.84326 Lon 11.01972

# ----- ExternSmObkekte -----
 <externsm>
    SmName Heizung&nbsp;Ferienhaus
    EsmName Heizung
    SmDescription Heizung&nbsp;im&nbsp;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:

AttributBeschreibung
SmNameDas ist der Name des Gerätes, mit dem man dieses auf diesem Server ansprechen möchte.
Leider müssen hier Leerzeichen mit &nbsp; (HTML-Leerzeichen) angegeben werden. Wer Geräte oft aus einer Konsole ansprechen möchte, sollte vielleicht auf Leerzeichen im Namen verzichten.
EsNameDas ist der Name,mit welchem das Objekt am anderen SnServer angelegt wurde.
SmDescriptionEine kurze Beschreibung zum Objekt, die dieser SmServer an Clients ausgibt.
SmAdressDer andere SmServer muss erreichbar sein, was im Internet Probleme geben kann. Ihr könnt folgendes nutzen:
  1. IPV4-Adresse des Routers im Ferienhaus, wenn der Provider diese nicht ändert.
  2. IPV6-Adresse des Gerätes im Ferienhaus, wenn der Provider diese nicht ändert.
  3. Internetadresse: z.Bsp. smserver.meinferienhaus.de, dafür muss man aber bezahlen. Vielleicht gibt es noch kostenlose Anbieter von Dyn-DNS-Adressen.
SmPortPort auf dem der andere SmServer auf verschlüsselte TCP-Verbindungen lauscht.
SmKeyWenn 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.
pictureFileOnBilddatei, 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.
pictureFileOffBilddatei, die auf der Weboberfläche angezeigt wird, wenn das Gerät ausgeschaltet ist.
Für den Pfad gilt das gleiche wie eben.
attacksafeWird 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.
nowontimeHier 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.
powerDieses 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&nbsp;Schreibtischlampe&nbsp;und&nbsp;Stehlampe
    pictureFileOn /bilder/smarthome/lichtAn.png
    pictureFileOff /bilder/smarthome/lichtAus.png
    nowontime 0
  </pseudo>

Die Attribute im Einzelnen:

AttributBeschreibung
PsNameEin Name für das Pseudo-Objekt. Er sollte so gewählt werden, was damit geschaltet wird.
PsDescriptionEine kurze Beschreibung zu diesem Pseudo-Objekt, vielleicht, was alles damit geschaltet wird.
pictureFileOnBilddatei, 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.
pictureFileOffBilddatei, die auf der Weboberfläche angezeigt wird, wenn das Pseudo-Objekt ausgeschaltet ist.
Für den Pfad gilt das gleiche wie eben.
nowontimeKlar, 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.

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
  1. Man installiert vorher ein Enrgiemessgerät zwischen Stromversorgung und Kühlschrank im Fereinhaus, welches selbst elektrische Energie benötigt.
  2. 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.
  3. Am Abreisetag, alles ist schon im Auto ordentlich verladen, schalte ich den Kühlschrank per SmServer aus.
  4. 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:

  1. Die Frau kauft exakt auf das Gramm genau die gleichen Lebensmittel, Kühlschrank wird am 1. Mai exakt 18 Uhr eingeschaltet.
  2. Ab dieser Zeit müssen Temperatur und Luftfeuchtigkeit bis zum Abreisetag exakt den Werten des Vorjahres sein, das geht nicht.
  3. 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.
  4. 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

SmServer neu starten

Der Smserver läuft als service (Dienst) aber als Benutzer ukswitch im System und wird beim Booten automatisch gestartet. Deshalb kann nur ein Benutzer, der Root-Rechte hat, mittels systemctl darauf zugrefen.

Neustart des SmServers:

sudo systemctl restart smserver.service

Allerdings passiert hier folgendes:

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:

  1. 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.
  2. 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.
  3. dok.ukswitch.de besitzt selbst einen privaten Schlüssel, nur mit dem kann er die Anfrage entschlüsseln (asynchrone Verschlüsselung).
  4. 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.
  5. Euer Browser entschlüsselt diesen Schlüssel mit dem öffentlichen Schlüssel (immer noch asynchron).
  6. 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:

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:

Inhalt