Instalasi ThingsBoard IoT Gateway di Ubuntu 20.04

Ada beberapa cara instalasi ThingsBoard IoT Gateway:

Instalasi ThingsBoard

Pada tulisan ini akan diuraikan proses instalasi menggunakan PIP (Python) di Ubuntu 20.04.4

Pertama-tama update dan upgrade Ubuntu ke versi terbaru

sudo apt update && apt upgrade

Selanjutnya lakukan instalasi library di Ubuntu

sudo apt install python3-dev python3-pip libglib2.0-dev 

Selanjutnya instal ThingsBoard Gateway dengan pip:

sudo pip3 install thingsboard-gateway

Download contoh file konfigurasi dan buat folder log

wget https://github.com/thingsboard/thingsboard-gateway/releases/download/2.0/configs.tar.gz

Buat direktori untuk file-file konfigurasi

sudo mkdir /etc/thingsboard-gateway

Buat direktori untuk file log

sudo mkdir /var/log/thingsboard-gateway

Buka file-file konfigurasi

sudo tar -xvzf configs.tar.gz -C /etc/thingsboard-gateway

Jalankan thingsboard gateway dengan perintah berikut

thingsboard-gateway

Akan timbul pesan kesalahan seperti di bawah ini, karena belum dikonfigurasi

[STREAM ONLY] 2022-05-12 00:54:46,314 - ERROR - [mqtt_connector.py] - mqtt_connector - 142 - 'attributeRequests' section missing from configuration
[STREAM ONLY] 2022-05-12 00:54:46,315 - ERROR - [mqtt_connector.py] - mqtt_connector - 207 - [Errno 111] Connection refused
[STREAM ONLY] 2022-05-12 00:54:46,938 - ERROR - [tb_device_mqtt.py] - tb_device_mqtt - 146 - connection FAIL with error 3 server unavailable
[STREAM ONLY] 2022-05-12 00:54:46,939 - DEBUG - [tb_device_mqtt.py] - tb_device_mqtt - 123 - Disconnected client: <paho.mqtt.client.Client object at 0x7fb426ddc490>, user data: None, result code: 0
 nano /etc/thingsboard-gateway/config/tb_gateway.yaml

Konfigurasi Dasar

