<
Arduino
PowerControl Projekt
>

PowerControl Projekt

Smart Home Projekt zum Steuern von Geräten Zuhause

Dieses Projekt war ein Projekt an meiner Schule. Es beeinflusste spätere Projekte wie "Raspberry Pi Backup Server" und "Stratoflights 2019". Es war aber als Projekt früher jugend und schulischer Ausbildung geprägt. Deshalb sind einige Dinge unüberlegt gewesen oder in nicht so besonders gutem Stil umgesetzt worden. Jedoch verbergen sich hier einige tiefe Überlegungen, weshalb ich das Projekt hier mal vorstelle. Hinter dem Projekt steckt das, was sich heute Smarte Steckdose nennt und zu haufe verkauft wird. Jedoch habe ich damit nichts zu tun.

Das Schulprojekt

In einer Schule (Oberstufenzentrum) habe ich einen Teil meiner Ausbildung gamacht. Dort haben wir viel zum Thema IT, Netze und Netzwerke gemacht. Darauf lag der Fokus. Nun hat die Schule jedes Jahr einen Tag der offenen Tür. Zu diesem werden von allen Kursen Dinge den Besuchern präsentiert, um diese für die Ausbildung an der Schule zu interessieren. Unsere Lehrer hatten die Idee gehabt, da gerade Raspberry Pi und Arduino Boards angeschafft waren und das Thema Smart Home aktuell war, dass wir Schüler dazu etwas machen sollten. Also mit entweder dem Raspberry Pi oder dem Arduino etwas steuern, messen womit sich eine kluge Idee für Smart Home ergibt. Die Ausarbeitung sollte in den Unterricht und damit als Projektnote in das Zeugnis einfließen. Ich arbeitete an dem Projekt mit einem Mitschüler. Wir begangen damit im November 2015 und hatten Zeit bis zum Februar 2016. Denn da war der Tag der offenen Tür. An diesem sollten die Projekte eben nicht nur der Klasse, dem Lehrer vorgestellt werden, sondern dem Publikum das zu diesem Tage kam.

Die Projekt Idee

Die Idee war, aus dem Raspberry Pi und dem Arduino ein Projekt zu machen. Ich sah den Arduino als Microcontroller eher in der Funktion als Messgerät oder Steuereinheit. Den Raspberry Pi hatte ich eher mit Webserver und anderen Anwendungen als den zentralen Mittelpunkt im Sinn. Man hat bei Smart Home oft die Anwendung etwas intelligent an- oder auszuschalten. Oder etwas zu überwachen. Dafür eignet sich der Arduino ganz gut. Doch alle Einstellungen vornehmen und Werte überwachen wollen Nutzer lieber am Smartphone oder gerade mal am Computer. Da eignen sich eben Anwendungen besser, die man über dem Raspberry laufen lässt. Obwohl dieser ebenfalls steuern kann.
Ich kam aber auf die Idee ein System zu bauen, was heute vergleichbar ist mit Smart Home Systemen wie ZigBee ist. Viele kleine Sensor- und Aktor Einheiten und ein zentraler Rechner, an dem alles gesteuert und verwaltet wird. So sollte zwischen einem Gerät wie Kühlschrank oder Fernsehr und der dazu gehörigen Steckdose ein Arduino mit Messsensor für Strom und Spannung, sowie ein Relais installiert werden. Damit sollte der Energieverbrauch erfasst werden. Im Beispiel könnte man den genannten Fernseher abschalten, wenn beispielsweise niemand im Haus ist. Um den Energieverbrauch sehen zu können und über das Jahr berechnen zu können sollten die Messwerte aller Arduinos auf den Raspberry Pi geschickt werden und dort verarbeitet werden. Dort hätte der User auch gleich alle Einstellungen vornehmen können.

Erster Prototyp

Messung der Verbraucherleistung

