MENGGUNAKAN PROTOKOL KOMUNIKASI WI-FI DAN PROTOKOL ...kc.umn.ac.id/1317/1/Rancang Bangun Smart Rice...

171
RANCANG BANGUN SMART RICE COOKER MENGGUNAKAN PROTOKOL KOMUNIKASI WI-FI DAN PROTOKOL PERTUKARAN PESAN MQTT SKRIPSI Diajukan Sebagai Salah Satu Syarat Untuk Memperoleh Gelar Sarjana Komputer (S.Kom.) Michael Aditya Sutiono 12110210001 PROGRAM STUDI SISTEM KOMPUTER FAKULTAS TEKNIK DAN INFORMATIKA UNIVERSITAS MULTIMEDIA NUSANTARA TANGERANG 2016

Transcript of MENGGUNAKAN PROTOKOL KOMUNIKASI WI-FI DAN PROTOKOL ...kc.umn.ac.id/1317/1/Rancang Bangun Smart Rice...

RANCANG BANGUN SMART RICE COOKER

MENGGUNAKAN PROTOKOL KOMUNIKASI WI-FI DAN

PROTOKOL PERTUKARAN PESAN MQTT

SKRIPSI

Diajukan Sebagai Salah Satu Syarat Untuk Memperoleh Gelar Sarjana

Komputer (S.Kom.)

Michael Aditya Sutiono

12110210001

PROGRAM STUDI SISTEM KOMPUTER

FAKULTAS TEKNIK DAN INFORMATIKA

UNIVERSITAS MULTIMEDIA NUSANTARA

TANGERANG

2016

ii

HALAMAN PENGESAHAN SKRIPSI

RANCANG BANGUN SMART RICE COOKER

MENGGUNAKAN PROTOKOL KOMUNIKASI WI-FI DAN

PROTOKOL PERTUKARAN PESAN MQTT

Oleh

Nama : Michael Aditya Sutiono

NIM : 12110210001

Fakultas : Teknik dan Informatika

Program Studi : Sistem komputer

Telah diujikan pada hari Selasa, 9 Agustus 2016 dan dinyatakan lulus dengan

susunan Tim Penguji sebagai berikut,

Ketua Sidang Dosen Penguji

Samuel, M.T.I. Felix Lokananta, S.Kom., M.Eng.Sc.

Dosen Pembimbing I Dosen Pembimbing II

Kanisius Karyono, S.T., M.T. Hargyo Tri Nugroho, S.Kom., M.Sc.

Disahkan oleh

Ketua Program Studi Sistem Komputer

Hargyo Tri Nugroho, S.Kom., M.Sc.

iii

PERNYATAAN TIDAK MELAKUKAN PLAGIAT

Dengan ini saya :

Nama : Michael Aditya Sutiono

NIM : 12110210001

Fakultas : Teknologi Informasi dan Komunikasi

Program Studi : Sistem Komputer

menyatakan bahwa skripsi yang berjudul “Rancang Bangun Smart Rice Cooker

Menggunakan Protokol Komunikasi Wi-Fi dan Protokol Pertukaran Pesan MQTT”

ini adalah karya ilmiah saya sendiri, bukan plagiat dari karya ilmiah yang ditulis

oleh orang lain atau lembaga lain, dan semua karya ilmiah orang lain atau lembaga

lain yang dirujuk dalam skripsi ini telah disebutkan sumber kutipannya serta

dicantumkan di Daftar Pustaka.

Jika dikemudian hari terbukti ditemukan kecurangan/penyimpangan, baik

dalam pelaksanaan skripsi maupun dalam penulisan laporan skripsi, saya bersedia

menerima konsekuensi dinyatakan TIDAK LULUS untuk mata kuliah Skripsi yang

telah saya tempuh.

Tangerang, 21 Juli 2016

Michael Aditya Sutiono

iv

KATA PENGANTAR

Tidak henti-hentinya penulis mengucap syukur atas melimpahnya rahmat

dan berkat penyertaan yang diberikan oleh Tuhan Yang Mahakasih kepada penulis

dalam menyelesaikan laporan skripsi yang berjudul “Rancang Bangun Smart Rice

Cooker Berbasis Protokol Komunikasi Wi-Fi dan Protokol Pertukaran Pesan

MQTT”. Laporan skripsi ini diajukan kepada Program Strata I Jurusan Sistem

Komputer, Fakultas Teknologi Informasi dan Komunikasi, Universitas Multimedia

Nusantara untuk mendapatkan gelar sarjana S1.

Terselesaikannya laporan skripsi ini tidak lepas dari bantuan banyak pihak

yang penulis dapatkan. Izinkan penulis berterima kasih kepada:

1. Dr. Ninok Leksono, selaku Rektor Universitas Multimedia Nusantara,

2. Hira Meidia, Ph.D., selaku Wakil Rektor Bidang Akademik,

3. Ir. Andrey Andoko, M.Sc., selaku Wakil Rektor Bidang Administrasi

Umum dan Keuangan,

4. Ika Yanuarti, S.E., MSF, selaku Wakil Rektor Bidang Kemahasiswaan,

5. Prof. Dr. Muliawati G. Siswanto, M.Eng.Sc., selaku Wakil Rektor

Bidang Hubungan dan Kerjasama,

6. Kanisius Karyono, S.T., M.T., selaku Dekan Fakultas ICT, dan dosen

pembimbing yang telah memberikan arahan dan dukungan moral

kepada penulis,

7. Hargyo Tri Nugroho, S.Kom., M.Sc., selaku Ketua Program Studi

Komputer, dan dosen pembimbing yang telah memberikan arahan dan

dukungan moral kepada penulis,

v

8. Kedua orang tua penulis yang selalu memberikan doa, dukungan moral

dan perhatian yang luar biasa kepada penulis,

9. Christian Orvin dan Vania, rekan diskusi penulis yang memiliki topik

besar yang sama,

10. Pihak ICT Lab B512, khususnya Wendy Hardianto dan Rio Raymundus

Theodora atas segala bantuan, motivasi, kritik, dan saran yang diberikan

kepada penulis,

11. Rekan-rekan seangkatan Sistem Komputer 2012 yang telah berjuang

bersama, berbagi suka dan duka dari awal masuk hingga selesainya

skripsi ini,

12. Pihak-pihak lain yang tidak dapat disebutkan satu persatu.

Semoga laporan skripsi ini bermanfaat bagi pembaca, baik sebagai sumber

informasi maupun inspirasi, terutama dalam mengembangkan teknologi informasi

dan komunikasi.

Tangerang, 21 Juli 2016

Penulis

vi

RANCANG BANGUN SMART RICE COOKER

MENGGUNAKAN PROTOKOL KOMUNIKASI WI-FI DAN

PROTOKOL PERTUKARAN PESAN MQTT

ABSTRAK

Smart Rice Cooker pada penelitian ini dirancang untuk mempermudah

memasak beras bagi orang-orang yang sibuk bekerja, sehingga nasi sudah siap

dikonsumsi ketika tiba di rumah tanpa campur tangan manusia. Terdapat tiga

komponen utama penyusun sistem ini, yaitu smart rice cooker itu sendiri, sebuah

server berbasis Node.js dengan database MySQL, dan sebuah aplikasi berbasis

Android bernama ApplianceHub sebagai pusat kendali. Smart Rice Cooker pada

penelitian ini memiliki fitur otomatisasi untuk proses menakar, mencuci, hingga

memasak nasi/bubur. Server berfungsi untuk mengatur traffic pesan seluruh

perangkat Internet of Things (IoT) yang terhubung. Aplikasi ApplianceHub

berfungsi untuk mengatur preferensi memasak. Metode komunikasi yang

digunakan untuk menghubungkan Smart Rice Cooker dengan aplikasi Android

adalah melalui protokol komunikasi Wi-Fi dan protokol pertukaran pesan MQTT

dalam format data JSON. Uji coba dilakukan dengan melihat ketepatan waktu

memasak dimulai, kesesuaian takaran beras dan air, dan pertukaran pesan antar

perangkat. Hasil uji coba menunjukkan bahwa smart rice cooker dapat menerima

perintah dari aplikasi ApplianceHub melalui server, mengirimkan laporan ke

aplikasi ApplianceHub melalui server, dan memasak sesuai takaran dan waktu yang

ditentukan.

Kata kunci: Smart rice cooker, Internet of Things, MQTT, Node.js, JSON, Wi-Fi

vii

SMART RICE COOKER DESIGN USING WI-FI PROTOCOL

AND MQTT MESSAGING PROTOCOL

ABSTRACT

Smart Rice Cooker is designed to make it easier to cook rice for people who is

busy working, so that the rice is ready to eat whenever they got home without

human intervention. There are three main components of this system, which are

smart rice cooker itself, a Node.js based server with MySQL database, and an

Android based application named ApplianceHub as the controller. Smart Rice

Cooker in this study has features to measure, wash, and cook rice or porridge

automatically. Server regulates all connected Internet of Things (IoT) devices’

message traffic. ApplianceHub adjusts the cooking preferences. Communication

methods which are used to connect Smart Rice Cooker with ApplianceHub are Wi-

Fi communication protocol and MQTT messaging protocol in JSON data format.

Experiments are done by observing punctuality of cooking process started, accuracy

of rice and water measurement, and message exchanges among connected devices.

The results show that Smart Rice Cooker is able to receive command from

ApplianceHub via server, send report to ApplianceHub via server, and cook based

on determined cooking preferences.

Keywords: Smart rice cooker, Internet of Things, MQTT, Node.js, JSON, Wi-Fi

viii

DAFTAR ISI

HALAMAN PENGESAHAN SKRIPSI ........................................................................... ii

PERNYATAAN TIDAK MELAKUKAN PLAGIAT ..................................................... iii

KATA PENGANTAR ......................................................................................................iv

ABSTRAK ........................................................................................................................vi

ABSTRACT ................................................................................................................... vii

DAFTAR ISI.................................................................................................................. viii

DAFTAR TABEL .............................................................................................................. x

DAFTAR GAMBAR ...................................................................................................... xii

BAB I PENDAHULUAN .................................................................................................. 1

1.1 Latar Belakang ................................................................................................... 1

1.2 Rumusan Masalah .............................................................................................. 4

1.3 Batasan Masalah ................................................................................................. 4

1.4 Tujuan Penelitian ............................................................................................... 5

1.5 Manfaat Penelitian.............................................................................................. 6

1.6 Sistematika Penulisan ......................................................................................... 7

BAB II TINJAUAN PUSTAKA ........................................................................................ 8

2.1 Smart Rice Cooker ............................................................................................. 8

2.2 Papan Pengendali Mikro Arduino Uno ............................................................. 10

2.3 Modul Wi-Fi ESP8266 ..................................................................................... 12

2.4 Motor Servo ..................................................................................................... 13

2.5 Real Time Clock .............................................................................................. 14

2.6 Sensor Aliran Air YF-S201 .............................................................................. 15

2.7 Relay Switch .................................................................................................... 17

2.8 MQTT .............................................................................................................. 19

2.9 Node.js ............................................................................................................. 25

2.10 JSON ................................................................................................................ 27

2.11 Android ............................................................................................................ 29

BAB III ANALISIS DAN PERANCANGAN SISTEM .................................................. 30

3.1 Fitur dan Spesifikasi Smart Rice Cooker .......................................................... 30

3.2 Rancangan Sistem Keseluruhan ....................................................................... 31

3.3 Rancangan Perangkat Keras ............................................................................. 33

3.4 Rancangan Perangkat Lunak ............................................................................ 36

3.4.1. Rancangan Protokol Komunikasi ............................................................. 36

ix

3.4.2. Rancangan Basis Data .............................................................................. 70

3.4.3. Rancangan Aplikasi Server ...................................................................... 76

3.4.4. Rancangan Perangkat Lunak Smart Rice Cooker ..................................... 80

3.4.5. Rancangan Aplikasi Android .................................................................... 89

BAB IV IMPLEMENTASI DAN PENGUJIAN SISTEM............................................... 94

4.1 Implementasi dan Pengujian Rangkaian Sensor dan Aktuator.......................... 94

4.2.1. Implementasi Perangkat Keras ................................................................. 94

4.2.2. Uji Coba Pengeluaran Beras dari Tempat Penyimpanan .......................... 96

4.2.3. Uji Coba Pencucian Beras Otomatis ......................................................... 96

4.2.4. Uji Coba Bacaan Sensor Aliran Air .......................................................... 96

4.2 Implementasi dan Pengujian Sistem ................................................................. 97

4.2.1. Pengujian Pertukaran Pesan ...................................................................... 98

4.2.2. Pengujian Keamanan Pertukaran Pesan .................................................. 109

4.2.3. Stress Test Server ................................................................................... 111

BAB V PENUTUP ........................................................................................................ 112

5.1 Kesimpulan .................................................................................................... 112

5.2 Saran .............................................................................................................. 113

DAFTAR PUSTAKA .................................................................................................... 114

LAMPIRAN 1. FLOWCHART ......................................................................................... I

LAMPIRAN 1.1 Flowchart Pemrosesan Pesan pada Server .......................................... I

LAMPIRAN 1.2 Flowchart Pemrosesan Pesan pada ESP8266 ................................... VI

LAMPIRAN 1.3 Flowchart Sub-Subroutine Pada Subroutine “Cook” ..................... VIII

LAMPIRAN 2. KODE PROGRAM ................................................................................. X

LAMPIRAN 2.1 Kode Program Arduino ...................................................................... X

LAMPIRAN 2.2 Kode Program ESP8266 (Init.lua) [25] ........................................... XX

LAMPIRAN 2.3 Kode Program ESP8266 (Config.lua) ............................................. XX

LAMPIRAN 2.4 Kode Program ESP8266 (Setup.lua) [25] ...................................... XXI

LAMPIRAN 2.5 Kode Program ESP8266 (Application.lua) [25] ........................... XXII

LAMPIRAN 2.6 Kode Program Server .................................................................. XXV

LAMPIRAN 3. FORMULIR KONSULTASI SKRIPSI ............................................... XLI

x

DAFTAR TABEL

Tabel 2. 1 Tabel Pilihan Perbandingan Beras dan Air Untuk Memasak Nasi................... 10

Tabel 2. 2 Tabel Pilihan Perbandingan Beras dan Air Untuk Memasak Bubur ................ 10

Tabel 3. 1 Tabel Spesifikasi Pesan "loginStatus" ............................................................. 37

Tabel 3. 2 Tabel Spesifikasi Pesan "signup" .................................................................... 37

Tabel 3. 3 Tabel Spesifikasi Pesan "signupStatus" ........................................................... 38

Tabel 3. 4 Tabel Spesifikasi Pesan "getOwner" ............................................................... 38

Tabel 3. 5 Tabel Spesifikasi Pesan "owner" ..................................................................... 39

Tabel 3. 6 Tabel Spesifikasi Pesan "getMyAppliance" .................................................... 39

Tabel 3. 7 Tabel Spesifikasi Pesan "myAppliance" .......................................................... 40

Tabel 3. 8 Tabel Spesifikasi Pesan "registerMyAppliance" ............................................. 41

Tabel 3. 9 Tabel Spesifikasi Pesan "registrationStatus" ................................................... 41

Tabel 3. 10 Tabel Spesifikasi Pesan "unregisterMyAppliance" ....................................... 42

Tabel 3. 11 Tabel Spesifikasi Pesan "unregisterStatus" ................................................... 42

Tabel 3. 12 Tabel Spesifikasi Pesan "getProfile" ............................................................. 43

Tabel 3. 13 Tabel Spesifikasi Pesan "myProfile" ............................................................. 43

Tabel 3. 14 Tabel Spesifikasi Pesan "updateProfile" ........................................................ 44

Tabel 3. 15 Tabel Spesifikasi Pesan "updateProfileStatus" .............................................. 45

Tabel 3. 16 Tabel Spesifikasi Pesan "updatePassword" ................................................... 45

Tabel 3. 17 Tabel Spesifikasi Pesan "updatePasswordStatus" .......................................... 46

Tabel 3. 18 Tabel Spesifikasi Pesan "renameAppliance" ................................................. 46

Tabel 3. 19 Tabel Spesifikasi Pesan "renameStatus" ........................................................ 47

Tabel 3. 20 Tabel Spesifikasi Pesan "getStatus" .............................................................. 47

Tabel 3. 21 Tabel Spesifikasi Pesan "applianceStatus" .................................................... 47

Tabel 3. 22 Tabel Spesifikasi Pesan "getLog" .................................................................. 48

Tabel 3. 23 Tabel Spesifikasi Pesan "reportLog" ............................................................. 48

Tabel 3. 24 Tabel Spesifikasi Pesan "offline" .................................................................. 49

Tabel 3. 25 Tabel Spesifikasi Pesan "cook" ..................................................................... 50

Tabel 3. 26 Tabel Spesifikasi Pesan "cmdid" ................................................................... 51

Tabel 3. 27 Tabel Spesifikasi Pesan "getCookSchedule" ................................................. 52

Tabel 3. 28 Tabel Spesifikasi Pesan "cookStarted" .......................................................... 52

Tabel 3. 29 Tabel Spesifikasi Pesan "cookFinished" ........................................................ 53

Tabel 3. 30 Tabel Spesifikasi Pesan "updateRckStock" ................................................... 54

Tabel 3. 31 Tabel Spesifikasi Pesan "confirmRckStock" ................................................. 55

Tabel 3. 32 Tabel Spesifikasi Pesan "getRckStock" ......................................................... 55

Tabel 3. 33 Tabel Spesifikasi Pesan "rckStock" ............................................................... 56

Tabel 3. 34 Tabel Spesifikasi Pesan "medicine" .............................................................. 57

Tabel 3. 35 Tabel Spesifikasi Pesan "cmdid" ................................................................... 57

Tabel 3. 36 Tabel Spesifikasi Pesan "medicineScheduled" .............................................. 58

Tabel 3. 37 Tabel Spesifikasi Pesan "getMedicineSchedule" ........................................... 59

Tabel 3. 38 Tabel Spesifikasi Pesan "medicineTook" ...................................................... 59

Tabel 3. 39 Tabel Spesifikasi Pesan "medicineNotTook" ................................................ 60

Tabel 3. 40 Tabel Spesifikasi Pesan "updateMedStock" .................................................. 61

Tabel 3. 41 Tabel Spesifikasi Pesan "confirmMedStock" ................................................ 62

Tabel 3. 42 Tabel Spesifikasi Pesan "getMedStock" ........................................................ 62

xi

Tabel 3. 43 Tabel Spesifikasi Pesan "smdStock" ............................................................. 63

Tabel 3. 44 Tabel Spesifikasi Pesan "feed" ...................................................................... 64

Tabel 3. 45 Tabel Spesifikasi Pesan "cmdid" ................................................................... 64

Tabel 3. 46 Tabel Spesifikasi Pesan "feedScheduled" ...................................................... 65

Tabel 3. 47 Tabel Spesifikasi Pesan "getFeedSchedule" .................................................. 66

Tabel 3. 48 Tabel Spesifikasi Pesan "feedReport" ........................................................... 66

Tabel 3. 49 Tabel Spesifikasi Pesan "updateFeederStock" ............................................... 67

Tabel 3. 50 Tabel Spesifikasi Pesan "confirmFeederStock" ............................................. 68

Tabel 3. 51 Tabel Spesifikasi Pesan "getFeederStock" .................................................... 69

Tabel 3. 52 Tabel Spesifikasi Pesan "sdfStock" ............................................................... 69

Tabel 3. 53 Tabel user pada Basis Data ........................................................................... 71

Tabel 3. 54 Tabel appliancemaster pada Basis Data......................................................... 71

Tabel 3. 55 Tabel appliancedetail pada Basis Data .......................................................... 72

Tabel 3. 56 Tabel command pada Basis Data................................................................... 73

Tabel 3. 57 Tabel report pada Basis Data ......................................................................... 73

Tabel 3. 58 Tabel rckstock pada Basis Data ..................................................................... 74

Tabel 3. 59 Tabel sdfstock pada Basis Data ..................................................................... 75

Tabel 3. 60 Tabel smdstock pada Basis Data ................................................................... 75

Tabel 4. 1 Tabel Hasil Uji Coba Stress Test Server ....................................................... 111

xii

DAFTAR GAMBAR

Gambar 2. 1 Panasonic SR-SX102 [14] ............................................................................. 9

Gambar 2. 2 Xiaomi Mi Induction Heating Pressure Rice Cooker [17] ............................. 9

Gambar 2. 3 Arduino Uno [23] ........................................................................................ 11

Gambar 2. 4 Spesifikasi Teknis Papan Pengendali Mikro Arduino Uno [22] .................. 11

Gambar 2. 5 Konfigurasi Pin ATmega1328 [23] ............................................................. 12

Gambar 2. 6 NodeMCU Development Kit Berbasis Modul Wi-Fi ESP8266 [27] ........... 13

Gambar 2. 7 Motor Servo MG995 [30] ............................................................................ 14

Gambar 2. 8 RTC DS3231 [32] ....................................................................................... 14

Gambar 2. 9 Sensor Aliran Air YF-S201 [33] .................................................................. 15

Gambar 2. 10 Jenis-Jenis Relay dan simbolnya [34] ........................................................ 17

Gambar 2. 11 Struktur Relay [34] .................................................................................... 17

Gambar 2. 12 Jenis Relay Berdasarkan Pole dan Throw [34] .......................................... 18

Gambar 2. 13 Alur pesan CONNECT dengan clean session [36] .................................... 20

Gambar 2. 14 Alur pesan CONNECT tanpa clean session [36] ....................................... 20

Gambar 2. 15 Alur pesan SUBSCRIBE and UNSUBSCRIBE untuk sebuah topik [36] .. 21

Gambar 2. 16 Alur pesan PUBLISH dengan QoS 0 (At most once) [36] ......................... 22

Gambar 2. 17 Alur pesan PUBLISH dengan QoS 1 (At least once) [36] ......................... 22

Gambar 2. 18 Alur pesan PUBLISH dengan QoS 2 (Exactly once) [36] ......................... 23

Gambar 2. 19 Alur pesan ping untuk keepalive [36] ........................................................ 24

Gambar 2. 20 Alur pesan DISCONNECT untuk memutuskan koneksi [36] .................... 24

Gambar 2. 21 Alur pesan “will” [36] ............................................................................... 25

Gambar 2. 22 Struktur Internal Node.js [41] .................................................................... 26

Gambar 2. 23 Cara Kerja Event Loop Node.js [41] ......................................................... 27

Gambar 2. 24 Struktur object pada JSON [44] ................................................................. 28

Gambar 2. 25 Struktur array pada JSON [44] .................................................................. 28

Gambar 2. 26 Value pada JSON [44] ............................................................................... 29

Gambar 3. 1 Diagram Arsitektur Keseluruhan Sistem ..................................................... 32

Gambar 3. 2 Rancangan Bentuk Fisik Smart Rice Cooker ............................................... 34

Gambar 3. 3 Diagram Blok Perangkat Keras Smart Rice Cooker .................................... 35

Gambar 3. 4 Entity Relation Diagram Basis Data Sistem Otomatisasi ............................. 70

Gambar 3. 5 Flowchart Utama Aplikasi Server ................................................................ 77

Gambar 3. 6 Flowchart Subroutine “Authentication and Authorization” ......................... 78

Gambar 3. 7 Flowchart Subroutine “Process Message Based on Protocol” ..................... 80

Gambar 3. 8 Flowchart Utama Program ESP8266 [25] ................................................... 82

Gambar 3. 9 Flowchart Utama Program Arduino (Bagian 1) ........................................... 86

Gambar 3. 10 Flowchart Utama Program Arduino (Bagian 2) ......................................... 87

Gambar 3. 11 Flowchart Utama Program Arduino (Bagian 3) ......................................... 88

Gambar 3. 12 Flowchart Subroutine “Cook” ................................................................... 89

Gambar 3. 13 Rancangan Tampilan Halaman Daftar Appliance [18] .............................. 90

Gambar 3. 14 Rancangan Tampilan Halaman Menu Smart Rice Cooker [18] ................. 90

Gambar 3. 15 Rancangan Tampilan Halaman Menu Cook Mode [18] ............................. 91

Gambar 3. 16 Rancangan Tampilan Halaman Cook Settings [18] ................................... 92

Gambar 3. 17 Rancangan Tampilan Halaman Update Stock Smart Rice Cooker [18] ..... 92

Gambar 3. 18 Rancangan Tampilan Halaman Log [18] ................................................... 93

xiii

Gambar 3. 19 Rancangan Tampilan Halaman Unregister [18] ......................................... 93

Gambar 4. 1 Diagram Skematik Perangkat Keras Smart Rice Cooker ............................. 94

Gambar 4. 2 Smart Rice Cooker ...................................................................................... 95

Gambar 4. 3 Grafik Hasil Uji Coba Bacaan Sensor Aliran Air ........................................ 97

Gambar 4. 4 Halaman Awal/Login pada ApplianceHub .................................................. 98

Gambar 4. 5 Hasil Capture Pesan “Connect (Login)” pada Wireshark ............................ 98

Gambar 4. 6 Halaman Menu Utama pada ApplianceHub Setelah Login Berhasil ........... 99

Gambar 4. 7 Hasil Capture Pesan “getMyAppliance” pada Wireshark ............................ 99

Gambar 4. 8 Hasil Capture Pesan “myAppliance” pada Wireshark ............................... 100

Gambar 4. 9 Halaman Daftar Perangkat pada ApplianceHub ........................................ 100

Gambar 4. 10 Hasil Capture Pesan “getRckStock” pada Wireshark .............................. 101

Gambar 4. 11 Hasil Capture Pesan “rckStock” pada Wireshark..................................... 101

Gambar 4. 12 Halaman Menu Smart Rice Cooker pada ApplianceHub ......................... 101

Gambar 4. 13 Halaman Pengaturan Preferensi Memasak pada ApplianceHub dengan

Parameter berbeda .......................................................................................................... 102

Gambar 4. 14 Hasil Capture Pesan “cook” pada Wireshark dengan Parameter Berbeda 102

Gambar 4. 15 Hasil Capture Pesan “cmdid” pada Wireshark dari Dua Pesan “cook”

Berbeda .......................................................................................................................... 103

Gambar 4. 16 Hasil Capture Pesan “cookStarted” pada Wireshark dari Dua Pesan “cook”

Berbeda .......................................................................................................................... 103

Gambar 4. 17 Hasil Capture Pesan “cookFinished” pada Wireshark dari Dua Pesan

“cook” Berbeda .............................................................................................................. 103

Gambar 4. 18 Halaman Update Stock Smart Rice Cooker pada ApplianceHub ............. 104

Gambar 4. 19 Hasil Capture Pesan “updateRckStock” pada Wireshark ......................... 104

Gambar 4. 20 Hasil Capture Pesan “confirmRckStock” pada Wireshark ....................... 104

Gambar 4. 21 Hasil Capture Pesan “getLog” pada Wireshark ....................................... 105

Gambar 4. 22 Halaman Daftar Laporan Smart Rice Cooker pada ApplianceHub .......... 105

