Smart-Home-System: Günstiger Raspberry Pi & MediaTek LinkIt Aufbau
Komponenten und Zubehör
| Raspberry Pi 2 Model B (Orange Pi funktioniert auch) | ×1 |
| XBee | ×1 |
| Arduino UNO | ×1 |
Apps und Online-Dienste
- Microsoft Azure
Über dieses Projekt
Einführung
Sehen wir uns an, was wir brauchen, um ein Smart-Home-System mit MediaTek LinkIt einzurichten. Da es hier viele Experten gibt, die dich beim Hardware-Anschluss zum Auslesen der Sensordaten anleiten können, werde ich mich auf das Erstellen von APIs und das Einrichten eines ultragünstigen 15-Dollar-Lokalservers konzentrieren, um alle Sensordaten zu erfassen. Optional logge ich die Daten in Azure.
Aufbau

Die Sensordaten werden per Funksignal via XBee oder einem anderen kostengünstigen Transceiver an den MediaTek LinkIt übertragen. Der MediaTek LinkIt empfängt alle rohen Sensordaten, verpackt sie mithilfe der ArduinoJson-Bibliothek in JSON-Objekte und sendet eine POST-Anfrage an den lokalen Server. Der lokale Server hostet dann eine Node.js-Webanwendung und empfängt alle Sensordaten als JSON-Objekte.
Der lokale Server fungiert als Pre-Prozessor und fügt UTC-Zeit und Signatur hinzu. Jegliche Datenvalidierung, Konvertierung und Filterung kann hier verarbeitet werden. Der lokale Server loggt alle Daten in den Cloud-Dienst – in unserem Fall Azure Storage Services. Alternativ kann der MediaTek LinkIt die JSON-Objekte direkt an Azure Storage Services senden. Ich habe einen lokalen Server eingerichtet, nur um zu beweisen, dass ein 15-Dollar-PC leistungsstark genug ist, um unsere Daten zu verarbeiten. Wir können unsere Daten in jede NoSQL-Datenbank sogar auf dem lokalen Server loggen und damit die Notwendigkeit externen Cloud-Speichers vollständig eliminieren. Das überlasse ich euch.

