Site icon Elektrologi

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

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

Aliran data pada sistem yang dibuat adalah sebagai berikut:

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

Daftar pin ESP32 yang dipakai adalah sebagai berikut

Berikut ini foto rangkaian setelah dirakit

Perangkat lunak yang dipakai

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:

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:

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

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.

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

Exit mobile version