Telemetri Data Sakelar Dengan Thingsboard

Telemetri Data Sakelar Dengan Thingsboard

Pada percobaan ini dilakukan pengiriman data telemetri dari ESP32 ke Thingsboard. Sensor yang dipakai adalah sakelar on-off. Percobaan ini adalah bagian dari pembuatan sistem IoT (Internet of Things) yang terdiri dari beberapa ESP32 dan software ThingsBoard.

Arsitektur ThingsBoard adalah sebagai berikut:

Arsitektur ThingsBoard
Arsitektur ThingsBoard

Pada percobaan ini , tidak semua komponen ThingsBoard dipakai. Yang dipakai adalah sebagai berikut

  • Devices: menggunakan ESP32 dan sakelar sebagas sensor 
  • Protokol HTTP sebagai ThingsBoard Transports
  • ThingsBoard Core
  • SQL Database
  • External Systems

Aliran data pada sistem yang dibuat adalah sebagai berikut:

Aliran data pada sistem. Sensor berupa sakelar. Kondisi sakelar dibaca oleh ESP32, kemudian dikirim secara teratur ke ThingsBoard.

Sakelar bertindak sebagai sensor. Besaran yang dihasilkan oleh sakelar adalah 0 dan 1. ESP32 membaca status sensor setiap interval tertentu, dan kemudian mengirimkannya ke ThingsBoard menggunakan protokol HTTP. Data ini kemudian disimpan di Database.

Data dari database ini dapat ditampilkan menggunakan Dashboard pada Thingsboard, dan juga dapat diambil oleh aplikasi eksternal menggunakan REST API (REpresentational State Transfer Application Program Interface)

Hardware yang dipakai adalah sebagai berikut:

  • ESP32 Lolin Wemos
  • 2 buah sakelar. Pada percobaan ini digunakan sakelar geser SPDT dan push button.
ESP32 Lolin Wemos
ESP32 Lolin Wemos

Daftar pin ESP32 yang dipakai adalah sebagai berikut

  • pin 13 sebagai input digital, diberi nama SW0. Input active low.
  • pin 15 sebagai input digital, diberi nama SW1. Input active low.

Berikut ini foto rangkaian setelah dirakit

Perangkat lunak yang dipakai

  • Arduino versi 1.8.19 (Windows)
  • ThingsBoard versi 3.3.4.1
  • Ubuntu Linux 20.04.04 LTS
  • Wireshark versi 3.02

Setting ThingsBoard

[under construction]

Perangkat Lunak ESP32

Perangkat lunak ESP32 dibuat dengan Arduino

Library yang dipakai di Arduino adalah sebagai berikut

Prosedur instalasi dapat dilihat di artikel “ESP32 Pico Kit GPIO Control and DHT22 sensor monitor using ThingBoard Arduino SDK

// demo switch telemetry to Thingsboard
// adapted from https://thingsboard.io/docs/samples/esp32/gpio-control-pico-kit-dht22-sensor/

#include <WiFi.h>           // WiFi control for ESP32
#include <ThingsBoard.h>    // ThingsBoard SDK

// onboard LED
#define BUILTIN_LED 22
// switch pin definition
#define SW0 13
#define SW1 15

// Helper macro to calculate array size
// #define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))

// WiFi access point
#define WIFI_AP_NAME        "ACCESS_POINT_NAME"
// WiFi password
#define WIFI_PASSWORD       "ACCESS_POINT_PASSWORD"

// See https://thingsboard.io/docs/getting-started-guides/helloworld/
// to understand how to obtain an access token
#define TOKEN               "QdqSrxBAjBvxAoJyeoXN"
// ThingsBoard server instance.
#define THINGSBOARD_SERVER  "192.168.0.90"

// Baud rate for debug serial
#define SERIAL_DEBUG_BAUD    115200