Demo
Voraussetzungen
Ich gehe davon aus, dass du weißt, wie man Sensordaten mit Sensoren und Mikrocontrollern wie Arduino oder MediaTek ausliest. Um den Umfang dieses Projekts zu begrenzen, gehe ich davon aus, dass die Sensordaten dem MediaTek LinkIt zur Verfügung stehen. Du kannst kostengünstige Funktransceiver oder XBee verwenden, um Funksignale von an Mikrocontrollern wie MediaTek angeschlossenen Sensoren zu senden und zu empfangen. Anfänger können das MediaTek LinkIt Grove Starter Kit verwenden, um Umweltdaten wie Temperatur, Luftfeuchtigkeit, Licht usw. auszulesen.
JSON – Der Standard für IoT
JSON ist zum de-facto-Standard für IoT geworden und weit verbreitet. Nachdem wir die Voraussetzungen geklärt haben, beginnen wir mit der Modellierung unserer Sensordaten. Der Hauptzweck ist, so viele Daten wie möglich zu erfassen und an den Server zu übergeben. Der Server kann alle schweren Arbeiten wie Analytik, Datenkonvertierung, Machine Learning usw. erledigen.
Das „desired“ JSON-Objekt repräsentiert den gewünschten Zustand der Sensordaten. Beispiel: Wenn wir die Temperatur aufzeichnen, bedeutet der gewünschte Wert 24, dass wir den Wert mit 24 in die Cloud synchronisieren müssen. Unsere Clients wie Web-App oder Mobile App werden auf diesen Wert aktualisiert.
Wenn wir ein Licht einschalten wollen, sagen wir, der gewünschte Zustand sei „on“. Das bedeutet, das Licht ist eingeschaltet oder wird eingeschaltet. Alle unsere Client-Anwendungen nutzen diesen Zustand, um die Änderungen dem Benutzer anzuzeigen. Ich meine, das Icon in unserer Web-App wird ein- oder ausgeschaltet.
Das ist kein internationaler Standard, ich habe es mir einfach ausgedacht. Fühle dich frei, dein eigenes praktisches Format zu verwenden.
Beispiel-JSON-Strukturen für verschiedene Sensoren:
Temperatur
{
"deviceid": "iot/myhome/livingroom/thermostat",
"desired": { "temperature": "24", "humidity": "80" },
"timeutc": "2015-11-23T00:41:48.824Z",
"signedBy": "localserver"
}
Mikrofon
{
"deviceid": "iot/myhome/livingroom/mic",
"desired": { "intensity": "66" },
"timeutc": "2015-11-23T00:41:48.824Z",
"signedBy": "localserver"
}
Distanz
{
"deviceid": "iot/myhome/livingroom/obstacle",
"desired": { "proximity": "150" },
"timeutc": "2015-01-01",
"signedBy": "localserver"
}
PIR (Bewegungssensor)
{
"deviceid": "iot/myhome/livingroom/pir",
"desired": { "motion start": "2500", "motion end": "5345" },
"timeutc": "2015-11-23T00:41:48.824Z",
"signedBy": "localserver"
}
GPS
{
"deviceid": "iot/mydevice/location",
"desired": { "lat": "25.5", "long": "32.2" },
"timeutc": "2015-11-23T00:41:48.824Z",
"signedBy": "localserver"
}
Bodenfeuchte
{
"deviceid": "/iot/myhome/garden/moisture",
"desired": { "moisture": "20" },
"timeutc": "2015-11-23T00:41:48.824Z",
"signedBy": "localserver"
}
Gas
{
"deviceid": "/iot/myhome/kitchen/gas",
"desired": { "leak": "No" },
"timeutc": "2015-11-23T00:41:48.824Z",
"signedBy": "localserver"
}
Licht
{
"deviceid": "/iot/myhome/livingroom/light",
"desired": { "intensity": "60" },
"timeutc": "2015-11-23T00:41:48.824Z",
"signedBy": "localserver"
}
Wohnzimmer (kombiniert)
{
"deviceid": "/iot/myhome/livingroom",
"desired": {
"temperature": "25", "humidity": "80", "window": "open",
"door": "closed", "light": "80", "noise": "low"
}
}
Schlafzimmer (kombiniert)
{
"deviceid": "/iot/myhome/bedroom",
"desired": {
"temperature": "24", "humidity": "70", "window": "closed",
"door": "closed", "light": "80", "ac": "on", "noise": "low"
}
}
MediaTek – Empfänger
Bitte beziehe dich auf die INO-Datei im Software-Bereich, um Daten an den lokalen Server zu loggen. Die Sensordaten sind simuliert; du kannst die tatsächlichen Messwerte in die jeweiligen JSON-Objekte einsetzen.
Lokaler Server
Der lokale Server fügt Overhead hinzu, ist aber in vielerlei Hinsicht sehr hilfreich. Wir können den lokalen Server als Pre-Prozessor für unsere IoT-Daten nutzen. Daten können gefiltert, zeitgestempelt und signiert werden.
Ein winziger PC und Node.js sind eine ausgezeichnete Wahl für den lokalen Server. Wir können jeden winzigen PC wählen wie Raspberry Pi, Odroid, Banana Pi, BeagleBone etc. Ich habe für dieses Projekt den Orange Pi (15 $) gewählt.
Setup
- Raspberry Pi 2 oder Orange Pi mit beliebiger Linux-Distribution, die Node.js 5 unterstützt. Ich habe Orange Pi mit Arch Linux für ARMv7 gewählt.
- Node.js und npm installiert.
- Mein iotapp von GitHub klonen und zu /dein/lokaler/pfad/iotapp navigieren und
npm installausführen. Die grundlegende Express.js-App lauscht auf Port 3000. - Im Browser zu
deine-lokale-ip:3000surfen, um zu prüfen, ob die Standard-Express.js-Ansicht gerendert wird.
Ich habe diese APIs zum Empfangen der Sensordaten erstellt:
- /iot/myhome/livingroom/thermostat – Temperatur API
- /iot/myhome/livingroom/mic – Schall API
- /iot/myhome/livingroom/pir – Präsenzsensor API
- /iot/myhome/livingroom/distance – Distanzsensor API
- /iot/myhome/mydevice/location – GPS Tracker API
- /iot/myhome/garden/moisture – Bodenfeuchte API
- /iot/myhome/kitchen/gas – Gasleck-Sensor API
- /iot/myhome/livingroom/light – Lichtsensor API
- /iot/myhome/livingroom – Weitere API für Wohnzimmer
- /iot/myhome/bedroom – Weitere API für Schlafzimmer
Um den lokalen Server einzurichten: Klone den Quellcode iotapp von meinem GitHub. Ändere die index.js, um deine Cloud-IP-Adresse oder den Domainnamen einzutragen, wo die ASP.NET 5-Anwendung in Azure gehostet wird.
Entfernter Server (Cloud)
Das Veröffentlichen von Daten in der Cloud ist heutzutage populär. Man kann Abonnements von IoT-Datenanbietern wie Amazon, Azure, SparkFun, PubNub, Initial State und vielen anderen erwerben. Ich habe Azure für diese Demo gewählt. Datenanalytik, Data Mining und Machine-Learning-Algorithmen können entwickelt werden, um unsere Daten zu verarbeiten.
Lade die iotwebapp von meinem GitHub herunter. Ich habe sie mit Visual Studio 2015 für ASP.NET 5 erstellt. Diese APIs wurden eingerichtet, um die IoT-Daten zu loggen. Die API loggt die IoT-Daten in Azure Storage Tables.
Der deviceid-Parameter kann gesetzt werden, um den Sensorstandort zu identifizieren.
Diese APIs wurden eingerichtet:
- api/iot/myhome/thermostat – ASP.NET 5 Web API für Thermostat-Daten
- api/iot/myhome/microphone – ASP.NET 5 Web API für Mikrofon-Daten
- api/iot/myhome/pir – ASP.NET 5 Web API für PIR-Daten
- api/iot/myhome/distance – ASP.NET 5 Web API für Distanzsensor-Daten
- api/iot/myhome/device/location – ASP.NET 5 Web API für GPS-Daten
- api/iot/myhome/moisture – ASP.NET 5 Web API für Feuchtigkeitsdaten
- api/iot/myhome/gas – ASP.NET 5 Web API für Gasdaten
- api/iot/myhome/light – ASP.NET 5 Web API für Lichtdaten
- api/iot/myhome/livingroom – ASP.NET 5 Web API für alle Wohnzimmer-Attribute/Sensordaten
- api/iot/myhome/bedroom – Gleiches für Schlafzimmer
Um den Remote-Server einzurichten: Klone den Quellcode iotwebapp von meinem GitHub. Erstelle eine Azure Storage Table. Ändere die IoTController.cs und trage deinen Azure Storage Table Account-Namen und Key ein. Verwende diesen Domainnamen oder die IP im lokalen Server.
Fazit
Es gibt viele Bereiche im Code, die refactored werden können. Fühle dich frei, ihn zu modifizieren und lass mich wissen, wenn du hängen bleibst.
Code
MediaTekRx (C/C++)
MediaTek als Empfänger. Sketch zum Loggen der Daten an den lokalen Server.
/* Web client
This sketch connects to a website using Wi-Fi functionality on MediaTek LinkIt platform.
Change the macro WIFI_AP, WIFI_PASSWORD, WIFI_AUTH and SITE_URL accordingly.
created 13 July 2010 by dlf (Metodo2 srl)
modified 31 May 2012 by Tom Igoe
modified 20 Aug 2014 by MediaTek Inc.
*/
#include <LTask.h>
#include <LWiFi.h>
#include <LWiFiClient.h>
#include <ArduinoJson.h>
#define WIFI_AP "your ap"
#define WIFI_PASSWORD "your password"
#define WIFI_AUTH LWIFI_WPA // choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP.
#define SITE_URL "your ip" // your nodejs or azure ip address or domain name
LWiFiClient c;
void setup() {
LWiFi.begin();
Serial.begin(115200);
// keep retrying until connected to AP
Serial.println("Connecting to AP");
while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD))) {
delay(1000);
}
// keep retrying until connected to website
Serial.println("Connecting to WebSite");
while (0 == c.connect(SITE_URL, 3000)) {
Serial.println("Re-Connecting to WebSite");
delay(1000);
}
}
boolean disconnectedMsg = false;
void loop() {
// Make sure we are connected, and dump the response content to Serial
while (!c) {
Serial.println(" Server disconnected..");
// keep retrying until connected to website
Serial.println("Connecting to WebSite");
while (0 == c.connect(SITE_URL, 3000)) {
Serial.println("Re-Connecting to WebSite");
delay(1000);
}
}
Serial.println(" Reading temperature..");
updateTemperature();
delay(3000);
Serial.println("Detecting sound..");
updateSound();
delay(3000);
Serial.println("Detecting person movement..");
updatePIR();
delay(3000);
Serial.println("Detecting obstacle..");
updateDistance();
delay(3000);
Serial.println("Updating device location..");
updateGPSTracker();
delay(3000);
Serial.println("Calculating soil moisture..");
updateMoisture();
delay(3000);
Serial.println("Detecting gas leakage..");
updateGasLeak();
delay(3000);
Serial.println("Recording light intensity..");
updateLightIntensity();
delay(3000);
updateLivingroomAttributes();
delay(3000);
updateBedroomAttributes();
delay(3000);
}
// ... (weitere Funktionen: updatePIR, updateDistance, updateGPSTracker, updateMoisture,
// updateGasLeak, updateLightIntensity, updateLivingroomAttributes, updateBedroomAttributes,
// updateSound, updateTemperature, writeToConsole)
Node.js – Lokaler Server (JavaScript)
Die index.js mit den Routen zum Empfangen der Daten vom MediaTek.
var express = require('express');
var router = express.Router();
var buf = require('buffer');
var request = require("request");
// replace your-ip-or-domain-name with your actual ip address or domain name
// example iot.azurewebsites.com
// example yourdomainname.com
// example 47.12.67.16
// accept POST request on the homepage
router.post('/iot/myhome/livingroom/thermostat', function (req, res) {
var state = req.body;
state.timeutc = new Date();
state.signedby = "orangepi";
console.log(state);
var options = {
method: 'POST',
url: 'https://your-ip-or-domain-name/api/iot/myhome/livingroom/thermostat',
headers: { 'cache-control': 'no-cache', 'content-type': 'application/json' },
body: state, json: true
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
res.send('Living room temperature recorded');
});
// ... (weitere Routes für mic, pir, distance, gps, moisture, gas, light, livingroom, bedroom)
ASP.NET 5 Controller (C#) – Beispiele
ThermoStatController.cs – API zum Loggen von Temperaturdaten in die Cloud
PIRController.cs – API zum Loggen von Präsenzsensordaten in Azure
MoistureController.cs – API zum Loggen von Bodenfeuchtedaten in Azure
LivingRoomController.cs – API zum Loggen aller Wohnzimmer-Sensordaten in Azure
LightController.cs – API zum Loggen von Lichtsensordaten in Azure
GPSController.cs – API zum Loggen von GPS-Daten in Azure
GasController.cs – API zum Loggen von Gasleckdaten in Azure
DistanceController.cs – API zum Loggen von Ultraschall-Distanzsensordaten in Azure
BedRoomController.cs – API zum Loggen aller Schlafzimmer-Sensordaten in Azure
Quellcode-Repository
MediaTek Smart Home – Quellcode für Datenlogging (Node.js App, ASP.NET 5 und MediaTek Receiver INO):
https://github.com/syediddi/iot-mediatek-linkIt
Schaltpläne
Funksignal-Übertragung vom Arduino:



Herstellungsprozess
- Smart Data: Die nächste Frontier von IoT und Big Data navigieren
- 433 MHz Smart-Home-Controller mit Sensorflare und Raspberry Pi selbst bauen
- Raspberry Pi Home Automation System für Fernsteuerung bauen
- Smart Bartender: Eigenen Raspberry Pi Cocktail-Roboter bauen
- Smart Hospitals von morgen: Die kritische Rolle intelligenter Software
- Smart Home Skills Gap überbrücken: Warum Großbritannien hinter Europa zurückbleibt
- Wie Vernetzung Effizienz, Sicherheit und Nachhaltigkeit in modernen Arbeitsplätzen treibt
- Smart Home Evolution: Was die Zukunft für vernetztes Wohnen bereithält
- Smart Factories: Von der Vision zur Realität – Warum die meisten UK-Unternehmen das Ziel verfehlen
- Smart-Home-Konnektivität: 3 bewährte Schritte zur Überwindung zentraler Hindernisse