Gambar 4. 23 Hasil Capture Pesan “reportLog” pada Wireshark ................................... 105

Gambar 4. 24 Halaman Unregister Appliance pada ApplianceHub ............................... 106

Gambar 4. 25 Hasil Capture Pesan “unregisterMyAppliance” pada Wireshark ............. 106

Gambar 4. 26 Hasil Capture Pesan “unregisterStatus” pada Wireshark ......................... 106

Gambar 4. 27 Halaman Daftar Perangkat pada ApplianceHub Setelah Unregister

Appliance ....................................................................................................................... 107

Gambar 4. 28 Halaman Add Appliance pada ApplianceHub ......................................... 108

Gambar 4. 29 Hasil Capture Pesan “registerMyAppliance” dan "renameAppliance" pada

Wireshark ....................................................................................................................... 108

Gambar 4. 30 Hasil Capture Pesan “registerStatus” dan "renameStatus" pada Wireshark

....................................................................................................................................... 108

Gambar 4. 31 Halaman Daftar Perangkat dan Menu Smart Rice Cooker pada

ApplianceHub Setelah Menambahkan Appliance .......................................................... 109

Gambar 4. 32 Hasil Capture Pesan "login" yang Tidak Terenkripsi pada Wireshark ..... 110

Gambar 4. 33 Hasil Capture Pesan "signup" yang Tidak Terenkripsi pada Wireshark .. 110

Gambar 4. 34 Hasil Capture Pesan "login" yang Terenkripsi pada Wireshark ............... 110

Gambar 4. 35 Hasil Capture Pesan "signup" yang Terenkripsi pada Wireshark ............. 110

1

BAB I

PENDAHULUAN

1.1 Latar Belakang

Indonesia merupakan negara dengan konsumsi beras tertinggi ketiga setelah

China dan India [1]. Berdasarkan data dari Badan Pusat Statistik (BPS), konsumsi

beras rata-rata per kapita per minggu di Indonesia adalah sebesar 1.626 kg [2].

Angka konsumsi beras yang tinggi tidak menjamin semua masyarakat Indonesia

mau untuk memasak sendiri. Berdasarkan survei yang dilakukan oleh Fiesta

Seafood terhadap responden berusia 25-45 tahun di lima kota, Jakarta, Depok,

Bandung, Surabaya, dan Yogyakarta, salah satu alasan utama yang membuat

seseorang enggan memasak sendiri di rumah adalah sibuk bekerja dari pagi hingga

larut malam dan sibuk dengan urusan rumah tangga lainnya, sehingga banyak

pasangan suami istri atau lajang muda yang memilih untuk makan di luar saja [3].

Melihat angka konsumsi beras masyarakat Indonesia yang tinggi dan

permasalahan sebagian masyarakat yang malas memasak karena sibuk, peneliti

memiliki ide untuk membuat suatu perangkat pemasak nasi otomatis yang dapat

membantu masyarakat agar tetap dapat memasak nasi di rumah walaupun sangat

sibuk.

Saat ini, sudah ada berbagai macam pemasak nasi elektrik. Ada yang hanya

memiliki 1 saklar on/off, ada yang memiliki beberapa tombol untuk berbagai fungsi,

hingga pemasak nasi yang pintar. Salah satu pemasak nasi pintar pada sudah ada di

pasaran adalah merek Panasonic SR-SX102 [4] memanfaatkan teknologi RFID

2

contactless untuk membuat ponsel pintar pengguna sebagai pengendali pemasak

nasi (menggunakan aplikasi khusus). Teknologi RFID tersebut hanya terdapat pada

ponsel pintar tertentu dan ponsel hanya mampu mengendalikan pemasak nasi jika

berada dalam jangkauan RFID.

Produk pemasak nasi pintar lain keluaran Xiaomi [5] mampu mengenali lebih

dari 200 merek beras dan 2.450 kombinasi metode memasak. Dengan memindai

barcode yang ada pada kemasan beras melalui aplikasi yang ada pada ponsel pintar,

pemasak nasi pintar ini mampu mengetahui bagaimana cara paling tepat memasak

beras berdasarkan jenis beras, merek, asal, dan preferensi kelunakan nasi.

Masing-masing produk pemasak nasi pintar tersebut memiliki kelebihan dan

kekurangannya masing-masing. Kekurangan yang dimiliki oleh pemasak nasi

pintar yang sudah ada di atas adalah tidak adanya fitur otomatisasi untuk menakar

dan mencuci beras. Proses menakar dan mencuci cukup menyita waktu, sehingga

peneliti memiliki ide lagi untuk menambahkan fitur otomatisasi pada pemasak nasi

pintar yang dibuat.

Produk pemasak nasi pintar Panasonic SR-SX102 dapat dikendalikan

menggunakan smartphone, namun dalam jarak yang terbatas. Sementara, produk

pemasak nasi pintar keluaran Xiaomi dapat dikendalikan darimana saja. Melihat

kelebihan yang dimiliki pemasak nasi pintar Xiaomi ini, maka peneliti memiliki ide

untuk menambahkan fitur pada pemasak nasi yang akan dibuat agar dapat

dikendalikan darimana saja.

Salah satu konsep teknologi yang dapat mewujudkan fitur tersebut adalah

konsep Internet of Things. Konsep ini secara sederhana merupakan konsep jaringan

3

yang pada dasarnya menghubungkan berbagai benda ke internet dan

memungkinkan mereka untuk saling bertukar informasi dengan sesama benda,

aplikasi, maupun manusia. Salah satu penerapan Internet of Things adalah pada

peralatan di rumah atau yang biasa disebut smart home/home automation. Beberapa

peralatan smart home sudah dijual di pasaran, seperti lampu, thermostat, sistem

keamanan rumah, penyiram tanaman otomatis [6] , meteran pintar [7], mesin kopi

pintar [8] dan masih banyak lagi. Peralatan tersebut dapat memberikan informasi

dari bacaan sensor kepada pemilik melalui aplikasi ponsel pintar dan pemilik dapat

memberikan perintah melalui aplikasi yang sama.

Beberapa komponen utama diperlukan untuk mewujudkan fitur-fitur tersebut,

seperti sistem otomatisasi untuk menakar, mencuci dan memasak beras, sistem dan

protokol komunikasi antara pemasak nasi pintar dengan perangkat pengendali jarak

jauh berupa smartphone Android, dan server.

Peneliti menggunakan protokol komunikasi Wi-Fi dan protokol pertukaran

pesan MQTT untuk membangun sistem dan protokol komunikasi antara pemasak

nasi pintar dengan perangkat pengendali jarak jauh. Wi-Fi merupakan salah satu

teknologi jaringan nirkabel yang menggunakan gelombang radio untuk

menyediakan koneksi jaringan dan koneksi internet nirkabel berkecepatan tinggi

[9]. Protokol Wi-Fi dipilih karena ketersediaan Wi-Fi yang hampir pasti ada pada

setiap rumah yang memiliki koneksi internet dan tidak perlu menggunakan kabel

tambahan untuk membuat koneksi. Pada tahun 2018 diprediksi akan ada 21 juta

perangkat yang memiliki Wi-Fi yang dipasarkan secara global [10].

4

MQTT merupakan sebuah protokol pertukaran pesan dengan model

publish/subscribe yang ringan, penggunaan bandwidth rendah, dan bersifat open

source [11]. Prinsip desain MQTT yang meminimalkan bandwidth jaringan dan

kebutuhan resource perangkat namun tetap menjamin keandalan dan adanya

beberapa tingkat jaminan tersampaikannya sebuah pesan [12] membuat protokol ini

ideal untuk diaplikasikan pada komunikasi machine-to-machine (M2M) atau

Internet of Things dan untuk aplikasi mobile dimana bandwidth dan kapasitas

baterai terbatas, sehingga dipilihlah protokol ini untuk digunakan pada penelitian

ini. Seluruh pertukaran data pada sistem ini menggunakan format data JSON untuk

memudahkan penyimpanan, pertukaran, dan pengolahan data.

Berdasarkan uraian di atas, maka pada penelitian ini akan dibuat sebuah rice

cooker yang dapat dikendalikan dari jarak jauh melalui protokol komunikasi Wi-Fi

dan protokol pertukaran pesan MQTT dengan pengendali berupa aplikasi Android.

1.2 Rumusan Masalah

Berdasarkan latar belakang di atas, dapat dirumuskan sebuah masalah, yaitu

bagaimana mewujudkan sebuah sebuah sistem pemasak nasi yang otomatis,

sehingga pengguna tidak perlu repot menakar dan mencuci beras terlebih dahulu

dan dapat memasak nasi dari mana saja, serta mampu memberikan informasi stok

beras kepada pengguna.

1.3 Batasan Masalah

Beberapa batasan masalah pada penelitian ini antara lain:

1) Sistem berjalan dengan asumsi kondisi ideal (tidak terjadi power dan

network failure);

5

2) Mekanisme pencucian beras secara otomatis dilakukan dengan

menyemprotkan air menggunakan pompa baterai untuk membersihkan

beras dari residu proses pasca-panen. Namun, sistem tidak dapat

membersihkan secara otomatis kerikil atau residu lain yang ukurannya agak

besar;

3) Tutup pemasak nasi dikondisikan selalu terbuka sebelum proses memasak

dimulai dan akan ditutup secara otomatis;

4) Pembaruan stok beras dan air menggunakan perhitungan saja tanpa sensor

pengukur tambahan, dan jumlah pengisian stok dimasukkan melalui

aplikasi dengan konfirmasi berdasarkan kondisi terbuka atau tidaknya tutup

pada tempat penyimpanan beras (memanfaatkan limit switch);

5) Notifikasi selesai memasak berdasarkan estimasi data waktu memasak nasi

yang dicantumkan pada petunjuk penggunaan rice cooker;

6) Keamanan komunikasi pada sistem ini berupa enkripsi koneksi

menggunakan OpenSSL dan otentikasi serta otorisasi ketika client

melakukan koneksi;

7) Tidak dilakukan analisis keamanan sistem yang mendalam;

8) Tidak dilakukan analisis perbandingan protokol Wi-Fi dan MQTT dengan

protokol lain;

1.4 Tujuan Penelitian

Tujuan penelitian ini berdasarkan rumusan dan batasan masalah yang telah

diuraikan sebelumnya adalah:

1) Merancang dan mengembangkan suatu sistem otomatisasi Smart Rice

Cooker yang mampu menakar, mencuci, dan memasak beras;

6

2) Merancang dan mengembangkan Smart Rice Cooker yang mampu

berkomunikasi menggunakan protokol komunikasi Wi-Fi dan protokol

pertukaran pesan MQTT;

3) Merancang dan mengembangkan server yang mampu mengatur pertukaran

data antara ponsel pintar Android dan perangkat pintar melalui protokol

pertukaran pesan MQTT;

4) Merancang dan mengembangkan basis data MySQL yang dapat diakses

oleh server, sehingga data dapat disimpan dan digunakan untuk otentikasi,

otorisasi, logging dan keperluan lainnya.

1.5 Manfaat Penelitian

Dengan sistem otomatisasi Smart Rice Cooker ini diharapkan dapat membantu

dalam pembuatan nasi atau bubur secara otomatis, dimana pengguna hanya perlu

memasukkan parameter takaran beras dan air yang diinginkan, mode memasak

(nasi atau bubur), dan kapan akan dimasak pada aplikasi Android. Selain itu

pengguna juga dapat melihat sisa stok beras dan air, sehingga diharapkan dapat

membantu mengatasi masalah kehabisan stok beras.

Aplikasi server dan sistem otomatisasi yang dihasilkan dari penelitian ini juga

diharapkan dapat digunakan untuk pengembangan penerapan konsep Internet of

Things pada perangkat pintar lainnya.

7

1.6 Sistematika Penulisan

Laporan skripsi ini terdiri atas 5 bab, yaitu:

1) Bab I : Merupakan bab pendahuluan yang terdiri atas latar

belakang masalah, rumusan masalah, batasan masalah, tujuan penelitian,

manfaat penelitian, dan sistematika penulisan.

2) Bab II : Merupakan bab tinjauan pustaka yang membahas tentang

Smart rice cooker, berbagai perangkat keras (pengendali mikro, sensor, dan

aktuator) dan perangkat lunak (MQTT, Node.js, JSON, dan Android) yang

digunakan dalam penelitian ini.

3) Bab III : Merupakan bab analisis dan pernacangan sistem yang

membahas tentang spesifikasi alat, rancangan sistem secara umum,

rancangan perangkat keras dan rancangan perangkat lunak yang digunakan

dalam penelitian ini.

4) Bab IV : Merupakan bab implementasi dan pengujian sistem yang

membahas tentang hasil implementasi dan pengujian sistem.

5) Bab V : Merupakan bab penutup yang membahas tentang

kesimpulan dan saran berdasarkan hasil penelitian.

8

BAB II

TINJAUAN PUSTAKA

2.1 Smart Rice Cooker

Smart device merupakan perangkat elektronik yang mampu terhubung, berbagi,

dan berinteraksi dengan penggunanya dan dengan smart device lainnya [13]. Smart

rice cooker merupakan salah satu contoh smart device yang memungkinkan sebuah

pemasak nasi mampu berkomunkasi dengan perangkat elektronik lain, misalnya

smartphone milik pengguna. Dengan demikian, pengguna dapat berinteraksi

dengan pemasak nasinya, misalnya untuk mengirimkan perintah memasak,

menerima laporan kondisi perangkat, mengakses resep secara online, dan lain

sebagainya. Saat ini terdapat beberapa pemasak nasi pintar yang ada / akan ada di

pasaran dengan berbagai fitur dan merek yang berbeda.

Gambar 2.1 menunjukkan Panasonic SR-SX102 yang merupakan salah satu

pemasak nasi pintar yang sudah dijual di pasaran. Pemasak nasi pintar ini dapat

dikendalikan melalui smartphone yang mendukung FeliCa, sebuah teknologi

contactless RFID yang dikembangkan oleh Sony Corp [4]. Untuk dapat

mengendalikan pemasak nasi tersebut melalui aplikasi pada ponsel, pengguna harus

mendekatkan ponsel ke area yang sudah disediakan di pemasak nasi. Selain itu,

pengguna dapat memasak berdasarkan resep (hingga 100 resep) yang tersedia di

Panasonic Cooking cloud server yang dapat diakses melalui aplikasi.

9

Gambar 2. 1 Panasonic SR-SX102 [14]

Pemasak nasi pintar lain yang akan dijual di pasaran adalah pemasak nasi pintar

keluaran Xiaomi yang diberi nama Mi Induction Heating Pressure Rice Cooker [15]

yang dapat dilihat pada gambar 2.2. Pemasak nasi pintar ini dapat terhubung dengan

ponsel pintar melalui aplikasi khusus. Pengguna dapat memindai barcode yang ada

pada kemasan beras mereka, sehingga perangkat dapat menentukan cara terbaik

memasak nasi berdasarkan merek, tipe, dan asal beras. Saat ini, aplikasi tersebut

dapat mengidentifikasi 200 merek beras dan akan terus bertambah [16].

Gambar 2. 2 Xiaomi Mi Induction Heating Pressure Rice Cooker [17]

Kedua pemasak nasi pintar di atas memiliki kelebihan dan kekurangan masing-

masing. Kekurangan yang ditemui adalah tidak adanya fitur otomatisasi untuk

menakar dan mencuci beras. Dari kekurangan inilah, peneliti merancang sebuah

pemasak nasi pintar yang dilengkapi dengan fitur otomatisasi dan dapat

dikendalikan melalui ponsel Android yang telah terpasang aplikasi ApplianceHub

[18].

10

Pengguna hanya perlu memilih perbandingan takaran beras dan air yang telah

disediakan oleh aplikasi yang ditentukan berdasarkan informasi dari beberapa

sumber [19] [20] [21]. Selanjutnya, pengguna perlu menentukan berapa banyak

beras yang akan dimasak dan aplikasi akan menyesuaikan jumlah air sesuai dengan

pilihan takaran pengguna, serta menentukan kapan waktu memasak (memasak

sekarang atau memilih jam). Setelah proses pengaturan selesai dan telah

dikonfirmasi, sistem akan secara otomatis menakar dan mencuci beras sesuai

dengan pilihan pengguna. Takaran yang disediakan oleh aplikasi dapat dilihat pada

tabel 2.1 dan tabel 2.2.

Tabel 2. 1 Tabel Pilihan Perbandingan Beras dan Air Untuk Memasak Nasi

Pilihan Beras Air

Thick 1 1

Medium 1 1,5

Thin 1 2

Tabel 2. 2 Tabel Pilihan Perbandingan Beras dan Air Untuk Memasak Bubur

Pilihan Beras Air

Thick 1 3

Medium 1 5

Thin 1 7

2.2 Papan Pengendali Mikro Arduino Uno

Arduino Uno yang dapat dilihat pada gambar 2.3 adalah sebuah papan

pengendali mikro yang berbasis ATmega328P dan merupakan perangkat keras

yang open-source. Papan ini memiliki 14 buah pin masukkan dan keluaran digital

(6 di antaranya dapat digunakan sebgai keluaran PWM), 6 buah pin masukkan

11

analog, sebuah kristal kuarsa, sebuah koneksi USB, sebuah lubang listrik, sebuah

header ICSP, dan sebuah tombol reset [22].

Gambar 2. 3 Arduino Uno [23]

Semua kelengkapan tersebut sudah cukup untuk mendukung pengoperasian

pengendali mikro ATmega328P, sehingga papan ini hanya perlu dihubungkan ke

komputer menggunakan kabel USB untuk dapat dinyalakan dan diprogram atau

dapat juga dinyalakan menggunakan AC-DC adaptor atau baterai. Spesifikasi

teknis dari pengendali mikro Arduino Uno dapat dilihat pada gambar 2.4.

Gambar 2. 4 Spesifikasi Teknis Papan Pengendali Mikro Arduino Uno [22]

12

Konfigurasi dan fungsi dari pin-pin yang ada pada pengendali mikro

ATmega328 dapat dilihat pada gambar 2.5.

Gambar 2. 5 Konfigurasi Pin ATmega1328 [23]

2.3 Modul Wi-Fi ESP8266

ESP8266 adalah sebuah modul SoC (System on Chip) Wi-Fi to Serial yang low

cost, dan memiliki performa yang tinggi. Modul ini merupakan bagian dari bagian

dari Smart Connectivity Platform milik Espressif System yang bertujuan untuk

memfasilitasi desainer platform mobile untuk membuat inovasi sistem dengan

kemampuan Wi-Fi tertanam dengan biaya yang murah dengan fungsionalitas yang

tinggi [24].

Saat ini, terdapat beberapa development kit yang berbasis ESP8266 ini, salah

satu contohya adalah NodeMCU development kit (dapat dilihat pada gambar 2.6)

yang digunakan pada penelitian ini. NodeMCU sendiri juga merupakan sebuah

firmware berbasis eLua untuk ESP8266 yang dikembangkan sebagai pendamping

13

development kit tersebut. Pemrograman pada NodeMCU mirip dengan Node.js,

yaitu bersifat asynchronous dan event-driven, namun dalam bahasa scripting Lua

[25]. Banyak fungsi pada NodeMCU yang memiliki parameter untuk fungsi

callback [26]. NodeMCU firmware sendiri memiliki berbagai macam modul yang

dapat di-custom sesuai kebutuhan.

Gambar 2. 6 NodeMCU Development Kit Berbasis Modul Wi-Fi ESP8266 [27]

2.4 Motor Servo

Motor servo merupakan salah satu jenis motor yang di dalamnya terdiri atas

sebuah motor DC kecil, potensiometer, dan rangkaian kontrol. Motor tersebut

terhubung dengan gir-gir ke sirkuit kontrol. Ketika motor berputar, nilai hambatan

pada potensiometer berubah, sehingga sirkuit kontrol dapat mengatur seberapa

banyak pergerakan motor dan arahnya. Motor servo dikendalikan dengan

mengirimkan pulsa listrik dengan lebar yang bervariasi atau pulse width modulation

(PWM) melalui kabel kontrol. PWM yang dikirimkan ke motor menentukan posisi

shaft dari servo [28].

Pada penelitian ini, motor servo yang digunakan adalah motor servo MG995

(dapat dilihat pada gambar 2.7) dengan spesifikasi sebagai berikut [29]:

1) Berat : 55 gram

2) Torsi : 9,4 kg/cm (4,8V); 11 kg/cm (6V)

3) Kecepatan : 0,2 s/60o (4,8V); 0,16 s/60o (4,8V);

14

4) Tegangan Kerja : 4,8 – 6,6 V

5) Tipe Gir : Gir metal

6) Temperatur Kerja : 0-55 oC

Gambar 2. 7 Motor Servo MG995 [30]

2.5 Real Time Clock

IC Real Time Clock (RTC) merupakan sebuah integrated circuit (IC) yang

berfungsi untuk mengukur/menyimpan nilai waktu, walaupun sumber daya listrik

dari perangkat utama mati. Selama waktu ini, IC RTC menggunakan tenaga listrik

dari sumber daya cadangan, misalnya baterai [31].

Gambar 2. 8 RTC DS3231 [32]

Pada penelitian ini, peneliti menggunakan RTC DS3231 (dapat dilihat pada

gambar 2.8) sebagai penentu waktu untuk pencatatan data kapan sebuah perintah

diterima oleh smart rice cooker dan kapan sebuah perintah selesai dieksekusi serta

untuk penjadwalan perintah memasak.

15

2.6 Sensor Aliran Air YF-S201

Sensor aliran air merupakan sensor untuk mengukur aliran air yang melewati

sensor. Sensor Aliran Air YF-S201 merupakan sensor aliran air yang digunakan

pada penelitian ini (dapat dilihat pada gambar 2.9) dan memanfaatkan perputaran

kincir akibat aliran air. Kincir telah terpasang magnet kecil yang mengakibatkan

efek Hall pada sensor magnetik pada sisi lain dari tabung plastik sehingga sensor

magnetik dapat mengukur jumlah putaran kincir [33].

Gambar 2. 9 Sensor Aliran Air YF-S201 [33]

Berikut merupakan spesifikasi teknis dari sensor aliran air YF-S201 yang

digunakan pada penelitian ini [33]:

1) Tegangan kerja : 5 s.d. 18V DC

2) Maksimum : 15mA pada tegangan 5V

3) Tipe output : 5V TTL

4) Working flow rate : 1 s.d. 30 Liters/Minute

5) Rentang temperatur kerja : -25 s.d. +80℃

6) Rentang kelembapan kerja : 35%-80% RH

7) Akurasi : ±10%

8) Tekanan air maksimum : 2.0 MPa

16

9) Karakteristik pulsa : Frekuensi (Hz) = Faktor Pengali (7.5) *

debit air (L/min)

10) Jumlah pulsa per liter : 450

11) Diameter luar : 0.78 inci

12) Ukuran koneksi pipa : 0.5 inci

13) Kabel merah untuk masukkan tegangan.

14) Kabel hitam untuk masukkan ground.

15) Kabel kuning untuk keluaran PWM.

Nilai karakteristik pulsa dapat bervariasi tergantung dari debit air, tekanan air,

dan orientasi sensor, sehingga dibutuhkan nilai kalibrasi yang berbeda [33].

Berdasarkan karakteristik pulsa tersebut, maka dapat dihitung volume air yang

keluar dengan melakukan substitusi karakteristik pulsa tersebut ke rumus berikut.

Keterangan:

V : Volume air yang keluar (dalam L)

t : Waktu (dalam s)

Q : Debit air (dalam L/min)

Sehingga menghasilkan rumus berikut.

Keterangan:

V : Volume air yang keluar (dalam L)

Pulses : Jumlah pulsa yang tercatat

Calibration Factor : Faktor kalibrasi/faktir pengali

𝑉 = 𝑄 ∗ (𝑡

60)

𝑉 = 𝑃𝑢𝑙𝑠𝑒𝑠 / (𝐶𝑎𝑙𝑖𝑏𝑟𝑎𝑡𝑖𝑜𝑛 𝑓𝑎𝑐𝑡𝑜𝑟 ∗ 60)

17

2.7 Relay Switch

Relay adalah saklar mekanik yang dioperasikan secara listrik dan merupakan

komponen elektromekanikal yang terdiri atas 2 bagian utama yakni elektromagnet

(coil) dan mekanik (seperangkat kontak saklar) [34]. Relay menggunakan prinsip

elektromagnetik untuk menggerakan kontak saklar sehingga dengan arus listrik

yang kecil dapat menghantarkan listrik yang bertegangan lebih besar. Jenis dan

simbol relay dapat dilihat pada gambar 2.10.

Gambar 2. 10 Jenis-Jenis Relay dan simbolnya [34]

Berdasarkan gambar 2.11, sebuah inti besi dililit oleh sebuah kumparan yang

berfungsi untuk mengendalikan besi tersebut. Apabila kumparan diberikan arus

listrik, maka akan timbul gaya elektromagnet yang kemudian menarik armature

untuk berpindah posisi menjadi open atau close tergantung jenis kontak poin relay.

Gambar 2. 11 Struktur Relay [34]

18

Kontak poin relay terdiri dari 2 jenis:

1) Normally Open

Pada relay ini, ketika tidak ada arus listrik yang mengalir pada kumparan

maka saklar akan berada pada posisi open. Ketika kumparan diberi arus listrik,

barulah saklar akan berada pada posisi close.

2) Normally Close

Pada relay ini, ketika tidak ada arus listrik yang mengalir pada kumparan

maka saklar akan berada pada posisi close. Ketika kumparan diberi arus listrik,

barulah saklar akan berada pada posisi open.

Berdasarkan jumlah pole (kontak) dan throw (kondisi sebuah kontak) pada

sebuah relay (dapat dilihat pada gambar 2.12), relay dapat digolongkan menjadi

beberapa jenis yang umum digunakan:

1) Single Pole Single Throw (SPST)

2) Single Pole Double Throw (SPDT)

3) Double Pole Single Throw (DPST)

4) Double Pole Double Throw (DPDT)

Gambar 2. 12 Jenis Relay Berdasarkan Pole dan Throw [34]

19

2.8 MQTT

MQTT merupakan sebuah protokol pertukaran pesan dengan model

publish/subscribe yang sederhana dan ringan serta didesain untuk perangkat yang

memiliki kemampuan terbatas dan bandwidth yang kecil, latency tinggi, atau

jaringan yang tidak andal. Prinsip desain MQTT adalah untuk meminimalisasi

bandwidth jaringan dan kebutuhan resource perangkat dan tetap menjamin

keandalan dan beberapa tingkat jaminan tersampaikannya sebuah pesan. Prinsip

inilah yang membuat protokol ini ideal untuk diaplikasikan pada komunikasi

machine-to-machine (M2M) atau Internet of Things dan untuk aplikasi mobile

dimana bandwidth dan kapasitas baterai terbatas [12].

Sejak 29 Oktober 2014, MQTT telah distandarisasi oleh Organization for the

Advancement of Structured Information Standards (OASIS) [35]. Spesifikasi

protokol MQTT telah dipublikasikan secara terbuka dengan lisensi open-source.

Pertukaran pesan dengan model publish/subscribe pada MQTT merupakan

