MQTT Publisher dan ThingsBoard untuk Sistem Monitoring Kualitas Udara

MQTT adalah salah satu protokol di atas TCP/IP yang cukup favorit digunakan untuk mengirimkan data dari perangkat IoT ke sebuah server. Berkenaan dengan sistem monitoring kualitas udara di Jakarta yang ingin saya kembangkan, MQTT menjadi protokol pilihan dalam pengiriman dari sensor ke ThingsBoard server. ThingsBoard adalah platform IoT yang menyediakan infrastruktur di sisi server, terdiri dari database, MQTT broker dan web server yang juga terdapat dashboard. Kompleksitas di sisi server sudah tidak lagi menjadi permasalahan untuk sistem pemantauan ini, sehingga sisi kompleksitas berada pada pengembangan perangkat sensor dan jaringan penunjang koneksi MQTT nya.

Komunikasi MQTT

Menurut pendapat saya, terdapat dua solusi yang menjamur untuk komunikasi IoT dengan MQTT, yaitu dengan WiFi dan GPRS. ThingsBoard juga sepertinya setuju dengan memberikan SDK Arduino untuk MQTT dengan SIM900 dan ESP8266, yang dapat dibuka di link ini. Komunikasi MQTT dengan GPRS dapat menggunakan berbagai modul GSM 2G yang tersedia dengan harga yang relatif murah. Walaupun pemakaian 2G semakin berkurang dan provider telepon seluler akan mematikan jaringan 2G secepatnya, namun Telkomsel masih akan meneruskan jaringan 2G karena hampir 50% penggunanya masih menggunakan 2G. Untuk sensor dengan umur 1 tahun seperti SDS011, penggunaan modul GSM 2G masih masuk akal.

Penggunaan WiFi juga sudah menjamur, sehingga memasang sensor di sekitar jaringan WiFi juga sangat memungkinkan. WiFi dalam IoT menjadi sangat prevalen akibat pengembangan mikrokontroler ESP8266, dan selanjutnya ESP32. ESP8266 menjadi populer karena ESP8266 merupakan chip dengan WiFi dengan TCP/IP dan dapat digunakan sebagai mikrokontroler. ESP8266 dapat dipasang berbagai SDK, salah satunya adalah Arduino SDK sehingga dapat diprogram layaknya Arduino dengan menambahkan Arduino Core untuk ESP8266 melalui Boards Manager Arduino IDE.

ESP8266/ESP32 atau Arduino Pro Mini

Komunikasi di MQTT dengan Arduino IDE dapat diakses dengan menggunakan library PubSubClient. Keduanya dapat digunakan di ESP8266 maupun Arduino berbasis ATmega328P. Modul GSM800 dapat terkoneksikan dengan mudah dengan Atmega328P karena penggunaan TinyGSM library yang menggunakan Flash memory dan RAM yang rendah. TinyGSM juga dapat digunakan dengan PubSubClient dan ThingsBoard sudah mengembangkan wrapper untuk PubSubClient agar dapat dengan mudah dikoneksikan dengan MQTT broker ThingsBoard. Di sisi lain ESP8266 dapat langsung menggunakan PubSubClient.

Arduino berbasis ATmega328P ProMini maupun ESP8266 dapat dijalankan dengan sinyal digital 3.3V. Sensor BME280, SDS-011, maupun modul GSM yang dipakai menggunakan komunikasi dengan 3.3V. Pro Mini dan ESP8266 merupakan pilihan yang cocok untuk sensor-sensor ini. Perlu dilakukan perbandingan antara solusi Pro Mini + TinyGSM dan ESP8266 untuk mengetahui kelebihan dan kekurangan dari masing-masing pendekatan.

Uji coba selanjutnya yang akan saya bahas di artikel setelah ini adalah bagaimana menghubungkan Pro Mini dan SIM800L dengan ThingsBoard dan/atau ESP8266 dengan ThingsBoard melalui MQTT. Bagian ini merupakan bagian penting yang menentukan pengembangan perangkat keras selanjutnya berdasarkan uji coba konsep yang sudah dilakukan dengan Raspberry Pi dan Python.

