Donnerstag, 28. Februar 2013

HAIN: Schalten und Walten

Wie im letzten Teil der Serie versprochen, wollen wir jetzt Steckdosen an und aus schalten.
Ziel der Übung ist per serieller Schnittstelle Funksteckdosen zu schalten. Dazu können in einem Terminalprogramm befehle der Form "S:<housecode><deviceid><0|1>" eingegeben werden. der Hauscode und die Deviceid können über DIP-Schalter an der Steckdose eingestellt werden. Die letzte Stelle des Kommandos entspricht an(1) oder aus(0).

Über diese fummeligen Schalterchen stellt ihr Housecode und DeviceId ein.  Der Housecode reicht von 00000 bis 11111 (32 Möglichkeiten) für die Device Id wird nur einer der Schalter  eingestellt. Die Buchstaben A-D entsprechen im Programm den Zahlen 1-5




Die Teileliste für Heute ist ziemlich überschaubar. Ihr braucht:

  • einen Arduino
  • ein 434MHz Sendemodul oder einen Transceiver z.B. von hier
  • Funksteckdosen, zum Beispiel diese diese hier


Die o.g. Funksteckdosen, genauso wie fast alle anderen die man für kleines Geld beim Elektroversand bekommt funken bei 434MHz nach dem sogenannten ASK-Verfahren. ASK steht für Amplitude Shift Keying . vereinfacht gesagt, wird hierbei das Trägersignal, sprich das 434MHz Funksignal für unterschiedlich lange Zeiträume ein und ausgeschaltet. Je nach Pulsdauer entspricht das dann 0 oder 1.

Glücklicherweise gibt es für den Arduino schon eine Library die das Protokoll der Steckdosen unterstützt, so das wir uns nicht selbst darum kümmern müssen. Sie heißt rcswitch und ihr findet sie hier. Um sie verwenden zu können müsst ihr einfach nur das Zipfille runterladen und ins Verzeichnis "libraries" unterhalb eures sketchbooks entpacken. Unter Umständen muss das Verzeichnis vorher erstellt werden.

Der Anschluss des Funkmoduls ist so einfach, dass ich mir einen Schaltplan schenke. verbindet einfach den DATA-Pin mit Arduino Pin 3, VCC mit +5V und GND mit Masse. An den Anchluss ANT kommt ein kurzes Stück Draht von ca. 18cm.

Mein Aufbau auf einem Proto-Shield

Werfen wir nun einen Blick auf das Beispielprogramm. Den kompletten Code gibt es im git-repository im Ordner OutletSwitchExample. Diesen braucht ihr nur in euer sketchbook-verzeichnis zu kopieren und auf den Arduinio zu spielen. Danach könnt ihr dann über den Serial-Monitor der Arduino-IDE oder über ein anderes Terminalprogramm Befehle nach dem oben genannten Muster eingeben.

Das Programm ist nicht super komplex, weshalb ich hier nur auf die wichtigsten Punkte eingehen möchte:



#include <RCSwitch.h>


RCSwitch mySwitch = RCSwitch();

void setup() {

// Transmitter is connected to Arduino Pin #3

mySwitch.enableTransmit(3);
Serial.begin(9600);
}
Als erstes muss die Library eingebunden und eine Instanz der Klasse RCSwitch erzeugt werden. In der setup-methode wird der Pin fürs Funkmodul gesetzt und die Serielle Schnittstelle initialisiert.





Die Loop-Methode liest Befehle von der seriellen Schnittstelle ein und leitet sie an die entsprechende process-Methode weiter:


void processSwitch(char *cmdString){      

      char houseCode[6] = "";
      for (int i = 2; i < 7; i++){
        houseCode[i-2] = cmdString[i];
      }
      houseCode[6] = '\0';
      Serial.print("Housecode: ");
      Serial.println(houseCode);

      int deviceNumber = cmdString[7]-48;  
      Serial.print("devicenumber");
      Serial.println(deviceNumber, DEC);
      int action = cmdString[8]-48; 
      switch(action){
      case ON:
        Serial.println("switching ON");
        mySwitch.switchOn(houseCode, deviceNumber);
        break;
      case OFF:
        Serial.println("switching OFF");
        mySwitch.switchOff(houseCode, deviceNumber);
        break;
      }
  
}



Hier passiert die eigentlich Arbeit. Der String wird in Hauscode und deviceId zerlegt und anschließend  die switchOn bzw. switchOff aufgerufen. Es gibt verschiedene Arten von Funksteckdosen, die mit 434MHz funken. Bei meinen wird der Devicecode mit DIP-Schaltern eingestellt, es gibt aber auch welche mit Drehschaltern. Die switch-Methoden sehen dann entsprechend anders aus. Wie genau erfahrt ihr auf der Seite von RCSwitch.

Beachtet bitte, dass in diesem Beispiel der Einfachheit halber sämtliche Fehlerbehandlung fehlt. Wer sich vertippt muss damit rechnen dass komische Sachen passieren. Kaputt gehen dürfte dabei aber eigentlich nichts.

Das war's für dieses Mal. Im nächsten Artikel werden wir dann etwas durch die Gegend funken.


HAIN: Intro

Vor einiger Zeit bin ich durch einen Java-Magazin Artikel auf OpenHAB aufmerksam geworden. OpenHAB steht für Open HomeAutomation BUS und bietet eine Systemübergreifende Oberfläche für Heimautomatisierung. Unglücklicherweise sind alle von OpenHAB unterstützten Systeme vergleichsweise teuer und wirklich brauchen tue ich sowas eigentlich auch nicht also landete die Sache bis auf weiteres in der Ablage.

Weiteres kam in Form eines Artikels in der c't Hardware Hacks . In diesem Artikel ging es darum wie man mit einem Arduino billige Funksteckdosen schalten kann.

Und so kommt HAIN ins Spiel HAIN wird ein kleines und vor allem günstiges Heimautomationssystem auf Basis eines Arduinos. Die eigentliche Kommunikation mit den Sensoren und Aktuatoren übernimmt hierbei der Arduino. Dieser wiederum hängt per USB am PC und enthält von hier Steuerbefehle bzw. sendet Sensordaten. Ab hier übernimmt dann OpenHAB.

So der Plan. Bis dahin gibt es aber noch viel zu tun und genau das will ich in dieser Artikelserie dokumentieren. In den nächsten Wochen, Monaten und hoffentlich nicht Jahren werde ich die einzelnen Teile genauer erklären und beschreiben und am Ende steht dann mit etwas Glück ein brauchbares System.

Alle Programmcodes und so weiter gibt's im github-repository.

Im nächsten Artikel werden wir dann ein paar Steckdosen schalten...