MENGGUNAKAN PROTOKOL KOMUNIKASI WI-FI DAN PROTOKOL ...kc.umn.ac.id/1317/1/Rancang Bangun Smart Rice...
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
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);
}
}
}
});