Changes for page ThingsBoard
Last modified by Dilisi S on 2025/04/23 19:23
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Attachments (2 modified, 0 added, 4 removed)
Details
- Page properties
-
- Content
-
... ... @@ -164,18 +164,34 @@ 164 164 [[image:ins1.png||height="310" width="500"]] 165 165 166 166 167 += 3. Creating Devices = 167 167 168 -= 3. Data Converters = 169 169 170 +First, you need to create devices in ThingsBoard to represent your physical devices. For example, you can name it **Device A**, and the second device could be **Device B** or any name you prefer. The device name should be unique within the **Devices** space. 170 170 171 -In **ThingsBoard**, **Data Converters** are components used to transform incoming or outgoing data between different formats, typically to convert raw telemetry data from devices into a structured format that ThingsBoard can understand, or vice versa. 172 172 173 - **In this section,you will createa universal uplink data converterfor all Dragino NB-IoT devices. The uplinkdecoder converts any MQTT message coming from a device into key-value pairs that can beusedtodisplay and visualizedata usingvarious widgetson the dashboard**.173 +In the left navigation, click Entities -> Devices. 174 174 175 +Click the **Add Device** button (the button with the **+** sign), and from the dropdown menu, click **Add new device**. 175 175 176 - ==3.1Uplink==177 +In the **Add new device** dialog box, enter the device name in the **Name** text box. For example, we will use **Device A**. 177 177 179 +Click the **Add** button. 178 178 181 +Skip the **connectivity testing** by clicking the **Close** button. 182 + 183 +The device is created and listed on the **Devices** page. Note that its initial state is **Inactive** because it has not received any data yet. 184 + 185 + 186 += 4. Data Converters = 187 + 188 + 189 +In **ThingsBoard**, **Data Converters** are components used to transform incoming or outgoing data between different formats, typically to convert raw telemetry data from devices into a structured format that ThingsBoard can understand, or vice versa. 190 + 191 + 192 +== 4.1 Uplink == 193 + 194 + 179 179 In the left navigation, click **Integrations center**, and then click **Data converters**. 180 180 181 181 ... ... @@ -182,7 +182,7 @@ 182 182 [[image:data-converters-list-empty.png]] 183 183 184 184 185 -On the **Data converters** page, click on the ‘**+**’ button, and then click on 201 +On the **Data converters** page, click on the ‘**+**’ button, and then click on the **Create new converter** from the dropdown menu. 186 186 187 187 188 188 ... ... @@ -189,67 +189,77 @@ 189 189 [[image:create-new-converter-menu.png||height="259" width="500"]] 190 190 191 191 192 -The **Add data converter** window appears. 208 +The **Add data converter** window will appear. Name it ‘**MQTT Uplink Converter NB/CB**’ and select the Type as **Uplink**. 193 193 194 -Name it ‘**MQTT Uplink Converter**’ and select the Type as **Uplink**. 195 - 196 196 Click on the **TBEL** button if it has not been selected by default. 197 197 198 - Replacethe default TBELdecoderfunctionwiththefollowinguniversalTBELdecoderfunction,whichdecodesMQTT payload from any Dragino NB-IoTdevice.212 +Modify the default TBEL function to match with your device as described below: 199 199 200 200 215 +* Uncomment** line 11**: 216 + 217 +//var data = decodeToJson(payload)// 218 + 219 + 220 +* **Line 13**: Assign your device name to the **deviceName** field. - We used **Device A** as it is to match with our device, **Device A **in the Devices section. 221 +* From **line 38**: Modify the telemetry section to allow parsed data to be assigned to the fields. 222 + 223 +//telemetry: { 224 + temperature: data.temperature, 225 + humidity: data.humidity, 226 + rawData: payloadStr 227 + }// 228 + 229 + 230 +The modified uplink decoder function to match with **Device A** is shown below. 231 + 201 201 {{code language="JavaScript"}} 233 +// Decode an uplink message from a buffer 234 +// payload - array of bytes 235 +// metadata - key/value object 236 + 237 +/** Decoder **/ 238 + 239 +// decode payload to string 240 +var payloadStr = decodeToString(payload); 241 + 202 202 // decode payload to JSON 203 -var pattern = "yyyy/MM/dd HH:mm:ss"; 204 -var objdata = {}; 205 -var obj1 = {}; 206 206 var data = decodeToJson(payload); 207 -var deviceName = data.IMEI; 208 -data.remove("IMEI"); 209 -var modelname = "Dragino "+ data.Model; 210 -//var mod = data.mod 211 -data.remove("Model"); 212 -//delete data.mod 213 -var timestamp = new Date().getTime(); 214 -foreach (entry: data.entrySet()) { 215 - var key = entry.getKey(); 216 - var value = entry.getValue(); 217 - //objdata[key] = data[key] 218 - if(key.matches("^-?\\d+$")){ //is number 219 - obj1[key]=data[key]; 220 - var index = obj1[key].length-1; 221 - obj1[key][index]=new Date(obj1[key][index],pattern).getTime(); 222 - } 223 - else if (key==="bat"||key==="BAT"){ 224 - objdata["battery"] = data[key]; 225 - } 226 - else{ 227 - objdata[key] = data[key]; 228 -}} 229 -var listdata = [{"ts":timestamp,"values":objdata}]; 230 -foreach ( entry1: obj1.entrySet()){ 231 - var key1 = entry1.getKey(); 232 - var value1 = entry1.getValue(); 233 - var index = obj1[key1].length-1; 234 - var ts = obj1[key1][index]; 235 - if (modelname=="Dragino RS485-NB"){ 236 - listdata.push({"ts":ts,"values":{"Payload":obj1[key1][0]}}); 237 - } 238 - else{ 239 - listdata.push({"ts":ts,"values":{"values":obj1[key1]}}); 240 - } 241 -} 242 - var result = { 243 - deviceName: deviceName, 244 - deviceType: modelname, 245 - attributes: { 246 - model: modelname 247 - //customerName: "NB-CB", 248 - //groupName: "NB-CB", 249 - //integrationName: metadata['integrationName'] 250 - }, 251 - telemetry: listdata 244 + 245 +var deviceName = 'Device A'; 246 +var deviceType = 'thermostat'; 247 +var customerName = 'Customer C'; 248 +var groupName = 'thermostat devices'; 249 +var manufacturer = 'Example corporation'; 250 +// use assetName and assetType instead of deviceName and deviceType 251 +// to automatically create assets instead of devices. 252 +// var assetName = 'Asset A'; 253 +// var assetType = 'building'; 254 + 255 +// Result object with device/asset attributes/telemetry data 256 +var result = { 257 +// Use deviceName and deviceType or assetName and assetType, but not both. 258 + deviceName: deviceName, 259 + deviceType: deviceType, 260 +// assetName: assetName, 261 +// assetType: assetType, 262 +// customerName: customerName, 263 + groupName: groupName, 264 + attributes: { 265 + model: 'Model A', 266 + serialNumber: 'SN111', 267 + integrationName: metadata['integrationName'], 268 + manufacturer: manufacturer 269 + }, 270 + telemetry: { 271 + temperature: data.temperature, 272 + humidity: data.humidity, 273 + rawData: payloadStr 274 + } 252 252 }; 276 + 277 +/** Helper functions 'decodeToString' and 'decodeToJson' are already built-in **/ 278 + 253 253 return result; 254 254 {{/code}} 255 255 ... ... @@ -257,7 +257,7 @@ 257 257 Once you modify the decoder function, click on the **Add** button. 258 258 259 259 260 -[[image:mqtt-uplink -converter.png||height="498"width="500"]]286 +[[image:mqtt-uplink.png||width="500"]] 261 261 262 262 263 263 ... ... @@ -264,13 +264,12 @@ 264 264 You should see that the newly added **MQTT Uplink converter **NB/CB is listed on the **Data Converters** page. 265 265 266 266 293 +[[image:data-converter-list-showing-uplink-dc.png]] 267 267 268 -[[image:data-converters-list.png]] 269 269 296 += 5. Add Integration = 270 270 271 -= 4. Add Integration = 272 272 273 - 274 274 In the left navigation, click **Integrations center**, and then click **Integrations**. 275 275 276 276 ... ... @@ -288,18 +288,16 @@ 288 288 **Basic settings:** 289 289 290 290 * **Integration type**: MQTT 291 -* **Name**: MQTT integration - Device A316 +* **Name**: MQTT integration NB/CB 292 292 * **Enable integration**: YES 293 -* **Allow create devices or assets**: YES 318 +* **Allows create devices or assets**: YES 294 294 295 295 Click **Next** button. 296 296 297 297 298 -[[image:add-integration-basic-settings.png||height="5 04" width="500"]]323 +[[image:add-integration-basic-settings.png||height="511" width="500"]] 299 299 300 300 301 - 302 - 303 303 **Uplink data converter:** 304 304 305 305 * Click on the **Select existing** button. ... ... @@ -308,10 +308,9 @@ 308 308 Click **Next** button. 309 309 310 310 311 -[[image:add-integration-ul-data-converter.png||height="5 05" width="500"]]334 +[[image:add-integration-uplink-data-converter.png||height="511" width="500"]] 312 312 313 313 314 - 315 315 **Downlink data converter:** 316 316 317 317 Dragino NB/CB devices don't require a downlink data converter to decode their payloads, so you can skip this step. ... ... @@ -336,7 +336,7 @@ 336 336 * **Topic: device/a** (The topic can be anything; you can even use just the device name.) 337 337 * **QoS:** 0-At most once 338 338 339 -[[image:add-integ artion-connection.png||height="505" width="500"]]361 +[[image:add-integration-connection.png||height="511" width="500"]] 340 340 341 341 342 342 Click on the **Advanced settings** button. ... ... @@ -366,16 +366,15 @@ 366 366 Since we haven't received data from a device yet, the integration **Status** is shown as **Pending.** 367 367 368 368 369 -[[image:integration- added.png]]391 +[[image:new-integration-pending.png]] 370 370 371 371 394 += 6. Verifying the receipt of data from virtual devices = 372 372 373 -= 5. Verifying the receipt of data from virtual devices = 374 374 397 +== 6.1 How does it work? == 375 375 376 -== 5.1 How does it work? == 377 377 378 - 379 379 We use the Mosquitto MQTT client to simulate MQTT messages, acting as a virtual device. First, install the Mosquitto client on your computer from [[this link>>url:https://mosquitto.org/download/]]. The Mosquitto client publishes messages to the MQTT broker (HiveMQ) on a specified MQTT topic. ThingsBoard subscribes to these messages using the same topic. 380 380 381 381 The Mosquitto client publishes messages (payloads) on the topic **/device/a**. Of course, you can use any topic for testing. ... ... @@ -392,7 +392,7 @@ 392 392 == 5.2 Sending messages == 393 393 394 394 395 -On your computer'sterminal, issue the following MQTT command which simulates the device'**Device A'**. The message payload contains the fieldsIMEI,temperature,humidity,and pressure,which hold the values 350693903995577,30, 80,and1005respectively. This payload is also (technically) known as telemetry.416 +On the terminal, issue the following MQTT command which simulates the device S31B-NB. The message payload contains the fields temperature and humidity, which hold the values S31B-NB and 27, respectively. This payload is also (technically) known as telemetry. 396 396 397 397 {{code language="none"}} 398 398 mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -u "xxxxx" -P "xxxxx" -t "device/a" -m '{"IMEI":"350693903995577", "temperature":30, "humidity":80, "pressure":1005}' ... ... @@ -404,9 +404,11 @@ 404 404 [[image:integration-active.png]] 405 405 406 406 407 -== 5.3 Viewing messages == 408 408 409 409 430 +== 6.3 Viewing messages == 431 + 432 + 410 410 Go back to the **Integrations** page. 411 411 412 412 Click on the **MQTT integration NB/CB** in the **Integrations** page to see its details. ... ... @@ -422,28 +422,21 @@ 422 422 Then click on the **Apply changes** (//**tick icon**//) button. 423 423 424 424 425 -[[image: debug-enabled.png||height="301"width="700"]]448 +[[image:Screenshot 2025-03-18 at 09.23.10.png]] 426 426 427 427 428 - 429 - 430 430 Now go to the **Events** tab. 431 431 432 -Select the **Event type**as **Debug** from the dropdown list.453 +Select the Event type as **Debug** from the dropdown list. 433 433 434 - Publish anothermessage (of course,you canrepeatthe previousmessagebypressing theUParrowonyourkeyboardandthen pressEnter key) toyourMQTT brokerfromyour terminal, for example:455 +Now you can see all the Uplink messages you are simulating through the MQTT broker. The status should be **OK **if there is no errors in your integration. 435 435 436 -{{code language="none"}} 437 -mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -u "xxxxx" -P "xxxxx" -t "device/a" -m '{"IMEI":"350693903995577", "temperature":30, "humidity":80, "pressure":1005}' 438 -{{/code}} 439 439 440 -Now you can see that uplink message in the **Events** tab (Click the **refresh** button if you didn't see any messages in the Events tab). The status should be **OK **if there is no errors in your integration. 441 - 442 - 443 443 [[image:Screenshot 2025-03-26 at 19.49.31.png]] 444 444 445 445 446 446 462 + 447 447 Then click on the **three dots (...)** in the **Message** column. You can see the uplink message's **payload** in the **Message** window. 448 448 449 449 ... ... @@ -455,7 +455,7 @@ 455 455 Now, you have successfully tested your integration with a simulated uplink payload and verified that it is received by ThingsBoard, and the device is provisioned. 456 456 457 457 458 -= 6. Creating a Dashboard =474 += 7. Creating a Dashboard = 459 459 460 460 ThingsBoard **Dashboards** provide a powerful way to visualize and monitor real-time and historical data from connected devices. They allow users to create interactive, customizable panels displaying telemetry data, device status, and other key metrics. With a variety of widgets, including charts, maps, and tables, dashboards help users gain insights, track trends, and manage IoT deployments efficiently. 461 461 ... ... @@ -465,7 +465,7 @@ 465 465 466 466 First simulate a few messages using MQTT. This time, we have added the 'humidity' field to the payload. Eg: 467 467 468 -{{code language="none"}}mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -u "xxxxx" -P "xxxxx" - t "device/a" -m '{"IMEI":"350693903995577", "temperature":22, "humidity":80, "pressure":1005}'{{/code}}484 +{{code language="none"}}mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -t "v1/devices/me/telemetry" -u "xxxxx" -P "xxxxx" -m '{"IMEI": "S31B-NB", "temperature": 22, "humidity":80}'{{/code}} 469 469 470 470 471 471 In **ThingsBoard**, from the left navigation menu, click **Dashboards**. Then, click the **+** button and select **Create new dashboard** from the dropdown menu. ... ... @@ -503,19 +503,15 @@ 503 503 504 504 Configure the **Time series chart** widget as follows: 505 505 506 -* **Datasource** - select **DeviceA**device you provisioned.522 +* **Datasource** - select S31B-NB device you provisioned. 507 507 * **Series**: 508 508 ** **temperature** - you can see this key by default. 509 509 ** **humidity** - Click **Add series** button. Then add the **humidity** for the key and then type **%** as its unit. 510 510 * Click on the **Add** button. 511 511 512 -{{info}} 513 -You can add only the relevant fields from the device's payload to display data on a widget. These fields are called 'keys'. 514 -{{/info}} 528 +[[image:timeseries-1.png||height="491" width="700"]] 515 515 516 -[[image:Screenshot 2025-03-31 at 06.51.15.png||height="485" width="700"]] 517 517 518 - 519 519 The time-series chart will appear in edit mode. Resize it by clicking and dragging the lower-right corner. 520 520 521 521 Click the **Save** button to add the widget to the dashboard. ... ... @@ -528,11 +528,12 @@ 528 528 529 529 530 530 {{code language="none"}} 531 -mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -u "xxxxx" -P "xxxxx" - t "device/a" -m '{"IMEI":"350693903995577", "temperature":22, "humidity":70, "pressure":1005}'543 +mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -t "v1/devices/me/telemetry" -u "xxxxx" -P "xxxxx" -m '{"IMEI": "S31B-NB", "temperature": 22, "humidity":70}' 532 532 533 -mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -u "xxxxx" -P "xxxxx" - t "device/a" -m '{"IMEI":"350693903995577", "temperature":27, "humidity":72, "pressure":1005}'545 +mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -t "v1/devices/me/telemetry" -u "xxxxx" -P "xxxxx" -m '{"IMEI": "S31B-NB", "temperature": 27, "humidity":72}' 534 534 535 -mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -u "xxxxx" -P "xxxxx" -t "device/a" -m '{"IMEI":"350693903995577", "temperature":19, "humidity":80, "pressure":1005}' 547 +mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -t "v1/devices/me/telemetry" -u "xxxxx" -P "xxxxx" -m '{"IMEI": "S31B-NB", "temperature": 19, "humidity":80}' 548 + 536 536 {{/code}} 537 537 538 538 The chart will update with the values in realtime, as shown in the below image. ... ... @@ -541,7 +541,7 @@ 541 541 [[image:timeseries-4.png||height="316" width="700"]] 542 542 543 543 544 -= 8. Configure PhysicalNB-IoT Sensor =557 += 8. Configure NB-IoT Sensor = 545 545 546 546 547 547 Now, let's experiment with sending data to ThingsBoard using a real NB-IoT device. For example, we will use the **TS01-NB**. ... ... @@ -563,7 +563,13 @@ 563 563 564 564 565 565 566 -The following image shows the uplink payload of a real Dragino device. The publish topic is '**TS01-NB'that contains fieldsinthepayload, IMEI, IMSI, Model, temperature, etc**. Note that we have created a device named**TS01-NB** in the**Devices**sectioninadvance.579 +The following image shows the uplink payload of a real Dragino device. The publish topic is **TS01-NB**, and the device name is **861275077962896**, which is represented by the **IMEI**. 567 567 581 +{{info}} 582 +The ThingsBoard uses the device's IMEI number included in the payload to create a device in the Devices section. 583 +{{/info}} 568 568 569 569 [[image:image-4.png]] 586 + 587 + 588 +
- Screenshot 2025-03-31 at 06.51.15.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -179.5 KB - Content
- data-converters-list.png
-
- Size
-
... ... @@ -1,1 +1,1 @@ 1 -1 9.0KB1 +212.2 KB - Content
- debug-enabled.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -196.3 KB - Content
- integration-active.png
-
- Size
-
... ... @@ -1,1 +1,1 @@ 1 -64. 1KB1 +64.2 KB - Content
- integration-added.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -196.2 KB - Content
- mqtt-uplink-converter.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -75.3 KB - Content