alternatif dari model client-server, dimana sebuah client (publisher/subscriber)

berkomunikasi langsung dengan sebuah endpoint lainnya pada sebuah topik melalui

sebuah broker yang bertugas melakukan penyaringan pesan dan

mendistribusikannya.

Terdapat beberapa alur pesan umum pada MQTT [36]:

1) Alur pesan ketika client melakukan koneksi ke broker.

Sebuah client melakukan koneksi ke broker dengan mengirimkan

sebuah pesan CONNECT dan broker akan merespon dengan sebuah pesan

CONNACK. Ketika sebuah client terhubung akan terbentuk sebuah session

20

dan dapat melakukan subscribe ke 1 atau lebih topik untuk menerima pesan.

Pesan CONNECT memiliki parameter clean session yang dapat bernilai 1

(true) atau 0 (false). Jika bernilai 1, maka ketika client terputus, semua

subscribe yang dilakukan client akan di-unsubscribe oleh broker.

Sementara jika bernilai 0, ketika client terputus dan terhubung kembali,

semua subscribe pada session sebelumnya akan ter-subscribe secara

otomatis (broker tidak melakukan unsubscribe). Alur dapat dilihat pada

gambar 2.13 dan 2.14.

Gambar 2. 13 Alur pesan CONNECT dengan clean session [36]

Gambar 2. 14 Alur pesan CONNECT tanpa clean session [36]

21

2) Alur pesan ketika client melakukan subscribe ke sebuah topik dan ketika

sebuah pesan tiba.

Sebuah client melakukan subscription ke sebuah topik dengan

mengirimkan sebuah pesan SUBSCRIBE dan broker akan merespon

dengan sebuah pesan SUBSCRIBEACK. Ketika sebuah client sudah ter-

subscribe pada sebuah topik, maka client dapat menerima semua pesan yang

di-publish pada topik tersebut sampai client melakukan unsubscribe dengan

mengirimkan pesan UNSUBSCRIBE ke broker dan menerima pesan

UNSUBACK. Alur dapat dilihat pada gambar 2.15

Gambar 2. 15 Alur pesan SUBSCRIBE and UNSUBSCRIBE untuk sebuah topik

[36]

3) Alur pesan ketika client melakukan publish ke sebuah topik dengan 3

tingkat QoS.

Sebuah client dapat mem-publish sebuah pesan pada sebuah topik

dengan menggunakan salah satu dari 3 tingkat QoS. Pada QoS 0, pesan

terkirim paling banyak sekali atau tidak terkirim sama sekali. Pesan

22

dinyatakan telah terkirim jika pesan telah sampai pada broker dan broker

akan meneruskannya ke semua subscriber pada topik tersebut. Client yang

melakukan publish tidak menunggu acknowledge dari broker dan tidak

menyimpan pesan. Alur untuk QoS 0 dapat dilihat pada gambar 2.16.

Gambar 2. 16 Alur pesan PUBLISH dengan QoS 0 (At most once) [36]

Pada QoS 1, pesan selalu terkirim paling sedikit sekali. Ketika client

mem-publish pesan, maka client dan broker menyimpannya secara lokal.

Pesan yang tersimpan pada broker akan disimpan sampai selesai diproses

dan broker akan mengirimkan pesan PUBACK setelahnya. Sementara,

pesan yang tersimpan pada sisi client akan disimpan sampai menerima

pesan PUBACK dari broker. Jika client tidak kunjung menerima pesan

PUBACK, client akan mengirimkan kembali pesan tersebut, sehingga pesan

yang sama dapat terkirim beberapa kali. Alur untuk QoS 1 dapat dilihat pada

gambar 2.17.

Gambar 2. 17 Alur pesan PUBLISH dengan QoS 1 (At least once) [36]

23

Pada QoS 2, pesan selalu terkirim tepat sekali. Sama seperti QoS 1,

ketika client mem-publish sebuah pesan maka akan disimpan secara lokal

oleh client itu sendiri dan broker. Untuk menandakan pesan telah disimpan,

broker akan mengirimkan pesan PUBREC kepada client yang mengirimkan

pesan tersebut. Jika client tidak kunjung menerima PUBREC, maka pesan

akan dikirimkan kembali. Client akan membalas dengan pesan PUBREL

untuk menyatakan bahwa pesan yang tersimpan sudah boleh dihapus.

Setelah broker menerima pesan PUBREL, maka broker akan menghapus

pesan yang tersimpan dan membalas lagi dengan pesan PUBCOMP. Jika

client yang mengirimkan pesan PUBREL tidak kunjung menerima pesan

PUBCOMP, maka pesan PUBREL akan dikirimkan kembali. Alur untuk

QoS 2 dapat dilihat pada gambar 2.18.

Gambar 2. 18 Alur pesan PUBLISH dengan QoS 2 (Exactly once) [36]

4) Alur pesan untuk keepalive antara client dan broker.

Ketika client tidak mengirimkan pesan dalam waktu tertentu, koneksi

perlu dijaga agar tetap terhubung dengan client mengirimkan pesan

PINGREQ ke broker setiap periode waktu tertentu sesuai dengan yang

sudah ditentukan sebelumnya. Broker akan membalas pesan PINGREQ

24

dengan pesan PINGRESP. Alur untuk keepalive connection dapat dilihat

pada gambar 2.19.

Gambar 2. 19 Alur pesan ping untuk keepalive [36]

5) Alur pesan untuk menutup koneksi.

Untuk menutup koneksi, client hanya perlu mengirimkan pesan

DISCONNECT kepada broker tanpa pesan ada balasan. Alur untuk

pemutusan koneksi dapat dilihat pada gambar 2.20.

Gambar 2. 20 Alur pesan DISCONNECT untuk memutuskan koneksi [36]

6) Alur pesan untuk pesan last will testament dari client yang terputus karena

bermasalah.

Pesan last will testament merupakan fitur yang ditawarkan oleh protokol

MQTT, sehingga sebuah client dapat menentukan pesan apa yang akan

dikirimkan ke topik yang telah ditentukan ketika client tersebut terputus

25

tanpa mengirimkan pesan DISCONNECT. Pesan ini ditentukan ketika

client melakukan koneksi ke broker. Alur untuk pesan ini dapat dilihat pada

gambar 2.21.

Gambar 2. 21 Alur pesan “will” [36]

Keamanan pada MQTT dapat dibagi dalam beberapa lapisan, seperti lapisan

network, transport, dan aplikasi [37]. Untuk mengamankan koneksi MQTT pada

lapisan network dilakukan dengan menggunakan jaringan yang aman secara fisik.

Enkripsi data menggunakan TLS/SSL mengamankan koneksi MQTT pada lapisan

network. Otentikasi dan otorisasi dapat diterapkan untuk mengamankan koneksi

MQTT pada lapisan aplikasi.

2.9 Node.js

Node.js adalah sebuah sebuah JavaScript runtime environment yang open-

source dan cross-platform untuk mengembangkan aplikasi web pada sisi server.

Runtime ini dibangun pada V8 JavaScript engine milik Chrome. Node.js

menggunakan sebuah event-driven, non-blocking I/O sehingga membuatnya ringan

dan efisien. Ekosistem paket Node.js, npm, adalah ekosistem open source library

terbesar di dunia [38].

Node.js mampu menangani banyak koneksi yang serentak [39]. Setiap ada

koneksi, sebuah callback dijalankan, namun ketika tidak ada proses yang harus

26

dikerjakan, maka Node.js akan masuk dalam mode sleep. Hampir tidak ada fungsi

pada Node.js yang melakukan I/O secara langsung (asynchronous), sehingga tidak

perlu khawatir akan proses yang dead-lock [39]. Desain Node.js yang event-driven

dan mampu melakukan asynchronous I/O mengoptimalkan throughput dan

scalability pada sebuah aplikasi web dengan banyak operasi I/O dan juga untuk

aplikasi web yang real-time [40].

Node.js terbagi menjadi 2 komponen utama, yaitu core dan modul-modul

lainnya. Core pada Node.js menggabungkan V8 JavaScript engine milik Google

dengan Libuv library milik Node dan protocol binding, termasuk socket dan HTTP.

V8 JavaScript engine bertugas untuk men-compile JavaScript ke kode assembly,

sehingga siap untuk dieksekusi, sementara Libuv bertanggung jawab untuk operasi

asynchronous I/O dan event loop utama. Libuv tersusun atas thread pool dengan

ukuran yang tetap, dimana sebuah thread dialokasikan untuk setiap operasi I/O,

sehingga V8 engine dan komponen Node.js yang lain dapat melanjutkan untuk

memproses permintaan lain [41].

Gambar 2. 22 Struktur Internal Node.js [41]

Gambar 2.22 menunjukkan struktur internal Node.js. Program utama yang

single thread menangani semua permintaan yang datang secara bersamaan. Semua

27

komponen adalah single thread, berjalan secara asynchronous dan mampu

berinteraksi dengan komponen lain [41].

Gambar 2. 23 Cara Kerja Event Loop Node.js [41]

Gambar 2.23 menunjukkan cara kerja event loop pada Node.js. Aplikasi utama

Node.js mengirimkan tugas/fungsi beserta callback ke event loop untuk diproses.

Event loop akan menugaskan 1 thread untuk memproses 1 tugas dan jika tugas telah

selesai, maka thread akan mengembalikan nilai hasil ke event loop dan event loop

akan meneruskan hasil tersebut ke aplikasi utama Node.js melalui sebuah callback

yang dikirim bersamaan dengan tugas tersebut.

Server pada penelitian ini berbasis Node.js dengan menggunakan tambahan

modul mosca [42] yang bertugas sebagai broker koneksi MQTT dan modul mysql

[43] yang bertugas untuk menangani komunikasi dengan basis data.

2.10 JSON

JSON (JavaScript Object Notation) adalah sebuah format pertukaran data

dalam bentuk teks yang ringan, tidak terbatas pada bahasa pemrograman tertentu,

mudah bagi manusia untuk membaca dan menulisnya, dan mudah juga bagi mesin

28

untuk mengurai dan men-generate JSON. Fitur-fitur inilah yang membuat JSON

menjadi bahasa pertukaran data yang ideal [44].

JSON terdiri atas 2 struktur, yaitu sekumpulan pasangan name dan value (dalam

berbagai bahasa pemrograman dikenal sebagai object/record/struct/dictionary/

hash table/keyed list/associative array) dan daftar nilai yang terurut (dalam

berbagai bahasa pemrograman dikenal sebagai array/vector/list/sequence).

Sebuah object pada JSON merupakan sekumpulan name dan value yang tidak

terurut. Sebuah object dimulai dengan tanda kurung kurawal kiri ({) dan diakhiri

dengan tanda kurung kurawal kanan (}). Setiap name diikuti dengan tanda titik dua

(:) dan setiap pasangan name dan value dipisahkan dengan tanda koma (,). Struktur

object pada JSON dapat dilihat lebih jelas pada gambar 2.24.

Gambar 2. 24 Struktur object pada JSON [44]

Sebuah array pada JSON merupakan sekumpulan value yang yang terurut.

Sebuah array dimulai dengan tanda kurung siku kiri ([) dan diakhiri dengan tanda

kurung siku kanan (]). Setiap value dipisahkan dengan tanda koma (,). Struktur

array pada JSON dapat dilihat lebih jelas pada gambar 2.25.

Gambar 2. 25 Struktur array pada JSON [44]

29

Sebuah value pada JSON dapat berupa sebuah string dengan diapit tanda kutip

(“), atau sebuah number, atau true/false/null, atau sebuah object, atau sebuah array.

Jenis-jenis value pada JSON dapat dilihat lebih jelas pada gambar 2.26.

Gambar 2. 26 Value pada JSON [44]

2.11 Android

Android merupakan sebuah sistem operasi yang dapat di-customize dan mudah

digunakan yang terpasang pada lebih dari jutaan perangkat di seluruh dunia, mulai

dari ponsel, tablet, jam tangan, TV, mobil dan akan lebih banyak lagi [45].

Pengembangan aplikasinya yang cukup mudah dan tidak terbatas pada lingkungan

pengembangan (Sistem Operasi) tertentu saja serta dominasi Android di pasar

global mencapai 84,1% pada kuartal pertama tahun 2016 [46] membuat Android

menjadi pilihan sebagai platform untuk mengembangkan aplikasi ApplianceHub

[18] yang berfungsi sebagai pengendali jarak jauh untuk perangkat pintar.

Agar Android dapat berkomunikasi dengan server berbasis protokol MQTT

yang dikembangkan peneliti, diperlukan sebuah service tambahan, yaitu

menggunakan Paho Android Service yang merupakan antarmuka dari Paho Java

MQTT Client untuk platform Android [18]. Service ini juga mendukung

penambahan opsi kemanan koneksi menggunakan SSL dengan menggunakan

sebuah file BouncyCastle keystore (BKS) [18].

30

BAB III

ANALISIS DAN PERANCANGAN SISTEM

3.1 Fitur dan Spesifikasi Smart Rice Cooker

Smart Rice Cooker yang dirancang memiliki fitur sebagai berikut.

1) Pengguna dapat mengakses smart rice cooker melalui smartphone

Android;

2) Smart rice cooker dapat memasak nasi atau bubur sesuai dengan takaran

dan jadwal yang diatur oleh pengguna;

3) Satu buah Smart rice cooker hanya dapat diakses oleh satu pengguna yang

terdaftar sebagai pemilik;

4) Memberikan notifikasi selesai memasak pada aplikasi;

5) Melakukan konfirmasi pembaruan stok beras dan air.

Smart Rice Cooker yang dirancang memiliki spesifikasi sebagai berikut.

1) Kapasitas maksimum tempat penyimpanan beras adalah 14 kg;

2) Kapasitas maksimum botol galon air adalah 5 liter;

3) Kapasitas maksimum pemasak nasi adalah 8 cup (sekitar 1,2 liter);

4) Mekanisme pencucian beras dilakukan dengan menyemprotkan air secara

terus-menerus pada beras yang telah dikeluarkan selama 20 detik dengan

debit air 3,5-4 L/menit menggunakan pompa air galon;

5) Pembaruan jumlah stok beras dan air berdasarkan perhitungan oleh sistem

tanpa menggunakan sensor pengukur tambahan;

31

6) Penentuan jumlah pengisian stok beras dan air dilakukan melalui

masukkan data pada aplikasi dengan konfirmasi dari perangkat pintar;

7) Pilihan memasak yang terdapat pada aplikasi berupa pilihan mode

memasak (nasi/bubur), pilihan perbandingan beras dan air (1:1, 1:1,5, dan

1:2 untuk mode memasak nasi. 1:3, 1:5, 1:7 untuk mode memasak bubur),

dan input jumlah beras;

8) Seluruh perangkat dan komponen penyusun sistem disusun pada sebuah

rak yang terdiri atas 3 bagian, yaitu:

a) Bagian atas dimana tempat penyimpanan beras, botol galon air, dan

pompa untuk mencuci diletakkan;

b) Bagian tengah dimana proses mencuci berlangsung dan tempat

meletakkan pengendali mikro, modul Wi-Fi, modul RTC, dan papan

rangkaian pendistribusi arus listrik;

c) Bagian bawah dimana pemasak nasi dan wadah penampung air

bekas cucian beras diletakkan.

3.2 Rancangan Sistem Keseluruhan

Diagram pada gambar 3.1 merupakan gambaran arsitektur sistem otomatisasi

Smart Rice Cooker secara keseluruhan. Arsitektur ini dikembangkan bersama

dengan dua penelitian pembuatan perangkat pintar lainnya [18] [25]. Smart Rice

Cooker pada sistem ini dirancang untuk dapat mengirim data berupa laporan

mengenai proses memasak (ketika mulai dan selesai), konfirmasi pembaruan stok,

dan permintaan jadwal memasak ke server. Selain mengirim data, perangkat pintar

ini juga dapat menerima data atau perintah dari server yang berasal dari aplikasi

Android berupa perintah memasak dan permintaan konfirmasi pembaruan stok.

32

Semua pertukaran data dikemas dalam format data JSON dengan protokol

pertukaran pesan MQTT yang terenkripsi menggunakan OpenSSL.

Server

Android Devices

MySQL Database

Node.js with modules:MoscaMySql

Smart Rice Cooker

MQTT with openSSL

MQTT openSSL

Wi-Fi access point

Internet Internet

Gambar 3. 1 Diagram Arsitektur Keseluruhan Sistem

Peran server dalam sistem ini adalah melakukan otentikasi dan otorisasi setiap

perangkat pintar maupun perangkat Android yang melakukan koneksi dan

mengatur lalu lintas data berdasarkan topik. Otentikasi dilakukan dengan

mencocokkan data username dan password yang dikirim perangkat untuk

melakukan koneksi dengan data username dan password yang tercatat pada basis

data. Otorisasi pada sistem ini berupa otorisasi topik yang boleh digunakan oleh

sebuah perangkat untuk melakukan publish dan subscribe data.

Aplikasi pada perangkat Android berfungsi sebagai pusat kendali perangkat-

perangkat pintar yang dimiliki oleh pengguna. Melalui aplikasi ini, pengguna yang

33

belum terdaftar dapat mendaftarkan diri terlebih dahulu dengan mengisi data-data

yang dibutuhkan dan kemudian disimpan dalam basis data. Jika proses pendaftaran

telah selesai, maka pengguna dapat melakukan log-in menggunakan data username

dan password yang telah didaftarkan sebelumnya. Setelah berhasil melakukan log-

in, pengguna dapat melakukan pendaftaran perangkat yang dimilikinya, mengakses

informasi terkait perangkat pintar yang dimiliki, memberikan perintah ke perangkat

pintar, dan dapat mengakses serta memperbarui informasi pengguna.

3.3 Rancangan Perangkat Keras

Komponen-komponen yang digunakan untuk membangun Smart Rice Cooker

akan disusun menjadi seperti rancangan pada gambar 3.2. dan terdiri atas:

1) Satu buah pengendali mikro ATmega328 dengan papan Arduino Uno R3;

2) Satu buah modul Wi-Fi ESP8266 yang berupa development board yang

telah terpasang firmware NodeMCU;

3) Satu buah modul RTC (real-time clock) DS3231 sebagai penentu waktu

pada sistem Smart Rice Cooker;

4) Empat buah motor servo MG995 yang masing-masing digunakan untuk:

a) Medorong dan menarik laci pada tempat penyimpanan beras

untuk menakar beras yang dikeluarkan (sekitar 150 gram);

b) Menggeser beras dari posisi cuci ke posisi penuangan ke

pemasak nasi;

c) Membuka dan menutup keran pada botol galon air untuk

mengalirkan air untuk memasak;

d) Menutup penutup pemasak nasi.

34

5) Satu buah sensor aliran air YF-S201 untuk menakar air yang dipakai untuk

memasak;

6) Tiga buah relay dalam bentuk papan modul untuk menyimulasikan

penekanan tombol “memasak”, tombol “tetap hangat”, dan tombol

“bubur”;

7) Satu buah limit switch untuk mengecek kondisi terbuka atau tidaknya

penutup tempat penyimpanan beras yang menjadi parameter konfirmasi

pembaruan data stok beras dan air pada basis data;

8) Satu buah pompa air galon untuk mencuci beras.

Rice BoxWater Gallon

Water Flow

Sensor

S ME OR TV OO R

Rice Cooker

Bucket to storeresidual water

Glass to store rice

Water Pump

Spot with tiny holes to drain

water

Spot with a glass sized hole to

dump rice

Servo Motor

Arduino Uno + ESP8266 +

RTC DS3231 + other

components

Servo Motor

Gambar 3. 2 Rancangan Bentuk Fisik Smart Rice Cooker

35

Arduino Uno R3

Water Flow Sensor YF-

S201

Limit switch

Wi-Fi Module ESP8266 with

NodeMCU Firmware

RTC DS3231

Servo Motor MG995

Servo Motor MG995

Servo Motor MG995

Servo Motor MG995

Relay Switch

Relay Switch

Relay Switch

Cook Button

Keep Warm Button

Porridge Button

Relay Switch Water Pump

Gambar 3. 3 Diagram Blok Perangkat Keras Smart Rice Cooker

Gambar 3.3 merupakan gambar diagram blok dari sistem otomatisasi pada

perangkat keras Smart Rice Cooker. Pengendali mikro Arduino Uno R3 terhubung

dengan modul Wi-Fi ESP8266 untuk dapat menerima perintah dan mengirim pesan

berupa pemanggilan fungsi atau pengiriman laporan ke server untuk diolah dan

diteruskan ke aplikasi Android.

Ketika menerima perintah untuk memasak, maka pengendali mikro akan

memerintahkan 4 buah motor servo MG995 untuk bergerak dan berhenti secara

bergantian sesuai dengan fungsinya masing-masing dan mengaktifkan salah satu

dari 3 buah saklar relai untuk menyimulasikan penekanan tombol sesuai mode

36

memasak pada pemasak nasi yang telah dimodifikasi dan 1 buah saklar relai untuk

menyalakan dan mematikan pompa air galon. Selain itu, pengendali mikro juga

menerima data bacaan sensor aliran air YF-S201 untuk menakar jumlah air yang

telah dikeluarkan agar sesuai dengan takaran yang diinginkan dan menerima data

bacaan dari limit switch untuk mengonfirmasi apakah sedang dilakukan pengisian

stok beras dan air. Sebagai penentu waktu untuk ditambahkan dalam laporan

perintah diterima dan perintah selesai dieksekusi, pengendali mikro mengambil

nilai waktu dari modul RTC DS3231.

3.4 Rancangan Perangkat Lunak

Rancangan perangkat lunak pada sistem ini dibagi dalam beberapa bagian, yaitu

rancangan protokol komunikasi, rancangan basis data, rancangan aplikasi server,

rancangan perangkat lunak Smart Rice Cooker, dan rancangan aplikasi Android.

3.4.1. Rancangan Protokol Komunikasi

Pertukaran pesan pada sistem ini dilakukan melalui protokol MQTT

yang telah dienkripsi menggunakan openSSL dan pesan diformat dalam JSON.

Terdapat 2 jenis pesan, yaitu pesan umum yang berisi pesan-pesan yang

berkaitan dengan pengaturan pengguna dan perangkat dan pesan khusus yang

berisi pesan-pesan yang berkaitan dengan perintah dan laporan eksekusi

perintah sesuai dengan kebutuhan masing-masing perangkat pintar (peneliti

juga membuat protokol untuk dua perangkat pintar lainnya, yaitu smart dog

feeder [18] dan smart medicine dispenser [25]).

37

A. Pesan Umum

Pesan umum yang dikenali oleh server adalah sebagai berikut.

1) Pesan “loginStatus”

Pesan ini berfungsi untuk mengirimkan balasan apakah sebuah

proses login valid atau tidak. Pesan ini dipublikasikan oleh server pada

topik “/general/<username>”. Spesifikasi pesan “loginStatus” dapat

dilihat pada tabel 3.1.

Tabel 3. 1 Tabel Spesifikasi Pesan "loginStatus"

Name Value Keterangan

msg loginStatus Identifikasi pesan.

status SUCCESS / FAIL Menyatakan apakah pengguna

berhasil didaftarkan atau tidak.

Contoh:

{

“msg” : “loginStatus”,

“status” : “SUCCESS”

}

2) Pesan “signup”

Pesan ini berfungsi untuk mendaftarkan pengguna baru. Pesan ini

dipublikasikan oleh Android pada topik “/signup/<username_baru>”.

Spesifikasi pesan “signup” dapat dilihat pada tabel 3.2.

Tabel 3. 2 Tabel Spesifikasi Pesan "signup"

Name Value Keterangan

msg signup Identifikasi pesan.

username <username> Username baru yang akan

didaftarkan.

password <password> Password dari username baru yang

akan didaftarkan dan di-hashing

SHA2-256.

fullname <fullname> Nama lengkap pengguna yang

akan didaftarkan.

38

email <email> Email pengguna yang akan

didaftarkan.

phone <phone_number> Nomor telepon pengguna yang

akan didaftarkan.

Contoh:

{

“msg” : “signup”,

“username” : “user1”,

“password” :

“0a041b9462caa4a31bac3567e0b6e6fd9100787db2ab433d96f6d178

cabfce90”,

“fullname” : “User One”,

“email” : “[email protected]”,

“phone” : “081818181818”

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.3.

Tabel 3. 3 Tabel Spesifikasi Pesan "signupStatus"

Name Value Keterangan

msg signupStatus Identifikasi pesan.

status SUCCESS / FAIL Menyatakan apakah pengguna

berhasil didaftarkan atau tidak.

Contoh:

{

“msg” : “signupStatus”,

“status” : “SUCCESS”

}

3) Pesan “getOwner”

Pesan ini berfungsi untuk mendapatkan username pemilik

perangkat pintar dari basis data. Pesan ini dipublikasikan oleh perangkat

pintar pada topik “/<id_perangkat>/<serial_number>”. Spesifikasi

pesan “getOwner” dapat dilihat pada tabel 3.4.

Tabel 3. 4 Tabel Spesifikasi Pesan "getOwner"

Name Value Keterangan

msg getOwner Identifikasi pesan.

39

applianceserial <applianceserial> Nomor serial perangkat pintar

yang didapat dari alamat MAC

perangkat pintar.

Contoh:

{

“msg” : “getOwner”,

“applianceserial” : “123456789012”

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.5.

Tabel 3. 5 Tabel Spesifikasi Pesan "owner"

Name Value Keterangan

msg owner Identifikasi pesan.

owner <username_pemilik> /

NOTFOUND

Berisi username pemilik perangkat

pintar tersebut. Mengembalikan

NOTFOUND jika tidak

ditemukan.

Contoh:

{

“msg” : “owner”,

“owner” : “user1”

}

4) Pesan “getMyAppliance”

Pesan ini berfungsi untuk mencari perangkat apa saja yang dimiliki

seorang pengguna. Pesan ini dipublikasikan oleh Android pada topik

“/general/<username>”. Spesifikasi pesan “getMyAppliance” dapat

dilihat pada tabel 3.6.

Tabel 3. 6 Tabel Spesifikasi Pesan "getMyAppliance"

Name Value Keterangan

msg getMyAppliance Identifikasi pesan.

owner <username_pemilik> Berisi username pemilik yang

menginginkan daftar perangkat yang

dimilikinya.

Contoh:

{

“msg” : “getMyAppliance”,

40

“owner” : “user1”

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.7.

Tabel 3. 7 Tabel Spesifikasi Pesan "myAppliance"

Name Value Keterangan

msg myAppliance Identifikasi pesan.

dat <array_appliance_detail> /

NOTFOUND

Berisi array JSON

object yang terdiri

atas applianceserial,

applianceid,

nickname, status.

Mengembalikan

NOTFOUND jika

tidak ditemukan.

applianceserial <applianceserial> Nomor serial

perangkat pintar

yang didapat dari

alamat MAC

perangkat pintar.

applianceid <applianceid> Jenis perangkat

pintar.

nickname <nickname> Nama perangkat

yang diberikan oleh

pemilik.

status ACTIVE / INACTIVE Status perangkat,

apakah aktif/tidak.

Contoh:

{

“msg” : “myAppliance”

“dat” : [

{

“applianceserial” : “123456789012”,

“applianceid" : “rck”,

“nickname” : “Kitchen Rice Cooker”,

“status” : “INACTIVE”

},

{

“applianceserial” : “210987654321”,

“applianceid" : “smd”,

“nickname” : “Grandma’s Pill Dispenser”,

“status” : “ACTIVE”

},

{

41

“applianceserial” : “789012345612”,

“applianceid" : “sdf”,

“nickname” : “Brownie’s Feeder”,

“status” : “ACTIVE”

}

]

}

5) Pesan “registerMyAppliance”