// Initialize ThingsBoard client
WiFiClient espClient;
// Initialize ThingsBoard instance
ThingsBoard tb(espClient);
// the Wifi radio's status
int status = WL_IDLE_STATUS;

// main application loop delay (ms)
int quant = 20;

// Period of sending a temperature/humidity data.
int send_delay = 2000;

// Time passed after telemetry data was sent, milliseconds.
int send_passed = 0;

char mac_str[20]; // storing MAC address string
byte mac_byte[6]; // storing MAC address bytes

int led_counter = 0; //blinking built int led

// Setup an application
void setup() {
  pinMode(SW0, INPUT_PULLUP); // input switch
  pinMode(SW1, INPUT_PULLUP);

  pinMode(BUILTIN_LED , OUTPUT);


  // Initialize serial for debugging
  Serial.begin(SERIAL_DEBUG_BAUD);
  WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD);
  InitWiFi();

  WiFi.macAddress(mac_byte);
  sprintf(mac_str, "%02x%02x%02x%02x%02x%02x", mac_byte[0], mac_byte[1], mac_byte[2], mac_byte[3], mac_byte[4], mac_byte[5]);
  Serial.print("ESP board MAC address:  ");
  Serial.println(WiFi.macAddress());
  Serial.print("ESP board  IP address: ");
  Serial.println(WiFi.localIP());
}

// Main application loop
void loop() {
  delay(quant);
  send_passed += quant;

  // Reconnect to WiFi, if needed
  if (WiFi.status() != WL_CONNECTED) {
    reconnect();
    return;
  }

  // Reconnect to ThingsBoard, if needed
  if (!tb.connected()) {
    // Connect to the ThingsBoard
    Serial.print("Connecting to: ");
    Serial.print(THINGSBOARD_SERVER);
    Serial.print(" with token ");
    Serial.println(TOKEN);
    if (!tb.connect(THINGSBOARD_SERVER, TOKEN)) {
      Serial.println("Failed to connect");
      return;
    }
  }

  // Check if it is a time to send switch data
  if (send_passed > send_delay) {
    int switch0, switch1;
    switch0 = digitalRead(SW0);
    switch1 = digitalRead(SW1);
    Serial.print("Sending telemetry data...");
    Serial.print(" SW0:");
    Serial.print(switch0);
    Serial.print(" SW1:");
    Serial.println(switch1);
    tb.sendTelemetryInt("switch00", switch0);
    tb.sendTelemetryInt("switch01", switch1);
    send_passed = 0;
  }

  // Process messages
  tb.loop();

  led_counter++; // LED blink at 1 Hz
  if (led_counter > 50) {
    led_counter = 0;
  }
  if (led_counter > 25) {
    digitalWrite(BUILTIN_LED , LOW);
  } else {
    digitalWrite(BUILTIN_LED , HIGH);
  }
}

void InitWiFi()
{
  Serial.println("Connecting to AP ...");
  // attempt to connect to WiFi network

  WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Connected to AP");
}

void reconnect() {
  // Loop until we're reconnected
  status = WiFi.status();
  if ( status != WL_CONNECTED) {
    WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println("Connected to AP");
  }
}

Pengecekan Telemetri

Setelah sistem dirakit dan ESP32 diprogram, perlu dilakukan pengecekan apakah sistem berfungsi dengan baik. Pengecekan pengiriman data telemetri dilakukan dengan cara:

  • Memantau output dari port serial ESP32
  • Mengecek data telemetri di server Thingsboard

Berikut ini output dari serial monitor ESP32.

19:45:30.745 -> Connecting to AP ...
19:45:31.225 -> ......Connected to AP
19:45:33.738 -> ESP board MAC address:  3C:71:BF:03:41:4C
19:45:33.738 -> ESP board  IP address: 192.168.0.124
19:45:33.773 -> Connecting to: 192.168.0.90 with token QdqSrxBAjBvxAoJyeoXN
19:45:35.798 -> Sending telemetry data... SW0:1 SW1:1
19:45:37.819 -> Sending telemetry data... SW0:1 SW1:1
19:45:39.850 -> Sending telemetry data... SW0:1 SW1:1

