Lalu ada lagi sambungan setelah mereka (pembaca blog) saya ajari kirim-kiriman, ehhh pengolahan datanya menjadi grafik belum bisa, jadi nanggung banget ! Kalau dilihat dari fasilitas chart di antares pada menu widget...yakkk ampunnn..coba deh lihat..
Belum dapat dinamakan grafik kalau seperti ini, karena data lorawan yang masuk belum sama sekali diparsing. Kesusahan kali ya membuat json parser data seperti ini di php ? Ingat dulu pembahasan saya disini ? baca dulu deh..
Akses data antares yang di subscribe via MQTT selalu ada pada 1 topic : /oneM2M/resp/antares-cse/access:key/json
Uplink perangkat LoRaWan akan menghasilkan output mqtt seperti berikut ini :
{
"m2m:rsp" : {
"rsc" : 2001,
"rqi" : "123456",
"pc" : {
"m2m:cin" : {
"rn" : "cin_tuYp3j-bTIy5fUm4",
"ty" : 4,
"ri" : "/antares-cse/cin-tuYp3j-bTIy5fUm4",
"pi" : "/antares-cse/cnt-661860573",
"ct" : "20240527T095651",
"lt" : "20240527T095651",
"st" : 0,
"cnf" : "message",
"cs" : 296,
"con" : "{\"type\": \"uplink\",\"port\": 1,\"data\": { \"suhu\": 27.81,\"humi\": 75},\"counter\": 2,\"devEui\": \"4fd4a31429711655\",\"radio\": {\"gps_time\": 1400813829,\"hardware\": {\"snr\": -17.6,\"rssi\": -116},\"datarate\": 0,\"modulation\": {\"bandwidth\": 125000,\"spreading\": 12},\"delay\": 0.060113125618098,\"freq\": 922,\"size\": 40}}"
}
},
"to" : "",
"fr" : "/antares-cse"
}
}
Data yang berguna ada di "con" sehingga harus parsing json dulu ...nah dari pada bingung, kita belajar dulu menerima data yg masuk dari LoRaWan menggunakan python sebagai penerima MQTT nya. Jangan lupa untuk menginstall library Paho-Mqtt, dimana kalau menggunakan google colab bisa install versi 1.6.0 saja yang lebih sederhana. Script ini secara realtime akan menerima data masuk jika LoRaWan menerima uplink dari device.
from paho.mqtt import client as mqtt_client
import time
from time import sleep
from random import randrange
# Inisialisasi broker antares
broker_address="mqtt.antares.id"
broker_port=1883
#sesuaikan dengan acces key antares kamu
antareskey= "access:key"
antaresdevice = "aplikasi/device"
#topik subscribe hanya 1 saja untuk tiap akun
topicsubantares = f'/oneM2M/resp/antares-cse/{antareskey}/json'
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(f'aisi555-client-{randrange(0,1000)}')
client.on_connect = on_connect
client.connect(broker_address, broker_port)
return client
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
client.subscribe(topicsubantares)
client.on_message = on_message
def run():
client = connect_mqtt()
subscribe(client)
client.loop_forever()
if __name__ == '__main__':
run()
Hasil dari script diatas akan menampilkan semua data yang masuk, memang ini kekurangan oneM2M dimana tidak melayani sub mqtt per device. Hasilnya kita harus parsing per device di "pi:" lalu di bandingkan dengan device yang sedang kita olah datanya.
Sekalian saja saya kemudian akan parsing "con" dan mengambil beberapa data seperti suhu, humi, snr dan rssi. Scriptnya seperti ini :
from paho.mqtt import client as mqtt_client
import time
from time import sleep
from random import randrange
import json
# Inisialisasi broker
broker_address="mqtt.antares.id"
broker_port=1883
antareskey= "access:key"
antaresdevice = "/antares-cse/device-uri"
topicsubantares = f'/oneM2M/resp/antares-cse/{antareskey}/json'
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(f'aisi555-client-{randrange(0,1000)}')
client.on_connect = on_connect
client.connect(broker_address, broker_port)
return client
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
#print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
olah_data(msg.payload.decode())
client.subscribe(topicsubantares)
client.on_message = on_message
def olah_data(datanya):
# Parsing json
data = json.loads(datanya)
penerima = data["m2m:rsp"]["pc"]["m2m:cin"]["pi"]
# ambil con untuk data
con_json_str = data["m2m:rsp"]["pc"]["m2m:cin"]["con"]
# Parse the JSON string inside "con"
con_data = json.loads(con_json_str)
print(f"Terima dari device : {penerima}")
print("Suhu:", con_data["data"]["suhu"], " Celcius")
print("kelembaban:", con_data["data"]["humi"], " %")
print("Radio SNR:", con_data["radio"]["hardware"]["snr"])
print("Radio RSSI:", con_data["radio"]["hardware"]["rssi"])
def run():
client = connect_mqtt()
subscribe(client)
client.loop_forever()
if __name__ == '__main__':
run()
Tapi masih belum juga bisa menampilkan grafik ke IOT MQTT PANEL seperti yang sering saya bahas setiap membuat proyek IOT disini. Untuk itu saya membuat bridge untuk menjembatani MQTT diantara antares dan aplikasi melalui broker mqtt gratisan HIVEMQ. Wahh benar-benar script python saya berfungsu jadi bridge ini, dimana saya melakukan koneksi ke 2 buah broker, antares saya sub dan hivemq saya pub. Saya kutipkan beberapa potongan penting:
def olah_data(datanya):
# Parsing json
data = json.loads(datanya)
penerima = data["m2m:rsp"]["pc"]["m2m:cin"]["pi"]
# ambil con untuk data
con_json_str = data["m2m:rsp"]["pc"]["m2m:cin"]["con"]
# Parse the JSON string inside "con"
con_data = json.loads(con_json_str)
if(penerima == antaresdevice):
print(f"Terima dari device : {penerima}")
print("Suhu:", con_data["data"]["suhu"], " Celcius")
print("Kelembaban:", con_data["data"]["humi"], " %")
print("Radio SNR:", con_data["radio"]["hardware"]["snr"])
print("Radio RSSI:", con_data["radio"]["hardware"]["snr"])
print("Kirim ke HiveMQ !")
hivemq.publish("/aisi555/suhu", con_data["data"]["suhu"])
hivemq.publish("/aisi555/humi", con_data["data"]["humi"])
hivemq.publish("/aisi555/snr", con_data["radio"]["hardware"]["snr"])
hivemq.publish("/aisi555/rssi", con_data["radio"]["hardware"]["snr"])
def run():
#konek ke antares
client = connect_mqtt()
#konek ke Hivemq
global hivemq
hivemq = connect_hivemq()
#subscribe ke antares
subscribe(client)
client.loop_forever()
Hasilnya seperti ini, langsung bisa dari Sensor ==> LoRaWan Antares ==> google colab ==> grafik apk IOT MQTT PANEL (gambar paling atas) secara real time. Script saya potong dan seperti biasa kontak saya jika berminat belajar lebih dalam lagi.