Weihnachtsbeleuchtung mit dem Smartphone steuern

Armin Baldemair
armix.one
Published in
4 min readDec 23, 2015

--

Weihnachten steht vor der Tür und fast auf jedem Christbaum, und in vielen Gärten und Terassen, tun Leuchtdioden ihren Dienst in Form einer Lichterkette. Mittlerweile gibt es die Dinger ja schon in allen Variationen: Ketten und Netze, einfärbig und bunt, permanent leuchtend oder blinkend.

Warum aber immer fertiges “Zeug” im Laden kaufen, wenn man sich auch selbst etwas basteln kann? Vielleicht sogar etwas Besseres als die 08/17-Lösungen aus dem Handel. Wie wäre es etwa mit einer LED-Beleuchtung Marke Eigenbau, die man vielleicht sogar vom Smartphone aus steuern kann? So schwierig ist das nämlich gar nicht.

Vor vier Jahren habe ich im Rahmen meiner damaligen Bachelorarbeit am Studiengang Informationstechnik & System-Management der FH Salzburg so eine Lösung entwickelt, über die ich euch ein Bisschen was erzählen möchte — vielleicht als Inspiration für einen eigenen kleinen “Hack”.

Was man braucht:

  • Eine Steuerung. In meinem Fall war das ein Board von Freescale, das damals vorgegeben wurde. Heutzutage wird man für sowas wohl eher einen günstigeren Raspberry Pi verwenden.
  • Ein Betriebssystem. In meinem Fall war GNU/Linux (wegen sysfs) das System der Wahl.
  • Eine Schnittstelle zwischen Hardware-Board und LEDs. Das war eine kleine Eigenentwicklung, die aber nur auf sowieso vorhandene PWM-Pin’s des Boards zurück griff. (Siehe Foto)
Board

Wie kann man so etwas also angehen? Die Ansteuerung einer LED kann man einfach mittels einer Pulsweitenmodulation (PWM) realisieren. Bei meinem i.MX53-Board gibt es da beispielsweise das “pwm-backlight.0”, das man über das sysfs-Dateisystem ansprechen kann.

Sysfs verhält sich wie ein hierarchisches Dateisystem: Ordner in denen sich Textfiles befinden. Es sind aber keine wirklichen Textdateien, sondern eigentlich Zugriffe auf die Hardware. So gibt es etwa eine Einschalt-Datei für eine gewisse Hardware. Schreibt man in diese virtuelle Datei eine “1”, so wird die Hardware eingeschaltet. (Ganz einfach ausgedrückt.) Beim pwm-backlight.0 des i.MX53 gibt es da beispielsweise 2 “Files” (bzw. eigentlich Parameter): bl_power und brightness. Mit dem ersten schaltet man generell ein, mit dem zweiten steuert man — auf PWM-Basis — die Helligkeit der LED. Dabei gibt es 256 Helligkeitsstufen, von 0 bis 255.

Um nun also beispielsweise auf “halbe Helligkeit” zu schalten müsste man via sysfs bl_power=1 und brightness=127 setzen. Das kann man beispielsweise einfach via Bash mit einem echo machen:

echo 1 > /sys/class/backlight/pwm-backlight.0/bl_power
echo 127 > /sys/class/backlight/pwm-backlight.0/brightness

Mit einem cat kann man schließend abfragen, ob die Parameter korrekt übernommen wurden.

Nun ist es aber recht mühsam eine SSH-Verbindung zu einer Linux-Box aufzubauen und dann via Bash einen Befehl abzusetzen. Angenehmer sind da beispielsweise ein Webinterface oder gar eine Smartphone-App. Ich habe mich damals für beide Varianten entschieden.

Auf erwähntem Board läuft LARAserv, eine Eigenentwicklung auf Java-basis die NanoHttpd für die HTTP-Implementierung nutzt. LARAserv bietet zum Einen ein Webinterface, über das man LEDs steuern kann…

lara-webserver

…und zum Anderen wird über eine XML-Schnittstelle ein Webservice bereitgestellt, der von einer eigenen Client-App genutzt wird. Ich habe mich damals auf Android beschränkt. Durch das erwähnte XML-Interface sollte es aber keine Schwierigkeit darstellen, auch Clients für andere Systeme bereitzustellen — solange die Umgebung des Client nur die Möglichkeit einer HTTP(S)-basierenden Kommunikation mit einem Server hat.

lara-androidclient-details-borderless

Die komplette Implementierung an dieser Stelle genau zu beschreiben würde den Rahmen dieses Blog-Posts sprengen. Man kann es aber darauf zusammen fassen, dass der Webserver unterschiedliche Arten (PWM, DALI, DMX,…) von LEDs verwaltet. Jede “Art” wird als Java-Klasse realisiert, die ein Interface implementiert. Somit weiß der Server unabhängig von der darunterliegenden LED, wie diese anzusteuern ist.

package com.laraserv.modules.ledinterface;
/**
* LED Interface
* Each connector interface must implement this interface to ensure the
* implementation of the following methods.
*
* @author Armin.Baldemair
* @version 1.0
*
*/
public interface ILedInterface {
public void init();
public int getId();
public void setId(int id);
public void enable();
public void disable();
public Boolean isEnabled();
public Boolean setBrightness(float brightness);
public float getBrightness();
public Boolean setLinearDimmer(float brightness, float timeframe);
public Boolean setLinearDimmer(float brightness, float timeframe, int steps);
public Boolean setLogDimmer(float brightness, float timeframe);
public Boolean setLogDimmer(float brightness, float timeframe, int steps);
public String getType();
public String getIdentifier();
public void test();
}

Die Verwaltung der LEDs wurde über eine ArrayList und eine SQLite-Datenbank realisiert, die alle zu verwaltenden LEDs enthält. Sowohl über das Webinterface als auch über die Smartphone-App (und den im Hintergrund verwendeten XML-Webservice) kann so auf alle verwalteten LEDs zugegriffen werden.

Den Ideen des Entwicklers sind somit so gut wie keine Grenzen gesetzt. Ob eine zeitgesteuerte Ein/Ausschaltung einer LED (bzw. eines LED-Strangs), Steuerung via Tablet und Webinterface (ohne App) oder via Smartphone und App. Vielleicht sogar ein blinken/dimmen zum Rhythmus einer Musik. Alles ist möglich. :-)

--

--