Dari output tersebut dapat disimpulkan:

  • ESP32 berhasil terhubung ke access point
  • ESP32 berhasil mendapatkan IP address
  • ESP32 berhasil mengirim data ke ThingsBoard

Untuk mengecek data yang masuk ke server, prosedurnya sebagai berikut:

  • Login ke ThingsBoard sebagai tenant. username: tenant@thingsboard.org, password: tenant (jika belum diganti)
  • Klik di “Devices”
  • Klik di “ESP32 Dual Switch”
  • Klik di “Latest telemetry”

Jika pengiriman data normal, maka status sakelar terakhir akan muncul di Device details, seperti gambar berikut ini.

Angka di kolom “Value” akan sesuai dengan status sakelar. Pada percobaan ini pengiriman data dilakukan dengan interval 2 detik, jadi selambatnya dalam 2 detik status sakelar terakhir akan masuk.

Dashboard di ThingsBoard

Setelah data dicek masuk, kita dapat membuat dashboard di Thingsboard untuk menampilkan data dari sensor. Berikut ini contoh tampilan dashboard.

dashboard ThingsBoard untuk dual switch

Pengambilan Data Telemetri Dengan REST API

Data telemetri di server ThingsBoard dapat diambil menggunakan REST API dari aplikasi lain.

Pada percobaan ini data diambil dengan menggunakan software ‘curl’ di Ubuntu Linux.

Pertama-tama membuat dulu JWT (JSON Web Token).

curl -X POST –header ‘Content-Type: application/json’ –header ‘Accept: application/json’ -d ‘{“username”:”tenant@thingsboard.org”, “password”:”tenant”}’ ‘http://192.168.0.90:8080/api/auth/login’

Hasilnya dalam bentuk JSON sebagai berikut

{“token”:”eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZW5hbnRAdGhpbmdzYm9hcmQub3JnIiwic2NvcGVzIjpbIlRFTkFOVF9BRE1JTiJdLCJ1c2VySWQiOiI2ZjEyZDE5MC1jOTAwLTExZWMtOWRlYS1kN2UzNGUyNDNiZWIiLCJlbmFibGVkIjp0cnVlLCJpc1B1YmxpYyI6ZmFsc2UsInRlbmFudElkIjoiNmU3OTI5YTAtYzkwMC0xMWVjLTlkZWEtZDdlMzRlMjQzYmViIiwiY3VzdG9tZXJJZCI6IjEzODE0MDAwLTFkZDItMTFiMi04MDgwLTgwODA4MDgwODA4MCIsImlzcyI6InRoaW5nc2JvYXJkLmlvIiwiaWF0IjoxNjUxNTgzNjI5LCJleHAiOjE2NTE1OTI2Mjl9.Ci_MA7PgSQk6xeMOgjJ_NRr3ipuRwLc2t3Yow2Nc5WWDCTPNNfbYPl4-bTikYH7DYFB5-ZqBuhnVVMY4kdJpaQ”,”refreshToken”:”eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZW5hbnRAdGhpbmdzYm9hcmQub3JnIiwic2NvcGVzIjpbIlJFRlJFU0hfVE9LRU4iXSwidXNlcklkIjoiNmYxMmQxOTAtYzkwMC0xMWVjLTlkZWEtZDdlMzRlMjQzYmViIiwiaXNQdWJsaWMiOmZhbHNlLCJpc3MiOiJ0aGluZ3Nib2FyZC5pbyIsImp0aSI6ImUwNGE0MDUyLTA3ZmYtNDRmNS04NmQ3LTRhYTIwYjEzNjFiOSIsImlhdCI6MTY1MTU4MzYyOSwiZXhwIjoxNjUyMTg4NDI5fQ.ZpLUtoqoY2BZBooRPu3vqF8DEbXOJuM33YsaRaR6IorBenRyRmnNAb_rTbpRfHWzh8-zBGDc0Ah0w6qqYK3ksA”}