Da wir Spanung und Strom der Verbraucher messen wollten um die Verbrauchte Leistung zu berechnen mussten wir uns über das Vorgehen bei der Messung gedanken machen. Als Controller für die Messung sollte ja ein Arduino dienen. Dieser hat eine Analoge Schnittstelle. Da Spannung und Strom auch analoge Werte sind, lag es nahe, das Analog Interface dafür nutzen zu müssen. Doch der Arduino selbst kann nur TTL- Spannungen an diesem Inerface messen. Wir wollten aber die Messung an der Steckdose ausführen bzw. uns zwischen Steckdose und Verbraucher schalten und messen. Und dort liegen eben 230 Volt Wechselspannung an. Außerdem fließen bei manchen Verbrauchern auch große Ströme. Dies wäre so mit den Analog Interface des Arduino nicht messbar.
Nach langem suchen im Internet fanden wir ein Beispiel, wie im Bild gezeigt. Es benutzt einen speziellen Messkontroller, mit dem der Strom am Verbraucher Kreis gemessen werden kann und dem Arduino als analoger Wert zu gesendet wird. Die Spannung wird daneben mit einem Spannungsteiler abgenommen. Leider fanden wir den Messer nicht einfach zu bekommen. Auch eine Anleitung fand sich erstmal nicht.
Ich schätze, dass der Stromwert über Spannungsfaktoren einer Referenzspannung in den Arduino gespeist wird. Das bedeutet, man müsste dies erst wieder umrechnen auf einen Stromwert. Auch die Spannung hätte man aufgrund des Spannungsteilers noch gegenrechnen müssen. Und wie man im Bild sieht, geht man in diesem Beispiel von 24 Volt aus (Wahrscheinlich auch noch Gleispannung) und wir wollten 230 Volt messen. Da uns dazu erstmal die Kentisse und Mittel fehlten, haben wir erstmal nur das Schalten von Verbrauchern mit dem Arduino Realisiert.

Messschaltung aus einem Beispiel im Internet um mit dem Arduino Spannung und Strom messen zu können

Einfache Schaltfunktion mit dem Arduino

Um mit dem von uns überlegten System zum Beipiel auch eine Lichtsteuerung zu machen, sollten natürlich die Arduino auch Schalten können. Eine sehr grundlegende Übung. Jedes Arduino Schaltmodul sollte sich per Server schalten lassen. Sonst macht das natürlich keinen Sinn. Der Server ist unser "Gehirn" und steuert alles zum Beispiel nach einem Zeitplan. Und für das Licht sollte deswegen natürlich ein Arduino genommen werden, um dem Beispiel zufolge das Licht automatisiert zu schalten. Doch wenn wir einfach das Stalten an der Steckdose vornehmen, könnte man nicht mehr manuell schalten, wenn es im System zur Zeit gerade aus ist. Und den Gedanken, sich erst in die Websteuerung anmeldun zu müssen, um dann in dieser den Arduino sagen zu können, dass er mal einschalten soll, fanden wir nicht sinnvoll. Deswegen war klar, dass es der Ardunino von der Ferne aus (also vom Server) schalten sollte und wenn man direkt an ihm eine Taste betätigt.
So haben wir erstmal die möglichkeit zum Schalten am Arduino entworfen. Im Bild sieht man eine LED, die am Arduino angeschlossen ist. Sie kann nach dem Entwurf durch eine gößere Lampe für die Steckdose ersetzt werden (auch wenn das eventuell eine zusätzliche Schaltung benötigt). Tja und der Taster, der mit einem Wiederstand am Arduino angeschlossen ist, benutzt man dann zum direkten Schalten. Dieser kann später durch einen größeren Taster ersetzt werden (zum Beispiel auch einen Wandtaster). Somit kann der User direkt schalten, wenn er es gerade Braucht oder das System schaltet per Befehl vom Server.

Primitiver Entwurf der Arduino Steuerschaltung

Verbindung des Arduinos mit dem Raspberry Pi

Damit der Arduino nun auch von der ferne geschaltet werden kann, also vom Server aus, stellte sich die Frage, wie das gehen sollte. Der Raspberry Pi sollte ja der Zentrale Server sein. Also sollte er sich mit den Arduinos verbinden können. Das muss dann natürlich eine möglichst freie Kommunikation sein. Also zum Beispiel über Funk im Niederfrequenz bereich oder auf bestehende Funknetze wie WLAN. Doch die Zeit drängte und die Zusatzkomponenten fehlten. Auch sahen wir beispiele, wie man mit dem ESP8266 und ein bisschen Software den Arduino an WLAN verbinden kann. Doch das Verständnis fehlte uns dafür.
Beim suchen in den Beispielen für den Arduino fand ich das "SerialEvent" beispiel vom Entwickler Tom Igoe. Es zeigt einem das verwenden der im Arduino befindlichen Seriellen Schnittstelle. Diese kann man mit den Tx/Rx Pins der Digitalen Kontaktleiste benutzen oder per USB Kabel. Nun - und man kann dann einfach den Arduino mit einem USB Kabel an einen Raspberry Pi anschließen. Wenn man dann den Code von "SerialEvent" auf den Arduino lädt und am Raspberry Pi in der Arduino IDE den "SerialMonitor" öffnet, kann man dem Arduino einen Text schicken, der diesen einem wieder zurück schickt.
Das war dann die Alternative für uns, um für den Prototyp erstmal einen Arduino am Raspberry zu betreiben. Wir testeten noch die Verwendung ohne Arduino IDE aus und entwickelten dafür ein kleines Python script. Und sobald der Arduino eine 1 oder 0 empfing, schaltete er die LED eben ein oder aus. So konnten wir prinzipiell am Arduino direkt und per "Remote" vom Raspberry Pi steuern.

