Tulisan kali ini merupakan pembahasan praktek pengenalan konsep MQTT sebagai protokol paling terkenal yang digunakan pada dunia IOT. Praktek ini telah dilakukan pada kelas mikrokontroler di Jurusan Teknik Listrik - Fakultas Vokasi - Universitas Negeri Surabaya dan respon mahasiswa peserta kuliah sangat 'heboh' karena dengan MQTT-Python-Excel bisa mengumpulkan data pooling secara cepat namun sederhana karena menggunakan bahan-bahan yang sudah ada pada laptop mahasiswa.
Sebagai bahan bacaan agar tidak menimbulkan 'ndas ngelu' sebaiknya dibaca dulu tulisan mengenai perkenalan MQTT bisa di klik disini : https://www.aisi555.com/2023/10/pengenalan-protokol-iot-mqtt-melalui.html
Titik berat pada praktek ini adalah coding python dengan library siap pakai berupa :
- Paho-MQTT : Library untuk melakukan PUB-SUB data mqtt (baca disini)
- Xlwing : Library untuk pengolahan data ke excel (baca disini)
Praktek pertama yang saya berikan adalah pengambilan data hoby dari mahasiswa, cukup sederhana dengan script seperti dibawah ini :
import random
from datetime import datetime
from paho.mqtt import client as mqtt_client
import xlwings as xw
#file excel nama dan sheetnya harus sama, jangan lupa dibuka
wb = xw.Book('koleksi.xlsx')
sht = wb.sheets['data']
row = 5 #global var buat awal row
#server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicsub = "/unesa/hobi"
# client id random karena gak boleh sama antar client
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = ''
password = ''
#koneksi
def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client
#subscribe ke mqtt broker
def subscribe(client: mqtt_client):
#routine ketika ada pesan masuk
def on_message(client, userdata, msg):
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
to_excel(msg.payload.decode()) #kirim ke excel
# daftar pada kedua topic
client.subscribe(topicsub)
client.on_message = on_message
def to_excel(data):
datae = data.split(',')
sekarang = datetime.now()
global row
#menulis ke kolom excel
nim = 'B' + str(row)
nama = 'C' + str(row)
hobi = 'D' + str(row)
ct = 'E' + str(row)
sht.range(nim).value = datae[0]
sht.range(nama).value = datae[1]
sht.range(hobi).value = datae[2]
sht.range(ct).value = sekarang
row = row + 1
def run():
client= connect_mqtt()
subscribe(client)
client.loop_forever()
if __name__ == '__main__':
run()
#ambil database pemilih
data_pemilih =[]
baris_awal=33 # baris awal dari data pemilih
baris=0
while sht.range('D'+str(baris + baris_awal)).value !=None :
dict_pilih= {'nim':sht.range('D'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value,
'key':sht.range('E'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value,
'pool':sht.range('F'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value}
data_pemilih.append(dict_pilih)
baris+=1
#ngecek data pemilih tampil dilayar
for x in data_pemilih:
print(x)
def to_excel(data):
datae = data.split(',') # parsing data yang masuk di topik mqtt
#kemudian tiap data di cek apakah pemilih terdaftar dan pascode benar serta belum vote
index_list=0
for y in data_pemilih:
#data pemilih sesuai dan belum vote
if y['nim'] == datae[0] and y['key'] == datae[1] and y['pool'] =='0':
#cek inputan nama pasangan calon presiden / wakil presiden
if datae[2].lower() == 'amin':
nilai = sht.range('D20').value + 1
sht.range('D20').value = nilai
elif datae[2].lower() == 'gofud':
nilai = sht.range('J20').value + 1
sht.range('J20').value = nilai
elif datae[2].lower() == 'praban':
nilai = sht.range('P20').value + 1
sht.range('P20').value = nilai
else : #calon presiden namanya salah
client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", pilihan anda salah")
break
#kirim notif ke nim bahwa berhasil vote
client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", Terimakasih sudah melakukan voting")
#update dict dari pool
data_pemilih[index_list]={'nim':str(datae[0]),'key':str(datae[1]),'pool':'1'}
#update cell hitungan voting di excel
sht.range('F' +str(index_list+ baris_awal)).value = 1
break
elif y['nim'] == datae[0] and y['key'] == datae[1] and y['pool'] !='0':
#kirim notif sudah melakukan vote
client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", Sepertinya anda sudah voting tadi!")
break
elif y['nim'] == datae[0] and y['key'] != datae[1] :
#kirim notif passkey anda salah
client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", passkey anda salah !")
break
index_list+=1
if index_list >= baris :
#kirim notif anda belum terdaftar
client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", anda bukan pemilih sah !")
from paho.mqtt import client as mqtt_client
import xlwings as xw
import random
#file excel nama dan sheetnya harus sama, jangan lupa dibuka
wb = xw.Book('koleksi.xlsx')
sht = wb.sheets['pool']
#server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicsub = "/unesa/pemilu"
# client id random karena gak boleh sama antar client
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = ''
password = ''
#ambil database pemilih
data_pemilih =[]
baris_awal=33 # baris awal dari data pemilih
baris=0
while sht.range('D'+str(baris + baris_awal)).value !=None :
dict_pilih= {'nim':sht.range('D'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value,
'key':sht.range('E'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value,
'pool':sht.range('F'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value}
data_pemilih.append(dict_pilih)
baris+=1
#ngecek data pemilih tampil dilayar
for x in data_pemilih:
print(x)
#koneksi ke broker
def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client
#subscribe ke mqtt broker
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg): #jika ada pesan masuk
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
to_excel(msg.payload.decode())
# daftar pada kedua topic
client.subscribe(topicsub)
client.on_message = on_message
def to_excel(data):
datae = data.split(',') # parsing data yang masuk di topik mqtt
#kemudian tiap data di cek apakah pemilih terdaftar dan pascode benar serta belum vote
index_list=0
for y in data_pemilih:
#data pemilih sesuai dan belum vote
if y['nim'] == datae[0] and y['key'] == datae[1] and y['pool'] =='0':
#cek inputan nama pasangan calon presiden / wakil presiden
if datae[2].lower() == 'amin':
nilai = sht.range('D20').value + 1
sht.range('D20').value = nilai
elif datae[2].lower() == 'gofud':
nilai = sht.range('J20').value + 1
sht.range('J20').value = nilai
elif datae[2].lower() == 'praban':
nilai = sht.range('P20').value + 1
sht.range('P20').value = nilai
else : #calon presiden namanya salah
client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", pilihan anda salah")
break
#kirim notif ke nim bahwa berhasil vote
client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", Terimakasih sudah melakukan voting")
#update dict dari pool
data_pemilih[index_list]={'nim':str(datae[0]),'key':str(datae[1]),'pool':'1'}
#update cell hitungan voting di excel
sht.range('F' +str(index_list+ baris_awal)).value = 1
break
elif y['nim'] == datae[0] and y['key'] == datae[1] and y['pool'] !='0':
#kirim notif sudah melakukan vote
client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", Sepertinya anda sudah voting tadi!")
break
elif y['nim'] == datae[0] and y['key'] != datae[1] :
#kirim notif passkey anda salah
client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", passkey anda salah !")
break
index_list+=1
if index_list >= baris :
#kirim notif anda belum terdaftar
client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", anda bukan pemilih sah !")
def run():
global client
client = connect_mqtt()
subscribe(client)
client.loop_forever()
if __name__ == '__main__':
run()