Walau sempat galau karena MQTT gagal dikirimkan ke platform Telkomiot.id, tidak usah nyinyir berlebihan karena ada satu cara yang umum dilakukan untuk kirim-terima data yaitu via REST API / HTTP/ POST . Langsung aja yuk kita mencoba menggunakan software semacam postman untuk mengirimkan data secara HTTP, dan saya pilihkan yang lebih mudah yaitu chrome extension bernama "Talend API Tester". Langkah-langkahnya cukup straight forward, kita cek dulu alamat endpoint dari REST API nya pada console :application/device di website telkomiot.
Sesuai petunjuk bapak presiden...ehhh salah..dokumentasi yang sangat sedikit, saya menerka bahwa akan ada authentification /authorization berdasarkan access key dan token key untuk access api dan biasanya ditambahkan pada header berupa "authorization". Lanjutkan aja dengan memasukkan pasangan key yang benar
Header yang gak kalah penting adalah "Content-Type" : "application/json" dan langsung saja saya coba dan berhasil mengirimkan data suhu dan humi ke telkomiot....yeahhh
Bagaimana dengan mengirimkan secara hardware? saya pilihkan microcontroller + sensor sejuta umat paling murah meriah : Wemos + DHT11.
*/telkomiot.id testing from www.aisi555.com
by nyoman yudi kurniawan ahocool@gmail.com
08155737755 - surabaya 2024
*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include "DHT.h"
#include <base64.h>
// wifi kamu sesuaikan
const char* ssid = "hotspothp";
const char* password = "tanyasebelah";
// Domain http publish dari device DHT11 ditelkomiot, sesuaikan
const char* serverName = "http://publish-data.telkomiot.id/v2.0/pubs/APP1111111111/DEV222222222223";
// account key dari telkomiot
String AccessKey = "aaaaaaaaaaaaaaaa";
String AccessToken = "bbbbbbbbbbbbbbbb";
String auth;
String authHeader;
const int dhtPin = D3; //Sesuaikan pin DHT
#define DHTTYPE DHT11 //Sensor DHT11
DHT dht(dhtPin, DHTTYPE);
//timer untuk membaca DHT11 tiap 10 detik
unsigned long lastTime = 0;
unsigned long timerDelay = 10000;
WiFiClient client;
HTTPClient http;
void setup() {
Serial.begin(9600);
delay(1000);
Serial.println("www.aisi555.com ==> telkomiot.id testing");
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Terhubung wifi : ");
Serial.print(ssid);
Serial.print(" IP : ");
Serial.println(WiFi.localIP());
//auth header untuk POST
auth = AccessKey+ ":" + AccessToken;
authHeader = "Basic " + base64::encode(auth);
}
String SendTempHumid(){ // pengukuran DHT
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
}
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" °C ");
//yang dikirim data berupa string JSON
return( "{\"suhu\":" + String(t) + ",\"humi\":" + String(h) +"}");
}
void loop() {
//Send HTTP POST request tiap 10 detik
if ((millis() - lastTime) > timerDelay) {
//Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
// server untuk kirim REST API
http.begin(client, serverName);
// Specify content-type header
http.addHeader("Authorization", authHeader);
http.addHeader("Content-Type", "application/json");
// Data to send with HTTP POST
String httpRequestData = SendTempHumid();
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
// Free resources
http.end();
}
else {
Serial.println("WiFi terputus");
}
lastTime = millis();
}
}
Hasilnya bagaimana ?
Penjabarannya seperti berikut :
Library :
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include "DHT.h"
#include <base64.h>
Yang digunakan library standar ESP8266 untuk kirim terima data via http dan sudah tersedia semua secara default. Yang mungkin berbeda adalah base64.h yang jarang digunakan, kali ini tujuannya untuk meng-enkripsi auth key sebagai standar auth pada REST API.
Rest API endpoint + auth:
// Domain http publish dari device DHT11 ditelkomiot, sesuaikan
const char* serverName = "http://publish-data.telkomiot.id/v2.0/pubs/APP1111111111111111/DEV222222222222222";
// account key dari telkomiot
String AccessKey = "aaaaaaaaaaaaaaaa";
String AccessToken = "bbbbbbbbbbbbbbbb";
String auth;
String authHeader;
WiFiClient client;
HTTPClient http;
Base 64 auth Header :
//auth header untuk POST
auth = AccessKey+ ":" + AccessToken;
authHeader = "Basic " + base64::encode(auth);
Baca DHT 11 :
String SendTempHumid(){ // pengukuran DHT
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
}
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" °C ");
//yang dikirim data berupa string JSON
return( "{\"suhu\":" + String(t) + ",\"humi\":" + String(h) +"}");
}
Kirim secara post :
// server untuk kirim REST API
http.begin(client, serverName);
// Specify content-type header
http.addHeader("Authorization", authHeader);
http.addHeader("Content-Type", "application/json");
// Data to send with HTTP POST
String httpRequestData = SendTempHumid();
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
// Free resources
http.end();
Lumayan straight forward, hanya meniru apa yang sudah dilakukan pada aplikasi testing REST API sebelumnya, dan jika data json / dht11 benar maka pada monitor terminal muncul ini.
Http response 200 artinya data diterima dengan benar, sedangkan jika 400 berarti json pengambilan data dht11 nya salah.
Lalu bagaimana cara menampilkan gauge dan grafik seperti gambar paling diatas? tinggal menuju menu personal dashboard , lalu buat dashboard kamu serta tambahkan widget yang dihubungkan ke device kamu.
Dan jika benar, maka akan muncul widget berupa gauge-line chart-bar chart sesuai yang kamu pilih. Dan tiap widget ini dapat ditempelkan pada website kamu lhoo..
Dan bisa kirim alarm lewat event trigger ke email lhooo ...
Walau kekecewaan masih tersirat pada saya yang pencinta MQTT ini, namun dengan praktek diatas agak sedikit terobati, dan semoga kalian bisa mencobanya sendiri