Pesan ini berfungsi untuk menandai perangkat pintar yang telah ada

di basis data sebagai milik pengguna. Pesan ini dipublikasikan oleh

Android pada topik “/general/<username>”. Spesifikasi pesan

“registerMyAppliance” dapat dilihat pada tabel 3.8.

Tabel 3. 8 Tabel Spesifikasi Pesan "registerMyAppliance"

Name Value Keterangan

msg registerMyAppliance Identifikasi pesan.

owner <username_pemilik> Berisi username pemilik

perangkat pintar tersebut.

applianceserial <applianceserial> Nomor serial perangkat

pintar yang didapat dari

alamat MAC perangkat

pintar.

Contoh:

{

“msg” : “registerMyAppliance”,

“owner” : “user1”,

“applianceserial” : “123456789012”

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.9.

Tabel 3. 9 Tabel Spesifikasi Pesan "registrationStatus"

Name Value Keterangan

msg registrationStatus Identifikasi pesan.

status SUCCESS /

FAIL

Menyatakan apakah pemilik perangkat

berhasil didaftarkan.

42

Contoh:

{

“msg” : “registrationStatus”,

“status” : “SUCCESS”

}

6) Pesan “unregisterMyAppliance”

Pesan ini berfungsi untuk me-reset pemilik perangkat pintar yang

telah ada di basis data. Pesan ini dipublikasikan oleh Android pada topik

“/general/<username>”. Spesifikasi pesan “unregisterMyAppliance”

dapat dilihat pada tabel 3.10.

Tabel 3. 10 Tabel Spesifikasi Pesan "unregisterMyAppliance"

Name Value Keterangan

msg unregisterMyAppliance Identifikasi pesan.

owner <username_pemilik> Berisi username pemilik

perangkat pintar tersebut.

password <password> Password yang di-

hashing SHA2-256.

applianceserial <applianceserial> Nomor serial perangkat

pintar yang didapat dari

alamat MAC perangkat

pintar.

Contoh:

{

“msg” : “unregisterMyAppliance”,

“owner” : “user1”,

“password” : “asfnsagbkjabfdlarfbealeafhlkndj”,

“applianceserial” : “123456789012”

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.11.

Tabel 3. 11 Tabel Spesifikasi Pesan "unregisterStatus"

Name Value Keterangan

msg unregisterStatus Identifikasi pesan.

43

status SUCCESS / FAIL Menyatakan apakah pemilik

perangkat berhasil

didaftarkan.

Contoh:

{

“msg” : “unregisterStatus”,

“status” : “SUCCESS”

}

7) Pesan “getProfile”

Pesan ini berfungsi untuk mengambil informasi profil pengguna.

Pesan ini dipublikasikan oleh Android pada topik

“/general/<username>”. Spesifikasi pesan “getProfile” dapat dilihat

pada tabel 3.12.

Tabel 3. 12 Tabel Spesifikasi Pesan "getProfile"

Name Value Keterangan

msg getProfile Identifikasi pesan.

username <username> Username yang telah terdaftar.

password <password> Password yang di-hashing SHA2-256.

Contoh:

{

“msg” : “getProfile”,

“username” : “user1”,

“password” :

“0a041b9462caa4a31bac3567e0b6e6fd9100787db2ab433d96f6d178

cabfce90”}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.13.

Tabel 3. 13 Tabel Spesifikasi Pesan "myProfile"

Name Value Keterangan

msg myProfile Identifikasi pesan.

username <username> /

NOTFOUND

Username yang telah terdaftar.

Mengembalikan nilai

NOTFOUND jika tidak

ditemukan.

fullname <fullname> Nama lengkap pengguna yang

terdaftar.

44

email <email> Email baru pengguna.

phone <phone_number> Nomor telepon pengguna

yang baru.

Contoh:

{

“msg” : “myProfile”,

“username” : “user1”,

“fullname” : “User One”,

“email” : “[email protected]”,

“phone” : “081616161616”

}

8) Pesan “updateProfile”

Pesan ini berfungsi untuk memperbarui informasi profil pengguna.

Pesan ini dipublikasikan oleh Android pada topik

“/general/<username>”. Spesifikasi pesan “updateProfile” dapat dilihat

pada tabel 3.14.

Tabel 3. 14 Tabel Spesifikasi Pesan "updateProfile"

Name Value Keterangan

msg updateProfile Identifikasi pesan.

username <username> Username yang telah terdaftar.

password <password> Password yang di-hashing SHA2-

256.

fullname <fullname> Nama lengkap pengguna yang

terdaftar.

email <email> Email baru pengguna.

phone <phone_number> Nomor telepon pengguna yang

baru.

Contoh:

{

“msg” : “updateProfile”,

“username” : “user1”,

“password” :

“0a041b9462caa4a31bac3567e0b6e6fd9100787db2ab433d96f6d178

cabfce90”,

“fullname” : “User One”,

“email” : “[email protected]”,

“phone” : “081616161616”

}

45

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.15.

Tabel 3. 15 Tabel Spesifikasi Pesan "updateProfileStatus"

Name Value Keterangan

msg updateProfileStatus Identifikasi pesan.

status SUCCESS / FAIL Menyatakan apakah profil

pengguna berhasil diperbarui

atau tidak.

Contoh:

{

“msg” : “updateProfileStatus”,

“status” : “SUCCESS”

}

9) Pesan “updatePassword”

Pesan ini berfungsi untuk memperbarui password pengguna. Pesan

ini dipublikasikan oleh Android pada topik “/general/<username>”.

Spesifikasi pesan “updatePassword” dapat dilihat pada tabel 3.16.

Tabel 3. 16 Tabel Spesifikasi Pesan "updatePassword"

Name Value Keterangan

msg updatePassword Identifikasi pesan.

username <username> Username yang telah

terdaftar.

oldpassword <old_password> Password lama yang di-

hashing SHA2-256.

newpassword <new_password> Password baru yang di-

hashing SHA2-256.

Contoh:

{

“msg” : “updatePassword”,

“username” : “user1”,

“oldpassword” :

“0a041b9462caa4a31bac3567e0b6e6fd9100787db2ab433d96f6d178

cabfce90”,

“newpassword”:

“0aa0s97fg8y0k09ausd0ahsa0jdj0safyad807fd9as0d8as9d8a0s09d7f

hgdffh99d”

}

46

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.17.

Tabel 3. 17 Tabel Spesifikasi Pesan "updatePasswordStatus"

Name Value Keterangan

msg updatePasswordStatus Identifikasi pesan.

status SUCCESS / FAIL Menyatakan apakah password

pengguna berhasil diperbarui

atau tidak.

Contoh:

{

“msg” : “updatePasswordStatus”,

“status” : “SUCCESS”

}

10) Pesan “renameAppliance”

Pesan ini berfungsi untuk mengganti nama perangkat pintar. Pesan

ini dipublikasikan oleh Android pada topik “/general/<username>”.

Spesifikasi pesan “renameAppliance” dapat dilihat pada tabel 3.18.

Tabel 3. 18 Tabel Spesifikasi Pesan "renameAppliance"

Name Value Keterangan

msg renameAppliance Identifikasi pesan.

applianceserial <applianceserial> Nomor serial perangkat pintar

yang didapat dari alamat

MAC perangkat pintar.

owner <owner> Berisi username pemilik

perangkat pintar tersebut.

nickname <nickname> Berisi nama perangkat pintar

Contoh:

{

“msg” : “renameAppliance”,

“applianceserial” : “123456789012”,

“owner” : “user1”,

“nickname” : “Smart Rice Cooker”

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.19.

47

Tabel 3. 19 Tabel Spesifikasi Pesan "renameStatus"

Name Value Keterangan

msg renameStatus Identifikasi pesan.

status SUCCESS /

FAIL

Menyatakan apakah nama perangkat

pengguna berhasil diperbarui atau tidak.

Contoh:

{

“msg” : “renameAppliance”,

“status” : “SUCCESS”

}

11) Pesan “getStatus”

Pesan ini berfungsi untuk mendapatkan status online tidaknya

perangkat pintar. Pesan ini dipublikasikan oleh Android pada topik

“/general/<username>”. Spesifikasi pesan “getStatus” dapat dilihat pada

tabel 3.20.

Tabel 3. 20 Tabel Spesifikasi Pesan "getStatus"

Name Value Keterangan

msg getStatus Identifikasi pesan.

applianceserial <applianceserial> Nomor serial perangkat pintar

yang didapat dari alamat MAC

perangkat pintar.

owner <owner> Berisi username pemilik

perangkat pintar tersebut.

Contoh:

{

“msg” : “getStatus”,

“applianceserial” : “123456789012”,

“owner” : “user1”

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.21.

Tabel 3. 21 Tabel Spesifikasi Pesan "applianceStatus"

Name Value Keterangan

msg applianceStatus Identifikasi pesan.

48

status ACTIVE /

INACTIVE /

NOTFOUND

Berisi status perangkat pintar.

Mengembalikan NOTFOUND jika

tidak ditemukan.

Contoh:

{

“msg” : “applianceStatus”,

“status” : “ACTIVE”

}

12) Pesan “getLog”

Pesan ini berfungsi untuk mengambil daftar laporan eksekusi.

Pesan ini dipublikasikan oleh Android pada topik

“/general/<username>”. Spesifikasi pesan “getLog” dapat dilihat pada

tabel 3.22.

Tabel 3. 22 Tabel Spesifikasi Pesan "getLog"

Name Value Keterangan

msg getLog Identifikasi pesan.

owner <username> Username yang telah

terdaftar.

applianceserial <applianceserial> Nomor serial

perangkat pintar yang

didapat dari alamat

MAC perangkat

pintar.

Contoh:

{

“msg” : “getLog”,

“owner” : “user1”,

“applianceserial” : “123456789012”

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.23.

Tabel 3. 23 Tabel Spesifikasi Pesan "reportLog"

Name Value Keterangan

msg reportLog Identifikasi pesan.

49

dat <array_appliance_detail>

/ NOTFOUND

Berisi array JSON object

yang terdiri atas

ctimestamp, cmd,

rtimesamp, rprt.

Mengembalikan

NOTFOUND jika tidak

ditemukan.

rtimestamp <timestamp_report> Berisi timestamp laporan

diterima.

rprt <laporan> Berisi string JSON yang

berisi laporan.

Contoh:

{

“msg” : “reportLog”,

“dat” : [

{

“rtimestamp” : “2016-04-15 15:15:00”,

“rprt” : “Cook rice finished”

},

{

“rtimestamp” : “2016-04-16 15:15:00”,

“rprt” : “Cook porridge finished”

}

]

}

13) Pesan “offline”

Pesan ini berfungsi untuk menyatakan sebuah perangkat pintar

tidak aktif. Pesan ini dipublikasikan oleh perangkat pintar pada topik

“/<id_perangkat>/<username>”. Spesifikasi pesan “offline” dapat

dilihat pada tabel 3.24.

Tabel 3. 24 Tabel Spesifikasi Pesan "offline"

Name Value Keterangan

msg offline Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar yang

didapat dari alamat

MAC perangkat

pintar.

Contoh:

{

50

“msg” : “offline”,

“applianceserial” : “123456789012”

}

B. Pesan Khusus

Selain menangani pesan-pesan dari perangkat pintar Smart Rice Cooker,

server juga menangani pesan-pesan dari perangkat pintar lain, seperti Smart

Medicine Dispenser dan Smart Dog Feeder. Pesan khusus yang dikenali

oleh server berdasarkan kebutuhan masing-masing perangkat pintar adalah

sebagai berikut.

B.1. Smart Rice Cooker

Pesan yang dikenali oleh perangkat pintar smart rice cooker

adalah sebagai berikut.

1) Pesan “cook”

Pesan ini berfungsi untuk memberikan perintah untuk memasak ke

Smart Rice Cooker. Pesan ini dipublikasikan oleh Android pada topik

“/rck/<username>”. Spesifikasi pesan “cook” dapat dilihat pada tabel

3.25.

Tabel 3. 25 Tabel Spesifikasi Pesan "cook"

Name Value Keterangan

msg cook Identifikasi pesan.

owner <username> Username yang telah terdaftar.

applianceserial <applianceserial> Nomor serial perangkat pintar

yang didapat dari alamat MAC

perangkat pintar.

rice <jumlah_beras> Jumlah beras yang akan

dimasak (kelipatan 150 gram).

water <jumlah_air> Jumlah air yang akan

digunakan untuk memasak

(dalam ml).

51

mode RICE /

PORRIDGE

Mode memasak, apakah

memasak nasi atau bubur.

cookSchedule <time> / NOW Jadwal memasak.

Contoh:

{

“msg” : “cook”,

“owner” : “user1”,

“applianceserial” : “123456789012”,

“rice” : 150,

“water” : 250,

“mode” : “RICE”,

“cookSchedule” : “17:00”

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.26.

Tabel 3. 26 Tabel Spesifikasi Pesan "cmdid"

Name Value Keterangan

msg cmdid Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar yang

didapat dari alamat

MAC perangkat

pintar.

cmdid <id_perintah> / -1 Berisi id perintah

yang dikirimkan,

didapat dari auto-

increment pada basis

data.

Contoh:

{

“msg” : “cmdid”,

“applianceserial” : “123456789012”,

“cmdid” : 1

}

2) Pesan “getCookSchedule”

Pesan ini berfungsi untuk mengambil jadwal memasak ketika

perangkat dinyalakan. Pesan ini dipublikasikan oleh smart rice cooker

52

pada topik “/rck/<username>”. Spesifikasi pesan “getCookSchedule”

dapat dilihat pada tabel 3.27.

Tabel 3. 27 Tabel Spesifikasi Pesan "getCookSchedule"

Name Value Keterangan

msg getCookSchedule Identifikasi pesan.

owner <username> Username pemilik perangkat

pintar.

applianceserial <applianceserial> Nomor serial perangkat pintar

yang didapat dari alamat MAC

perangkat pintar.

Contoh:

{

“msg” : “getCookSchedule”,

“owner” : “user1”,

“applianceserial” : “123456789012”

}

Server akan mengirimkan dua pesan balasan dengan spesifikasi

yang sama dengan spesifikasi pesan “cook” dan “cmdid”.

3) Pesan “cookStarted”

Pesan ini berfungsi untuk memberikan notifikasi bahwa proses

memasak telah dimulai. Pesan ini dipublikasikan oleh smart rice cooker

pada topik “/rck/<username>”. Spesifikasi pesan “cookStarted” dapat

dilihat pada tabel 3.28.

Tabel 3. 28 Tabel Spesifikasi Pesan "cookStarted"

Name Value Keterangan

msg cookStarted Identifikasi pesan.

cmdid <id_perintah> Id perintah yang

didapat pada saat

menerima perintah.

ctimestamp <timestamp_perintah_diterima> Waktu memasak

dimulai yang

ditentukan dari RTC

milik perangkat

pintar.

Contoh:

53

{

“msg” : “cookStarted”,

“cmdid” : 1,

“ctimestamp” : “2016-04-15 14:45:00”

}

4) Pesan “cookFinished”

Pesan ini berfungsi untuk memberikan notifikasi bahwa proses

memasak telah selesai. Pesan ini dipublikasikan oleh smart rice cooker

pada topik “/rck/<username>”. Spesifikasi pesan “cookFinished” dapat

dilihat pada tabel 3.29.

Tabel 3. 29 Tabel Spesifikasi Pesan "cookFinished"

Name Value Keterangan

msg cookFinished Identifikasi

pesan.

rtimestamp <timestamp_selesai_memasak> Waktu selesai

memasak yang

ditentukan dari

RTC milik

perangkat

pintar.

applianceserial <applianceserial> Nomor serial

perangkat pintar

yang didapat

dari alamat

MAC perangkat

pintar.

rprt <laporan_eksekusi_perintah> Berisi laporan

kalau memasak

sudah selesai.

cmdid <id_perintah> Berisi id

perintah

memasak yang

telah

diselesaikan.

Contoh:

{

“msg” : “cookFinished”,

“rtimestamp” : “2016-04-15 14:45:00”,

“applianceserial” : “123456789012”,

“rprt” : “Cook rice finished”,

54

“cmdid” : 1

}

5) Pesan “updateRckStock”

Pesan ini berfungsi untuk menanyakan konfirmasi pembaruan data

stok ke perangkat pintar. Pesan ini dipublikasikan oleh Android pada

topik “/rck/<username>”. Spesifikasi pesan “updateRckStock” dapat

dilihat pada tabel 3.30.

Tabel 3. 30 Tabel Spesifikasi Pesan "updateRckStock"

Name Value Keterangan

msg updateRckStock Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar

yang didapat dari

alamat MAC

perangkat pintar.

rice <jumlah_beras> Berisi jumlah beras

saat ini (dalam

gram).

water <jumlah_air> Berisi jumlah air saat

ini (dalam ml).

Contoh:

{

“msg” : “updateRckStock”,

“applianceserial” : “123456789012”,

“rice” : 500,

“water” : 100

}

6) Pesan “confirmRckStock”

Pesan ini berfungsi untuk melakukan konfirmasi pembaruan data

stok. Pesan ini dipublikasikan oleh smart rice cooker pada topik

“/rck/<username>”. Spesifikasi pesan “confirmRckStock” dapat dilihat

pada tabel 3.31.

55

Tabel 3. 31 Tabel Spesifikasi Pesan "confirmRckStock"

Name Value Keterangan

msg confirmRckStock Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar yang

didapat dari alamat

MAC perangkat

pintar.

confirmation OK / NOK Konfirmasi update

stok berdasarkan

dibuka atau tidaknya

tutup tempat beras.

rice <jumlah_beras> Berisi jumlah beras

saat ini (dalam gram).

water <jumlah_air> Berisi jumlah air saat

ini (dalam ml).

Contoh:

{

“msg” : “confirmRckStock”,

“applianceserial” : “123456789012”,

“confirmation” : “OK”,

“rice” : 500,

“water” : 100

}

7) Pesan “getRckStock”

Pesan ini berfungsi untuk mengambil data stok beras dan air dari

basis data. Pesan ini dipublikasikan oleh Android atau smart rice cooker

pada topik “/rck/<username>”. Spesifikasi pesan “getRckStock” dapat

dilihat pada tabel 3.32.

Tabel 3. 32 Tabel Spesifikasi Pesan "getRckStock"

Name Value Keterangan

msg getRckStock Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar yang

didapat dari alamat

MAC perangkat

pintar.

Contoh:

{

56

“msg” : “getRckStock”,

“applianceserial” : “123456789012”

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.33.

Tabel 3. 33 Tabel Spesifikasi Pesan "rckStock"

Name Value Keterangan

msg rckStock Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar yang

didapat dari alamat

MAC perangkat

pintar.

rice <jumlah_beras> / -1 Berisi jumlah beras

saat ini (dalam gram).

water <jumlah_air> / -1 Berisi jumlah air saat

ini (dalam ml).

Contoh:

{

“msg” : “rckStock”,

“applianceserial” : “123456789012”,

“rice” : 500,

“water” : 100

}

B.2. Smart Medicine Dispenser

Pesan yang dikenali oleh perangkat pintar smart medicine

dispenser adalah sebagai berikut.

1) Pesan “medicine”

Pesan ini berfungsi untuk memberikan penjadwalan pemberian obat.

Pesan ini dipublikasikan oleh Android pada topik “/smd/<username>”.

Spesifikasi pesan “medicine” dapat dilihat pada tabel 3.34.

57

Tabel 3. 34 Tabel Spesifikasi Pesan "medicine"

Name Value Keterangan

msg medicine Identifikasi pesan.

owner <username> Username yang telah

terdaftar.

applianceserial <applianceserial> Nomor serial perangkat

pintar yang didapat dari

alamat MAC perangkat

pintar.

pilschedule <array_jadwal_pil> Array berisi jadwal

pemberian pill pada pill

dispenser ke n.

pilamount <jumlah_pil> Jumlah pill yang harus

dikeluarkan oleh pill

dispenser ke n (dalam

butir).

lqschedule <array_jadwal_obat_

cair>

Array berisi jadwal

pemberian obat cair pada

solution dispenser ke n.

lqamount <volume_obat_cair> Jumlah obat cair yang

harus dikeluarkan oleh

solution dispenser ke n

(dalam ml).

Contoh:

{

“msg” : “medicine”,

“owner” : “user1”,

“applianceserial” : “210987654321”,

"pilschedule":["08:00","12:00","20:00"],

"pilamount":8,

"lqschedule":["08:00","12:00","20:00"],

"lqmount":8

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.35.

Tabel 3. 35 Tabel Spesifikasi Pesan "cmdid"

Name Value Keterangan

msg cmdid Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar yang

didapat dari alamat

MAC perangkat

pintar.

58

cmdid <id_perintah> / -1 Berisi id perintah

yang dikirimkan,

didapat dari auto-

increment pada basis

data.

Contoh:

{

“msg” : “cmdid”,

“applianceserial” : “210987654321”,

“cmdid” : 2

}

2) Pesan “medicineScheduled”

Pesan ini berfungsi untuk memberikan notifikasi bahwa jadwal

pemberian obat telah diatur. Pesan ini dipublikasikan oleh smart

medicine dispenser pada topik “/smd/<username>”. Spesifikasi pesan

“medicineScheduled” dapat dilihat pada tabel 3.36.

Tabel 3. 36 Tabel Spesifikasi Pesan "medicineScheduled"

Name Value Keterangan

msg medicineScheduled Identifikasi pesan.

owner <username> Username pemilik

perangkat pintar.

ctimestamp <timestamp_perintah_diterima> Waktu perintah

penjadwalan

diterima

berdasarkan RTC

pada perangkat

pintar.

Contoh:

{

“msg” : “medicineScheduled”,

“owner” : “user1”,

“applianceserial” : “210987654321”

}

59

3) Pesan “getMedicineSchedule”

Pesan ini berfungsi untuk mengambil konfigurasi jadwal pemberian

obat dari basis data. Pesan ini dipublikasikan oleh smart medicine

dispenser pada topik “/smd/<username>”. Spesifikasi pesan

“getMedicineSchedule” dapat dilihat pada tabel 3.37.

Tabel 3. 37 Tabel Spesifikasi Pesan "getMedicineSchedule"

Name Value Keterangan

msg getMedicineSchedule Identifikasi pesan.

owner <username> Username pemilik

perangkat pintar.

applianceserial <applianceserial> Nomor serial

perangkat pintar

yang didapat dari

alamat MAC

perangkat pintar.

Contoh:

{

“msg” : “getMedicineSchedule”,

“owner” : “user1”,

“applianceserial” : “210987654321”

}

Server akan mengirimkan dua pesan balasan dengan spesifikasi

yang sama dengan pesan “medicine” dan “cmdid”.

4) Pesan “medicineTook”

Pesan ini berfungsi untuk memberikan notifikasi apakah obat telah

dikonsumsi ketika waktunya. Pesan ini dipublikasikan oleh smart

medicine dispenser pada topik “/smd/<username>”. Spesifikasi pesan

“medicineTook” dapat dilihat pada tabel 3.38.

Tabel 3. 38 Tabel Spesifikasi Pesan "medicineTook"

Name Value Keterangan

msg medicineTook Identifikasi pesan.

60

rtimesta

mp

<timestamp_laporan_kondi

si_obat >

Waktu pelaporan kondisi

obat saat jadwal minum

obat tiba.

appliance

serial

<applianceserial> Nomor serial perangkat

pintar yang didapat dari

alamat MAC perangkat

pintar.

rprt <laporan_obat_dimakan> Berisi laporan apakah

makanan telah disajikan,

dimakan, atau tidak

dimakan.

cmdid <id_perintah> Berisi id perintah

penjadwalan yang telah

diselesaikan.

Contoh:

{

“msg” : “medicineTook”,

“rtimestamp” : “2016-04-15 19:10:00”,

“applianceserial” : “210987654321”,

“rprt” : “Pill taken”,

“cmdid” : 2

}

5) Pesan “medicineNotTook”

Pesan ini berfungsi untuk memberikan notifikasi ketika pada

waktunya, obat belum diminum. Pesan ini dipublikasikan oleh smart

medicine dispenser pada topik “/smd/<username>”. Spesifikasi pesan

“medicine” dapat dilihat pada tabel 3.39.

Tabel 3. 39 Tabel Spesifikasi Pesan "medicineNotTook"

Name Value Keterangan

msg medicineNotTook Identifikasi pesan.

owner <username> Username pemilik yang

telah terdaftar.

applianceserial <applianceserial> Nomor serial perangkat

pintar yang didapat dari

alamat MAC perangkat

pintar.

Contoh:

{

“msg” : “medicineNotTook”,

“owner” : “user1”,

61

“applianceserial” : “210987654321”,

}

6) Pesan “updateMedStock”

Pesan ini berfungsi untuk menanyakan konfirmasi pembaruan data

stok ke perangkat pintar. Pesan ini dipublikasikan oleh Android pada

topik “/smd/<username>”. Spesifikasi pesan “updateMedStock” dapat

dilihat pada tabel 3.40.

Tabel 3. 40 Tabel Spesifikasi Pesan "updateMedStock"

Name Value Keterangan

msg updateMedStock Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar

yang didapat dari

alamat MAC

perangkat pintar.

pil <jumlah_pil> Berisi jumlah pil

(dalam gram).

liquid <volume_obat_cair> Berisi volume obat

cair (dalam ml).

Contoh:

{

“msg” : “updateMedStock”,

“applianceserial” : “210987654321”,

“pil” : 60,

“liquid” : 500

}

7) Pesan “confirmMedStock”

Pesan ini berfungsi untuk melakukan konfirmasi pembaruan data

stok obat. Pesan ini dipublikasikan oleh Android pada topik

“/smd/<username>”. Spesifikasi pesan “confirmMedStock” dapat

dilihat pada tabel 3.41.

62

Tabel 3. 41 Tabel Spesifikasi Pesan "confirmMedStock"

Name Value Keterangan

msg confirmMedStock Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar

yang didapat dari

alamat MAC

perangkat pintar.

confirmation OK / NOK Konfirmasi update

stok berdasarkan

dibuka atau tidaknya

tutup tempat pil.

pil <jumlah_pil> Berisi jumlah pil

(dalam gram).

liquid <volume_obat_cair> Berisi volume obat

cair (dalam ml).

Contoh:

{

“msg” : “confirmMedStock”,

“applianceserial” : “210987654321”,

“confirmation” : “OK”,

“pil” : 60,

“liquid” : 500

}

8) Pesan “getMedStock”

