• Tidak ada hasil yang ditemukan

Analisis Kinerja Model Rancangan Sistem Home_Automation Berbasis Internet Protocol Terhadap Penggunaan Http Persistent dan Non-Persistent

N/A
N/A
Protected

Academic year: 2017

Membagikan "Analisis Kinerja Model Rancangan Sistem Home_Automation Berbasis Internet Protocol Terhadap Penggunaan Http Persistent dan Non-Persistent"

Copied!
29
0
0

Teks penuh

(1)

LAMPIRAN 1

KODE PROGRAM KONTROLER

Fugue.ino

/ * *

* Fugue – Sebuah pr ogr am Ar dui no unt uk Home Aut omat i on. *

* @pac k age Nugr aha

* @Aut hor Wahy u Nugr aha <nugr aha. c . wahy u@gmai l . c om> * /

#i nc l ude " Fugue. h"

names pac e Mai n {

us i ng Nugr aha: : Foundat i on: : Bas eCont r ol l er ;

c l as s Cont r ol l er : publ i c v i r t ual Bas eCont r ol l er {

publ i c:

v oi d s et up( ) {

Debug: : i s DebugMode = t r ue;

i f( ! env : : wi f i : : obt ai nI pAddr es s Aut omat i c al l y ) {

Wi Fi .c onf i g( env : : wi f i : : i p, env : : wi f i : : gat eway , env : : wi f i : : s ubnet , env : : wi f i : : dns 1, env : : wi f i : : dns 2) ;

}

boar d- >i ni t i al i z e( ) ; boar d- >aut omat e( ) ; }

v oi d l oop( ) {

Sc hedul er: : handl eEv ent s ( ) ; }

} ;

}

#i nc l ude " boot s t r ap/ boot s t r ap. hpp"

App/Boards/WemosD1.hpp

namespace App { namespace Boards {

usingnamespace App::Devices;

using Nugraha::Foundation::Board;

using App::Gateways::WebServer::Server;

(2)

classWemosD1 : publicvirtual Board {

protected:

void gateways() {

// this->attachGateway(new Server());

this->attachGateway(new PersistentHttp(std::map<String, String>({ { "host" , env::httpClient::host },

{ "mode" , env::httpClient::mode },

{ "publishKey" , env::httpClient::publishKey }, { "subscribeKey" , env::httpClient::subscribeKey }, { "signature" , env::httpClient::signature }, { "channelName" , env::httpClient::channelName }, { "callback" , env::httpClient::callback } })));

}

void devices() {

this->attachDevice(new Lampu(D2, NULL));

this->attachDevice(new Lampu(D3, NULL));

this->attachDevice(new Lampu(D4, NULL));

this->attachDevice(new Lampu(D5, NULL));

this->attachDevice(new AirConditioner(D6, NULL));

this->attachDevice(new LED(BUILTIN_LED, NULL)); }

void sensors() {

} };

}}

app/Devices/AirConditioner.hpp

namespace App { namespace Devices {

using Nugraha::Sensors::Sensor;

using Nugraha::Devices::Device;

using Nugraha::Devices::Drivers::AirConditionerDriver;

classAirConditioner : publicvirtual Device {

public:

AirConditioner(int pin, Sensor* sensor=NULL) : Device(pin, sensor) {}

void initialize() {

pinMode(this->pin, OUTPUT);

setDriver(new AirConditionerDriver()); }

(3)

{

} };

}}

app/Devices/Lampu.hpp

namespace App { namespace Devices {

using Nugraha::Sensors::Sensor;

using Nugraha::Devices::Device;

classLampu : publicvirtual Device {

public:

Lampu(int pin, Sensor* sensor=NULL) : Device(pin, sensor) {}

void initialize() {

pinMode(this->pin, OUTPUT); }

void behavior() {

} };

}}

app/Gateways/HttpClients/NonPersistentHttp.hpp