Ein Foto des Prototyps mit einer LED als Gerät zum Schalten angeschlossen an einem Arduino UNO R3. Dieser ist wiederum am Raspberry Pi per USB angeschlossen und wird von dort betreut.

Ein Protokoll für die Kommunikation

Nun war es nötig, über einen Kanal dem Arduino Anweisungen senden zu können und Rückmeldungen empfangen zu können. Denn man hätte natürlich einfach irgendetwas schicken können als Impuls und darauf den Arduino das Gerät toggeln lassen können. Aber wir wollten ja mehr.
Wir wollten neben dem Schalten des Geräts auch die gemessene Leistung abfragen können um diese auf dem Server speichern zu können. Daraus sollte ja schließlich auch eine Berechnung der Stromkosten auf das laufende Kalenderjahr erfolgen.
Weiter wollten wir auch, dass der Benutzer zu einem gewälten Zeitpunkt das Gerät einschalten oder ausschalten kann. Sinnvoll ist dem entsprechend auch, dass man das wiederum abfragen kann, was gerade eingestellt ist.
Also beschloss ich eine Art eigenes Protokoll für die Kommunikation der beiden Systeme zu definieren. Es gab eine Folge von Befehlen, die teilweise mit Parametern erweitert gesendet worden. Auch für das Zurücksenden von Informationen gab es definierte Ketten.
Auf dem Arduino musste dafür natürlich erst einmal die Symboltrennung programmiert werden. Zum Glück wartete der angesprochende SerialEvent Code bis ein gesamter String empfangen war. So musste ich diesen im Anschluss nur in die Wort Teile zerlegen und den Code darüber in die entsprechenden Verzweigungen lenken. Der Arduino gab natürlich immer etwas zurück. Also mindestens, ob der Befehl erfolgreich war, nicht erfolgreich war oder ob er mit dem gesendeten nichts anfangen konnte. Hatte man den Controller gebeten, einem eine Info zuschicken, mit einem Schlüsselwort was man wissen wollte, hat der Controller eben mit dieser Information geantwortet.
Die im Protokoll verwendeten Schlüsselworte waren auf 4 Zeichen pro Wort festgelegt. Diese Verkürzung hätte dann ein Programm auf dem Raspberry Pi wiederum in aussage kräftigere Informationen wandeln müssen. Oder es hätte die Befehle so verkürzt zusammenstellen müssen, so dass der Benutzer keine Kenntnis darüber haben müsste.
Befehlscodes (zu senden mit \0 ):
Befehlskette Beschreibung
setA Gerät Einschalten
setI Gerät ausschalten
setT <TIME_NOW FORM(HH_mm_ss)> <TIME_TICK FORM(HH_mm)> (dact | nact) Zu gewünschter Zeit schalten, mit 1) Aktueller Zeit, 2) Ziel Zeit, 3) (De-)Aktivieren
info (stat | lght | powr | time) Status info für Gerätezustand | Lichtwert am Senor | Aktuelle Leistung am Verbraucher | Einstellung der Zeitsteuerung
Rückmeldecodes (Empfangen mit \n):
Rückgabewerte Beschreibung
done Befehl ohne Fehler ausgeführt
secf Nicht ausführbar - Sicherheitsabschaltung
echo devc (iact | nact) Anzeige ob Gerät gerade Aktiviert oder Deaktiviert ist
echo lght (nght | dayL | dayS | dayC) Abfrage des Lichtklassifizierung mittels Licht Enum Typ
echo powr <var> Ausgabe der gemessenen Elektrischen Leistung
echo time (iact | nact) + <HH_MM> Ausgabe ob Zeitsteuerung (aktiviert | deaktiviert) ist und Zeitwert. Wenn Deaktivert ist Zeit immer 00:00
fail Nicht möglich! Gerät bereits im angeforderten Zustand
ncom Unbekannter Befehl

Eine Websteuerung für den User