Pesan ini berfungsi untuk mengambil data stok obat dari basis data.

Pesan ini dipublikasikan oleh Android atau smart medicine dispenser

pada topik “/smd/<username>”. Spesifikasi pesan “getMedStock” dapat

dilihat pada tabel 3.42.

Tabel 3. 42 Tabel Spesifikasi Pesan "getMedStock"

Name Value Keterangan

msg getMedStock Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar yang

didapat dari alamat

MAC perangkat

pintar.

Contoh:

{

63

“msg” : “getMedStock”,

“applianceserial” : “210987654321”

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.43.

Tabel 3. 43 Tabel Spesifikasi Pesan "smdStock"

Name Value Keterangan

msg smdStock Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar

yang didapat dari

alamat MAC

perangkat pintar.

pil <jumlah_pil_tabung_1> / -

1

Berisi jumlah pil

(dalam gram).

solution <volume_obat_cair> / -1 Berisi volume obat

cair (dalam ml).

Contoh:

{

“msg” : “smdStock”,

“applianceserial” : “210987654321”,

“pil” : 60,

“liquid” : 500

}

B.3. Smart Dog Feeder

Pesan yang dikenali oleh perangkat pintar smart dog feeder adalah

sebagai berikut.

1) Pesan “feed”

Pesan ini berfungsi untuk memberikan penjadwalan pemberian

makan anjing. Pesan ini dipublikasikan oleh Android pada topik

“/sdf/<username>”. Spesifikasi pesan “feed” dapat dilihat pada tabel

3.44.

64

Tabel 3. 44 Tabel Spesifikasi Pesan "feed"

Name Value Keterangan

msg feed Identifikasi pesan.

owner <username> Username yang telah

terdaftar.

applianceserial <applianceserial> Nomor serial

perangkat pintar yang

didapat dari alamat

MAC perangkat

pintar.

amount <jumlah_makanan> Jumlah makanan yang

diberikan (dalam

gram).

times <array_jadwal> Array berisi jadwal

pemberian makanan.

timeout <timeout> Periode pengecekan

apakah makanan

sudah dikonsumsi

atau belum (dalam

menit).

Contoh:

{

“msg” : “feed”,

“owner” : “user1”,

“applianceserial” : “789012345612”,

“amount” : 200,

“times” : [“07:00”,”12:00”,”19:00”],

“timeout” : 15

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.45.

Tabel 3. 45 Tabel Spesifikasi Pesan "cmdid"

Name Value Keterangan

msg cmdid Identifikasi pesan.

applianceserial <applianceserial> Nomor serial perangkat

pintar yang didapat dari

alamat MAC perangkat

pintar.

cmdid <id_perintah> / -1 Berisi id perintah yang

dikirimkan, didapat

dari auto-increment

pada basis data.

65

Contoh:

{

“msg” : “cmdid”,

“applianceserial” : “789012345612”,

“cmdid” : 3

}

2) Pesan “feedScheduled”

Pesan ini berfungsi untuk memberikan notifikasi bahwa jadwal

pemberian makan telah diatur. Pesan ini dipublikasikan oleh smart dog

feeder pada topik “/sdf/<username>”. Spesifikasi pesan

“feedScheduled” dapat dilihat pada tabel 3.46.

Tabel 3. 46 Tabel Spesifikasi Pesan "feedScheduled"

Name Value Keterangan

msg feedScheduled Identifikasi pesan.

cmdid <id_perintah> Id perintah yang

didapat pada saat

menerima perintah.

ctimestamp <timestamp_perintah_diterima> Waktu perintah

penjadwalan

diterima

berdasarkan RTC

pada perangkat

pintar.

Contoh:

{

“msg” : “feedScheduled”,

“cmdid” : 2,

“ctimestamp” : “2016-04-15 10:00:00”

}

3) Pesan “getFeedSchedule”

Pesan ini berfungsi untuk mengambil konfigurasi jadwal pemberian

makan dari basis data. Pesan ini dipublikasikan oleh smart dog feeder

66

pada topik “/sdf/<username>”. Spesifikasi pesan “getFeedSchedule”

dapat dilihat pada tabel 3.47.

Tabel 3. 47 Tabel Spesifikasi Pesan "getFeedSchedule"

Name Value Keterangan

msg getFeedSchedule Identifikasi pesan.

owner <username> Username pemilik

perangkat pintar.

applianceserial <applianceserial> Nomor serial

perangkat pintar

yang didapat dari

alamat MAC

perangkat pintar.

Contoh:

{

“msg” : “getFeedSchedule”,

“owner” : “user1”,

“applianceserial” : “789012345612”

}

Server akan mengirimkan dua pesan balasan dengan spesifikasi

yang sama dengan pesan “feed” dan “cmdid”.

4) Pesan “feedReport”

Pesan ini berfungsi untuk memberikan notifikasi apakah makanan

telah disajikan/dimakan/ditinggalkan/tidak ada anjing ketika waktunya.

Pesan ini dipublikasikan oleh smart dog feeder pada topik

“/sdf/<username>”. Spesifikasi pesan “feedReport” dapat dilihat pada

tabel 3.48.

Tabel 3. 48 Tabel Spesifikasi Pesan "feedReport"

Name Value Keterangan

msg feedReport Identifikasi pesan.

rtimestamp <timestamp_laporan_

kondisi_makanan>

Waktu pelaporan kondisi

makanan saat jadwal

makan tiba.

67

applianceserial <applianceserial> Nomor serial perangkat

pintar yang didapat dari

alamat MAC perangkat

pintar.

rprt SERVED / EATEN /

LEFT / NODOG

Berisi laporan apakah

makanan telah disajikan,

dimakan, atau tidak

dimakan.

cmdid <id_perintah> Berisi id perintah

penjadwalan yang telah

diselesaikan.

Contoh:

{

“msg” : “feedReport”,

“rtimestamp” : “2016-04-15 19:00:00”,

“applianceserial” : “789012345612”,

“rprt” : “EATEN”,

“cmdid” : 2

}

5) Pesan “updateFeederStock”

Pesan ini berfungsi untuk memperbarui data stok makanan anjing

pada basis data. Pesan ini dipublikasikan oleh Android pada topik

“/sdf/<username>”. Spesifikasi pesan “updateFeederStock” dapat

dilihat pada tabel 3.49.

Tabel 3. 49 Tabel Spesifikasi Pesan "updateFeederStock"

Name Value Keterangan

msg updateFeederStock Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar

yang didapat dari

alamat MAC

perangkat pintar.

dogfood <jumlah_makanan_anjing> Berisi jumlah

makanan anjing

saat ini (dalam

gram).

Contoh:

{

“msg” : “updateFeederStock”,

“applianceserial” : “789012345612”,

68

“dogfood” : 1000

}

6) Pesan “confirmFeederStock”

Pesan ini berfungsi untuk memperbarui data stok makanan anjing

pada basis data. Pesan ini dipublikasikan oleh smart dog feeder pada

topik “/sdf/<username>”. Spesifikasi pesan “confirmFeederStock”

dapat dilihat pada tabel 3.50.

Tabel 3. 50 Tabel Spesifikasi Pesan "confirmFeederStock"

Name Value Keterangan

msg confirmFeederStock Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar

yang didapat dari

alamat MAC

perangkat pintar.

confirmation OK / NOK Konfirmasi update

stok berdasarkan

dibuka atau

tidaknya tutup

tempat makanan

anjing.

dogfood <jumlah_makanan_anjing> Berisi jumlah

makanan anjing

saat ini (dalam

gram).

Contoh:

{

“msg” : “updateFeederStock”,

“applianceserial” : “789012345612”,

“confirmation” : “OK”,

“dogfood” : 1000

}

7) Pesan “getFeederStock”

Pesan ini berfungsi untuk mengambil data stok makanan anjing dari

basis data. Pesan ini dipublikasikan oleh Android atau smart dog feeder

69

pada topik “/sdf/<username>”. Spesifikasi pesan “getFeederStock”

dapat dilihat pada tabel 3.51.

Tabel 3. 51 Tabel Spesifikasi Pesan "getFeederStock"

Name Value Keterangan

msg getFeederStock Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar yang

didapat dari alamat

MAC perangkat

pintar.

Contoh:

{

“msg” : “getFeederStock”,

“applianceserial” : “789012345612”

}

Server akan mengirimkan pesan balasan dengan spesifikasi yang

dapat dilihat pada tabel 3.52.

Tabel 3. 52 Tabel Spesifikasi Pesan "sdfStock"

Name Value Keterangan

msg sdfStock Identifikasi pesan.

applianceserial <applianceserial> Nomor serial

perangkat pintar

yang didapat dari

alamat MAC

perangkat pintar.

dogfood <jumlah_makanan_anjing>

/ -1

Berisi jumlah

makanan anjing saat

ini (dalam gram).

Contoh:

{

“msg” : “sdfStock”,

“applianceserial” : “789012345612”,

“dogfood” : 1000

}

70

3.4.2. Rancangan Basis Data

Basis data pada penelitian ini menggunakan basis data MySQL dan

memiliki model Entitiy Relationship seperti gambar 3.3. Tabel otherstock

merupakan tabel dummy yang merupakan referensi pembuatan tabel stock baru

ketika ada perangkat pintar tambahan.

appliancemaster

appliancedetail

sdfstock

rckstock

smdstock

user

command report

otherstock

applianceidPK

appliancename

applianceserialPK

applianceid

password

owner

nickname

status

stockIDPK

applianceserial

dogfood

stockIDPK

applianceserial

rice

water

stockIDPK

applianceserial

pil

liquid

usernamePK

password

name

email

phonenumber

commandidPK

ctimestamp

applianceserial

cmd

owner

reportidPK

rtimestamp

applianceserial

rprt

commandid

has

defines

has

has

has

execute

generate

generate

gives

stockIDPK

applianceserial

stockAttribute1

stockAttribute2

has

Gambar 3. 4 Entity Relation Diagram Basis Data Sistem Otomatisasi

71

Terdapat 8 buah tabel dengan rincian:

1) Tabel user

Tabel 3. 53 Tabel user pada Basis Data

Tabel user dapat dilihat pada tabel 3.53. Tabel ini berisi 5 atribut,

yaitu username yang merupakan primary key pada table ini, password

yang telah di-hash menggunakan SHA2-256, name, email, dan

phonenumber. Tabel ini digunakan sebagai pembanding pada saat

pengguna melakukan login pada aplikasi, menyimpan data pengguna

ketika signup, dan akan diperbarui ketika pengguna memperbarui

informasi password, email, dan phonenumber.

2) Tabel appliancemaster

Tabel 3. 54 Tabel appliancemaster pada Basis Data

Tabel appliancemaster dapat dilihat pada tabel 3.54. Tabel ini berisi

2 atribut, yaitu applianceid yang merupakan kode perangkat pintar yang

terdaftar (untuk Smart Rice Cooker, applianceid-nya adalah rck) dan

appliancename yang merupakan nama jenis perangkat pintar yang

72

terdaftar. Atribut applianceid merupakan primary key pada tabel ini.

Tabel ini digunakan untuk menyimpan daftar jenis perangkat pintar

yang dikenali oleh sistem.

3) Tabel appliancedetail

Tabel 3. 55 Tabel appliancedetail pada Basis Data

Tabel appliancedetail dapat dilihat pada tabel 3.55. Tabel ini berisi

6 atribut, yaitu applianceserial yang merupakan nomor serial dari

perangkat pintar yang terdaftar dan diambil dari alamat MAC perangkat

pintar tersebut, applianceid yang merupakan foreign key yang mengacu

pada applianceid pada tabel appliancemaster, password untuk validasi

perangkat pada saat terhubung dengan server, owner yang juga

merupakan foreign key yang mengacu pada username pada tabel user,

nickname yang merupakan nama panggilan perangkat pintar, dan status

untuk mengetahui apakah perangkat pintar tersebut sedang aktif atau

tidak. Atribut applianceserial merupakan primary key pada tabel ini.

Tabel ini digunakan untuk menyimpan daftar perangkat pintar yang

dikenali oleh sistem dan dimiliki oleh pengguna.

73

4) Tabel command

Tabel 3. 56 Tabel command pada Basis Data

Tabel command dapat dilihat pada tabel 3.56. Tabel ini berisi 5

atribut, yaitu commandid sebagai identifier perintah, ctimestamp yang

merupakan waktu perintah diterima/dijalankan, applianceserial yang

merupakan foreign key yang mengacu pada applianceserial pada tabel

appliancedetail, cmd yang berisi perintah yang diterima, dan owner

yang juga merupakan foreign key yang mengacu pada username pada

tabel user. Atribut commandid merupakan primary key pada tabel ini.

Tabel ini digunakan untuk menyimpan perintah-perintah yang

dikirimkan pengguna kepada perangkat pintar.

5) Tabel report

Tabel 3. 57 Tabel report pada Basis Data

74

Tabel report dapat dilihat pada tabel 3.57. Tabel ini berisi 5 atribut,

yaitu reportid sebagai identifier laporan, rtimestamp yang merupakan

waktu perintah selesai dijalankan, applianceserial yang merupakan

foreign key yang mengacu pada applianceserial pada tabel

appliancedetail, rprt yang berisi laporan yang diterima, dan commandid

yang juga merupakan foreign key yang mengacu pada commandid pada

tabel command. Atribut reportid merupakan primary key pada tabel ini.

Tabel ini digunakan untuk menyimpan laporan-laporan dari perangkat

pintar.

6) Tabel rckstock

Tabel 3. 58 Tabel rckstock pada Basis Data

Tabel rckstock dapat dilihat pada tabel 3.58. Tabel ini berisi 4

atribut, yaitu stockid sebagai identifier stok, applianceserial yang

merupakan foreign key yang mengacu pada applianceserial pada tabel

appliancedetail, rice yang berisi data jumlah beras saat ini, dan water

yang berisi data jumlah air saat ini. Atribut stockid merupakan primary

key pada tabel ini. Tabel ini digunakan untuk menyimpan data stok dari

smart rice cooker.

75

7) Tabel sdfstock

Tabel 3. 59 Tabel sdfstock pada Basis Data

Tabel rckstock dapat dilihat pada tabel 3.59. Tabel ini berisi 3

atribut, yaitu stockid sebagai identifier stok, applianceserial yang

merupakan foreign key yang mengacu pada applianceserial pada tabel

appliancedetail, dan dogfood yang berisi data jumlah makanan anjing

saat ini. Atribut stockid merupakan primary key pada tabel ini. Tabel ini

digunakan untuk menyimpan data stok dari smart dog feeder.

8) Tabel smdstock

Tabel 3. 60 Tabel smdstock pada Basis Data

Tabel rckstock dapat dilihat pada tabel 3.60. Tabel ini berisi 4

atribut, yaitu stockid sebagai identifier stok, applianceserial yang

merupakan foreign key yang mengacu pada applianceserial pada tabel

appliancedetail, pil yang berisi data jumlah pil saat ini, dan liquid yang

berisi data jumlah obat cair saat ini. Atribut stockid merupakan primary

key pada tabel ini. Tabel ini digunakan untuk menyimpan data stok dari

smart medicine dispenser.

76

3.4.3. Rancangan Aplikasi Server

Server dikembangkan berbasis Node.js, sehingga bahasa pemrograman

yang digunakan adalah bahasa scripting JavaScript. Terdapat dua tambahan

modul yang digunakan pada server, yaitu modul mosca [42] sebagai MQTT

broker dan modul mysql [43] sebagai penghubung ke basis data MySQL.

Alur program utama server dapat dilihat pada gambar 3.5. Pertama-tama,

server melakukan inisialisasi parameter koneksi yang akan dibuka, seperti

certificate dan key path (lokasi disimpannya file certificate dan key untuk

mengamankan koneksi), parameter koneksi MySQL (host, username, password,

nama basis data yang digunakan, dan port basis data), dan port yang dibuka

untuk koneksi MQTT. Setelah inisialisasi selesai, maka koneksi dibuka dan

server menunggu client melakukan koneksi.

Server akan melakukan proses authentication dan authorization ketika ada

client yang melakukan koneksi. Jika koneksi yang dilakukan client valid, maka

server menunggu client tersebut mengirimkan pesan. Ketika client

mengirimkan pesan pada suatu topik tertentu, maka server akan memeriksa

terlebih dahulu apakah client tersebut berhak mengirim pesan pada topik

tersebut. Jika berhak, maka server akan meneruskan pesan tersebut ke seluruh

authorized client yang subcribe ke topik tersebut. Setelah pesan tersebut

diteruskan, server akan mengolahnya untuk menentukan pesan mana yang perlu

dilakukan proses query ke basis data. Setelah query selesai dan tidak ada error,

maka server akan kembali menunggu pesan selanjutnya.

77

Start

Connection Parameter

Initialization

Certificate & Key pathMySql Host, Username,

Password, DatabasePort

Client connected?

Authentication and

Authorization

Is connection valid?

Any incoming message?

Authorized client?

Publish message to authorized subscriber

Process message based

on protocol

Any Error?

End

No

Yes

No

Yes

No

Yes

No

Yes

Yes

No

Open Connection

Gambar 3. 5 Flowchart Utama Aplikasi Server

78

Alur program server untuk proses authentication dan authorization dapat

dilihat pada gambar 3.6. Terdapat tiga jenis koneksi client yang valid, yaitu

koneksi dari perangkat pintar berdasarkan nomor serial dan password yang

terdaftar, koneksi untuk melakukan signup pengguna, dan koneksi untuk login

pengguna berdasarkan username dan password yang telah terdaftar.

Start

Username = undefined?

6th character of username = #?

First 6 character of username = signup?

Accept connection

Client can publish & subscribe on topics:

/*/<user>/*/<user2>

/lwt

3rd character of username = #?

user = <string after

End

type = <First 3 string of username>

sn = <String after

Owner found?

Username and password matched

with database?

Accept connection, Publish loginStatus

Success

Client can publish & subscribe on topics:

/*/<user>/lwt

Accept connection

Client can publish & subscribe on topics:

/*/<user>/lwt

No No No

Yes

Yes

Yes

Yes Yes

No

Yes

No

user = <sn>user2 = <owner>

Find owner from database based on

type, sn, and password

No

user = <username>

Refuse connection

Refuse connection

Refuse connection

Refuse connection,

Publish loginStatus Fail

Autentication and Authorization Subroutine

Gambar 3. 6 Flowchart Subroutine “Authentication and Authorization”

Parameter yang dapat digunakan oleh MQTT broker untuk melakukan

authentication dan authorization adalah username dan password saja. Namun,

79

ketiga koneksi tersebut membutuhkan proses pengecekan yang berbeda,

sehingga perlu dibedakan format username untuk ketiga koneksi tersebut.

Format username untuk signup adalah string “signup#” diikuti dengan

username yang akan didaftarkan. Format username untuk perangkat pintar

adalah string jenis perangkat pintar (rck untuk smart rice cooker) diikuti dengan

tanda “#” dan diakhiri dengan nomor serial perangkat tersebut. Format

username untuk login pengguna berupa string username yang dimasukkan pada

aplikasi ApplianceHub saja.

Setelah diproses berdasarkan formatnya masing-masing dan dinyatakan

sebagai koneksi yang valid, maka client dapat melakukan publish dan subscribe

pada spesifikasi topik yang telah ditentukan. Client dengan koneksi signup atau

login dapat melakukan publish dan subscribe pada 2 spesifikasi topik, yaitu