namespace App { namespace Gateways { namespace HttpClients { using Nugraha::Gateways::Esp8266::WifiHttpClient;

classNonPersistentHttp : publicvirtual WifiHttpClient {

public:

NonPersistentHttp(std::map<String, String> setting):WifiHttpClient(setting) {}

void service() {

Debug::println("Memulai service koneksi HTTP Non-persistent...");

interval = 0;

http.setReuse(false);

Scheduler::every(interval, [=]() { updateMessage();

httpGet(generateUri(), [=]() {

board->executeUserCommand(response); });

(4)

}}}

app/Gateways/HttpClients/PersistentHttp.hpp

namespace App { namespace Gateways { namespace HttpClients { using Nugraha::Gateways::Esp8266::WifiHttpClient;

classPersistentHttp : publicvirtual WifiHttpClient {

public:

PersistentHttp(std::map<String, String> setting) : WifiHttpClient(setting) {}

void service() {

Debug::println("Memulai service koneksi HTTP Persistent...");

interval = 0;

http.setReuse(true);

Scheduler::every(interval, [=]() { updateMessage();

httpGet(generateUri(), [=]() {

board->executeUserCommand(response); });

}); } };

}}}

config/env.hpp

namespace env {

namespace wifi {

String ssid = "Fugue2";

String password = "fugue123"; bool obtainIpAddressAutomatically = false; IPAddress ip(192, 168, 137, 69); IPAddress subnet(255, 255, 255, 0); IPAddress gateway(192, 168, 137, 1); IPAddress dns1(8, 8, 8, 8);

IPAddress dns2(8, 8, 4, 4); }

namespace httpClient {

String host = "www.wahyunugraha.com"; String mode = "publish";

String publishKey = "pub-w-3e5de365-5d57-48c7-a317-366ef2846eb4"; String subscribeKey = "sub-n-cca59b64-d972-11e5-bdd5-02ee2ddab7fe"; String signature = "0";

String channelName = "rumah1"; String callback = "0";

(5)

namespace server {

ESP8266WebServer* server = new ESP8266WebServer(80); }

}

vendor/nugraha/tugasAkhirWahyu/src/Nugraha/Devices/Drivers/AirConditionerDriver.hpp

namespace Nugraha { namespace Devices { namespace Drivers { using Nugraha::Support::Facades::Scheduler::Scheduler;

classAirConditionerDriver: publicvirtual Driver {

protected:

public:

bool turnOn(int pin) {

digitalWrite(pin, HIGH); Scheduler::after(50, [=]() { digitalWrite(pin, LOW); });

returntrue; }

bool turnOff(int pin) {

digitalWrite(pin, HIGH); Scheduler::after(50, [=]() { digitalWrite(pin, LOW); });

returntrue; } };

}}}

vendor/nugraha/tugasAkhirWahyu/src/Nugraha/Devices/Drivers/SinkModeDriver.hpp

namespace Nugraha { namespace Devices { namespace Drivers {

classSinkModeDriver : publicvirtual Driver {

protected:

public:

bool turnOn(int pin) {

digitalWrite(pin, LOW);

returntrue; }

bool turnOff(int pin) {

digitalWrite(pin, HIGH);

(6)

}}}

vendor/nugraha/tugasAkhirWahyu/src/Nugraha/Devices/Device.hpp

namespace Nugraha { namespace Devices { using Nugraha::Traits::HasId;

classDevice : publicvirtual DeviceContract, public HasLogger, public HasId {

protected: int pin = -1; bool isOn = false;

SensorContract* sensor; DriverContract* driver; unsignedlong previousMillis = 0; static DriverContract* defaultDriver;

public:

Device(int pin, SensorContract* sensor) {

this->pin = pin; this->sensor = sensor;

this->driver = Device::defaultDriver; }

virtual ~Device() {}

void toggle()

if(driver->turnOn(this->pin)) { this->isOn = true;

logger->addNotification(1, String(this->pin));

if(driver->turnOff(this->pin)) { this->isOn = false;

logger->addNotification(0, String(this->pin)); }

(7)

}

int getPin() {

returnthis->pin; }

void setSensor(SensorContract* sensor) {

this->sensor = sensor; }

void setDriver(DriverContract* driver) {

this->driver = driver; }

int getId() override {HasId::getId();}

void setLogger(LoggerContract* logger) override {HasLogger::setLogger(logger);}

LoggerContract* getLogger() override {HasLogger::getLogger();} };

}}

vendor/nugraha/tugasAkhirWahyu/src/Nugraha/Foundation/Application.hpp

namespace Nugraha { namespace Foundation {

using Nugraha::Contracts::Foundation::BoardContract;

classApplication

{

public:

BaseController* controller; int serialBaudRate;

bool beginSerial;

Application(BaseController* controller, BoardContract* board, int serialBaudRate, bool beginSerial)

{

this->controller = controller;

this->controller->board = board;

this->serialBaudRate = serialBaudRate;

this->beginSerial = beginSerial; }

virtual ~Application() {}

virtualvoid setup() {

this->controller->setup(); }

virtualvoid loop() {

(8)

};

}}

vendor/nugraha/tugasAkhirWahyu/src/Nugraha/Foundation/BaseController.hpp

namespace Nugraha { namespace Foundation {

using Nugraha::Contracts::Foundation::BoardContract;

classBaseController

{

public:

BoardContract* board;

virtual ~BaseController() {}

virtualvoid setup()=0;

virtualvoid loop()=0; };

}}

vendor/nugraha/tugasAkhirWahyu/src/Nugraha/Foundation/Board.hpp

namespace Nugraha { namespace Foundation {

using Nugraha::Traits::HasLogger;

using Nugraha::Collections::Vector;

using Nugraha::Contracts::Devices::DeviceContract;

using Nugraha::Contracts::Sensors::SensorContract;

using Nugraha::Contracts::Gateways::GatewayContract;

using Nugraha::Contracts::Foundation::BoardContract;

using Nugraha::Contracts::Foundation::LoggerContract;

using Nugraha::Contracts::Collections::CollectionContract;

classBoard : publicvirtual BoardContract, public HasLogger {

protected:

CollectionContract<DeviceContract*>* devicesCollection; CollectionContract<SensorContract*>* sensorsCollection; CollectionContract<GatewayContract*>* gatewaysCollection; DeviceContract* Default = NULL;

voidinitializeAll() {

/** Inisialisasi setiap Gateway. */

for(int i=0; i<gatewaysCollection->count(); i++) {

if(gatewaysCollection->getMemberAt(i) != NULL) {

gatewaysCollection->getMemberAt(i)->initialize(); }

}

/** Inisialisasi setiap Device. */

for(int i=0; i<devicesCollection->count(); i++) {

if(devicesCollection->getMemberAt(i) != NULL) {

(9)

} }

public: Board() {

devicesCollection = new Vector<DeviceContract*>(); sensorsCollection = new Vector<SensorContract*>(); gatewaysCollection = new Vector<GatewayContract*>(); setLogger(new Logger());

}

void initialize() {

sensors(); devices(); gateways(); initializeAll(); }

void automate() {

/** Jalankan behavior setiap Device. */

for(int i=0; i<devicesCollection->count(); i++) {

if(devicesCollection->getMemberAt(i) != NULL) {

devicesCollection->getMemberAt(i)->behavior();

devicesCollection->getMemberAt(i)->setLogger(logger); }

}

/** Jalankan service setiap Gateway. */

for(int i=0; i<gatewaysCollection->count(); i++) {

if(gatewaysCollection->getMemberAt(i) != NULL) {

gatewaysCollection->getMemberAt(i)->service();

gatewaysCollection->getMemberAt(i)->setLogger(logger); gatewaysCollection->getMemberAt(i)->setBoard(this); }

} }

void attachDevice(DeviceContract* device) {

devicesCollection->add(device); }

void attachSensor(SensorContract* sensor) {

sensorsCollection->add(sensor); }

void attachGateway(GatewayContract* gateway) {

gatewaysCollection->add(gateway); }

void executeUserCommand(String userCommands) {

DeviceContract* device;

(10)

JsonObject& root = jsonBuffer.parseObject(userCommands);

if (!root.success()) {

Serial.println("parseObject() failed");

return; }

for(int i=0; i<root["commands"].size(); i++) { int pin = root["commands"][i]["pin"];

String action = root["commands"][i]["action"];

if(action=="turnOn") {

if((device=getDeviceByPin(pin)) != NULL) { device->turnOn(); }

} elseif(action=="turnOff") {

if((device=getDeviceByPin(pin)) != NULL) { device->turnOff(); }

} elseif(action=="toggle") {

if((device=getDeviceByPin(pin)) != NULL) { device->toggle(); }

} } }

DeviceContract* getDeviceByPin(int pin) {

DeviceContract* device;

for(int i=0; i<devicesCollection->count(); i++) {

device = devicesCollection->getMemberAt(i);

if(device != NULL) {

if(device->getPin() == pin) {

return device; } } }

returnNULL; }

~Board() {

delete gatewaysCollection;

delete devicesCollection;

delete sensorsCollection;

delete logger; }

};

}}

vendor/nugraha/tugasAkhirWahyu/src/Nugraha/Foundation/Logger.hpp

namespace Nugraha { namespace Foundation {

(11)

classLogger : public LoggerContract {

protected:

DynamicJsonBuffer* jsonBuffer = new DynamicJsonBuffer(); JsonObject* root = &jsonBuffer->createObject();

JsonArray* notifications = &root->createNestedArray("notifications"); JsonArray* measurements = &root->createNestedArray("measurements"); JsonArray* connectionInfos =

&root->createNestedArray("connectionInfos");

bool sendBoardInfo = true;

voidclean() {

delete jsonBuffer;

jsonBuffer = NULL;

notifications = &root->createNestedArray("notifications"); measurements = &root->createNestedArray("measurements");

connectionInfos = &root->createNestedArray("connectionInfos"); }

voidaddBoardInfoToRecord() {

JsonObject& boardInfo = root->createNestedObject("boardInfo"); boardInfo["chipId"] = ESP.getChipId();

boardInfo["freeSketchSpace"] = ESP.getFreeSketchSpace(); }

public:

void addNotification(int code, String message) {

(12)

notification["state"] = state; }

void addConnectionInfo(String parameter, String value) {

if(jsonBuffer == NULL)

reInitializeJsonBuffer();

JsonObject& connectionInfo = connectionInfos->createNestedObject(); connectionInfo["parameter"] = parameter;

connectionInfo["value"] = value; }

void addSensorMeasurement(String sensorName, String measurementValue) {

if(jsonBuffer == NULL)

reInitializeJsonBuffer();

JsonObject& measurement = measurements->createNestedObject(); measurement["sensor"] = sensorName;

measurement["value"] = measurementValue; }

String getLogMessage() {

if(jsonBuffer != NULL) {

if(sendBoardInfo) {

addBoardInfoToRecord(); }

String logMessages;

root->printTo(logMessages); clean();

reInitializeJsonBuffer();

return logMessages;

} else {

return"{\"records\":[]}"; }

}

void printToSerial() {

if(jsonBuffer != NULL) {

if(sendBoardInfo) {

addBoardInfoToRecord(); }

root->prettyPrintTo(Serial); }

else

Serial.println("NULL"); }

};

}}

(13)

namespace Nugraha { namespace Gateways { namespace Esp8266 {

using Nugraha::Traits::HasId;

using Nugraha::Traits::HasLogger;

using Nugraha::Contracts::Gateways::GatewayContract;

using Nugraha::Contracts::Foundation::BoardContract;

using Nugraha::Contracts::Foundation::LoggerContract;

classWifiHttpClient : publicvirtual GatewayContract, public HasLogger,

public HasId {

protected:

ESP8266WiFiMulti WiFiMulti; HTTPClient http;

BoardContract* board;

String ssid = env::wifi::ssid; String password = env::wifi::password; unsignedlong interval = 1000;

String host; String mode;

String publishKey; String subscribeKey; String signature; String channelName; String callback;

String message = "{\"text\":\"hello\"}"; String response;

public:

WifiHttpClient(std::map<String, String> setting) {

this->host = setting["host"];

this->mode = setting["mode"];

this->publishKey = setting["publishKey"];

this->subscribeKey = setting["subscribeKey"];

this->signature = setting["signature"];

this->channelName = setting["channelName"];

this->callback = setting["callback"]; }

virtual ~WifiHttpClient() {}

void initialize() {

Serial.println(); Serial.println(); Serial.println();

for(uint8_t t = 4; t >0; t--) {

Serial.printf("[SETUP] WAIT %d...\n", t); Serial.flush();

delay(1000); }

WiFiMulti.addAP("Fugue2", "fugue123"); }

(14)

{

if(message != "") {

String uri = "http://" + host + "/" + mode + "/" + publishKey + "/" + subscribeKey + "/" + signature + "/" + channelName + "/" + callback + "/" + message;

Serial.println(uri);

return uri; } }

template<typename Callback>

void httpGet(String uri, Callback callback) {

// wait for WiFi connection

if((WiFiMulti.run() == WL_CONNECTED)) { unsignedlong tempMillis = millis(); http.begin(uri);

int httpCode = http.GET();

if(httpCode >0) {

Serial.printf("[HTTP] GET... code: %d\n", httpCode);

// file found at server

if(httpCode == HTTP_CODE_OK) { // Hitung delay.

addDelayToRecord(String(millis() - tempMillis)); // Ekstrak pesan dan panggil fungsi callback.

response = http.getString(); callback();

} else {

addDelayToRecord(String(-1)); }

} else {

Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());

}

http.end(); }

}

int getId() override {HasId::getId();}

void updateMessage() {

this->message = getLogger()->getLogMessage(); }

void setLogger(LoggerContract* logger) override

{

HasLogger::setLogger(logger); addDelayToRecord(String(0)); }

LoggerContract* getLogger() {

return logger;

(15)

void setBoard(BoardContract* board) {

this->board = board; }

void addDelayToRecord(String value) {

getLogger()->addConnectionInfo("delay", value); }

};

}}}

vendor/nugraha/tugasAkhirWahyu/src/Nugraha/Sensors/Sensor.hpp

namespace Nugraha { namespace Sensors {

using Nugraha::Traits::HasId;

using Nugraha::Traits::HasLogger;

using Nugraha::Sensors::Drivers::Driver;

using Nugraha::Sensors::Drivers::GenericDriver;

using Nugraha::Contracts::Sensors::SensorContract;

using Nugraha::Contracts::Foundation::LoggerContract;

classSensor : publicvirtual SensorContract, public HasLogger, public HasId {

protected:

Driver* driver;

public: int id; int pin;

constchar* name;

virtual ~Sensor() {}

Sensor(int pin, constchar* name) {

this->pin = pin;

this->name = name;

this->driver = new GenericDriver(); }

int getId() override {HasId::getId();}

void setLogger(LoggerContract* logger) override

{HasLogger::setLogger(logger);}

LoggerContract* getLogger() override {HasLogger::getLogger();} };

}}

(16)

namespace Nugraha { namespace Support { namespace Facades { namespace

Scheduler {

using Nugraha::Contracts::Support::Facades::Scheduler::EventContract;

using Nugraha::Traits::HasId;

classBaseEvent : publicvirtual EventContract, publicvirtual HasId {

protected:

unsignedlong interval;

unsignedlong previousMillis; int repeatCount = -1;

public:

BaseEvent(unsignedlong interval, int repeatCount) {

this->previousMillis = millis();

this->interval = interval;

this->repeatCount = repeatCount; }

virtual ~BaseEvent()

{

}

int executionCount = 0; voidupdate(unsignedlong now) {

if(now - previousMillis >= interval && (repeatCount == -1 || repeatCount >0)) {

previousMillis = now;

Serial.printf("[%d] ", this->id); executeCallback();

if(repeatCount != -1) {

repeatCount--; }

} }

intgetRepeatCount() {

return repeatCount;

}

intgetId() override

{

HasId::getId(); }

};

}}}}

vendor/nugraha/tugasAkhirWahyu/src/Nugraha/Support/Facades/Scheduler/Scheduler.hpp

namespace Nugraha { namespace Support { namespace Facades { namespace

Scheduler {

using Nugraha::Collections::Collection;

(17)

classScheduler {

protected:

static CollectionContract<BaseEvent*>* eventCollection;

staticbool init;

public:

staticvoid handleEvents() {

if(init) {

after(1, [=](){Serial.println();}); init = false;

}

for(auto event = eventCollection->getMembers().begin(); event != eventCollection->getMembers().end();) {

(*event)->update(millis());

if((*event)->getRepeatCount() == 0) {

delete *event;

*event = NULL;

event = eventCollection->getMembers().erase(event); } else {

++event; }

} }

template<typename Callback>

staticvoid every(unsignedlong interval, Callback callback, int repeatCount = -1)

{

eventCollection->add(new StaticEvent<Callback>(interval, callback, repeatCount));

}

template<typename Callback, typename ObjectType>

staticvoid every(unsignedlong interval, ObjectType object, Callback

callback, int repeatCount = -1) {

eventCollection->add(new Event<Callback, ObjectType>(interval, callback, object, repeatCount));

}

template<typename Callback>

staticvoid after(unsignedlong afterMillis, Callback callback)

{

every(afterMillis, callback, 1); }

static BaseEvent* getEventAt(int index) {

return eventCollection->getMemberAt(index); }

};

CollectionContract<BaseEvent*>* Scheduler::eventCollection = new

(18)

}}}}

vendor/nugraha/tugasAkhirWahyu/src/Nugraha/Support/Facades/Scheduler/StaticEvent.hp

p

names pac e Nugr aha { names pac e Suppor t { names pac e Fac ades { names pac e Sc hed-ul er {

t empl at e<c l as s Cal l bac k>

c l as s St at i c Ev ent : publ i c v i r t ual Bas eEv ent {

pr ot ec t ed:

Cal l bac k c al l bac k ;

publ i c:

St at i c Ev ent (uns i gned l ong i nt er v al , Cal l bac k c al l bac k , i nt r epeat Count ) : Bas eEv ent ( i nt er v al , r epeat Count ) , c al l bac k ( c al l bac k )

{ }

v oi d ex ec ut eCal l bac k ( ) {

t hi s- >c al l bac k ( ) ; }

} ;

(19)

LAMPIRAN 2

KODE PROGRAM APLIKASI WEB

App/Http/routes.php

<?php

Rout e: :get(' / ' , ' HomeCont r ol l er @i ndex ' ) ; Rout e: :aut h( ) ;

Rout e: :get(' publ i s h/ { publ i s hKey } / { s ubs c r i beKey } / { s i gnat ur e} / { c hannel Name} / { c al l bac k } / { mes s age} ' , ' Publ i s hCont r ol l er @handl e' ) ;

Rout e: :get(' manage/ das hboar d' , ' Das hboar dCont r ol l er @i ndex ' ) ;

Rout e: :get(' manage/ das hboar d/ c ons ol e' , ' Cons ol eCont r ol l er @i ndex ' ) ; Rout e: :get(' not i f i c at i ons ' , ' Not i f i c at i ons Cont r ol l er @i ndex ' ) ; Rout e: :get(' not i f i c at i ons / { not i f i c at i ons } / s een' ,

' Not i f i c at i ons Cont r ol l er @s een' ) ;

Rout e: :get(' meas ur ement s ' , ' Meas ur ement s Cont r ol l er @i ndex ' ) ; Rout e: :get(' meas ur ement s / { meas ur ement s } / s een' ,

' Meas ur ement s Cont r ol l er @s een' ) ;

Rout e: :get(' c onnec t i oni nf os ' , ' Connec t i onI nf os Cont r ol l er @i ndex ' ) ; Rout e: :get(' c onnec t i oni nf os / { c onnec t i oni nf os } / s een' ,

' Connec t i onI nf os Cont r ol l er @s een' ) ;

Rout e: :get(' c ommands / 1/ { pi n} ' , ' Commands Cont r ol l er @t ur nOn' ) ; Rout e: :get(' c ommands / 0/ { pi n} ' , ' Commands Cont r ol l er @t ur nOf f ' ) ;

App/Http/Controllers/CommandsController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Command;

use App\Http\Requests;

use Illuminate\Http\JsonResponse;

use Carbon\Carbon;

use App\Traits\ArduinoBoard;

classCommandsControllerextends Controller

{

use ArduinoBoard;

functionturnOn($pin) {

$command = new Command();

$command->pin = $this->getPinValue($pin); $command->action = 'turnOn';

(20)

functionturnOff($pin) {

$command = new Command();

$command->pin = $this->getPinValue($pin); $command->action = 'turnOff';

$command->save(); }

}

App/Http/Controllers/ConnectionInfosController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

use App\ConnectionInfo;

use Illuminate\Http\JsonResponse;

classConnectionInfosControllerextends Controller

{

functionindex() {

$connectionInfos = ConnectionInfo::where('seen', false)->get()-> toArray();

return (new JsonResponse(array( "connectionInfos" =>$connectionInfos )));

}

functionseen(ConnectionInfo $connectionInfo) {

$connectionInfo->seen = true; $connectionInfo->save(); }

}

App/Http/Controllers/ConsoleController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

use App\Command;

use App\Measurement;

use App\Notification;

use Illuminate\Http\JsonResponse;

(21)

{

functionindex() {

return view('dashboard.console.index');

}

}

App/Http/Controllers/DashboardController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

classDashboardControllerextends Controller

{

publicfunction__construct()

{

$this->middleware('auth'); }

publicfunctionindex() {

return view('dashboard.index'); }

}

App/Http/Controllers/HomeController.php

<?php

namespace App\Http\Controllers;

use App\Http\Requests;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Auth;

use Illuminate\Support\Facades\Redirect;

use App\TugasAkhirWahyu\TugasAkhirWahyu;

classHomeControllerextends Controller {

publicfunction__construct()

{

}

publicfunctionindex() {

(22)

} }

App/Http/Controllers/MeasurementsController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request; use App\Http\Requests; use App\Measurement;

use Illuminate\Http\JsonResponse;

classMeasurementsControllerextends Controller {

functionindex() {

$notifications = Measurement::where('seen', false)->get()->toArray();

return (new JsonResponse(array( "measurements" =>$notifications )));

}

functionseen(Measurement $measurement) {

$measurement->seen = true; $measurement->save(); }

}

App/Http/Controllers/NotificationsController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request; use App\Http\Requests; use App\Notification;

use Illuminate\Http\JsonResponse;

classNotificationsControllerextends Controller {

functionindex() {

$notifications = Notification::where('seen', false)->get()->toArray();

return (new JsonResponse(array( "notifications" =>$notifications )));

}

functionseen(Notification $notification) {

$notification->seen = true; $notification->save(); }

(23)

App/Http/Controllers/PublishController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Illuminate\Http\JsonResponse;

use Carbon\Carbon;

use App\Http\Requests;

use App\Command;

use App\Notification;

use App\Device;

use App\Measurement;

use App\ConnectionInfo;

classPublishControllerextends Controller {

functionhandle($publishKey, $subscribeKey, $signature, $channelName, $callback, $message)

{

if($publishKey != "pub-w-3e5de365-5d57-48c7-a317-366ef2846eb4" || $subscribeKey != "sub-n-cca59b64-d972-11e5-bdd5-02ee2ddab7fe") {

return []; }

$this->saveMessages($message);

return$this->sendResponse(); }

functionsaveMessages($message) {

$data = json_decode($message);

$myNotification;

foreach ($data->notificationsas$notification) { $myNotification = new Notification();

$myNotification->pin = $notification->pin; $myNotification->state = $notification->state; $myNotification->seen = false;

$myNotification->save();

$device = Device::where('pin', $myNotification->pin)->get()-> first();

if(isset($device->state)){

if($notification->state == 'on') { $device->state = true;

} elseif($notification->state == 'off') { $device->state = false;

} $device->save(); } }

$myMeasurements;

foreach ($data->measurementsas$measurement) { $myMeasurements = new Measurement();

(24)

$myMeasurements->value = $measurement->value; $myMeasurements->seen = false;

$myMeasurements->save(); }

$myConnectionInfos;

foreach ($data->connectionInfosas$connectionInfo) { $myConnectionInfos = new ConnectionInfo();

$myConnectionInfos->parameter = $connectionInfo->parameter; $myConnectionInfos->value = $connectionInfo->value;

$myConnectionInfos->seen = false; $myConnectionInfos->save();

} }

functionsendResponse() {

$commands = Command::where('sent', false)->get();

foreach ($commandsas$command) { $command->sent = true;

$command->sent_at = Carbon::now(); $command->save();

}

return (new JsonResponse(array("commands" =>$commands-> toArray())));

} }

Resources/views/dashboard/index.blade.php

@extends('dashboard.layouts.master')

@section('content')

<div class="row x_title"> <div class="col-md-6">

<h3>Rumah <small>saya</small></h3> </div>

<div class="col-md-6">

</div> </div>

<div class="col-md-12 col-sm-12 col-xs-12"> <table class="table table-inverse">

<thead> <tr>

<th>#</th> <th>Nama</th> <th>Pin</th> <th>Action</th> </tr>

(25)

<tr>

<th scope="row">1</th> <td>A/C</td>

<td>D6</td> <td>

<button id="turnOn1" type="button" class="btn btn-primary">On</button> <button id="turnOff1" type="button" class="btn btn-warning">Off</button> </td>

</tr> <tr>

<th scope="row">2</th> <td>Lampu 1</td>

<td>D2</td> <td>

<button id="turnOn2" type="button" class="btn btn-primary">On</button> <button id="turnOff2" type="button" class="btn btn-warning">Off</button> </td>

</tr> <tr>

<th scope="row">3</th> <td>Lampu 2</td>

<td>D3</td> <td>

<button id="turnOn3" type="button" class="btn btn-primary">On</button> <button id="turnOff3" type="button" class="btn btn-warning">Off</button> </td>

</tr> <tr>

<th scope="row">4</th> <td>Lampu 3</td>

<td>D4</td> <td>

<button id="turnOn4" type="button" class="btn btn-primary">On</button> <button id="turnOff4" type="button" class="btn btn-warning">Off</button> </td>

</tr> <tr>

<th scope="row">5</th> <td>Lampu 4</td>

<td>D5</td> <td>

<button id="turnOn5" type="button" class="btn btn-primary">On</button> <button id="turnOff5" type="button" class="btn btn-warning">Off</button> </td>

</tr> <tr>

<th scope="row">6</th> <td>Test Led</td> <td>BUILTIN_LED</td> <td>

<button id="turnOn6" type="button" class="btn btn-primary">On</button> <button id="turnOff6" type="button" class="btn btn-warning">Off</button> </td>

(26)

// A/C

$('#turnOn1').click(function() {

$.ajax({url: "/commands/1/d6", success: function(result) {alert("Perintah terkirim!");}});

});

$('#turnOff1').click(function() {

$.ajax({url: "/commands/0/d6", success: function(result) {alert("Perintah terkirim!");}});

});

// Lampu 1

$('#turnOn2').click(function() {

$.ajax({url: "/commands/1/d2", success: function(result) {alert("Perintah terkirim!");}});

});

$('#turnOff2').click(function() {

$.ajax({url: "/commands/0/d2", success: function(result) {alert("Perintah terkirim!");}});

});

// Lampu 2

$('#turnOn3').click(function() {

$.ajax({url: "/commands/1/d3", success: function(result) {alert("Perintah terkirim!");}});

});

$('#turnOff3').click(function() {

$.ajax({url: "/commands/0/d3", success: function(result) {alert("Perintah terkirim!");}});

}); // Lampu 3

$('#turnOn4').click(function() {

$.ajax({url: "/commands/1/d4", success: function(result) {alert("Perintah terkirim!");}});

});

$('#turnOff4').click(function() {

$.ajax({url: "/commands/0/d4", success: function(result) {alert("Perintah terkirim!");}});

});

// Lampu 4

$('#turnOn5').click(function() {

$.ajax({url: "/commands/1/d5", success: function(result) {alert("Perintah terkirim!");}});

});

$('#turnOff5').click(function() {

$.ajax({url: "/commands/0/d5", success: function(result) {alert("Perintah terkirim!");}});

});

// Test Led

$('#turnOn6').click(function() {

$.ajax({url: "/commands/1/builtin_led", success: function(result) {alert("Perintah terkirim!");}});

});

$('#turnOff6').click(function() {

$.ajax({url: "/commands/0/builtin_led", success: function(result) {alert("Perintah terkirim!");}});

(27)

</script> @endsection

Resources/views/dashboard/console/index.blade.php

@extends('dashboard.layouts.master')

@section('content')

<div class="row x_title"> <div class="col-md-6">

<h3>Debug <small>Console</small></h3> </div>

<div class="col-md-6">

</div> </div>

<div class="col-md-12 col-sm-12 col-xs-12"> <div id="ayam" class="col-md-6">

</div>

<div id="console" class="col-md-6">

<textarea class="col-md-12" id="myConsoleArea" cols="100" rows="9000" style="background:#000; foreground:#fff; height: 700px;

font-size:16px"></textarea> </div>

</div> <script>

var message = "";

functiongetData() {

$.ajax({url: "/notifications", success: function(result) { result.notifications.forEach(function(notification) {

message += '>> ['+ notification.created_at +'] perangkat pada pin ' + notification.pin + ' telah di-' + notification.state + '-kan\n'; $('#myConsoleArea').html(message);

$.ajax({url: "/notifications/"+notification.id+"/seen", success:

function(result) {}});

});; }});

$.ajax({url: "/measurements", success: function(result) { result.measurements.forEach(function(measurement) {

message += '>> ['+ measurement.created_at +'] pembacaan sensor ' + measurement.sensor + ' adalah: ' + measurement.value + '\n';

$('#myConsoleArea').html(message);

$.ajax({url: "/measurements/"+measurement.id+"/seen", success:

function(result) {}});

});; }});

setTimeout(getData, 3000); }

$(document).ready(function () { getData();

});

</script>

(28)

Resources/views/dashboard/layouts/master.blade.php

<!DOCTYPE html> <html lang="en">

<head>

@include('dashboard.layouts.master.header') @yield('header')

</head>

<body class="nav-md">

<div class="container body"> <div class="main_container"> <div class="col-md-3 left_col"> <div class="left_col scroll-view">

<div class="navbar nav_title" style="border: 0;"> <a href="dashboard" class="site_title"><i class="fa fa-paw"></i><span>Dashboard</span></a>

</div>

<div class="clearfix"></div>

<!-- menu profile quick info --> <div class="profile">

@include('dashboard.layouts.master.profileQuickInfo')

</div>

<!-- /menu profile quick info -->

<br />

<!-- sidebar menu -->

<div id="sidebar-menu" class="main_menu_side hidden-print main_menu"> <div class="menu_section">

@include('dashboard.layouts.master.sideBarMenu')

</div> </div>

<!-- /sidebar menu -->

<!-- /menu footer buttons -->

<div class="sidebar-footer hidden-small">

@include('dashboard.layouts.master.menuFooterButtons')

</div>

<div class="clearfix"></div> <!-- /menu footer buttons --> </div>

(29)

<!-- top navigation --> <div class="top_nav">

<div class="nav_menu">

<nav class="" role="navigation"> <div class="nav toggle">

<a id="menu_toggle"><i class="fa fa-bars"></i></a> </div>

@include('dashboard.layouts.master.topNavigation') </nav>

</div>

</div>

<!-- /top navigation -->

<!-- page content -->

<div class="right_col" role="main">

<div class="row">

<div class="col-md-12 col-sm-12 col-xs-12"> <div class="dashboard_graph">

@yield('content')

<div class="clearfix"></div>

</div> </div> </div>

<br/>

<!-- footer content --> <footer>

@include('dashboard.layouts.master.footer') @yield('footer')

</footer>

<!-- /footer content --> </div>

<!-- /page content -->

</div>

</div>

<div id="custom_notifications" class="custom-notifications dsp_none"> <ul class="list-unstyled notifications clearfix"

data-tabbed_notifications="notif-group"> </ul>

<div class="clearfix"></div>

<div id="notif-group" class="tabbed_notifications"></div> </div>

@include('dashboard.layouts.master.scripts') </body>

Referensi

Dokumen terkait

bahwa berdasarkan pertimbangan sebagaimana dimaksud dalam huruf a, perlu menetapkan Keputusan Bupati tentang Penunjukan Pejabat Pengelola Keuangan Satuan Kerja (

[r]

KESATU : Membentuk Tim Program Pinjaman Bergulir Usaha Ekonomi Produktif Bagi Kelompok Usaha Peningkatan Kesejahteraan (KUPK) di Kabupaten Bantul Tahun 2010

[r]

according to classification schema in land cover data, as artificial surface in GlobeLand30 includes transportation land use, residential land use, and industrial land

DFD adalah suatu model logika data atau proses yang dibuat untuk menggambarkan dari mana asal data dan kemana tujuan data yang keluar dari sistem, dimana

Suatu perjanjian yang disepakati antar bank syariah dengan nasabah dimana bank menyediakan pembiayaan untuk pembelian bahan baku/modal kerja dan harus di bayar kembali oleh

Hasil penelitian menunjukkan bahwa perbedaan varietas kedelai berpnegaruh nyata pada peubah amatan tinggi tanaman 6 MST, diameter batang dan juinlah cabang