Sistem Rumah Pintar: Membuat Setup Raspberry Pi & MediaTek Linkit Biaya Rendah
Komponen dan Perlengkapan
| Raspberry Pi 2 Model B |
1 |
| Xbee |
1 |
| Arduino UNO |
1 |
Aplikasi dan Layanan Online
Tentang Proyek Ini
Pendahuluan
Mari kita lihat apa yang kita butuhkan untuk menyiapkan sistem rumah pintar menggunakan MediaTek Linkit. Karena ada banyak ahli di sini untuk memandu Anda dalam pemasangan perangkat keras untuk membaca data sensor, saya akan berfokus pada pembuatan API dan penyiapan server lokal biaya ultra rendah $15 untuk menangkap semua data sensor Anda. Secara opsional, saya mencatat data ke Azure.
Setup
Sensor mengirim data mereka melalui sinyal radio menggunakan xbee atau transceiver biaya rendah lainnya ke MediaTek LinkIt. MediaTek linkIt menerima semua data sensor mentah, memaketkannya menjadi objek JSON menggunakan pustaka adruinojson dan membuat permintaan POST ke server lokal. Server lokal kemudian meng-host aplikasi web nodejs dan menerima semua data sensor sebagai objek JSON.
Server lokal digunakan sebagai pre-prosesor dan menambahkan waktu UTC dan tanda tangan. Validasi data, konversi, dan filtrasi dapat diproses di sini. Server lokal mencatat semua data ke layanan cloud dalam hal ini layanan penyimpanan Azure. Secara alternatif, MediaTek linkIt dapat langsung memposting objek JSON ke layanan penyimpanan Azure. Saya menyiapkan server lokal hanya untuk membuktikan bahwa PC $15 dapat cukup kuat untuk menangani data kami. Kami dapat mencatat data ke database no-sql apa pun bahkan di server lokal kami sepenuhnya menghilangkan kebutuhan penyimpanan cloud eksternal. Saya serahkan semuanya ini kepada Anda.
Demo
Prasyarat
Saya mengasumsikan Anda tahu cara membaca data sensor menggunakan sensor dan mikrokontroler seperti Arduino atau mediaTek. Untuk membatasi cakupan proyek ini, saya akan mengasumsikan bahwa data sensor tersedia untuk MediaTek Link It. Anda dapat menggunakan transceiver radio biaya rendah atau Xbee untuk mentransmisi dan menerima sinyal radio dari sensor yang ditempatkan pada mikrokontroler seperti MediaTek. Pemula dapat menggunakan starter kit groove MediaTek linkIt untuk membaca data lingkungan eksternal seperti suhu, kelembaban, cahaya, dll.
Json Json Json
Json telah menjadi standar de facto untuk IoT dan telah banyak diadopsi. Setelah mengatakan tentang prasyarat, mari kita mulai dengan memodelkan data sensor kami. Tujuan utamanya adalah untuk menangkap sebanyak mungkin data yang Anda miliki dan melewatkannya ke server. Server dapat melakukan semua pekerjaan pemrosesan berat seperti analitik, konversi data, pembelajaran mesin, dll.
Objek JSON 'yang diinginkan' akan menjadi keadaan yang diinginkan dari data sensor. Misalnya saat kita mencatat suhu, nilai yang diinginkan 24 berarti kita perlu menyinkronkan nilai ke cloud dengan nilai 24. Klien kami seperti aplikasi web atau aplikasi seluler akan diperbarui ke nilai ini.
Ketika kita ingin menyalakan lampu kita bilang, keadaan yang diinginkan adalah on. Ini berarti lampu menyala atau akan menyala. Semua aplikasi klien kami akan menggunakan keadaan ini untuk mencerminkan perubahan kepada pengguna. Maksud saya, ikon di aplikasi web kami akan menyala atau mati.
Ini bukan standar internasional, saya baru saja membuatnya. Jadi, silakan gunakan format yang Anda sukai sendiri.
MediaTek - Penerima
Silakan lihat file ino yang dilampirkan di bagian perangkat lunak untuk mencatat data ke server lokal. Data sensor disimulasikan, Anda dapat melewati pembacaan aktual ke objek JSON yang sesuai.
Server Lokal
Server lokal menambahkan overhead namun akan sangat berguna dalam banyak hal. Kita dapat menggunakan server lokal sebagai pre-prosesor untuk data IoT kita. Data dapat difilter, diberi stempel waktu dan ditandatangani.
PC kecil dan nodejs adalah pilihan yang sangat baik untuk server lokal. Kami dapat memilih PC kecil apa pun seperti raspberry pi, odriod, banana pi, beagle bone, dll. Saya memilih orange pi ($15) untuk proyek ini.
Setup
Raspberry pi 2 atau Orange Pi dengan variasi OS Linux apa pun yang mendukung nodejs 5. Saya memilih orange pi dengan arch linux untuk arm7. Instal nodejs dan npm. Unduh aplikasi IoT saya dari github dan navigasikan ke /your/local/path/iotapp dan jalankan npm install. Aplikasi expressjs dasar mulai mendengarkan pada port 3000 Anda.
Buka ke your-local-ip:3000 untuk memeriksa apakah tampilan default expressjs dirender. Saya telah membuat API ini untuk memposting data sensor:
- /iot/myhome/livingroom/thermostat - API Suhu
- /iot/myhome/livingroom/mic - API Suara
- /iot/myhome/livingroom/pir - API Sensor Kehadiran
- /iot/myhome/livingroom/distance - API Sensor Jarak
- /iot/myhome/mydevice/location - API Pelacak GPS
- /iot/myhome/garden/moisture - API Sensor Kelembaban Tanah
- /iot/myhome/kitchen/gas - API Sensor Kebocoran Gas
- /iot/myhome/livingroom/light - API Sensor Cahaya
- /iot/myhome/livingroom - API lain untuk ruang tamu
- /iot/myhome/bedroom - API lain untuk kamar tidur
Untuk menyiapkan server lokal. Kloning kode sumber iotapp dari github saya. Ubah index.js untuk menempatkan alamat IP cloud atau nama domain Anda di mana aplikasi aspnet5 dihosting di Azure.
Server Jarak Jauh
Penerbitan data ke cloud telah menjadi populer saat ini. Kami dapat membeli langganan dari penyedia data IoT seperti amazon, azure, spark fun, pubnub, initial state dan banyak lagi. Saya memilih Azure untuk demo ini. Analitik data, penambangan data dan algoritma pembelajaran mesin dapat dikembangkan untuk memproses data kami.
Unduh iotwebapp dari github saya. Saya membuatnya menggunakan visual studio 2015 yang menargetkan asp.net5. API ini telah ditetapkan untuk memposting data IoT. API mencatat IoT di tabel penyimpanan Azure.
Parameter deviceid dapat diatur untuk mengidentifikasi lokasi sensor.
API ini telah ditetapkan:
- api/iot/myhome/thermostat - asp.net5 web api untuk mencatat semua data termostat
- api/iot/myhome/microphone - asp.net5 web api untuk mencatat semua data mikrofon
- api/iot/myhome/pir - asp.net5 web api untuk mencatat semua data PIR
- api/iot/myhome/distance - asp.net5 web api untuk mencatat semua data sensor jarak
- api/iot/myhome/device/location - asp.net5 web api untuk mencatat data GPS
- api/iot/myhome/moisture - asp.net5 web api untuk mencatat data sensor kelembaban tanah
- api/iot/myhome/gas - asp.net5 web api untuk mencatat data sensor gas
- api/iot/myhome/light - asp.net5 web api untuk mencatat semua data sensor cahaya
- api/iot/myhome/livingroom - asp.net5 web api untuk mencatat semua atribut/ data sensor ruang tamu. kita dapat menggunakan API ini untuk mendorong semua nilai sensor.
- api/iot/myhome/bedroom - sama seperti di atas, saya telah membuat satu untuk mencatat detail kamar tidur saya
Untuk menyiapkan server jarak jauh. Kloning kode sumber iotwebapp dari github saya. Buat tabel penyimpanan Azure. Ubah IoTController.cs dan masukkan nama akun dan kunci tabel penyimpanan Azure Anda. Gunakan nama domain atau IP ini di server lokal.
Kesimpulan
Ada banyak area yang perlu difaktorkan ulang dalam kode. Silakan modifikasi dan beri tahu saya jika Anda mengalami kendala.
Kode
- MediaTekRx
- nodejs - server lokal
- ThermoStatController.cs
- PIRController.cs
- MoistureController.cs
- LivingRoomController.cs
- LightController.cs
- GPSController.cs
- GasController.cs
- DistanceController.cs
- BedRoomController.cs
MediaTekRx
/* Web client Sketch ini terhubung ke situs web menggunakan fungsi Wi-Fi pada platform MediaTek LinkIt. Ubah makro WIFI_AP, WIFI_PASSWORD, WIFI_AUTH dan SITE_URL sesuai. dibuat 13 Juli 2010 oleh dlf (Metodo2 srl) dimodifikasi 31 Mei 2012 oleh Tom Igoe dimodifikasi 20 Agu 2014 oleh 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 // pilih dari LWIFI_OPEN, LWIFI_WPA, atau LWIFI_WEP. #define SITE_URL "your ip" // alamat IP atau nama domain nodejs atau Azure Anda LWiFiClient c; void setup() { LWiFi.begin(); Serial.begin(115200); // coba terus sampai terhubung ke AP Serial.println("Connecting to AP"); while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD))) { delay(1000); } // coba terus sampai terhubung ke situs web 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() { // Pastikan kita terhubung, dan buang konten respons ke Serial while (!c) { Serial.println(" Server disconnected.."); // coba terus sampai terhubung ke situs web 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); } void writeToConsole() { // Pastikan kita terhubung, dan buang konten respons ke Serial while (c) { int v = c.read(); if (v != -1) { Serial.print((char)v); } } Serial.println(); Serial.println(" Server disconnected.."); // coba terus sampai terhubung ke situs web Serial.println("Connecting to WebSite"); while (0 == c.connect(SITE_URL, 3000)) { Serial.println("Re-Connecting to WebSite"); delay(1000); } } void updatePIR() { long unsigned int s; DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); root["deviceid"] = "/iot/myhome/livingroom/pir"; //asumsikan satuan default ms desired["motionstart"] = String(random(0,1000)); desired["motionend"]= String(random(1000,10000)); String len = String(root.measureLength()); c.println("POST /iot/myhome/livingroom/pir HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); //logika untuk mendeteksi respons server lambat dan memposting permintaan lagi tanpa menunggu respons mati s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateDistance() { long unsigned int s; DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); root["deviceid"] = "/iot/myhome/livingroom/distancesensor"; //asumsikan satuan default cm desired["obstacle"]=String(random(50,450)); String len = String(root.measureLength()); c.println("POST /iot/myhome/livingroom/distance HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateGPSTracker() { long unsigned int s; DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); root["deviceid"] = "/iot/mydevice"; desired["lat"] =String(random(20,25)); desired["long"]=String(random(22,27)); String len = String(root.measureLength()); c.println("POST /iot/mydevice/location HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateMoisture() { long unsigned int s; DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); root["deviceid"] = "/iot/myhome/garden/moisture"; //asumsikan satuan default desired["moisture"] = String(random(40,60)); String len = String(root.measureLength()); c.println("POST /iot/myhome/garden/moisture HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateGasLeak() { DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); desired["leak"] = "no"; root["deviceid"] = "/iot/myhome/kitchen/gas"; long unsigned int s; String len = String(root.measureLength()); c.println("POST /iot/myhome/kitchen/gas HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateLightIntensity() { DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); desired["intensity"] = "80"; root["deviceid"] = "/iot/myhome/livingroom/light"; long unsigned int s; String len = String(root.measureLength()); c.println("POST /iot/myhome/livingroom/light HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateLivingroomAttributes() { DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); root["deviceid"] = "/iot/myhome/livingroom"; JsonObject& desired = root.createNestedObject("desired"); //API alternatif untuk mencatat atribut ruang tamu sekaligus desired["window"] = "open"; desired["door"] = "closed"; desired["ac"] = "off"; desired["temperature"] = String(random(24,28)); desired["humidity"] = String(random(60,65)); long unsigned int s; String len = String(root.measureLength()); c.println("POST /iot/myhome/livingroom HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateBedroomAttributes() { DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); root["deviceid"] = "/iot/myhome/bedroom"; JsonObject& desired = root.createNestedObject("desired"); //API alternatif untuk mencatat atribut kamar tidur sekaligus desired["window"] = "open"; desired["door"] = "closed"; desired["ac"] = "off"; desired["temperature"] = String(random(22,23)); desired["humidity"] = String(random(75,80)); long unsigned int s; String len = String(root.measureLength()); c.println("POST /iot/myhome/bedroom HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateSound() { long unsigned int s; long unsigned int e; DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); desired["intensity"] = String(random(40,80)); root["deviceid"] = "/iot/myhome/livingroom/mic"; root["timeutc"] = ""; root["signedby"]=""; String len = String(root.measureLength()); c.println("POST /iot/myhome/livingroom/mic HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); } void updateTemperature() { long unsigned int s; long unsigned int e; DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonObject& desired = root.createNestedObject("desired"); desired["temperature"] = String(random(20,40)); desired["humidity"]= String(random(60,80)); root["deviceid"] = "/iot/myhome/livingroom/thermostat"; root["timeutc"] = ""; root["signedby"]=""; String len = String(root.measureLength()); c.println("POST /iot/myhome/livingroom/thermostat HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Content-Type: application/json"); c.println("Cache-Control: no-cache"); c.print("Content-Length: "); c.println(len); c.println("Connection: close"); c.println(); root.printTo(c); root.printTo(Serial); s = millis(); // menunggu respons server Serial.println("waiting HTTP response:"); while (!c.available()) { delay(100); if((millis() - s > 3000)) { Serial.println(); Serial.println("Server not responding.."); break; } } Serial.println("Calling write to console.."); writeToConsole(); }
nodejs - server lokal
var express = require('express'); var router = express.Router(); var buf = require('buffer'); var request = require("request"); //ganti your-ip-or-domain-name dengan alamat IP atau nama domain sebenarnya Anda //contoh iot.azurewebsites.com //contoh yourdomainname.com //contoh 47.12.67.16 // terima permintaan POST di halaman utama 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'); }); // terima permintaan POST mikrofon router.post('/iot/myhome/livingroom/mic', 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/microphone', 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 sound intensity recorded'); }); // terima permintaan POST PIR router.post('/iot/myhome/livingroom/pir', 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/pir', 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 pir movement recorded'); }); // terima permintaan POST jarak router.post('/iot/myhome/livingroom/distance', 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/distance', 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 obstacle recorded'); }); // terima permintaan POST GPS router.post('/iot/mydevice/location', 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/mydevice/location/gps', 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('device location recorded'); }); // terima permintaan POST kelembaban tanah router.post('/iot/myhome/garden/moisture', 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/garden/moisture', 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('Garden moisture level recorded'); }); // terima permintaan POST gas router.post('/iot/myhome/kitchen/gas', 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/kitchen/gas', 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('Gas leak information recorded'); }); // terima permintaan POST cahaya router.post('/iot/myhome/livingroom/light', 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/light', 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('Light intensity recorded'); }); // terima permintaan POST ruang tamu router.post('/iot/myhome/livingroom', 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/room/livingroom', 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('Livingroom attributes recorded'); }); // terima permintaan POST kamar tidur router.post('/iot/myhome/bedroom', 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/room/bedroom', 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('Bedroom attributes recorded'); }); // terima permintaan PUT di /user router.put('/user', function (req, res) { res.send('Got a PUT request at /user'); }); // terima permintaan DELETE di /user //router.delete('/user', function (req, res) { // res.send('Got a DELETE request at /user'); //}); /* GET halaman utama. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); module.exports = router;
Skematis
Mentransmisikan sinyal radio dari arduino
Mentransmisikan sinyal radio melalui Xbee dari arduino tanpa shield
Mentransmisikan sinyal radio dari arduino