Buat device Iot Gateway di ThingsBoard. Caranya:

  • Masuk ke ThingsBoard web interface (misal alamatnya http://192.168.0.90:8080)

  • Klik di “Devices”
  • Klik di tanda “+”, kemudian “Add new device” untuk membuat device baru
  • Masukkan nama device. Misal “iot-gateway-93”
  • Klik di checkbutton “is gateway” untuk menandakan bahwa device yang dibuat adalah IoT gateway
  • Klik “Add”. Maka pembuatan Device IoT Gateway selesai.

Selanjutnya adalah mengambil Access Token.

  • Klik di menu “Devices”. Akan muncul daftar devices yang ada
  • Klik di device IoT gateway yang baru dibuat
  • Klik di “Copy access token”, maka access token akan tersimpan di clipboard Windows.
  • selanjutnya masuk ke console Ubuntu untuk mengedit file konfigurasi ThingsBoard Gateway.
  • edit file /etc/thingsboard-gateway/config/tb_gateway.yaml dengan teks editor editor, misalnya dengan ‘nano’.
  • Ganti “host” dengan alamat dari server ThingsBoard. Defaultnya adalah demo.thingsboard.io. Misal pada contoh ini alamat server ThingsBoard adalah 192.168.0.90, sehingga alamat host diganti menjadi 192.168.0.90
  • port tetap di 1883 (MQTT) . Umumnya tidak ada perubahan.
  • Ganti string PUT_YOUR_GW_ACCESS_TOKEN_HERE dengan access token yang dicopy di atas. Misal access token adalah KbllULqUCAj1PWt1pvCQ

thingsboard:
  host: demo.thingsboard.io
  port: 1883
  security:
    accessToken: PUT_YOUR_GW_ACCESS_TOKEN_HERE

Maka file akan berubah seperti berikut ini:

thingsboard:
  host: 192.168.0.90
  port: 1883
  security:
    accessToken: KbllULqUCAj1PWt1pvCQ

Untuk sementara bagian lain dari file konfigurasi belum perlu diubah.

Hentikan thingsboard gateway dengan menekan CTRL-C di console Ubuntu.

Selanjutnya jalankan lagi thingsboard gateway dari console Ubuntu untuk melihat apakah ada perubahan

 thingsboard-gateway 

Akan muncul pesan seperti berikut ini:

[STREAM ONLY] 2022-05-12 01:19:55,467 - ERROR - [mqtt_connector.py] - mqtt_connector - 142 - 'attributeRequests' section missing from configuration
[STREAM ONLY] 2022-05-12 01:19:55,468 - ERROR - [mqtt_connector.py] - mqtt_connector - 207 - [Errno 111] Connection refused

Pesan itu normal, karena memang MQTT belum dikonfigurasi.

Selanjutnya lihat di web interface ThingsBoard untuk melihat apakah sudah ada koneksi dari thingsboard gateway.

Caranya:

  • Masuk ke daftar devices dengan cara klik “Devices” di menu web ThingsBoard
  • Klik di IoT gateway yang baru dibuat, misal tadi namanya adalah “iot-gateway-93”
  • Klik di “Latest telemetry”. Seharusnya akan muncul beberapa key berikut ini, dengan “last update time” sesuai dengan waktu start thingsboard gateway di console Ubuntu
    • eventsProduced
    • eventsSent
    • LOGS
    • mqttbrokerconnectorEventsProduced
    • mqttbrokerconnectorEventsSent

Thingsboard IoT gateway Telemetry

Jika muncul data telemetry seperti di atas, maka artinya ThingsBoard gateway sudah berhasil berkomunikasi dengan ThingsBoard Server.

Tahap selanjutnya adalah melakukan konfigurasi connector di ThingsBoard Gateway supaya dapat menerima / mengirim data ke devices yang ada. Contohnya untuk REST API dapat dilihat di artikel “Koneksi REST API ke ThingsBoard IoT Gateway

Pada contoh ikni script thingsboard-gateway perlu dijalankan secara manual. Jika ingin dijalankan secara otomatis, dapat dibuat menjadi service atau ditambahkan ke crontab ataupun  etc/rc.local

Konfigurasi File Log

Pada contoh file konfigurasi yang diberikan, file log disimpan di “./log”, jadi relatif terhadap dari mana kita menjalankan thingsboard-gateway. Supaya rapi, file log disimpan di /var/log/thingsboard-gateway. Untuk itu edit file /etc/thingsboard-gateway/config/logs.conf untuk mengubah lokasi file log sesuai keinginan.

Berikut ini bagian dari file logs.conf yang mengatur lokasi file log

[handler_connectorHandler]
level=DEBUG
class=logging.handlers.TimedRotatingFileHandler
formatter=LogFormatter
args=(“/var/log/thingsboard-gateway/connector.log”, ‘d’, 1, 7,)

[handler_storageHandler]
level=DEBUG
class=logging.handlers.TimedRotatingFileHandler
formatter=LogFormatter
args=(“/var/log/thingsboard-gateway/storage.log”, ‘d’, 1, 7,)

[handler_serviceHandler]
level=DEBUG
class=logging.handlers.TimedRotatingFileHandler
formatter=LogFormatter
args=(“/var/log/thingsboard-gateway/service.log”, ‘d’, 1, 7,)

[handler_converterHandler]
level=DEBUG
class=logging.handlers.TimedRotatingFileHandler
formatter=LogFormatter
args=(“/var/log/thingsboard-gateway/converter.log”, ‘d’, 1, 3,)

[handler_extensionHandler]
level=DEBUG
class=logging.handlers.TimedRotatingFileHandler
formatter=LogFormatter
args=(“/var/log/thingsboard-gateway/extension.log”, ‘d’, 1, 3,)

[handler_tb_connectionHandler]
level=DEBUG
class=logging.handlers.TimedRotatingFileHandler
formatter=LogFormatter
args=(“/var/log/thingsboard-gateway/tb_connection.log”, ‘d’, 1, 3,)

 

Daftar Artikel Tentang ThingsBoard IoT Gateway

Referensi

Koneksi REST API ke ThingsBoard IoT Gateway

ThingsBoard gateway dapat menerima data dari client dengan protokol REST connector.

Arsitektur Thingsboard IoT Gateway
Arsitektur Thingsboard IoT Gateway

 

 

Setting Server

Untuk mengaktifkan REST API, pastikan ada baris berikut ini pada file /etc/thingsboard-gateway/config/tb_gateway.yaml

Penjelasan detail di artikel “IoT Gateway Configuration

  -
    name: REST Connector
    type: rest
    configuration: rest.json

Berikut ini contoh konfigurasi connector untuk REST API.

Lokasi file adalah di /etc/thingsboard-gateway/config/rest.json

Penjelasan detail format file ini ada di artikel “REST Connector Configuration

 

{
  "host": "0.0.0.0",
  "port": "5000",
  "SSL": false,
  "security": {
    "cert": "~/ssl/cert.pem",
    "key": "~/ssl/key.pem"
  },
  "mapping": [
    {
      "endpoint": "/device1",
      "HTTPMethods": [
        "POST"
      ],
      "security": {
        "type": "anonymous"
      },
      "converter": {
        "type": "json",
        "deviceNameExpression": "Device ${name}",
        "deviceTypeExpression": "default",
        "attributes": [
          {
            "type": "string",
            "key": "model",
            "value": "${sensorModel}"
          }
        ],
        "timeseries": [
          {
            "type": "double",
            "key": "temperature",
            "value": "${temp}"
          },
          {
            "type": "double",
            "key": "humidity",
            "value": "${hum}"
          }
        ]
      }
    }
  ],
  "attributeUpdates": [
    {
      "HTTPMethod": "POST",
      "SSLVerify": false,
      "httpHeaders": {
        "CONTENT-TYPE": "application/json"
      },
      "security": {
        "type": "basic",
        "username": "user",
        "password": "passwd"
      },
      "timeout": 0.5,
      "tries": 3,
      "allowRedirects": true,
      "deviceNameFilter": ".*REST$",
      "attributeFilter": "data",
      "requestUrlExpression": "sensor/${deviceName}/${attributeKey}",
      "valueExpression": "{\"${attributeKey}\":\"${attributeValue}\"}"
    }
  ],
  "serverSideRpc": [
    {
      "deviceNameFilter": ".*",
      "methodFilter": "echo",
      "requestUrlExpression": "http://127.0.0.1:5001/${deviceName}",
      "responseTimeout": 1,
      "HTTPMethod": "GET",
      "valueExpression": "${params}",
      "timeout": 10.0,
      "tries": 3,
      "httpHeaders": {
        "Content-Type": "application/json"
      },
      "security": {
        "type": "anonymous"
      }
    },
    {
      "deviceNameFilter": ".*",
      "methodFilter": "no-reply",
      "requestUrlExpression": "sensor/${deviceName}/request/${methodName}/${requestId}",
      "HTTPMethod": "POST",
      "valueExpression": "${params}",
      "httpHeaders": {
        "Content-Type": "application/json"
      },
      "security": {
        "type": "anonymous"
      }
    }
  ]
}

Penjelasan

“host”

  "host": "0.0.0.0",

Setting host di contoh aslinya menggunakan 127.0.0.1, namun kalau pakai IP ini tidak dapat dikontak dari komputer lain. Supaya dapat dikontak dari IP lain, maka menggunakan 0.0.0.0 , atau bisa juga menggunakan IP address dari IoT Gateway tersebut

“port”

Port yang dipakai bebas. Pada contoh ini menggunakan port 5000 seperti sesuai contoh file aslinya.

“SSL”

konfigurasi ini tidak menggunakan security

“mapping”

Bagian ini berisi konfigurasi penerimaan data dari client dan juga pemetaan data untuk dikirim ke ThingsBoard Core.

“endpoint”: untuk mendefinisikan URL dari REST API

IoT Gateway ini misalnya menggunakan IP address 192.168.0.92. Jadi alamat dari REST API adalah http://192.168.0.92:5000/device1

“HTTPMethods”: konfigurasi ini menggunakan HTTP POST. Sesuai contoh dari Thingsboard

“security”: anonymous, tidak menggunakan password samsekali

“converter”: berisi pemetaan data yang diterima, ke parameter yang akan dikirim ke ThingsBoard Core

“deviceNameExpression”: “Device ${name}”, : baris ini artinya mengharapkan adanya parameter “name” dari data yang masuk. Data ini kemudian akan dikirim sebagai string “Device $name” ke ThingsBoard Core.

“attributes”: berisi atribut dari device di client

“timeseries”: berisi entry data yang akan dimasukkan sebagai data telemetri di Device di ThingsBoard Core.

Pada contoh ini ada 2 entry data, yaitu temperatur dan humidity. Parameter yang diharapkan diterima adalah “temp” dan “hum”. Parameter “temp” akan dipetakan ke parameter “temperature”, dan parameter “hum” akan dipetakan ke parameter “humidity”.

Client Dengan PHP CURL

Berikut ini contoh client menggunakan PHP Curl

<?php 
// API URL
$url = 'http://192.168.0.92:5000/device1';
// Create a new cURL resource
$ch = curl_init($url);
// Setup request to send json via POST

$body_array = array();
$body_array["name"] = "123123";
$body_array["sensorModel"] = "CX811";
$body_array["hum"] = 78;
$body_array["temp"] = 65;
$body = json_encode($body_array);
// Attach encoded JSON string to the POST fields
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
// Set the content type to application/json
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Execute the POST request
$result = curl_exec($ch);
// Close cURL resource
curl_close($ch);
print_r($payload);
print_r($result);

Berikut ini data yang masuk ke ThingsBoard sebagai latest telemetry

 

Jika koneksi berhasil, pada console thingsboard dan file log “connector.log” akan muncul pesan seperti berikut ini:


”2022-05-12 01:40:58′ – INFO – rest_connector – 319 – CONVERTER CONFIG: {‘type’: ‘json’, ‘deviceNameExpression’: ‘Device ${name}’, ‘deviceTypeExpression’: ‘default’, ‘attributes’: [{‘type’: ‘string’, ‘key’: ‘model’, ‘value’: ‘${sensorModel}’}], ‘timeseries’: [{‘type’: ‘double’, ‘key’: ‘temperature’, ‘value’: ‘${temp}’}, {‘type’: ‘double’, ‘key’: ‘humidity’, ‘value’: ‘${hum}’}]}’
”2022-05-12 01:40:58′ – INFO – rest_connector – 324 – CONVERTED_DATA: {‘deviceName’: ‘Device 58749’, ‘deviceType’: ‘default’, ‘attributes’: [{‘model’: ‘BMP280’}], ‘telemetry’: [{‘temperature’: ’80’}, {‘humidity’: ’67’}]}’

Dari pesan itu dapat diperiksa apakah konfigurasi “mapping” di rest.json sudah sesuai.

Client Dengan POSTMAN

Jika menggunakan software POSTMAN atau semacamnya, yg perlu diset adalah sebagai berikut:

  • URL: http://192.168.0.92:5000/device1
  • Payload dalam format JSON: {“name”:”58749″,”sensorModel”:”BMP280″,”hum”:67,”temp”:80}

Literatur