Parameter yang diperlukan adalah hanya “token”, tidak termasuk”refresh token”.

Berikutnya membuat query REST API

curl -v -X GET http://192.168.0.90:8080/api/plugins/telemetry/DEVICE/e19fb430-caa4-11ec-84b1-a3192844351e/values/timeseries?keys=switch00,switch01 \
> –header “Content-Type:application/json” \
> –header “X-Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZW5hbnRAdGhpbmdzYm9hcmQub3JnIiwic2NvcGVzIjpbIlRFTkFOVF9BRE1JTiJdLCJ1c2VySWQiOiI2ZjEyZDE5MC1jOTAwLTExZWMtOWRlYS1kN2UzNGUyNDNiZWIiLCJlbmFibGVkIjp0cnVlLCJpc1B1YmxpYyI6ZmFsc2UsInRlbmFudElkIjoiNmU3OTI5YTAtYzkwMC0xMWVjLTlkZWEtZDdlMzRlMjQzYmViIiwiY3VzdG9tZXJJZCI6IjEzODE0MDAwLTFkZDItMTFiMi04MDgwLTgwODA4MDgwODA4MCIsImlzcyI6InRoaW5nc2JvYXJkLmlvIiwiaWF0IjoxNjUxNTgzNjI5LCJleHAiOjE2NTE1OTI2Mjl9.Ci_MA7PgSQk6xeMOgjJ_NRr3ipuRwLc2t3Yow2Nc5WWDCTPNNfbYPl4-bTikYH7DYFB5-ZqBuhnVVMY4kdJpaQ”
Note: Unnecessary use of -X or –request, GET is already inferred.
* Trying 192.168.0.90:8080…
* TCP_NODELAY set
* Connected to 192.168.0.90 (192.168.0.90) port 8080 (#0)
> GET /api/plugins/telemetry/DEVICE/e19fb430-caa4-11ec-84b1-a3192844351e/values/timeseries?keys=switch00,switch01 HTTP/1.1
> Host: 192.168.0.90:8080
> User-Agent: curl/7.68.0
> Accept: */*
> Content-Type:application/json
> X-Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZW5hbnRAdGhpbmdzYm9hcmQub3JnIiwic2NvcGVzIjpbIlRFTkFOVF9BRE1JTiJdLCJ1c2VySWQiOiI2ZjEyZDE5MC1jOTAwLTExZWMtOWRlYS1kN2UzNGUyNDNiZWIiLCJlbmFibGVkIjp0cnVlLCJpc1B1YmxpYyI6ZmFsc2UsInRlbmFudElkIjoiNmU3OTI5YTAtYzkwMC0xMWVjLTlkZWEtZDdlMzRlMjQzYmViIiwiY3VzdG9tZXJJZCI6IjEzODE0MDAwLTFkZDItMTFiMi04MDgwLTgwODA4MDgwODA4MCIsImlzcyI6InRoaW5nc2JvYXJkLmlvIiwiaWF0IjoxNjUxNTgzNjI5LCJleHAiOjE2NTE1OTI2Mjl9.Ci_MA7PgSQk6xeMOgjJ_NRr3ipuRwLc2t3Yow2Nc5WWDCTPNNfbYPl4-bTikYH7DYFB5-ZqBuhnVVMY4kdJpaQ
>

Berikut ini output dari curl:

* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< Vary: Origin
< Vary: Access-Control-Request-Method
< Vary: Access-Control-Request-Headers
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Tue, 03 May 2022 13:16:56 GMT
<
* Connection #0 to host 192.168.0.90 left intact
{“switch00”:[{“ts”:1651583815502,”value”:”0″}],”switch01″:[{“ts”:1651583815505,”value”:”1″}]}

Output dalam format JSON

Referensi

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.