OpenKontrol Gateway – RF Daten senden an COSM

Das OpenKontrol Gateway ist ein optimales Internet-Gateway um meine Sensordaten an die IoT-Plattform Cosm zu senden.

Im nachfolgenden Beispiel werden die Daten von Node 13 an Cosm gesendet. Dabei werden 2 Datenstreams, Temperatur und Batteriespannung übertragen.

Das Senden der Daten an Cosm wird mit der Bibliothek ERxPachube realisiert.

Auf dem Arduino-basierenden Gateway zeigt Pin 17 mittels Status-LED den Empfang von Daten an.

//
// OpenKontrol Gateway - sending rf data to COSM
// Date: 10.05.13
// www.arduino-praxis.ch

#include <SPI.h>
#include <Ethernet.h>
#include <JeeLib.h>
#include <Arduino.h>
#include <HardwareSerial.h>
#include <ERxPachube.h>

// Ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xAD };
byte ip[] = { 10, 0, 1, 101 };
byte gateway[] = { 10, 0, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };

// Cosm API-Key
#define PACHUBE_API_KEY	"YourAPIKey"
// Cosm Feed ID
#define PACHUBE_FEED_ID YOURFEEDID

// Status senden 1:OK
int sendenStatus = 0;

ERxPachubeDataOut dataout(PACHUBE_API_KEY, PACHUBE_FEED_ID);

void PrintDataStream(const ERxPachube& pachube);

// Fixed RF12 settings
#define MYNODE 3            //node ID of the receiever
#define freq RF12_433MHZ     //frequency
#define group 210            //network group

 typedef struct {
          int rxD;              // sensor value
          int supplyV;          // tx voltage
 } Payload;
 Payload rx;

int nodeID;

int value;
int millivolts;

// Data received
const int LEDpin=17;

void setup()
{
  Serial.begin(9600);
  rf12_initialize(MYNODE, freq,group); // Initialise the RFM12B
  Ethernet.begin(mac, ip);

  // 2 Datenstreams Sensor Node 13
  // Temp Inside
  dataout.addData(0);
  // Battery
  dataout.addData(1);

  // Daten empfangen
  pinMode(LEDpin, OUTPUT);
  digitalWrite(LEDpin,HIGH);

  Serial.println("TinyTX Simple Receive Example");
  Serial.println("-----------------------------");
  Serial.println("Waiting for data");
  Serial.println(" ");
}

void loop()
{
  if (rf12_recvDone() && rf12_crc == 0 && (rf12_hdr & RF12_HDR_CTL) == 0) {
  nodeID = rf12_hdr & 0x1F;  // get node ID
  rx = *(Payload*) rf12_data;
  value = rx.rxD;
  millivolts = rx.supplyV;
  Serial.println("Received a packet:");
  Serial.print("From Node: ");
  Serial.println(nodeID);
  Serial.print("Value: ");
  Serial.println(value);
  Serial.print("TX Millivolts: ");
  Serial.println(millivolts);
  Serial.println("--------------------");
  if (nodeID== 13)
  {
    digitalWrite(LEDpin,HIGH);
    sendenStatus=1;
  }
 }

  // Daten an Cosm senden
  if (sendenStatus == 1) {
  Serial.println("Sendig Data to COSM");
  float data0 = value;
  float data1 = millivolts;
  data0=data0/100;
  dataout.updateData(0, data0);
  dataout.updateData(1, data1);

  // Show Status
  int status = dataout.updatePachube();
  Serial.print("Status: ");
  Serial.println(status);

  // Daten senden
  PrintDataStream(dataout);

  sendenStatus=0;
  // turn off status LED to indicate
  // succesful data receive and online posting
  digitalWrite(LEDpin,LOW);
  }

}

void PrintDataStream(const ERxPachube& pachube)
{
  unsigned int count = pachube.countDatastreams();
  Serial.print("data count=> ");
  Serial.println(count);

  Serial.println(",");
  for(unsigned int i = 0; i < count; i++)
  {
    Serial.print(pachube.getIdByIndex(i));
    Serial.print(",");
    Serial.print(pachube.getValueByIndex(i));
    Serial.println();
  }
}

OpenKontrol Gateway

In meinem Sensor Node Netzwerk arbeiten mittlerweile rund 20 drahtlose und batteriebetriebene Sensor Nodes die im und ums Haus platziert sind. Die Sensoren senden Messwerte von Aussentemperatur, Innentemperatur, Luftfeuchtigkeit, Lichtstärke und Feuchtigkeit der Erde an eine Basisstation.

Wireless Sensor Node Soil Moisture Sensor Node

Als Basisstation wurden bisher mehrere Empfänger mit Display eingesetzt. Die Daten wurde dabei angezeigt, aber nicht weiterverarbeitet.

Wireless Display

Versuche mit Nanode mit RF Shield sowie einem Arduino Board mit Ethernet-und RF Shield waren nicht erfolgreich. Keine der getesteten Lösungen hat funktioniert.

Auf der Suche nach einer simplen Gateway-Lösung, Daten per RFM12B empfangen und an eine IoT-Plattform wie COSM zu senden, bin ich auf das Projekt OpenKontrol Gateway gestossen. Das OpenKontrol Gateway ist eine Arduino-basierte Lösung auf welcher man verschiedene drahtlose Module wie XBee, XRF, NRF24 oder RFM12B aufstecken kann. Die so empfangenen Daten können auf einer SD Card gespeichert oder via Ethernet-Adapter an eine Webplattform gesendet werden.

Das OpenKontrol Gateway kann als Bausatz beim englischen Hersteller CISECO bestellt werden. Je nach Anforderungen können die einzelnen Module mitbestellt werden.

OpenKontrol Gateway

Ich habe mir den Bausatz mit der Option SD Card und ein Ethernet Wiznet-Adapter bestellt.

Pünktlich zum Wochenende habe ich den Kit erhalten. Der Aufbau der einzelnen Module des Gateways ist recht einfach und gut dokumentiert. Die ausführliche Dokumentation beschreibt die einzelnen Module. Für die meisten Funktionen stehen Code-Beispiele zur Verfügung.
Im ersten Schritt habe ich ein Webserver-Sketch hochgeladen. Die Ethernet-Verbindung hat sofort funktioniert und der Webserver hat Daten angezeigt.

Anschliessend habe ich das RFM12B-Modul auf die Leiterplatte gelötet und eine Antenne montiert. Mein im Voraus erstelltes Gateway-Sketch hat nach dem Ergänzen der LED-Ansteuerung sofort funktioniert und erste empfangene Daten an COSM gesendet. Die im Minutentakt gesendeten Sensordaten von Sensor Node 13 werden dann umgehend an den COSM-Feed gesendet.