“/*/<username>” dan “/lwt”, sementara client yang merupakan perangkat pintar

dapat melakukan publish dan subscribe pada 3 spesifikasi topik, yaitu

“/*/<nomor_serial>”, “/*/<owner>”, dan “/lwt”.

Alur program server untuk pemrosesan pesan dapat dilihat pada gambar 3.7.

Terdapat 4 kelompok pesan, yaitu pesan umum, pesan untuk smart rice cooker,

pesan untuk smart medicine dispenser [25], dan smart dog feeder [18].

Pemrosesan pesan dilakukan dengan mem-parsing terlebih dahulu pesan yang

berformat JSON. Setelah itu, server akan mencocokkan value dari parameter

name yang berisi string “msg” dengan pesan yang sudah didefinisikan. Jika

cocok, maka pesan tersebut akan diolah sesuai dengan fungsi masing-masing

pesan dan setelah selesai, maka server akan kembali menunggu pesan

80

selanjutnya. Gambaran lebih detail mengenai pengolahan masing-masing pesan

dapat dilihat pada Lampiran 1.1.

Start

JSONmsg = JSON parse packet.payload

Parse Error?

JSONmsg.msg = ?No

Yes

End

Process Message Based on Protocol Subroutine

1 4

7 10

13 16

19

signupregisterMyAppliance

updateProfile getStatus

cook cookFinished

medicine

22

25 28

medicineTook

feed feedReport

2 3

getOwner getMyAppliance

5

unregisterMyAppliance

6

getProfile

8 9

updatePassword renameAppliance

11

getLog

12

offline

14 15

getCookSchedule cookStarted

17

confirmRckStock

18

getRckStock

20 21

getMedicineSchedule medicineScheduled

23 24

confirmMedStock getMedStock

26 27

getFeedSchedule feedScheduled

29 30

confirmFeederStock getFeederStock

31313131313131313131

General messages

Smart Rice Cooker Messages

Smart Medicine Dispenser Messages

Smart Dog Feeder Messages

Gambar 3. 7 Flowchart Subroutine “Process Message Based on Protocol”

3.4.4. Rancangan Perangkat Lunak Smart Rice Cooker

Perangkat lunak pada smart rice cooker terdiri atas dua program utama,

yaitu program pada modul Wi-Fi ESP8266 yang berisi firmware NodeMCU

menggunakan bahasa scripting Lua dan program pada Arduino Uno

menggunakan bahasa C. Program pada modul Wi-Fi ESP8266 bertugas untuk

berkomunikasi dengan server, sementara program pada Arduino Uno bertugas

untuk memproses dan mengeksekusi pesan yang diterima dari modul Wi-Fi

ESP8266 melalui komunikasi serial dengan baudrate 9600.

81

1) Program pada modul Wi-Fi ESP8266 [25]

Alur program utama untuk modul Wi-Fi ESP8266 dapat dilihat pada

gambar 3.8. Program dimulai dengan inisialisasi variabel, kemudian

program mengambil nomor serial dari alamat MAC perangkat dan akan

mengirimkannya ke Arduino Uno melalui komunikasi serial.

Selanjutnya, program akan mengatur parameter client MQTT, seperti

ID, waktu keepalive, username, dan password, mengatur pesan last-will

dan setelah selesai, program akan mencoba melakukan koneksi ke

server.

Parameter untuk melakukan koneksi terdiri atas host dan port server,

security (nilai 0 berarti koneksi tanpa security, sementara nilai 1 berarti

sebaliknya), dan auto-reconnect (nilai 0 berarti program tidak akan

melakukan reconnect secara otomatis ketika koneksi terputus atau

gagal, sementara nilai 1 berarti sebaliknya). Setelah koneksi terbentuk,

program melakukan subscribe ke topik “/rck/<serial_number>” dan

meminta informasi pemilik perangkat ke server dengan mengirimkan

pesan “getOwner”.

Selanjutnya, program akan menunggu pesan dari server dan

Arduino dan akan menjalankan suatu proses sesuai dengan isi pesan

tersebut, misalnya melakukan proses memasak, mengonfirmasi

pembaruan stok, dan mengirimkan laporan proses memasak telah

dimulai/selesai. Gambaran lebih detail mengenai pengolahan masing-

masing pesan dapat dilihat pada Lampiran 1.2.

82

Start

Variable initialization

sn = Get Serial Number

Set Last Will Testament

Connect to server

Connect ?

Publish getOwner

Set MQTT client parameter

Yes

No

Send setApplianceSerial

with Serial Number to Serial

m = nilsn = nilowner = ”tempMsg = ”tempRice = 0tempWater = 0tempMode =

tempCookSched = nilcookStatus = falseconsumedWater = 0consumedRice = 0riceNow = 0waterNow = 0

IDKeepalive timeUsernamepassword

HostPortSecurityAuto-reconnect

On Error?

End

Yes

No

Any message from server?

Yes

Any message from Arduino?

Yes

Process message from server

Process message from Arduino

No

No

Subcribe to rck/<sn>”

Gambar 3. 8 Flowchart Utama Program ESP8266 [25]

83

2) Program pada Arduino Uno

Alur program utama untuk Arduino Uno dapat dilihat pada gambar

39, 3.10, 3.11, dan 3.12. Program dimulai dengan inisialisasi variabel,

mode pin (input/output), dan posisi motor servo. Selanjutnya, program

menunggu data serial dari modul Wi-Fi ESP8266. Data serial yang

masuk akan ditampung dalam variabel “crecv” dan akan di-parse ke

variabel “injobj”. Jika parse berhasil, maka program akan mencocokkan

value pada name “msg” dengan 3 value yang dikenali oleh program,

yaitu “cook”, “updateRckStock”, dan “setApplianceSerial”.

Jika value dari “msg” adalah “setApplianceSerial”, maka program

akan mengatur variabel “applianceserial” menjadi value dari serial

number yang ada pada pesan tersebut. Setelah itu, program akan

mengecek alarm dari RTC.

Jika value dari “msg” adalah “updateRckStock”, maka program

akan mengecek apakah tutup tempat penyimpanan beras sedang terbuka

atau tidak berdasarkan nilai bacaan dari limit switch. Jika terbuka, maka

program akan mengonfirmasi pembaruan stok. Setelah itu, program

akan mengecek alarm dari RTC.

Jika value dari “msg” adalah “cook”, maka program akan mengecek

apakah sistem sedang memasak atau sedang menunggu waktunya

memasak berdasarkan nilai dari variabel “cookStatus”. Nilai 0 pada

variabel “cookStatus” menandakan sistem sedang tidak mengeksekusi

atau menunggu perintah memasak, sehingga program akan mengambil

parameter-parameter memasak seperti jumlah beras, air, mode

84

memasak, dan jadwal memasak dari pesan tersebut. Jika jadwal

memasak adalah “NOW”, maka program akan langsung mengeksekusi

subroutine “cook”. Jika jadwal memasak merupakan waktu, maka

program akan mengatur alarm pada RTC dan mengatur nilai cookStatus

menjadi 2. Setelah itu, program akan mengecek alarm dari RTC.

Ketika ada alarm dari RTC, program akan mengecek nilai variabel

“cookStatus”. Nilai “cookStatus” 1 menandakan proses memasak telah

selesai dan program akan mengirim laporan “cookFinished” ke

ESP8266 melalui serial. Nilai “cookStatus” 2 menandakan sudah

waktunya perintah memasak yang telah dijadwalkan untuk dieksekusi,

sehingga program akan memanggil subroutine “cook”.

Alur program untuk subroutine “cook” dapat dilihat pada gambar

3.11. dan alur untuk sub-subroutine pada subroutine “cook” dapat

dilihat pada Lampiran 1.3. Program akan melakukan perulangan untuk

mengeluarkan beras per 150 gram dari tempat penyimpanannya,

mencucinya, dan memindahkan beras yang telah dicuci tersebut ke rice

cooker hingga jumlah beras yang dikeluarkan sesuai dengan takaran

yang diinginkan. Pengeluaran beras dari tempat penyimpanannya ke

wadah cuci dilakukan dengan menggerakan motor servo yang terhubung

dengan laci pengeluaran ke sudut tertentu, pencucian beras dilakukan

dengan menyambungkan relay untuk menyalakan pompa air, dan

pemindahan beras yang telah dicuci dilakukan dengan menggerakkan

motor servo yang disambungkan dengan wadah cuci ke sudut tertentu.

85

Selanjutnya, program akan menambahkan air sesuai dengan takaran

yang diinginkan dengan menekan keran pada galon air menggunakan

motor servo yang terhubung dengan keran tersebut dan mengatur

keluarnya air berdasarkan bacaan dari sensor aliran air. Setelah air

selesai ditambahkan, program akan menutup rice cooker dengan

menggerakkan motor servo yang berada di dekat rice cooker ke sudut

tertentu dan menyimulasikan penekanan tombol sesuai mode memasak

dengan menyambungkan relay yang terhubung dengan tombol pada rice

cooker selama beberapa ms. Subroutine “cook” diakhiri dengan

mengirimkan pesan “cookStarted”, mengubah nilai “cookStatus”

menjadi 1, dan mengatur alarm pada RTC sesuai dengan waktu yang

dibutuhkan untuk memasak.

86

Start

Variable Initialization

Pin Mode Initialization

crecv = cookStatus = 0

msg = mode =

schedule = applianceserial = ”

rice = 0water = 0cmdid = 0

cookTime = 0

OUTPUT: Pinp_washRelay 4p_rBoxServo 5p_modeCook 6p_modePorridge 7p_cancel 8p_waterServo 9p_washServo 10p_lidServo 11

Servo Position

Initialization

Servo DegreerBoxServo 90washServo 52lidServo 90waterServo 80

crecv = Read serial data from

ESP8266

injobj = JSON parse crecv

Parse success?

msg = injobj[ msg”

msg = ?

Yes

1

2

cook setApplianceSerial

applianceserial = injobj[ applianceserial”

3

Any serial data?

Yes

No

No

4

cookStatus == 0?

Yes

updateRckStock

No

porridgeTime = 50ctimestamp = ”rtimestamp = ”pulseCount = 0flowRate = 0.0

flowMilliLitres = 0totalMilliLitres = 0

oldTime = 0

INPUT: Pinp_flowSensor 2p_rBoxLid 12

Gambar 3. 9 Flowchart Utama Program Arduino (Bagian 1)

87

rice = injobj[ rice” water = injobj[ water” mode = injobj[ mode” cmdid = injobj[ cmdid”

schedule = injobj[ cookSchedule”

mode == rice?

Rice vol. = ?

cookTime = 40

cookTime = 50

cookTime = 60

cookTime = 70

Yes

150 300 450 600

schedule == NOW?

cook

No

Yes

cookStatus = 2No

h = First 2 char before from schedule variable

m = 2 chars after from schedule variable

Set Alarm 1 RTC at <h> hour <m> minute

1

3

porridgeTime = 50

Gambar 3. 10 Flowchart Utama Program Arduino (Bagian 2)

88

333

Alarm1 RTC triggered?

4

cookStatus = 0outjobj[ msg” cookFinished

outjobj[ applianceserial” <applianceserial>outjobj[ rprt” <Rice/Porridge> cooking

have been completedoutjobj[ rtimestamp” <timestamp now>

outjobj[ cmdid” <cmdid>

cookStatus = ?

cook

Yes

12

Print outjobj to

serial

No

onError?

End

Yes

No

Print cook finished report

outjobj[ msg” confirmRckStockoutjobj[ applianceserial” <applianceserial>

outjobj[ water” <water>outjobj[ rice” <rice>

p_rBoxLid == HIGH?

Print outjobj to

serial

outjobj[ confirmation” OK

outjobj[ confirmation” NOK

Yes

No

Print update stock confirmation

2

Gambar 3. 11 Flowchart Utama Program Arduino (Bagian 3)

89

Start

n < rice/ricePerDump

dumpToClean

cleanRice

dumpToRiceCooker

Yes

addWaterNo

startCook

cookStatus = 1outjobj[ msg” cookStarted

outjobj[ ctimestamp” <timestamp now>outjobj[ cmdid” <cmdid>

Print outjobj to

serial

mode = ?

Time = m+cookTime

m = minute()h = hour()d = day()

RICE

Time = m+porridgeTime

PORRIDGE

Set RTC Alarm1hour = hminute =

m+porridgeTime

Set RTC Alarm1hour = h+1

minute = (m+porridgeTime)%60

End

Cook Subroutine

Time >= 60?No

Yes

Print cook started report

Gambar 3. 12 Flowchart Subroutine “Cook”

3.4.5. Rancangan Aplikasi Android

Secara keseluruhan, aplikasi Appliance Hub terdiri atas 8 activity umum,

yaitu activity sign in, sign up, main setting, appliance list, setting, account

setting, change password, dan edit profile [18]. Pada halaman appliance list

yang dapat diakses pengguna setelah melakukan login, terdapat daftar

appliance yang dimiliki dan dapat diakses oleh pengguna dan sebuah tombol

90

untuk menambah appliance melalui add appliance activity. Desain halaman ini

dapat dilihat pada gambar 3.13.

Gambar 3. 13 Rancangan Tampilan Halaman Daftar Appliance [18]

Ketika pengguna mengakses smart rice cooker, pengguna dapat mengakses

4 buah activity lainnya, yaitu activity cook, update stock, log, dan unregister.

Desain halaman ini dapat dilihat pada gambar 3.14.

Gambar 3. 14 Rancangan Tampilan Halaman Menu Smart Rice Cooker [18]

91

Ketika pengguna mengakses menu “Cook”, pengguna akan dihadapkan

pada halaman pilihan mode memasak nasi atau bubur dengan desain seperti

gambar 3.15 dan masing-masing pilihan akan menampilkan halaman baru untuk

menentukan pengaturan memasak dengan desain tampilan yang sama seperti

pada gambar 3.16, namun dengan pilihan takaran yang berbeda. Pada halaman

ini, pengguna dapat memilih tekstur nasi/bubur (thick/medium/thin) melalui

radio button. Setiap pilihan tekstur memiliki perbandingan nasi dan bubur yang

berbeda.

Selanjutnya, pengguna dapat memilih jumlah cup nasi yang akan dimasak

melalui sebuah spinner, dan jumlah air akan mengikuti sesuai dengan tekstur

yang dipilih. Langkah terakhir adalah memilih waktu memasak, yaitu sekarang

atau memilih waktu melalui radio button dan menyentuh tombol “Confirm”

untuk mengirimkan perintah memasak tersebut ke smart rice cooker.

Gambar 3. 15 Rancangan Tampilan Halaman Menu Cook Mode [18]

92

Gambar 3. 16 Rancangan Tampilan Halaman Cook Settings [18]

Ketika pengguna mengakses menu “Update Stock”, pengguna akan

dihadapkan pada halaman dengan desain seperti gambar 3.17. Pada halaman ini,

nilai jumlah beras dan air yang baru saja dimasukkan diketikkan pada 2 buah

edit text dan jika data sudah benar, pengguna tinggal menyentuh tombol

“Confirm”. Pengguna perlu membiarkan tutup penyimpanan beras terbuka

sampai proses pembaruan selesai.

Gambar 3. 17 Rancangan Tampilan Halaman Update Stock Smart Rice Cooker [18]

Ketika pengguna mengakses menu “Log”, pengguna akan dihadapkan pada

halaman dengan desain seperti gambar 3.18. Pada halaman ini, informasi

93

mengenai daftar laporan yang berasal dari perangkat pintar tersebut dapat

diakses oleh pengguna. Daftar ini terdiri atas 2 kolom, yaitu waktu laporan

diterima dan isi laporannya.

Gambar 3. 18 Rancangan Tampilan Halaman Log [18]

Ketika pengguna mengakses menu “Unregister”, pengguna akan

dihadapkan pada halaman dengan desain seperti gambar 3.19. Pada halaman ini,

pengguna perlu mengisi kembali password akun pengguna untuk konfirmasi

unregister pemilik perangkat tersebut.

Gambar 3. 19 Rancangan Tampilan Halaman Unregister [18]

94

BAB IV

IMPLEMENTASI DAN PENGUJIAN SISTEM

4.1 Implementasi dan Pengujian Rangkaian Sensor dan Aktuator

Implementasi dan pengujian rangkaian sensor dan aktuator terbagi menjadi

beberapa bagian, yaitu implementasi keseluruhan perangkat keras, pengujian

pengeluaran beras dari tempat penyimpanan, dan pengujian bacaan sensor aliran air.

4.2.1. Implementasi Perangkat Keras

Gambar 4. 1 Diagram Skematik Perangkat Keras Smart Rice Cooker

Gambar 4.1 merupakan diagram skematik perangkat keras sistem

otomatisasi Smart Rice Cooker. Sensor flowmeter membutuhkan interrupt

untuk menghitung pembacaan debit air, sehingga dihubungkan dengan digital

pin 2 milik Arduino yang juga merupakan pin interrupt 0. Sensor limit switch

yang hasil bacaannya merupakan nilai digital, sehingga dihubungkan dengan

95

pin digital 12 Arduino. Empat buah relay yang membutuhkan masukkan sinyal

digital untuk menentukan terhubung atau tidaknya relay tersebut, sehingga

dihubungkan dengan pin digital Arduino (pin digital 4, 6, 7, 8). Empat buah

motor servo yang membutuhkan masukkan sinyal PWM digital, sehingga

dihubungkan dengan pin digital Arduino yang mendukung pembangkitan sinyal

PWM (pin digital 5, 9, 10, 11). Penentu waktu RTC DS3231 menggunakan jalur

komunikasi I2C, sehingga dihubungkan dengan pin analog 4 (SDA) dan analog

5 (SCL) milik Arduino. Modul Wi-Fi ESP8266 menggunakan jalur komunikasi

UART, sehingga dihubungkan dengan pin digital 0 (Rx) dan pin digital 1 (Tx)

milik Arduino.

Bentuk fisik dari Smart Rice Cooker pada penelitian ini dapat dilihat pada

gambar 4.2.

Gambar 4. 2 Smart Rice Cooker

96

4.2.2. Uji Coba Pengeluaran Beras dari Tempat Penyimpanan

Uji coba pengeluaran beras dari tempat penyimpanannya bertujuan untuk

mengecek apakah mekanisme pengeluaran dengan mendorong laci tempat

penyimpanan menggunakan motor servo dapat berhasil dengan baik atau tidak.

Pengujian dilakukan dengan melakukan 10 kali tarikan dengan jeda tiap tarikan

selama 5 detik dan jumlah beras yang keluar per tarikan adalah +/- 150 gram

(berdasarkan spesifikasi laci). Dari hasil uji coba tersebut, mekanisme

pengeluaran ini dapat berfungsi dengan baik dan mencapai tingkat keberhasilan

100%.

4.2.3. Uji Coba Pencucian Beras Otomatis

Uji coba pencucian beras secara otomatis bertujuan untuk mengecek apakah

mekanisme pencucian beras otomatis dapat membersihkan beras dari residu

proses pasca-panen. Pencucian beras dilakukan dengan menyemprotkan air ke

beras menggunakan pompa dengan debit air 3,5-4L/min selama 20 detik. Hasil

percobaan menunjukkan bahwa dengan debit air dan durasi tersebut, air hasil

cucian berubah dari agak putih menjadi lebih jernih.

4.2.4. Uji Coba Bacaan Sensor Aliran Air

Uji coba bacaan sensor aliran air bertujuan untuk menentukan berapa

calibration factor yang tepat untuk dipakai dalam pembacaan sensor aliran air

YF-S201. Pengujian dilakukan dengan membandingkan 3 buah calibration

factor, yaitu 5.5, 5.7, dan 6. Masing-masing calibration factor digunakan untuk

membaca 3 takaran air yang berbeda dengan pengulangan sebanyak 10 kali

untuk masing-masing takaran, yaitu 150 ml (titik bawah pada opsi takaran), 600

ml (titik tengah pada opsi takaran), dan 900 ml (titik atas pada opsi takaran).

97

Dari hasil pengujian yang dapat dilihat pada gambar 4.3, dapat disimpulkan

bahwa dengan menggunakan calibration factor 5.7 dihasilkan pembacaan yang

paling mendekati dengan target pembacaan, sehingga nilai tersebutlah yang

digunakan dalam program.

Gambar 4. 3 Grafik Hasil Uji Coba Bacaan Sensor Aliran Air

4.2 Implementasi dan Pengujian Sistem

Implementasi dan pengujian sistem melibatkan keseluruhan komponen

penyusun sistem, yaitu Smart Rice Cooker, server, dan perangkat Android yang

telah terpasang aplikasi Appliance Hub. Pengujian terbagi menjadi tiga bagian,

yaitu pengujian pertukaran pesan, pengujian keamanan pertukaran pesan, dan stress

test terhadap server.

Uji Coba 150 ml Uji Coba 600 ml Uji Coba 900 ml

Target 150 600 900

Calibration Factor 5.5 150 583 870

Calibration Factor 5.7 150 600 896

Calibration Factor 6.0 161 629 951

0

100

200

300

400

500

600

700

800

900

1000

Vo

lum

e A

ir (

ml)

Hasil Uji Coba Bacaan Sensor Aliran Air

98

4.2.1. Pengujian Pertukaran Pesan

Pengujian pertukaran pesan diamati dengan menggunakan aplikasi

Wireshark. Pesan yang diamati adalah pesan umum dan pesan khusus untuk

mengakses smart rice cooker yang tidak terenkripsi.

Gambar 4.4 merupakan halaman awal/login aplikasi ApplianceHub. Setelah

pengguna memasukkan username dan password yang telah terdaftar dan

menyentuh tombol “Login”, maka aplikasi akan mengirimkan paket Connect

seperti pada gambar 4.5.

Gambar 4. 4 Halaman Awal/Login pada ApplianceHub

Gambar 4. 5 Hasil Capture Pesan “Connect (Login)” pada Wireshark

99

Setelah berhasil login, maka aplikasi akan menampilkan halaman menu

utama seperti gambar 4.6. Smart rice cooker dan perangkat pintar lain milik

pengguna yang telah didaftarkan dapat diakses melalui tombol “My Appliance”.

Ketika tombol “My Appliance” disentuh, maka aplikasi akan mengirimkan

pesan “getMyAppliance” seperti gambar 4.7 untuk mengambil informasi daftar

perangkat pintar milik pengguna dan akan menerima pesan balasan

“myAppliance” seperti gambar 4.8.

Gambar 4. 6 Halaman Menu Utama pada ApplianceHub Setelah Login Berhasil

Gambar 4. 7 Hasil Capture Pesan “getMyAppliance” pada Wireshark

100

Gambar 4. 8 Hasil Capture Pesan “myAppliance” pada Wireshark

Setelah mendapatkan informasi seluruh perangkat pintar yang dimiliki

pengguna, maka aplikasi akan menampilkan halaman daftar perangkat

pengguna seperti gambar 4.9. Informasi dan pengaturan memasak pada smart

rice cooker milik pengguna dapat diakses melalui tombol dengan ikon rice

cooker. Ketika mengakses menu smart rice cooker, maka aplikasi akan

meminta informasi stok beras dan air dengan mengirimkan pesan “getRckStock”

seperti pada gambar 4.10 dan server akan membalas dengan pesan “rckStock”

seperti pada gambar 4.11. Selanjutnya, aplikasi akan menampilkan halaman

menu smart rice cooker seperti pada gambar 4.12.

Gambar 4. 9 Halaman Daftar Perangkat pada ApplianceHub

101

Gambar 4. 10 Hasil Capture Pesan “getRckStock” pada Wireshark

Gambar 4. 11 Hasil Capture Pesan “rckStock” pada Wireshark

Gambar 4. 12 Halaman Menu Smart Rice Cooker pada ApplianceHub

Ketika pengguna mengaskes menu “Cook” dan memilih mode “Rice”, maka

tampilan akan berpindah ke halaman seperti gambar 4.13. Pengguna dapat

memasukkan preferensi memasak pada halaman ini dan jika sudah selesai

mengatur, pengguna dapat menyentuh tombol “Confirm”. Aplikasi akan

mengirimkan pesan “cook” seperti pada gambar 4.14. dan ketika server

menerima pesan tersebut, maka server akan mengirimkan pesan “cmdid”

102

seperti pada gambar 4.15. Jika proses memasak telah dimulai, maka smart rice

cooker akan mengirimkan pesan “cookStarted” seperti pada gambar 4.16. Pesan

“cookFinished” seperti pada gambar 4.17 akan dikirimkan smart rice cooker

ketika proses memasak telah selesai.

Gambar 4. 13 Halaman Pengaturan Preferensi Memasak pada ApplianceHub dengan

Parameter berbeda

Gambar 4. 14 Hasil Capture Pesan “cook” pada Wireshark dengan Parameter Berbeda

103

Gambar 4. 15 Hasil Capture Pesan “cmdid” pada Wireshark dari Dua Pesan “cook”

Berbeda

Gambar 4. 16 Hasil Capture Pesan “cookStarted” pada Wireshark dari Dua Pesan “cook”

Berbeda

Gambar 4. 17 Hasil Capture Pesan “cookFinished” pada Wireshark dari Dua Pesan

“cook” Berbeda

Ketika pengguna mengaskes menu “Update Stock” maka tampilan akan

berpindah ke halaman seperti gambar 4.18. Setelah pengguna memasukkan

jumlah beras dan air yang baru diisikan dan menyentuh tombol “Confirm”,

aplikasi akan mengirimkan pesan “updateRckStock” seperti gambar 4.19. Pesan

104

ini akan diterima oleh smart rice cooker untuk dikonfirmasi berdasarkan

keberadaan penutup tempat penyimpanan beras. Pesan konfirmasi ini dapat

dilihat pada gambar 4.20. Ketika pesan konfirmasi ini diterima oleh server,

barulah data stok yang ada di basis data diperbarui.

Gambar 4. 18 Halaman Update Stock Smart Rice Cooker pada ApplianceHub

Gambar 4. 19 Hasil Capture Pesan “updateRckStock” pada Wireshark

Gambar 4. 20 Hasil Capture Pesan “confirmRckStock” pada Wireshark

Ketika pengguna mengaskes menu “Log” maka aplikasi akan mengirimkan

pesan “getLog” seperti gambar 4.21 dan tampilan akan berpindah ke halaman

seperti gambar 4.22 setelah menerima pesan “reportLog” seperti gambar 4.23.

105

Gambar 4. 21 Hasil Capture Pesan “getLog” pada Wireshark

Gambar 4. 22 Halaman Daftar Laporan Smart Rice Cooker pada ApplianceHub

Gambar 4. 23 Hasil Capture Pesan “reportLog” pada Wireshark

Ketika pengguna mengaskes menu “Unregister” maka tampilan akan

berpindah ke halaman seperti gambar 4.24. Setelah pengguna memasukkan

password untuk konfirmasi unregistration dan menyentuh tombol “Confirm”,

aplikasi akan mengirimkan pesan “unregisterMyAppliance” seperti gambar

4.25 dan jika proses unregister berhasil, maka server akan mengirimkan pesan

106

“unregisterStatus” seperti pada gambar 4.26 dan tampilan halaman daftar

perangkat akan menjadi seperti gambar 4.27.

Gambar 4. 24 Halaman Unregister Appliance pada ApplianceHub

Gambar 4. 25 Hasil Capture Pesan “unregisterMyAppliance” pada Wireshark

Gambar 4. 26 Hasil Capture Pesan “unregisterStatus” pada Wireshark

107

Gambar 4. 27 Halaman Daftar Perangkat pada ApplianceHub Setelah Unregister

Appliance

Ketika pengguna mengaskes menu “Add Appliance” dengan menyentuh

tombol “+”, tampilan halaman akan berpindah seperti gambar 4.28. Setelah

pengguna memasukkan data perangkat yang ingin ditambahkan dan menyentuh

tombol “Confirm”, aplikasi akan mengirimkan pesan “registerMyAppliance”

dan pesan “renameAppliance” seperti gambar 4.29 dan jika proses register dan

rename berhasil, maka server akan mengirimkan pesan balasan

“registrationStatus” dan “renameStatus” seperti gambar 4.30 dan tampilan

daftar perangkat serta menu smart rice cooker akan menjadi seperti gambar 4.31.

108

Gambar 4. 28 Halaman Add Appliance pada ApplianceHub

Gambar 4. 29 Hasil Capture Pesan “registerMyAppliance” dan "renameAppliance" pada

Wireshark

Gambar 4. 30 Hasil Capture Pesan “registerStatus” dan "renameStatus" pada Wireshark

109

Gambar 4. 31 Halaman Daftar Perangkat dan Menu Smart Rice Cooker pada

ApplianceHub Setelah Menambahkan Appliance

4.2.2. Pengujian Keamanan Pertukaran Pesan

Pengujian keamanan pertukaran pesan dilakukan dengan melakukan

pengamatan pesan menggunakan aplikasi Wireshark. Fokus keamanan pada

sistem ini adalah penanggulangan terhadap serangan man in the middle/sniffing,

dimana penyerang dapat menyadap pesan-pesan yang dipublikasikan pada

sistem ini jika tidak ditanggulangi. Penanggulangan yang dilakukan berupa

penggunaan OpenSSL untuk mengenkripsi komunikasi, sehingga walaupun

penyerang dapat menyadap pesan yang dipublikasikan, penyerang tidak dapat

langsung mengetahui isi pesan tersebut.

Pesan yang tidak terenkripsi dapat dilihat pada gambar 4.32 dan 4.33,

sementara pesan yang terenkripsi dapat dilihat pada gambar 4.34 dan 4.35. Pada

gambar 4.32 dan 4.33 informasi dari pesan yang dikirimkan bisa langsung

dibaca, sementara pada gambar 4.34 dan 4.35, informasi dari pesan yang

dikirimkan tidak bisa langsung dibaca karena telah dienkripsi.

110

Gambar 4. 32 Hasil Capture Pesan "login" yang Tidak Terenkripsi pada Wireshark

Gambar 4. 33 Hasil Capture Pesan "signup" yang Tidak Terenkripsi pada Wireshark

Gambar 4. 34 Hasil Capture Pesan "login" yang Terenkripsi pada Wireshark

Gambar 4. 35 Hasil Capture Pesan "signup" yang Terenkripsi pada Wireshark

111

4.2.3. Stress Test Server

Stress test server dilakukan untuk menguji ketahanan server ketika ada

banyak client yang melakukan koneksi. Pengujian dilakukan dengan

menggunakan aplikasi JMeter dengan dua variasi tes berdasarkan jumlah client.

Tes dilakukan menggunakan 3 buah thread group yang masing-masing berisi 1

MQTT publisher dengan login credential yang berbeda dan mengirimkan pesan

“getMyAppliance” setelah berhasil login dan dilakukan perulangan sebanyak 5

kali. Pada tes pertama, masing-masing thread group bertugas untuk

menjalankan 1000 MQTT publisher secara bertahap dan pada tes kedua,

masing-masing thread group bertugas untuk menjalankan 10000 MQTT

publisher secara bertahap. Dari hasil pengujian yang dapat dilihat pada tabel

4.1, dapat disimpulkan bahwa server dapat dengan baik melewati stress test

dengan error rate maksimal 1,68%.

Tabel 4. 1 Tabel Hasil Uji Coba Stress Test Server

Pengujian

ke-

Error Rate Thread

Group 1

Error Rate Thread

Group 2

Error Rate Thread

Group 3

1 0.03% 0.08% 0.18%

2 0.72% 1.28% 1.68%

112

BAB V

PENUTUP

5.1 Kesimpulan

Kesimpulan dari penelitian ini adalah sebagai berikut.

1) Sistem otomatisasi Smart Rice Cooker yang mampu menakar, mencuci, dan

memasak beras dapat terwujud dengan menggunakan dan menyusun posisi

komponen sesuai dengan rancangan spesifikasi dan mekanisme perangkat

keras yang telah dibuat;

2) Smart Rice Cooker yang dirancang dan dikembangkan pada penelitian ini

mampu berkomunikasi menggunakan protokol komunikasi Wi-Fi dan

protokol pertukaran pesan MQTT dengan menggunakan modul Wi-Fi

ESP8266 yang berupa NodeMCU development kit dan menggunakan

firmware NodeMCU. Firmware ini mendukung protokol MQTT secara

native, sehingga memudahkan pengembangan. Dukungan protokol MQTT

pada NodeMCU juga dilengkapi dengan dukungan terhadap koneksi

terenkripsi. Melalui NodeMCU inilah pengendali mikro Arduino Uno yang

bertugas mengelola sensor dan aktuator pada Smart Rice Cooker dapat

berkomunikasi dengan perangkat lain;

3) Server yang dirancang dan dikembangkan pada penelitian ini berbasis

Node.js dengan tambahan modul mosca [42] yang berperan sebagai MQTT

broker, sehingga server mampu mengatur pertukaran data antara

smartphone Android dan perangkat pintar melalui protokol pertukaran

pesan MQTT. Selain itu, juga terdapat fitur keamanan yang

113

diimplementasikan berupa enkripsi koneksi menggunakan OpenSSL agar

sulit untuk disadap dan mekanisme authentication dan authorization agar

pengguna dan perangkat yang terdaftar saja yang dapat terhubung dan

pertukaran pesan yang terjadi sesuai dengan pasangan pengguna dan

perangkatnya;

5.2 Saran

Saran yang dapat dilakukan untuk penelitian berikutnya adalah sebagai berikut.

1) Membuat Smart Rice Cooker yang memiliki ukuran yang lebih kecil dan

mekanisme mencuci beras yang lebih baik;

2) Membuat Smart Rice Cooker menjadi lebih pintar dengan menambahkan

sensor untuk memantau stok beras dan air;

3) Menambahkan fitur untuk memasak jenis olahan beras yang lain atau

makanan lain, misalnya sup pada Smart Rice Cooker;

4) Menambahkan perangkat pintar lainnya pada sistem ApplianceHub;

5) Menambahkan fitur logging error yang terjadi pada server di basis data

untuk mempermudah troubleshooting.

114

DAFTAR PUSTAKA

[1] V. Roy, "The 11 Countries that Consume the Most Rice," Insider Monkey, 15 Juni

2015. [Online]. Available: http://www.insidermonkey.com/blog/the-11-countries-

that-consume-the-most-rice-353506/. [Accessed 09 Mei 2016].

[2] BPS, "Konsumsi per Kapita Seminggu Beberapa Macam Bahan Makanan Penting,

2007-2014," 22 September 2015. [Online]. Available:

http://www.bps.go.id/LinkTabelStatis/view/id/950#accordion-daftar-subjek1.

[Accessed 09 Mei 2016].

[3] C. A. Setyanti, "3 Alasan Utama Perempuan Malas Masak," Kompas, 6 Maret

2014. [Online]. Available:

http://female.kompas.com/read/2014/03/06/1254310/3.Alasan.Utama.Perempuan.M

alas.Masak. [Accessed 2 Juni 2015].

[4] B. Krepshaw, "Smartphone talks to Panasonic rice cooker," 19 Maret 2012.

[Online]. Available: http://www.cnet.com/news/smartphone-talks-to-panasonic-

rice-cooker/. [Accessed 12 September 2015].

[5] R. Lai, "Xiaomi's 'Mi Ecosystem' starts with a smart rice cooker," 03 Maret 2016.

[Online]. Available: http://www.engadget.com/2016/03/29/xiaomi-ih-pressure-rice-

cooker/. [Accessed 21 May 2016].

[6] E. Griffith, "How to Build Your Smart Home: A Beginner's Guide," PCmag, 29

Januari 2016. [Online]. Available: http://sea.pcmag.com/digital-

home/9916/feature/how-to-build-your-smart-home-a-beginners-guide. [Accessed

09 Mei 2016].

[7] The Guardian, "Smart meters: everything you need to know," 26 Agustus 2014.

[Online]. Available: http://www.theguardian.com/british-gas-smart-meter-

challenge/2014/aug/26/smart-meters-everything-you-need-to-know. [Accessed 09

Mei 2016].

[8] T. Afiat, "Perancangan Sistem Sensor Pada Mesin Kopi Pintar Dengan

Menggunakan Protokol Komunikasi ZigBee," UMN, Tangerang, 2015.

[9] V. Beal, "Wi-Fi," [Online]. Available:

http://www.webopedia.com/TERM/W/Wi_Fi.html. [Accessed 15 July 2016].

[10] Cyber Media (India) Ltd., "Wi-Fi Will Dominate The Smart Appliance Market,"

Athena Information Solutions Pvt. Ltd., Bangalore, 2013.

[11] K. K. Patel, J. Patoliya and H. Patel, "Low Cost Home Automation with ESP8266

and Lightweight Protocol MQTT," Transactions on Engineering and Sciences, vol.

3, no. 6, pp. 14-19, 2015.

115

[12] MQTT, "MQTT Frequently Asked Questions," [Online]. Available:

http://mqtt.org/faq. [Accessed 25 Juni 2016].

[13] Techopedia, "Smart Device," [Online]. Available:

https://www.techopedia.com/definition/31463/smart-device. [Accessed 28 Juni

2016].

[14] "Siliconindia," [Online]. Available:

http://www.siliconindia.com/news/newsimages/bigimages/109778-top.jpg.

[Accessed 28 Juni 2016].

[15] A. Rizal, "Xiaomi Smart Rice Cooker Bisa Kenali 200 Varian Beras," 5 April 2016.

[Online]. Available: http://www.infokomputer.com/2016/04/berita/berita-

reguler/xiaomi-smart-rice-cooker-bisa-kenali-200-varian-beras/. [Accessed 2016

Juni 28].

[16] V. Palladino, "Xiaomi introduces Mi Ecosystem with new smart rice cooker," 29

Maret 2016. [Online]. Available: http://arstechnica.com/gadgets/2016/03/xiaomi-

introduces-mi-ecosystem-with-new-smart-rice-cooker/. [Accessed 28 Juni 2016].

[17] Xiaomi, "Xiaomi MiJia Induction Heating Pressure Rice Cooker," [Online].

Available: http://xiaomi-mi.com/mi-smart-home/xiaomi-mijia-induction-heating-

pressure-rice-cooker/. [Accessed 28 Juni 2016].

[18] Vania, "Perancangan Smart Dog Feeder Menggunakan Protokol Komunikasi WiFi

dan MQTT Serta Client Berbasis Android," UMN, Tangerang, 2016.

[19] F. Durand, "How To Cook Rice on the Stove," 20 September 2015. [Online].

Available: http://www.thekitchn.com/how-to-cook-rice-on-the-stove-44333.

[Accessed 28 Juni 2016].

[20] "How to Cook Multigrain Rice or Brown Rice in a Rice Cooker," [Online].

Available: http://crazykoreancooking.com/recipe/how-cook-multigrain-rice-or-

brown-rice-rice-cooker?serve=1#ingr. [Accessed 28 Juni 2016].

[21] Marvellina, "How to Make Rice Porridge," [Online]. Available:

http://whattocooktoday.com/how-to-make-rice-porridge.html. [Accessed 28 Juni

2016].

[22] Arduino, "Arduino UNO (USA ONLY) & Genuino UNO (OUTSIDE USA),"

Arduino, [Online]. Available: https://www.arduino.cc/en/Main/ArduinoBoardUno.

[Accessed 08 Juni 2016].

[23] Arduino, "Getting Started with Arduino on Windows," [Online]. Available:

https://www.arduino.cc/en/Guide/Windows. [Accessed 5 January 2016].

[24] M. Mehta, "ESP 8266: A Breakthrough in Wireless Sensor Networks and Internet

of Things," International Journal of Electronics and Communication Engineering

& Technology, vol. 6, no. 8, pp. 7-11, 2015.

116

[25] C. Orvin, "Rancang Bangun Sistem Smart Medicine Dispenser Menggunakan

Protokol Komunikasi Wi-Fi dan Protokol Pertukaran Pesan MQTT," UMN,

Tangerang, 2016.

[26] NodeMCU, "NodeMCU Documentation," [Online]. Available:

https://nodemcu.readthedocs.io/en/master/. [Accessed 28 Juni 2016].

[27] NodeMCU, "NodeMCU Connect Things EASY," [Online]. Available:

http://nodemcu.com/index_en.html. [Accessed 9 Juni 2016].

[28] F. Reed, "How Do Servo Motors Work," [Online]. Available:

http://www.jameco.com/jameco/workshop/howitworks/how-servo-motors-

work.html. [Accessed 28 Juni 2016].

[29] TowerPro, "MG995 Robot servo 180° Rotation," [Online]. Available:

http://www.towerpro.com.tw/product/mg995-robot-servo-180-rotation-2/.

[Accessed 28 Juni 2016].

[30] Flipkart, "MG995," [Online]. Available: http://img6a.flixcart.com/image/learning-

toy/j/b/m/rotobotix-rotobotix-towerpro-mg995-servo-motor-400x400-

imae7qts4yvecyyz.jpeg. [Accessed 28 Juni 2016].

[31] Maximintegrated, "Real-Time Clocks (RTC) ICs," [Online]. Available:

https://www.maximintegrated.com/en/products/digital/real-time-clocks.html.

[Accessed 28 Juni 2016].

[32] "DS3231 High Precision Real-Time Clock Module," [Online]. Available:

http://www.dx.com/p/ds3231-high-precision-real-time-clock-module-blue-3-3-5-

5v-222910#.V4Ng6hV97tQ. [Accessed 28 Juni 2016].

[33] Adafruit, "NEW PRODUCT – Liquid Flow Meter – Plastic 1/2 NPT Threaded,"

[Online]. Available: https://blog.adafruit.com/2012/05/09/new-product-liquid-flow-

meter-plastic-12-npt-threaded/. [Accessed 12 September 2015].

[34] D. Kho, "Pengertian Relay dan Fungsinya," 7 March 2015. [Online]. Available:

http://teknikelektronika.com/pengertian-relay-fungsi-relay/. [Accessed 30 October

2015].

[35] HiveMQ, "MQTT Essentials: Part 1 – Introducing MQTT," HiveMQ, [Online].

Available: http://www.hivemq.com/blog/mqtt-essentials-part-1-introducing-mqtt.

[Accessed 25 Juni 2016].

[36] ppatierno, "Message Flow," 11 November 2013. [Online]. Available:

http://www.embedded101.com/Develop-M2M-IoT-Devices-

Ebook/DevelopM2MIoTDevicesContent/ArticleId/224/3-7-Message-Flow.

[Accessed 26 Juni 2016].

[37] HiveMQ, "Introducing the MQTT Security Fundamentals," HiveMQ, [Online].

Available: http://www.hivemq.com/blog/introducing-the-mqtt-security-

fundamentals. [Accessed 25 Juni 2016].

117

[38] Node.js, "Home," [Online]. Available: https://nodejs.org/en/. [Accessed 27 Juni

2016].

[39] Node.js, "About Node.js," [Online]. Available: https://nodejs.org/en/about/.

[Accessed 27 Juni 2016].

[40] L. Orsini, "What You Need To Know About Node.js," 7 November 2013. [Online].

Available: http://readwrite.com/2013/11/07/what-you-need-to-know-about-nodejs/.

[Accessed 27 Juni 2016].

[41] B. S. Souci and M. Lemaire, "An Inside Look at the Architecture of NodeJS,"

McGill, Montreal West.

[42] M. Collina, "Mosca," [Online]. Available: https://github.com/mcollina/mosca.

[Accessed March 2016].

[43] "MysqlJS," [Online]. Available: https://github.com/mysqljs. [Accessed March

2016].

[44] JSON.org, "Introducing JSON," [Online]. Available: http://www.json.org/.

[Accessed 28 Juni 2016].

[45] Android, "Powering screens of all sizes," [Online]. Available:

https://www.android.com/. [Accessed 30 Juni 2016].

[46] Statista, "Global market share held by the leading smartphone operating systems in

sales to end users from 1st quarter 2009 to 1st quarter 2016," [Online]. Available:

http://www.statista.com/statistics/266136/global-market-share-held-by-smartphone-

operating-systems/. [Accessed 28 Juni 2016].

I

LAMPIRAN 1. FLOWCHART

LAMPIRAN 1.1 Flowchart Pemrosesan Pesan pada Server

Query insert user data to database

Insert success?

Publish signupStatus

Fail

Publish signupStatus

Success

No

Yes

Query select owner from database

Owner found?

Publish Owner

Not Found

No

Publish Owner Found

Yes

Query select appliance data from

database

Data found?

Publish:myAppliance

Not Found

Publish:myAppliance with its data

No

Yes

1

31

2 3

Query update appliance status

ACTIVE

4

Query update owner data to

database

Update success?

Publish registrationStatus Fail

Publish registration

Status Success

No

Yes

Query update owner data to

database

Update success?

Publish unregisterStatus Fail

No

Publish unregister

Status Success

Yes

Query select user data from database

Data found?

Publish:myProfile Not Found

Publish:myProfile with

its data

No

Yes

31

5 6

II

7

Query update user profile data

to database

Update success?

Publish updateProfile

Status Fail

Publish updateProfile

Status Fail

No

Yes

Query update user password data to

database

Update success?

Publish updatePasswordStatus

Fail

No

Publish updatePasswordStatus

Success

Yes

Query update appliance nickname

to database

Update success?

Publish:renameStatus

Fail

Publish:renameStatus

Success

No

Yes

31

8 9

10

Query select appliance status from database

Data found?

Publish applianceStatus Not

Found

Publish appliance

Status Active/Inactive

No

Yes

Query select report log data from

database

Data found?Publish

reportLog Not Found

No

Publish reportLog

with its data

Yes

Query update appliance status to

database

31

11 12

III

13

Query insert command to

database

Insert success?

Publish cmdid

-1

Publish cmdid

No

Yes

Query select command cook from database

Data found?Publish cook

command Not Found

No

Publish cook command

with its data and cmdid

Yes

Query update cook command

timestamp to database

31

14 15

16

Query insert report to database

Query update rckStock to database

Query select rice cooker stock from

database

Data found?

Publish:rckStock

Not Found

Publish:rckStock

with its data

No

Yes

Confirmation = OK?

Yes

31

No

17 18

IV

19

Query insert command to

database

Insert success?

Publish cmdid

-1

Publish cmdid

No

Yes

Query update medicine command

timestamp to database

Query select medicine command

from database

Data Found?

Publish:medicine

command Not Found

Publish:medicine with

its data

No

Yes

31

20 21

22

Query insert report to database

Query update medStock to

database

Query select medicine stock from

database

Data found?

Publish:smdStock Not

Found

Publish:smdStock with

its data

No

Yes

confirmation = OK?

Yes

31

No

23 24

V

25

Query insert command to

database

Insert success?

Publish cmdid

-1

Publish cmdid

No

Yes

Query select command feed from

database

Data found?Publish feed

command Not Found

No

Publish feed command

with its data and cmdid

Yes

Query update feed command

timestamp to database

31

26 27

28

Query insert report to database

Query update feeder stock to

database

Query select feeder stock from database

Data found?

Publish:sdfStock Not

Found

Publish:sdfStock with

its data

No

Yes

Confirmation = OK?

Yes

31

No

29 30

VI

LAMPIRAN 1.2 Flowchart Pemrosesan Pesan pada ESP8266

Re

ceiv

e d

ata

fro

m S

erv

er

Star

tP

roce

ss m

ess

age

fro

m

Serv

er

Sub

rou

tin

e

Dat

a !=

nil

?

2n

d t

ier

top

ic =

=

seri

al n

um

be

r?

Yes

2n

d t

ier

top

ic =

=

ow

ne

r?

No

job

j = J

SON

de

cod

e d

ata

job

j.msg

==

o

wn

er”

An

d

job

j.ow

ne

r !=

N

OTF

OU

ND”

Sub

scri

be

to

rck/

<o

wn

er>”

Yes

Pu

blis

h

getC

oo

kSch

ed

ule

Pu

blis

h

getR

ckSt

ock

End

No

Yes

job

j.msg

==

co

ok” a

nd

co

okS

tatu

s =

= f

alse

an

d jo

bj.r

ice

!=

-1

an

d jo

bj.w

ate

r !=

-1

an

d

job

j.ap

plia

nce

seri

al =

= s

n

Yes

job

j.msg

==

cm

did”

and

jo

bj.a

pp

lian

cese

rial

==

sn

an

d

tem

pM

sg =

=

coo

k” a

nd

jo

bj.c

md

id !

= -

1

job

j.msg

==

u

pd

ate

Rck

Sto

ck”

and

jo

bj.a

pp

lian

cese

rial

==

sn

job

j.msg

==

rc

kSto

ck”

and

jo

bj.r

ice

!=

-1

an

d jo

bj.w

ate

r !=

-1

an

d jo

bj.a

pp

lian

cese

rial

==

sn

No

No

No

tem

pM

sg =

job

j.msg

tem

pR

ice

= jo

bj.r

ice

tem

pW

ate

r =

job

j.wat

er

tem

pM

od

e =

job

j.mo

de

tem

pC

oo

kSch

ed

=

job

j.co

okS

che

du

le

Yes

Pri

nt

coo

k w

ith

its

par

ame

ters

to

A

rdu

ino

Yes

con

sum

ed

Ric

e =

te

mp

Ric

eco

nsu

me

dW

ate

r =

te

mp

Wat

er

tem

pM

sg =

""

tem

pR

ice

= 0

tem

pW

ate

r =

0te

mp

Mo

de

= "

"

Forw

ard

me

ssag

e

to A

rdu

ino

Yes

rice

No

w =

job

j.ric

ew

ate

rNo

w =

job

j.wat

er

Yes

No

No

No

VII

Receive Serial data from Arduino

fromArd.msg == cookStarted ?

Rprt == cookFinished?

fromArd = cjson.decode(data)

cookStatus = falsericeNow = riceNow - consumedRice

waterNow = waterNow - consumeWater

No

YesYes

cookStatus = true

Start

Publish Received

Data

Publish confirmRckStock

End

No

Process message from Arduino Subroutine

VIII

LAMPIRAN 1.3 Flowchart Sub-Subroutine Pada Subroutine “Cook”

rBoxServo write 90

rBoxServo write 0

Delay 5000ms

Delay 5000ms

Start

End

dumpToClean Subroutine

Rotate rBoxServo to push rice box drawer

Rotate rBoxServo to close/pull rice box drawer

Set p_washRelay

LOW

Delay 20000ms

Set p_washRelay

HIGH

Delay 5000ms

Start

End

cleanRice Subroutine

Turn on water pump

Turn off water pump

washServo write 52

washServo write 120

Delay 20000ms

Delay 1000ms

Start

End

dumpToRiceCooker Subroutine

Rotate washServo to place dumped rice on wash position

Rotate washServo to dump washed rice to rice cooker

IX

pulseCount = 0flowRate = 0

flowMilliLitres = 0totalMilliLitres = 0

Start

washServo write 125

oldTime = millis()

Activate Timer0 interrupt

liters < water

f = HIGH?

pulseCount + 1

Yes

Yes

washServo write 80

No

Delay 5000ms

lidServo write 175

Delay 3000ms

lidServo write 90

End

addWater Subroutine

Rotate washServo to open water tap

Rotate washServo to close water tap

f = digitalRead(p_flowSensor )

liters = pulseCount

liters = (liters/5.7)/60

No

Deactivate Timer0 interrupt

Rotate lidServo to close rice cooker lid

Rotate lidServo to normal position

X

Start

mode =?

Set p_modeCook LOW

Delay 400ms

Set p_modeCook HIGH

Set p_modePorridge LOW

Delay 400ms

Set p_modePorridge HIGH

RICE PORRIDGE

End

startCook Subroutine

Simulate Bounceless Button at Rice Cooker

LAMPIRAN 2. KODE PROGRAM

LAMPIRAN 2.1 Kode Program Arduino

#include <DS3232RTC.h>

#include <Time.h>

#include <Wire.h>

#include <ArduinoJson.h>

//Pin Definitions

#define p_flowSensor 2

#define p_washRelay 4

#define p_rBoxServo 5

#define p_modeCook 6

#define p_modePorridge 7

#define p_cancel 8

#define p_waterServo 9

#define p_washServo 10

#define p_lidServo 11

#define p_rBoxLid 12

//constants for dumping rice from ricebox mechanism

#define ricePerDump 150

#define t_dumpRiceBox 5000

XI

#define t_fillDrawer 5000

#define pullDirection 90

#define pushDirection 0

//constants for washing mechanism

#define t_clean 20000

#define t_dry 5000

#define washDirection 52

#define dumpDirection 120

#define t_dumpRiceCooker 5000

//constants and variables for water flow mechanism

volatile uint16_t pulses = 0;

float liters = 0.0;

//constants for closing rice cooker lid

#define openDirection 90

#define closeDirection 175

Servo rBoxServo,washServo,lidServo,waterServo;

#define rBoxLidNotPresentValue 1

#define MAX_BUFF 200

const int IN_BUF_SIZE = JSON_OBJECT_SIZE(7);//+JSON_ARRAY_SIZE();

const int OUT_BUF_SIZE = JSON_OBJECT_SIZE(12);

String inputString = "";

String ctimestamp,rtimestamp;

boolean stringComplete = false;

char crecv[MAX_BUFF];

char msg[20];

char mode[10];

char schedule[8];

char applianceserial[15];

int cookStatus,rice,water,cmdid,cookTime,porridgeTime;

void setup() {

XII

// put your setup code here, to run once:

Serial.begin(9600);

setSyncProvider(RTC.get);

inputString.reserve(MAX_BUFF);

cookStatus = 0;

rice = 0;

water = 0;

cmdid = 0;

cookTime = 0;

porridgeTime = 50;

ctimestamp.reserve(20);

rtimestamp.reserve(20);

RTC.alarmInterrupt(ALARM_1,true);

RTC.alarmInterrupt(ALARM_2, false);

pinMode(p_rBoxLid,INPUT);

digitalWrite(p_rBoxLid,HIGH);

pinMode(p_washRelay,OUTPUT);

pinMode(p_flowSensor,INPUT);

digitalWrite(p_flowSensor,HIGH);

pinMode(p_rBoxLid,INPUT);

digitalWrite(p_rBoxLid,HIGH);

digitalWrite(p_washRelay,HIGH);

rBoxServo.attach(p_rBoxServo);

rBoxServo.write(pullDirection);

washServo.attach(p_washServo);

washServo.write(washDirection);

lidServo.attach(p_lidServo);

lidServo.write(openDirection);

waterServo.attach(p_waterServo);

waterServo.write(closeFlowDirection);

XIII

}

void loop() {

// put your main code here, to run repeatedly:

if (stringComplete) {

inputString.toCharArray(crecv,inputString.length());

StaticJsonBuffer<IN_BUF_SIZE> injbuff;

JsonObject& injobj = injbuff.parseObject(crecv);

if (!injobj.success()){

inputString = "";

memset(crecv, 0, sizeof(crecv));

stringComplete = false;

return;

}

strcpy(msg,injobj["msg"]);

if(strcmp(msg,"cook") == 0 && cookStatus == 0){

rice = injobj["rice"];

water = injobj["water"];

strcpy(mode,injobj["mode"]);

cmdid = injobj["cmdid"];

strcpy(schedule,injobj["cookSchedule"]);

if(strcmp(mode,"RICE")==0){

if(rice==150) cookTime = 40;

else if(rice==300) cookTime = 50;

else if(rice==450) cookTime = 60;

else if(rice==600) cookTime = 70;

}

if(strcmp(schedule,"NOW")==0){

cook();

}

else{

cookStatus = 2;

int h,m;

h = extractHour(schedule);

m = extractMinute(schedule);

RTC.setAlarm(ALM1_MATCH_HOURS,m,h,day());

XIV

}

}

else if(strcmp(msg,"updateRckStock")==0){

StaticJsonBuffer<OUT_BUF_SIZE> outjbuff3;

JsonObject& outjobj3 = outjbuff3.createObject();

outjobj3["msg"] = "confirmRckStock";

outjobj3["applianceserial"] = applianceserial;

outjobj3["water"] = injobj["water"];

outjobj3["rice"] = injobj["rice"];

if(digitalRead(p_rBoxLid)==rBoxLidNotPresentValue){

outjobj3["confirmation"] = "OK";

}

else{

outjobj3["confirmation"] = "NOK";

}

outjobj3.printTo(Serial);

}

else if(strcmp(msg,"setApplianceSerial")==0){

strcpy(applianceserial,injobj["applianceserial"]);

}

inputString = "";

memset(crecv, 0, sizeof(crecv));

stringComplete = false;

}

if (RTC.alarm(ALARM_1)){

if(cookStatus == 1){

StaticJsonBuffer<OUT_BUF_SIZE> outjbuff2;

JsonObject& outjobj2 = outjbuff2.createObject();

cookStatus = 0;

outjobj2["msg"] = "cookFinished";

outjobj2["applianceserial"] = applianceserial;

if(strcmp(mode,"RICE")==0){

outjobj2["rprt"] = "Rice cooking have been completed";

}

else if(strcmp(mode,"PORRIDGE")==0){

XV

outjobj2["rprt"] = "Porridge cooking have been completed";

}

rtimestamp = year();

rtimestamp += "-";

rtimestamp += month();

rtimestamp += "-";

rtimestamp += day();

rtimestamp += " ";

rtimestamp += hour();

rtimestamp += ":";

rtimestamp += minute();

rtimestamp += ":";

rtimestamp += second();

outjobj2["rtimestamp"] = rtimestamp;

outjobj2["cmdid"] = cmdid;

outjobj2.printTo(Serial);

}

else if (cookStatus == 2){

cook();

}

}

}

void serialEvent(){

while (Serial.available()) {

char inChar = (char)Serial.read();

inputString += inChar;

if (inChar == '\n') {

stringComplete = true;

}

}

}

void cook(){

prepare();

startCook(mode);

XVI

cookStatus = 1;

StaticJsonBuffer<OUT_BUF_SIZE> outjbuff;

JsonObject& outjobj = outjbuff.createObject();

outjobj["msg"] = "cookStarted";

ctimestamp = year();

ctimestamp += "-";

ctimestamp += month();

ctimestamp += "-";

ctimestamp += day();

ctimestamp += " ";

ctimestamp += hour();

ctimestamp += ":";

ctimestamp += minute();

ctimestamp += ":";

ctimestamp += second();

outjobj["ctimestamp"] = ctimestamp;

outjobj["cmdid"] = cmdid;

outjobj.printTo(Serial);

int s = second();

int m = minute();

int h = hour();

int d = day();

if(strcmp(mode,"RICE")==0){

if(m+cookTime >= 60){

RTC.setAlarm(ALM1_MATCH_HOURS,s,(m+cookTime)%60,h+1,d);

}

else{

RTC.setAlarm(ALM1_MATCH_HOURS,s,m+cookTime,h,d);

}

}

else if(strcmp(mode,"PORRIDGE")==0){

if(m+porridgeTime >= 60){

RTC.setAlarm(ALM1_MATCH_HOURS,s,(m+porridgeTime)%60,h+1,d);

}

XVII

else{

RTC.setAlarm(ALM1_MATCH_HOURS,s,m+porridgeTime,h,d);

}

}

}

int extractHour(char t[]){

char h[2];

for(int n = 0; n<2;n++){

h[n]=t[n];

}

return atoi(h);

}

int extractMinute(char t[]){

char m[2];

for(int n = 0; n<2;n++){

m[n]=t[n+3];

}

return atoi(m);

}

void prepare(){

for(int n = 0; n<(rice/ricePerDump);n++){

dumpToClean(rice);

cleanRice();

dumpToRiceCooker();

}

addWater(water);

}

void dumpToClean(int r){

// TODO:

// drive motor servo that attached on rice box

for(int n = pullDirection; n >= pushDirection; n-=4){

rBoxServo.write(n);

delay(40);

}

XVIII

rBoxServo.write(pushDirection);

delay(t_dumpRiceBox);

for(int n = pushDirection; n <= pullDirection; n+=4){

rBoxServo.write(n);

delay(40);

}

rBoxServo.write(pullDirection);

delay(t_fillDrawer);

}

void cleanRice(){

// TODO:

// turn on pump for clean water for x minutes

// turn off pump

digitalWrite(p_washRelay,LOW);

delay(t_clean);

digitalWrite(p_washRelay,HIGH);

delay(t_dry);

}

void dumpToRiceCooker(){

// TODO:

// dump after washing rice mechanism

for(int n = washDirection; n <= dumpDirection; n+=4){

washServo.write(n);

delay(40);

}

washServo.write(dumpDirection);

delay(t_dumpRiceCooker);

for(int n = dumpDirection; n >= washDirection; n-=4){

washServo.write(n);

delay(40);

}

washServo.write(washDirection);

delay(1000);

}

void openTap(){

for(int n = closeFlowDirection; n >= openFlowDirection; n-=6){

XIX

waterServo.write(n);

delay(60);

}

waterServo.write(openFlowDirection);

}

void closeTap(){

for(int n = openFlowDirection; n <= closeFlowDirection; n+=6){

waterServo.write(n);

delay(60);

}

waterServo.write(closeFlowDirection);

}

SIGNAL(TIMER0_COMPA_vect) {

uint8_t x = digitalRead(p_flowSensor);

if (x == HIGH) {

//low to high transition!

pulses++;

}

}

void useInterrupt(boolean v) {

if (v) {

// Timer0 is already used for millis() - we'll just interrupt somewhere

// in the middle and call the "Compare A" function above

OCR0A = 0xAF;

TIMSK0 |= _BV(OCIE0A);

} else {

// do not call the interrupt function COMPA anymore

TIMSK0 &= ~_BV(OCIE0A);

}

}

void closeRiceCookerLid(){

for(int n = openDirection; n <= closeDirection; n+=6){

lidServo.write(n);

delay(60);

XX

}

lidServo.write(closeDirection);

delay(3000);

for(int n = closeDirection; n >= openDirection; n-=6){

lidServo.write(n);

delay(60);

}

lidServo.write(openDirection);

}

void addWater(int w){

useInterrupt(true);

openTap();

while(liters < (w/1000)){

liters = pulses;

liters /= 5.7;

liters /= 60.0;

delay(100);

}

closeTap();

useInterrupt(false);

}

LAMPIRAN 2.2 Kode Program ESP8266 (Init.lua) [25]

-- file : init.lua

app = require("application")

config = require("config")

setup = require("setup")

setup.start()

LAMPIRAN 2.3 Kode Program ESP8266 (Config.lua)

-- file : config.lua

local module = {}

module.SSID = {}

module.SSID["Bengkel (Bohongan)"] = "bengkel513"

module.HOST = "192.168.68.102"

XXI

module.PORT = 1883

module.ID = node.chipid()

module.pass = "rck789123456"

module.applianceType = "rck"

module.ENDPOINT = "/"..module.applianceType

return module

LAMPIRAN 2.4 Kode Program ESP8266 (Setup.lua) [25]

-- file: setup.lua

local module = {}

local function wifi_wait_ip()

if wifi.sta.getip()== nil then

--print("IP unavailable, Waiting...")

else

tmr.stop(1)

app.start()

end

end

local function wifi_start(list_aps)

if list_aps then

for key,value in pairs(list_aps) do

if config.SSID and config.SSID[key] then

wifi.setmode(wifi.STATION);

wifi.sta.config(key,config.SSID[key])

wifi.sta.connect()

tmr.alarm(1, 2500, 1, wifi_wait_ip)

end

end

else

--print("Error getting AP list")

end

end

function module.start()

wifi.setmode(wifi.STATION);

XXII

wifi.sta.getap(wifi_start)

end

return module

LAMPIRAN 2.5 Kode Program ESP8266 (Application.lua) [25]

-- file : application.lua

local cjson = require "cjson"

local module = {}

m = nil

local sn = nil

local owner = ""

local tempMsg = ""

local tempRice = 0

local tempWater = 0

local tempMode = ""

local tempCookSched = nil

local cookStatus = false

local consumedWater = 0

local consumedRice = 0

local riceNow = 0

local waterNow = 0

local function publishData(topic,payload)

m:publish(config.ENDPOINT .. topic,payload,1,0)

end

local function subscribeTopic(topic)

m:subscribe(config.ENDPOINT .. topic,1)

end

local function convertMACToSN(mac)

return (mac:gsub('%:', '')):sub(1,12)

end

local function mqtt_start()

sn = convertMACToSN(wifi.sta.getmac())

--give arduino our SN

XXIII

print("}")

giveSN =

"{\"msg\":\"setApplianceSerial\",\"applianceserial\":\""..sn.."\"}"

print(giveSN)

m = mqtt.Client(config.ID, 120,config.applianceType.."#"..sn,config.pass)

-- register message callback beforehand

m:on("message", function(conn, topic, data)

if (data ~= nil) then

-- do something, we have received a message

jobj = cjson.decode(data)

if (topic == config.ENDPOINT.."/"..sn) then

if (jobj.msg == "owner" and jobj.owner ~= "NOTFOUND") then

owner = jobj.owner

subscribeTopic("/"..owner)

snd =

"{\"msg\":\"getCookSchedule\",\"owner\":\""..owner.."\",\"applianceserial\":\""..s

n.."\"}"

publishData("/"..owner,snd)

snd =

"{\"msg\":\"getRckStock\",\"applianceserial\":\""..sn.."\"}"

publishData("/"..owner,snd)

end

else if (topic == config.ENDPOINT.."/"..owner) then

if (jobj.msg == "cook" and not cookStatus and jobj.rice ~= -

1 and jobj.water ~= -1 and jobj.applianceserial == sn) then

tempMsg = jobj.msg

tempRice = jobj.rice

tempWater = jobj.water

tempMode = jobj.mode

tempCookSched = jobj.cookSchedule

else if (jobj.msg == "cmdid" and jobj.applianceserial == sn

and tempMsg == "cook" and jobj.cmdid ~= -1) then

toArduino =

"{\"msg\":\"cook\",\"rice\":"..tempRice..",\"water\":"..tempWater..",\"mode\":\"".

.tempMode.."\",\"cmdid\":"..jobj.cmdid..",\"cookSchedule\":\""..tempCookSched.."\"

}"

print(toArduino)

XXIV

consumedRice = tempRice

consumedWater = tempWater

tempMsg = ""

tempRice = 0

tempWater = 0

tempMode = ""

else if (jobj.msg == "updateRckStock" and

jobj.applianceserial == sn) then

jo = cjson.encode(jobj)

print(jo)

else if(jobj.msg == "rckStock" and jobj.rice ~= -1 and

jobj.water ~= -1 and jobj.applianceserial == sn) then

riceNow = jobj.rice

waterNow = jobj.water

end

end

end

end

end

end

end

end)

-- Do something when received data from Arduino

uart.on("data","}",function(data)

publishData("/"..owner,data)

fromArd = cjson.decode(data)

if(fromArd.msg=="cookStarted") then

cookStatus = true

else if(fromArd.msg=="cookFinished") then

cookStatus = false

riceNow = riceNow - consumedRice

waterNow = waterNow - consumedWater

snd =

"{\"msg\":\"confirmRckStock\",\"applianceserial\":\""..sn.."\",\"confirmation\":\"

OK\",\"rice\":"..riceNow..",\"water\":"..waterNow.."}"

publishData("/"..owner,snd)

end

end

end,0)

XXV

--LWT

m:lwt("/lwt","{\"msg\":\"offline\",\"applianceserial\":\""..sn.."\"}",1)

-- Connect to broker

m:connect(config.HOST, config.PORT,0 ,1)

-- When connected, subscribe to /<type>/<serial_number> to get owner

m:on("connect", function(client)

subscribeTopic("/"..sn)

snd = "{\"msg\":\"getOwner\",\"applianceserial\":\""..sn.."\"}"

publishData("/"..sn,snd)

end)

end

function module.start()

mqtt_start()

end

return module

LAMPIRAN 2.6 Kode Program Server

var mosca = require('mosca');

var mysql = require('mysql');

var myKeyPath = 'certs/selfsigned/server-key.pem';

var myCertPath = 'certs/selfsigned/server-cert.pem';

var JSONstr = '';

var q = '';

var connection = mysql.createConnection({

host : 'localhost',

user : 'root',

password : '',

database : 'appliancehub'

});

connection.connect(function (err) {

if (err) {

console.error('error connecting: ' + err.stack);

return;

}

XXVI

console.log('Connected to MySql as id ' + connection.threadId);

});

var authenticate = function (client, username, password, callback) {

if (typeof(username) != "undefined") {

if (username.charAt(6) == '#') {

if (username.substring(0, 6) == "signup") {

client.user = username.substring(7,

username.length);

client.user2 = username.substring(7,

username.length);

callback(null, true);

} else {

callback(null, false);

}

} else if (username.charAt(3) == '#') {

var type = username.substring(0, 3);

var sn = username.substring(4, username.length);

q = 'SELECT ad.owner FROM appliancemaster am,

appliancedetail ad WHERE ad.applianceserial = ' + mysql.escape(sn) + ' AND

ad.applianceid = am.applianceid AND am.applianceid = ' + mysql.escape(type) + '

AND ad.password = ' + mysql.escape(password.toString()) + ';';

connection.query(q, function (err, rows) {

if (err) {

callback(null, false);

} else if (rows.length !== 0 && rows[0].owner !==

null && rows[0].owner !== '') {

client.user = rows[0].owner;

client.user2 = sn;

callback(null, true);

} else

callback(null, false);

});

} else {

q = 'SELECT username FROM user WHERE username = ' +

mysql.escape(username.toString()) + ' AND password = ' +

mysql.escape(password.toString());

connection.query(q, function (err, rows) {

if (err) {

callback(null, false);

} else if (rows.length !== 0) {

client.user = username;

client.user2 = username;

JSONstr =

'{"msg":"loginStatus","status":"SUCCESS"}';

XXVII

encodeReply(JSONstr, "/general/" + username);

callback(null, true);

} else {

JSONstr =

'{"msg":"loginStatus","status":"FAIL"}';

encodeReply(JSONstr, "/general/" + username);

callback(null, false);

}

});

}

} else {

callback(null, false);

}

};

var authorizePublish = function (client, topic, payload, callback) {

callback(null, client.user == topic.split('/')[2] || client.user2 ==

topic.split('/')[2] || "lwt" == topic.split('/')[1]);

};

var authorizeSubscribe = function (client, topic, callback) {

callback(null, client.user == topic.split('/')[2] || client.user2 ==

topic.split('/')[2] || "lwt" == topic.split('/')[1]);

};

var ascoltatore = {

type : 'mqtt',

mqtt : require('mqtt'),

host : '127.0.0.1',

port : 1880

};

var moscaSettings = {

port : 1883,

backend : ascoltatore,

};

var server = new mosca.Server(moscaSettings);

server.on('ready', function () {

console.log('Appliance Hub server is up and running');

server.authenticate = authenticate;

server.authorizeSubscribe = authorizeSubscribe;

server.authorizePublish = authorizePublish;

});

server.on('clientConnected', function (client) {

console.log('Client connected', client.id);

XXVIII

});

function encodeReply(JSONstring, tpc) {

var rply = {

topic : tpc,

payload : JSONstring,

qos : 1,

retain : false

};

server.publish(rply);

console.log("Server published " + JSONstring + " to " + tpc);

}

server.on('published', function (packet, client) {

var packetOverhead = packet.topic.substring(0, 4);

if (packetOverhead != "$SYS") {

if (typeof client != "undefined") {

console.log("Server received " + packet.payload.toString() +

" at " + packet.topic + " from " + client.id);

}

try {

var JSONmsg = JSON.parse(packet.payload);

} catch (e) {

return console.error(e);

}

if (JSONmsg.msg == "signup") {

q = 'INSERT INTO user VALUES ("' + JSONmsg.username + '","'

+ JSONmsg.password + '","' + JSONmsg.fullname + '","' + JSONmsg.email + '","' +

JSONmsg.phone + '");';

connection.query(q, function (err, rows) {

if (err) {

JSONstr =

'{"msg":"signupStatus","status":"FAIL"}';

encodeReply(JSONstr, packet.topic);

return console.error(err);

} else {

if (rows.affectedRows == 1) {

JSONstr =

'{"msg":"signupStatus","status":"SUCCESS"}';

encodeReply(JSONstr, packet.topic);

} else if (rows.affectedRows != 1) {

JSONstr =

'{"msg":"signupStatus","status":"FAIL"}';

encodeReply(JSONstr, packet.topic);

XXIX

}

}

});

} else if (JSONmsg.msg == "getOwner") {

q = 'SELECT owner FROM appliancedetail WHERE applianceserial

= "' + JSONmsg.applianceserial + '";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.length > 0) {

JSONstr = '{"msg":"owner","owner":"'

+ rows[0].owner + '"}';

encodeReply(JSONstr, packet.topic);

} else if (rows.length === 0) {

JSONstr =

'{"msg":"owner","owner":"NOTFOUND"}';

encodeReply(JSONstr, packet.topic);

}

}

});

q = 'UPDATE appliancedetail SET status = "ACTIVE" WHERE

applianceserial = "' + JSONmsg.applianceserial + '";';

connection.query(q, function (err, rows) {

if (err)

throw err;

});

} else if (JSONmsg.msg == "getMyAppliance") {

q = 'SELECT applianceid, applianceserial,nickname,status

FROM appliancedetail WHERE owner="' + JSONmsg.owner + '" ORDER BY nickname ASC;';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.length > 0) {

JSONstr =

'{"msg":"myAppliance","dat":[';

for (n = 0; n < rows.length; n++) {

if (n == rows.length - 1) {

JSONstr +=

'{"applianceserial":"' + rows[n].applianceserial + '","applianceid":"' +

rows[n].applianceid + '","nickname":"' + rows[n].nickname + '","status":"' +

rows[n].status + '"}]}';

} else {

XXX

JSONstr +=

'{"applianceserial":"' + rows[n].applianceserial + '","applianceid":"' +

rows[n].applianceid + '","nickname":"' + rows[n].nickname + '","status":"' +

rows[n].status + '"},';

}

}

encodeReply(JSONstr, packet.topic);

} else if (rows.length === 0) {

JSONstr =

'{"msg":"myAppliance","dat":"NOTFOUND"}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "registerMyAppliance") {

q = 'UPDATE appliancedetail SET owner = "' + JSONmsg.owner +

'" WHERE applianceserial = "' + JSONmsg.applianceserial + '" AND owner = "";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.changedRows == 1) {

JSONstr =

'{"msg":"registrationStatus","status":"SUCCESS"}';

encodeReply(JSONstr, packet.topic);

} else if (rows.changedRows != 1) {

JSONstr =

'{"msg":"registrationStatus","status":"FAIL"}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "unregisterMyAppliance") {

q = 'UPDATE appliancedetail SET owner = "" WHERE

applianceserial = "' + JSONmsg.applianceserial + '" AND owner = "' + JSONmsg.owner

+ '" AND (SELECT 1 FROM user WHERE username = "' + JSONmsg.owner + '" and

password = "' + JSONmsg.password + '");';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.changedRows == 1) {

JSONstr =

'{"msg":"unregisterStatus","status":"SUCCESS"}';

XXXI

encodeReply(JSONstr, packet.topic);

} else if (rows.changedRows != 1) {

JSONstr =

'{"msg":"unregisterStatus","status":"FAIL"}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "getProfile") {

q = 'SELECT username,name,email,phonenumber FROM user WHERE

username = "' + JSONmsg.username + '" AND password = "' + JSONmsg.password + '";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

if (rows.length > 0) {

JSONstr = '{"msg":"myProfile","username":"' +

rows[0].username + '","fullname":"' + rows[0].name + '","email":"' + rows[0].email

+ '","phone":"' + rows[0].phonenumber + '"}';

encodeReply(JSONstr, packet.topic);

} else if (rows.length === 0) {

JSONstr =

'{"msg":"myProfile","username":"NOTFOUND"}';

encodeReply(JSONstr, packet.topic);

}

});

} else if (JSONmsg.msg == "updateProfile") {

q = 'UPDATE user SET name = "' + JSONmsg.fullname + '",email

= "' + JSONmsg.email + '", phonenumber = "' + JSONmsg.phone + '" WHERE username =

"' + JSONmsg.username + '" AND password = "' + JSONmsg.password + '";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.changedRows == 1) {

JSONstr =

'{"msg":"updateProfileStatus","status":"SUCCESS"}';

encodeReply(JSONstr, packet.topic);

} else if (rows.changedRows != 1) {

JSONstr =

'{"msg":"updateProfileStatus","status":"FAIL"}';

encodeReply(JSONstr, packet.topic);

}

}

});

XXXII

} else if (JSONmsg.msg == "updatePassword") {

q = 'UPDATE user SET password = "' + JSONmsg.newpassword +

'" WHERE username = "' + JSONmsg.username + '" AND password = "' +

JSONmsg.oldpassword + '";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.changedRows == 1) {

JSONstr =

'{"msg":"updatePasswordStatus","status":"SUCCESS"}';

encodeReply(JSONstr, packet.topic);

} else if (rows.changedRows != 1) {

JSONstr =

'{"msg":"updatePasswordStatus","status":"FAIL"}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "renameAppliance") {

q = 'UPDATE appliancedetail SET nickname = "' +

JSONmsg.nickname + '" WHERE applianceserial = "' + JSONmsg.applianceserial + '"

AND owner = "' + JSONmsg.owner + '";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.changedRows == 1) {

JSONstr =

'{"msg":"renameStatus","status":"SUCCESS"}';

encodeReply(JSONstr, packet.topic);

} else if (rows.changedRows != 1) {

JSONstr =

'{"msg":"renameStatus","status":"FAIL"}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "getStatus") {

q = 'SELECT status FROM appliancedetail WHERE

applianceserial = "' + JSONmsg.applianceserial + '" AND owner = "' + JSONmsg.owner

+ '";';

connection.query(q, function (err, rows) {

if (err)

XXXIII

return console.error(err);

else {

if (rows.length > 0) {

JSONstr =

'{"msg":"applianceStatus","status":"' + rows[0].status + '"}';

encodeReply(JSONstr, packet.topic);

} else if (rows.length === 0) {

JSONstr =

'{"msg":"applianceStatus","status":"NOTFOUND"}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "getLog") {

q = 'SELECT UNIX_TIMESTAMP(r.rtimestamp) AS

rtimestamp,r.rprt FROM command c, report r WHERE c.applianceserial = "' +

JSONmsg.applianceserial + '" AND c.owner = "' + JSONmsg.owner + '" AND r.commandid

= c.commandid ORDER BY c.ctimestamp DESC;';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.length > 0) {

JSONstr =

'{"msg":"reportLog","dat":[';

for (n = 0; n < rows.length; n++) {

if (n == rows.length - 1) {

JSONstr +=

'{"rtimestamp":' + rows[n].rtimestamp + ',"rprt":"' + rows[n].rprt + '"}]}';

} else {

JSONstr +=

'{"rtimestamp":' + rows[n].rtimestamp + ',"rprt":"' + rows[n].rprt + '"},';

}

}

encodeReply(JSONstr, packet.topic);

} else if (rows.length === 0) {

JSONstr =

'{"msg":"reportLog","dat":"NOTFOUND"}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "offline") {

XXXIV

q = 'UPDATE appliancedetail SET status = "INACTIVE" WHERE

applianceserial = "' + JSONmsg.applianceserial + '";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

});

} else if (JSONmsg.msg == "cook" && typeof client != "undefined") {

q = 'INSERT INTO command (applianceserial,cmd,owner) VALUES

("' + JSONmsg.applianceserial + '","' + mysql.escape(JSON.stringify(JSONmsg)) +

'","' + JSONmsg.owner + '");';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.affectedRows == 1) {

JSONstr =

'{"msg":"cmdid","applianceserial":"' + JSONmsg.applianceserial + '","cmdid":"' +

rows.insertId + '"}';

encodeReply(JSONstr, packet.topic);

} else if (rows.affectedRows != 1) {

JSONstr =

'{"msg":"cmdid","applianceserial":"' + JSONmsg.applianceserial + '","cmdid":-1}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "getCookSchedule") {

q = 'SELECT c.commandid, c.ctimestamp, c.cmd FROM command c

WHERE c.applianceserial = "' + JSONmsg.applianceserial + '" AND c.owner = "' +

JSONmsg.owner + '" AND c.commandid NOT IN (SELECT r.commandid FROM report r WHERE

r.commandid = c.commandid) ORDER BY c.commandid DESC;';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.length > 0) {

JSONstr = rows[0].cmd.replace(/'/g,

'');

encodeReply(JSONstr, packet.topic);

JSONstr =

'{"msg":"cmdid","applianceserial":"' + JSONmsg.applianceserial + '","cmdid":' +

rows[0].commandid + '}';

encodeReply(JSONstr, packet.topic);

} else if (rows.length == 0) {

XXXV

JSONstr = '{"msg":"cook","owner":"' +

JSONmsg.owner + '","applianceserial":"' + JSONmsg.applianceserial + '","rice":-

1,"water":-1,"mode":"NOTFOUND","cookSchedule":-1}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "cookStarted") {

q = 'UPDATE command SET ctimestamp = "' + JSONmsg.ctimestamp

+ '" WHERE commandid = ' + JSONmsg.cmdid + ';';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

});

} else if (JSONmsg.msg == "cookFinished") {

q = 'INSERT INTO report

(rtimestamp,applianceserial,rprt,commandid) VALUES ("' + JSONmsg.rtimestamp +

'","' + JSONmsg.applianceserial + '","' + JSONmsg.rprt + '",' + JSONmsg.cmdid +

');';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

});

} else if (JSONmsg.msg == "confirmRckStock") {

if (JSONmsg.confirmation == "OK") {

q = 'UPDATE rckstock SET rice = ' + JSONmsg.rice +

', water = ' + JSONmsg.water + ' WHERE applianceserial = "' +

JSONmsg.applianceserial + '";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

});

}

} else if (JSONmsg.msg == "getRckStock") {

q = 'SELECT rice,water FROM rckstock WHERE applianceserial =

"' + JSONmsg.applianceserial + '";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.length > 0) {

JSONstr =

'{"msg":"rckStock","applianceserial":"' + JSONmsg.applianceserial + '","rice":' +

rows[0].rice + ',"water":' + rows[0].water + '}';

XXXVI

encodeReply(JSONstr, packet.topic);

} else if (rows.length === 0) {

JSONstr =

'{"msg":"rckStock","applianceserial":"' + JSONmsg.applianceserial + '","rice":-

1,"water":-1}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "medicine" && typeof client !=

"undefined") {

q = 'INSERT INTO command (applianceserial,cmd,owner) VALUES

("' + JSONmsg.applianceserial + '","' + mysql.escape(JSON.stringify(JSONmsg)) +

'","' + JSONmsg.owner + '");';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.affectedRows == 1) {

JSONstr =

'{"msg":"cmdid","applianceserial":"' + JSONmsg.applianceserial + '","cmdid":' +

rows.insertId + '}';

encodeReply(JSONstr, packet.topic);

} else if (rows.affectedRows != 1) {

JSONstr =

'{"msg":"cmdid","applianceserial":"' + JSONmsg.applianceserial + '","cmdid":-1}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "getMedicineSchedule") {

q = 'SELECT commandid, ctimestamp,cmd FROM command WHERE

applianceserial = "' + JSONmsg.applianceserial + '" AND owner = "' + JSONmsg.owner

+ '" ORDER BY commandid DESC';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.length > 0) {

JSONstr = rows[0].cmd.replace(/'/g,

'');

encodeReply(JSONstr, packet.topic);

JSONstr =

'{"msg":"cmdid","applianceserial":"' + JSONmsg.applianceserial + '","cmdid":' +

rows[0].commandid + '}';

XXXVII

encodeReply(JSONstr, packet.topic);

} else if (rows.length === 0) {

JSONstr =

'{"msg":"medicine","applianceserial":"' + JSONmsg.applianceserial + '","owner":"'

+ JSONmsg.owner + '","pdpsetup":-1,"lqsetup":-1}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "medicineScheduled") {

q = 'UPDATE command SET ctimestamp = "' + JSONmsg.ctimestamp

+ '" WHERE commandid = ' + JSONmsg.cmdid + ';';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

});

} else if (JSONmsg.msg == "medicineTook") {

q = 'INSERT INTO report

(rtimestamp,applianceserial,rprt,commandid) VALUES ("' + JSONmsg.rtimestamp +

'","' + JSONmsg.applianceserial + '","' + JSONmsg.rprt + '",' + JSONmsg.cmdid +

');';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

});

} else if (JSONmsg.msg == "confirmMedStock") {

if (JSONmsg.confirmation == "OK") {

q = 'UPDATE smdstock SET pil = ' + JSONmsg.pil + ',

liquid = ' + JSONmsg.liquid + ' WHERE applianceserial = "' +

JSONmsg.applianceserial + '";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

});

}

} else if (JSONmsg.msg == "getMedStock") {

q = 'SELECT pil,liquid FROM smdstock WHERE applianceserial =

"' + JSONmsg.applianceserial + '";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.length > 0) {

XXXVIII

JSONstr =

'{"msg":"smdStock","applianceserial":"' + JSONmsg.applianceserial + '","pil":' +

rows[0].pil + ',"liquid":' + rows[0].liquid + '}';

encodeReply(JSONstr, packet.topic);

} else if (rows.length === 0) {

JSONstr =

'{"msg":"smdStock","applianceserial":"' + JSONmsg.applianceserial + '","pil":-

1,"liquid":-1}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "feed" && typeof client != "undefined") {

q = 'INSERT INTO command (applianceserial,cmd,owner) VALUES

("' + JSONmsg.applianceserial + '","' + mysql.escape(JSON.stringify(JSONmsg)) +

'","' + JSONmsg.owner + '");';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.affectedRows == 1) {

JSONstr =

'{"msg":"cmdid","applianceserial":"' + JSONmsg.applianceserial + '","cmdid":' +

rows.insertId + '}';

encodeReply(JSONstr, packet.topic);

} else if (rows.affectedRows != 1) {

JSONstr =

'{"msg":"cmdid","applianceserial":"' + JSONmsg.applianceserial + '","cmdid":-1}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "feedScheduled") {

q = 'UPDATE command SET ctimestamp = "' + JSONmsg.ctimestamp

+ '" WHERE commandid = ' + JSONmsg.cmdid + ';';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

});

} else if (JSONmsg.msg == "getFeedSchedule") {

q = 'SELECT commandid, ctimestamp,cmd FROM command WHERE

applianceserial = "' + JSONmsg.applianceserial + '" AND owner = "' + JSONmsg.owner

+ '" ORDER BY commandid DESC;';

connection.query(q, function (err, rows) {

if (err)

XXXIX

return console.error(err);

else {

if (rows.length > 0) {

JSONstr = rows[0].cmd.replace(/'/g,

'');

encodeReply(JSONstr, packet.topic);

JSONstr =

'{"msg":"cmdid","applianceserial":"' + JSONmsg.applianceserial + '","cmdid":' +

rows[0].commandid + '}';

encodeReply(JSONstr, packet.topic);

} else if (rows.length === 0) {

JSONstr =

'{"msg":"feed","applianceserial":"' + JSONmsg.applianceserial + '","owner":"' +

JSONmsg.owner + '","amount":-1,"times":-1,"timeout":-1}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else if (JSONmsg.msg == "feedReport") {

q = 'INSERT INTO report

(rtimestamp,applianceserial,rprt,commandid) VALUES ("' + JSONmsg.rtimestamp +

'","' + JSONmsg.applianceserial + '","' + JSONmsg.rprt + '",' + JSONmsg.cmdid +

');';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

});

} else if (JSONmsg.msg == "confirmFeederStock") {

if (JSONmsg.confirmation == "OK") {

q = 'UPDATE sdfstock SET dogfood = ' +

JSONmsg.dogfood + ' WHERE applianceserial = "' + JSONmsg.applianceserial + '";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

});

}

} else if (JSONmsg.msg == "getFeederStock") {

q = 'SELECT dogfood FROM sdfstock WHERE applianceserial = "'

+ JSONmsg.applianceserial + '";';

connection.query(q, function (err, rows) {

if (err)

return console.error(err);

else {

if (rows.length > 0) {

XL

JSONstr =

'{"msg":"sdfStock","applianceserial":"' + JSONmsg.applianceserial + '","dogfood":'

+ rows[0].dogfood + '}';

encodeReply(JSONstr, packet.topic);

} else if (rows.length === 0) {

JSONstr =

'{"msg":"sdfStock","applianceserial":"' + JSONmsg.applianceserial + '","dogfood":-

1}';

encodeReply(JSONstr, packet.topic);

}

}

});

} else {

if (typeof client != "undefined") {

console.log("Received undefined message : " +

packet.payload.toString() + " on " + packet.topic);

}

}

}

});

XLI

LAMPIRAN 3. FORMULIR KONSULTASI SKRIPSI