SDS011 BME280 and MQTT

Sambil menunggu kedatangan sensor SDS011, saya menulis artikel singkat bagaimana cara untuk mengambil data dari BME280 dan mengirimkannya ke ThingsBoard. Namun terganggu dengan adanya mati listrik hari Minggu dan Senin, sehingga pada hari Senin sensor sudah datang maka saya putuskan untuk menuliskan artikel lengkap percobaan dengan BME280, SDS011, dan MQTT

Modul Python Adafruit untuk BME280

Modul Python untuk BME280 sudah disediakan oleh Adafruit dengan CircuitPython. CircuitPython ini hanya bisa dijalankan di Python 3, Adafruit sudah memiliki tutorial sendiri bagaimana cara menyiapkan CircuitPython di Raspberry Pi. Langkah-langkah detil untuk mempersiapkan Raspberry Pi untuk menggunakan CircuitPython dapat dilihat di link ini, namun saya akan merangkum dengan singkat.

Hal pertama pastikan Raspberry Pi anda sudah diupdate:

# apt update
# apt upgrade

Pastikan bahwa di Raspberry Pi sudah ada PIP untuk Python3

# apt install python3-pip

Untuk menggunakan sensor BME280 dengan I2C maupun SPI pastikan Anda sudah menyalakan I2C dan SPI melalui command line tool:

# raspi-config

Setelah memastikan semua dependencies sudah terinstal di Raspberry Pi, instalasi untuk Python dapat dilakukan dengan command:

# pip3 install adafruit-circuitpython-bme280

Setelah instalasi Adafruit-CircuitPython-BME280, modul adafruit_bme280 sudah dapat diakses dari Python3, semua dependencies dalam Python3 yang dibutuhkan juga sudah terinstalasi. Sensor I2C memiliki address tertentu dan umumnya bisa diubah dengan menggunakan pull-down atau pull-up resistor di pin ADR. BME280 oleh Adafruit memiliki pull up resistor di ADR, sehingga address nya 0x77, lalu modul China yang umum dijual menggunakan pull-down resistor di pin ADR sehingga address nya 0x76. CircuitPython module untuk BME280 yang disediakan Adafruit menggunakan addrses 0x77, namun dapat diubah pada Class initialization dalam script Python. Contoh program ini sudah tersedia di GitHub saya.

SDS-011 dengan Python Serial

SDS011 mengirimkan data dari serial menggunakan USB converter (CH340), driver untuk CH340 sudah tersedia di Linux, sehingga yang diperlukan hanyalah modul Python untuk mengakses data Serial. Karena BME280 menggunakan Python3, maka untuk PySerial digunakan Python3. Instalasi PySerial dapat dilakukan dengan PIP3

# pip3 install PySerial

Setelah instalasi PySerial, koneksikan sensor dengan USB ke Raspberry Pi dan jalankan script yang sudah tersedia di GitHub saya, maka akan terlihat pembacaan sensor PM2.5 dan PM10 di tampilan layar.

Publisher MQTT untuk Python

Setelah data sensor sudah dibaca oleh script Python, module paho-mqtt dapat dipakai untuk mengirimkan data ke MQTT broker, untuk saat ini saya menggunakan ThingsBoard. Untuk mengirimkan telemetry dengan ThingsBoard, yang diperlukan adalah token akses untuk device yang sudah digenerate di ThingsBoard. Pengiriman data telemetri ke ThingsBoard memiliki topic tertentu yakni ‘v1/devices/me/telemetry’, data yang dikirimkan di format dengan JSON. Data ini diterima oleh ThingsBoard dan dapat dibuat Dashboard seperti Gambar di bawah ini.

dashboard.png

Dengan hasil pembacaan dengan dashboard ini, saya mengakhiri tulisan kali ini yang menunjukkan bagaimana sebuah sistem dengan BME280 dan SDS011 dapat mengirimkan informasi realtime tentang kualitas udara menggunakan ThingsBoard dan MQTT.