Mit dem definierten Protokoll war das Kommunizieren von Raspberry Pi und Arduino möglich. Das Python Script ermöglichte bereits das Senden und Empfangen der Befehlsketten. Doch das war für den Alltags Nutzer natürlich nicht Umgänglich genug. Und wenn sich so schnell keine App aufbauen ließ, so sollte wenigstens eine Weboberfläche da sein. Nun kam der Raspberry Pi ins Spiel. Auf diesem funktionierte die Kommunikation soweit. Jetzt wurde auf diesem noch ein Webserver installiert und eine Scripting umgebung. Wir benutzten den Apache Webserver. Leider wussten wir nicht, ob man Python direckt am Apache ausführen lassen kann. Aber wie man mit PHP ein Script ausführen kann, welches sich auf dem Server befindet, dass war bekannt.
So haben wir PHP Scripte für die jeweiligen Aktionen geschrieben. Diese haben dann nur die Parameter zusammen gestellt (eventuell welche von einem HTML Form bekamen) und dann das Python script mit den Parametern aufgerufen. Das führte wiederum zum übertragen der Befehle via USB Seriell Schnittstelle an den Arduino und dann konnte dieser den Befehl auseinander nehmen und verarbeiten. Schickte dieser seine Rückgabe zurück, zeichnete das Python Script diese auf und gab sie an PHP weiter. Dort konnte es in eine menschlich lesbare Information verarbeitet und in der Webseite dargestellt werden. Durch ein Betätigen der Ein- oder Aus Funktion konnte man nun also im Sitzen auf dem Sofa mit dem Handy das Licht an machen und für Mitternacht einstellen, dass es wieder ausgehen soll.

Diese Bilder zeigen Screenshots der Weboberfläche, mit derer der User das System verwalten kann. Einmal vom Android Handy und einmal von eimem Computer aus aufgerufen.

Präsentation des Projekts

Am Ende des Projekt stand die Präsentation am Tag der Offenen Tür. Bis dahin, war das Steuern einer Lampe am Arduino direkt und per Remote möglich. Ich baute den Raspberry Pi im Präsentationsraum auf und ließ ihn am Hotspot des Handys laufen. Meinen Laptop hatte ich ebenfalls mit und ihn ebenfalls mit dem Hotspot verbunden. Das habe ich alles gemacht, denn ich wollte zeigen, das man an beiden Geräten die Webseite zum steuern des Systems benutzen kann. Es kamen einige Leute vorbei. Ich errinere mich daran, das ein ältere Herr mit mir über das System und seine Möglichkeiten der Erweiterung gesprochen hatte. (Ich dennke dieser Herr war nur aus Technik interesse da :-D ).

Dinge die nicht Entwickelt wurden

Was nicht mehr Entwickelt wurde, war zum Einen die Erfassung der elektrischen Leistung. Da die Schaltung mit dem Strommesser nicht für Netzspannung war und auch der darin verbaute Stromsensor nicht einfach aufzutreiben war, haben wir nie die Messschaltung entwickelt. Dem zufolge konnten wir natürlich Strom und Spannung nicht erfassen, um sie als berechnete Leistung an den Server zu schicken (zumindest, wenn dieser nach fragt).
Zum Anderen hatten wir über die Steuerung von Licht die Idee bekommen gehabt, dieses entsprechend der Tageslichtmenge zu schalten. Das Protokoll hatte dafür zwar bereits Optionen vorgesehen. Ferner hatten wir uns bereits überlegt gehabt, dass es gut wäre eine Steuerung des Lichtes anhand des Tageslichts zu machen. Aber dafür blieb im Schuljahr aber auch keine Zeit mehr, weshalb wir es nicht mehr entwickelt haben. Aber das ist vieleicht das einfachere Feature, so dass ich es vieleicht noch entwickle.

Was hätte noch entwickelt werden können

Da der Arduino immer noch per USB am Raspberry Pi angeschlossen war, wäre natürlich der nächste Schritt gewesen, die beiden Systeme zu trennen vom Kabel und auf Drahtlos umzustellen.
Sobald das geschafft wäre, gibt es da noch eine Sache. Das Projekt wurde mit einem Arduino UNO durchgeführt. Der Arduino soll aber in der Idee mal am Netzkabel oder im Gehäuse einer Steckdose angeschlossen werden um seine Schaltaufgabe zu erfüllen. Und eventuell sollte die Strommessung auch in die Steckdose eingebaut passen. Dafür ist der UNO aber zu groß. Dafür müsste das ganze mindestens auf einen Arduino Nano portiert werden oder sogar auf einen kleinen Microcontroller auf einer eigenen noch kleineren Platine. Jedoch, wenn es dann so weit gekommen wäre, gäbe es viele solcher Systeme. Diese alle mit dem Raspberry Pi verbunden und von diesem aus verwaltet. Dann könnte man wirklich damit seine Verbraucher steuern und den Strom verbrauch messen. Damit kann der User vielleicht doch noch Energiekosten sparen. Und eine Tageslicht gesteuerte Licht automatik gibt es so dann vielleicht auch noch.