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 (0 modified, 0 added, 13 removed)
Details
- Page properties
-
- Content
-
... ... @@ -22,10 +22,7 @@ 22 22 To complete this tutorial, you need to have the following: 23 23 24 24 * ThingsBoard cloud account 25 -* MQTT Broker (public or private) such as, 26 -** **[[HiveMQ Cloud>>https://www.hivemq.com]] - You can create a free account to try it or subscribe for a paid account. - We use HiveMQ Cloud as the MQTT broker to build example in this tutorial.** 27 -** [[emqx>>https://www.emqx.com/zh/mqtt/public-mqtt5-broker]] - The public MQTT server is only used for MOTT learning and testing, and should not be used in the production environment. 28 -** [[lns1.thingseye.io>>http://lns1.thingseye.io/]] - This is Dragino's MQTT broker, which requires a CA certificate to use. 25 +* HiveMQ Cloud account 29 29 30 30 == 2.1 ThingsBoard Cloud == 31 31 ... ... @@ -69,9 +69,7 @@ 69 69 70 70 == 2.2 HiveMQ Cloud == 71 71 72 -=== 2.2.1 HiveMQ Cloud === 73 73 74 - 75 75 Go to [[https:~~/~~/www.hivemq.com>>https://www.hivemq.com]] 76 76 77 77 Click on the **Start Free** button. ... ... @@ -146,24 +146,6 @@ 146 146 You will need these MQTT connection parameters when configuring the MQTT integration in the '**Add Integration**' section. 147 147 148 148 149 -=== 2.2.2 emqx === 150 - 151 - 152 -The [[emqx>>https://www.emqx.com/zh/mqtt/public-mqtt5-broker]] public MQTT server is only used for MOTT learning and testing, and should not be used in the production environment. 153 - 154 - 155 -[[image:emqx.png||height="420" width="500"]] 156 - 157 - 158 -=== 2.2.3 Ins1.thingseye.io === 159 - 160 -[[lns1.thingseye.io>>http://lns1.thingseye.io/]] is the Dragino's MQTT broker, which requires a CA certificate file, Certificate file, and the Private key file to use. 161 - 162 -If customers need to use this MQTT connection with ThingsBoard, they need to contact the TE team to obtain three license files. 163 - 164 -[[image:ins1.png||height="310" width="500"]] 165 - 166 - 167 167 = 3. Data Converters = 168 168 169 169 ... ... @@ -176,6 +176,7 @@ 176 176 In the left navigation, click **Integrations center**, and then click **Data converters**. 177 177 178 178 156 + 179 179 [[image:data-converters-list-empty.png]] 180 180 181 181 ... ... @@ -188,130 +188,34 @@ 188 188 189 189 The **Add data converter** window will appear. Name it ‘**MQTT Uplink Converter NB/CB**’ and select the Type as **Uplink**. 190 190 191 -Click on the ** JavaScript**button.169 +Click on the **TBEL** button if not selected it by default. Delete the existing decoder function in the code editor. Now copy and paste the following decoder function written in **TBEL (ThingsBoard Expression Language)** in to the **code editor**. This decoder function is compatible for both NB and CB series devices. 192 192 193 -Delete the default decoder function in the code editor. Now copy and paste the following decoder function written in **JavaScript** in to the **code editor**. This decoder function is compatible for both NB and CB series devices. 194 - 195 - 196 196 {{code language="JavaScript"}} 197 -//Version: 0.1 172 +/** Decoder **/ 173 + 198 198 // decode payload to string 199 199 var payloadStr = decodeToString(payload); 176 +var data = JSON.parse(payloadStr); 200 200 178 +var deviceName = metadata.topic.split("/")[3]; 201 201 // decode payload to JSON 202 -var objdata = {}; 203 -var obj1 = {}; 204 -var data = decodeToJson(payload); 205 -var deviceName = data.IMEI; 206 -delete data.IMEI; 207 -var modelname = "Dragino " + data.Model; 208 -//var mod = data.mod 209 -delete data.Model; 210 -//delete data.mod 211 -var timestamp = new Date().getTime(); 180 +var deviceType = 'sensor'; 212 212 213 -for (var key in data) { 214 - 215 - if (Number(key)) { 216 - obj1[key] = data[key]; 217 - obj1[key][obj1[key].length - 1] = Number(new Date( 218 - obj1[key][obj1[key].length - 1])); 219 - 220 - } 221 -//Alec submitted25/02/25 222 -//turn old key into new 223 - else if (key === "Reading") { 224 - objdata["reading"] = data[key]; 225 - } else if (key === "work mode") { 226 - objdata["work_mode"] = data[key]; 227 - } else if (key === "hum") { 228 - objdata["humidity"] = data[key]; 229 - }else if (key === "hum2") { 230 - objdata["humidity2"] = data[key]; 231 - } else if (key === "hum3") { 232 - objdata["humidity3"] = data[key]; 233 - } else if (key === "tem") { 234 - objdata["temperature"] = data[key]; 235 - } else if (key === "tem2") { 236 - objdata["temperature2"] = data[key]; 237 - } else if (key === "tem3") { 238 - objdata["temperature3"] = data[key]; 239 - } else if (key === "DS18B20_Temp") { 240 - objdata["temperature_pro"] = data[key]; 241 - } else if (key === "ds18b20_temperature") { 242 - objdata["temperature_pro"] = data[key]; 243 - } else if (key === "DS18B20_temperature_pro") { 244 - objdata["temperature_pro"] = data[key]; 245 - } else if (key === "tdc send flag") { 246 - objdata["tdc_send_flag"] = data[key]; 247 - } else if (key === "trigger mode") { 248 - objdata["trigger_mode"] = data[key]; 249 - } else if (key === "soil dielectric constant") { 250 - objdata["soil_dielectric_constant"] = data[key]; 251 - } else if (key === "door open num") { 252 - objdata["door_open_num"] = data[key]; 253 - } else if (key === "door duration") { 254 - objdata["door_duration"] = data[key]; 255 - } else if (key === "count time") { 256 - objdata["count_time"] = data[key]; 257 - } else if (key === "last open time2") { 258 - objdata["last_open_time2"] = data[key]; 259 - } else if (key === "last open time3") { 260 - objdata["last_open_time3"] = data[key]; 261 - } 262 -//Alec submitted25/02/25 263 - else { 264 - objdata[key] = data[key] 265 - } 266 -} 267 -var listdata = [{ 268 - "ts": timestamp, 269 - "values": objdata 270 -}] 271 -for (var key1 in obj1) { 272 - if (modelname == "Dragino RS485-NB") { 273 - listdata.push({ 274 - "ts": obj1[key1][obj1[key1].length - 1], 275 - "values": { 276 - "Payload": obj1[key1][0], 277 - } 278 - }) 279 - } else { 280 - listdata.push({ 281 - "ts": obj1[key1][obj1[key1].length - 1], 282 - "values": { 283 - "values": obj1[key1] 284 - }, 285 - }) 286 - } 287 -} 182 +// Result object with device attributes/telemetry data 288 288 var result = { 289 - 290 290 deviceName: deviceName, 291 - deviceType: modelname,185 + deviceType: deviceType, 292 292 attributes: { 293 - model: modelname, 294 - //customerName: "NB-CB", 295 - //groupName: "NB-CB", 296 - //integrationName: metadata['integrationName'] 297 - 187 + integrationName: metadata['integrationName'], 298 298 }, 299 - telemetry: listdata 300 -} 189 + telemetry: { 190 + temperature: data.temperature, 191 + humidity: data.humidity, 192 + } 193 +}; 301 301 302 -function decodeToString(payload) { 303 - return String.fromCharCode.apply(String, payload); 304 -} 195 +/** Helper functions 'decodeToString' and 'decodeToJson' are already built-in **/ 305 305 306 -function decodeToJson(payload) { 307 - // covert payload to string. 308 - var str = decodeToString(payload); 309 - 310 - // parse string to JSON 311 - var data = JSON.parse(str); 312 - return data; 313 -} 314 - 315 315 return result; 316 316 {{/code}} 317 317 ... ... @@ -319,16 +319,16 @@ 319 319 Click on the **Add** button. 320 320 321 321 322 -[[image:mqtt-uplink.png||width="500"]] 323 323 205 +[[image:add-uplink-data-converter.png||height="529" width="500"]] 324 324 325 325 326 326 You should see that the newly added **MQTT Uplink converter **NB/CB is listed on the **Data Converters** page. 327 327 328 - 329 329 [[image:data-converter-list-showing-uplink-dc.png]] 330 330 331 331 213 + 332 332 == 3.2 Downlink == 333 333 334 334 ... ... @@ -386,6 +386,7 @@ 386 386 Click on the **Add** button. 387 387 388 388 271 + 389 389 [[image:add-downlink-data-converter.png||height="529" width="500"]] 390 390 391 391 ... ... @@ -395,6 +395,7 @@ 395 395 [[image:data-converters-list.png]] 396 396 397 397 281 + 398 398 = 4. Add Integration = 399 399 400 400 ... ... @@ -422,6 +422,7 @@ 422 422 Click **Next** button. 423 423 424 424 309 + 425 425 [[image:add-integration-basic-settings.png||height="511" width="500"]] 426 426 427 427 ... ... @@ -433,6 +433,7 @@ 433 433 Click **Next** button. 434 434 435 435 321 + 436 436 [[image:add-integration-uplink-data-converter.png||height="511" width="500"]] 437 437 438 438 ... ... @@ -444,18 +444,19 @@ 444 444 Click **Next** button. 445 445 446 446 333 + 447 447 [[image:add-integration-downlink-data-converter.png||height="511" width="500"]] 448 448 449 449 450 450 **Connection:** 451 451 452 -* **Host**: Cluster URL (Eg. 011731f7 xxxxxxxxxxxfbbedfc63f4.s1.eu.hivemq.cloud)339 +* **Host**: Cluster URL (Eg. 011731f7928541588a6cdfbbedfc63f4.s1.eu.hivemq.cloud) 453 453 * **Port**: 8883 454 454 * **Credentials**: Basic 455 455 * **Enable SSL**: YES 456 456 * **Username**: Username (from your HiveMQ Cloud Cluster with your credentials) 457 457 * **Password:** Password (from your HiveMQ Cloud Cluster with your credentials) 458 -* **Topic: v1/devices/+/telemetry**(the + replaces any 'device name'willcreateadevice in the Entities -> Devices)345 +* **Topic:** tb/mqtt-integration-tutorial/sensors/+/telemetry (the + replaces any 'device name' and creates devices in the Entities -> Devices) 459 459 * **QoS:** 0-At most once 460 460 461 461 [[image:add-integration-connection.png||height="511" width="500"]] ... ... @@ -463,8 +463,8 @@ 463 463 464 464 Click on the **Advanced settings** button. 465 465 466 -* **Clean session:** YES467 -* **Retained**: YES353 +* **Clean session:** NO 354 +* **Retained**: NO 468 468 469 469 [[image:add-integration-connection-advanced-settings.png||height="510" width="500"]] 470 470 ... ... @@ -497,7 +497,6 @@ 497 497 498 498 == 5.1 How does it work? == 499 499 500 - 501 501 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. 502 502 503 503 The Mosquitto client publishes messages on the topic v1/devices/[device_name]/telemetry. The [device_name]placeholder can be replaced with any device name, for example, 'S31B-NB'. Then, the MQTT topic would be v1/devices/S31B-NB/telemetry. ... ... @@ -511,12 +511,12 @@ 511 511 For example, if you send two MQTT messages with different device names in the topic: 512 512 513 513 1. v1/devices/**S31B-NB**/telemetry 514 -1. v1/devices/** LDS25-NB**/telemetry400 +1. v1/devices/**S31B-CB**/telemetry 515 515 516 -ThingsBoard will create two devices named **S31B-NB** and LDS25-NB** in the **//Devices//** section.402 +ThingsBoard will create two devices named **S31B-NB** and **S31B-CB** in the **//Devices//** section. 517 517 518 518 519 -The MQTT payload format is as follows, which is commonfor all ~-~-NB and ~-~-CB series devices:405 +The MQTT payload format is as follows, for example: 520 520 521 521 {{code language="none"}} 522 522 {"temperature":10.4, "humidity":85} ... ... @@ -529,144 +529,7 @@ 529 529 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 10.4 and 85, respectively. This payload is also (technically) known as telemetry. 530 530 531 531 {{code language="none"}} 532 -mosquitto_pub -d -q 1 -h 011731f7928 xxxxx.s1.eu.hivemq.cloud -p 8883 -t "tb/mqtt-integration-tutorial/sensors/S31B-NB/telemetry" -u "xxxxx" -P "xxxxx" -m '{"temperature":10.4, "humidity":85}'418 +mosquitto_pub -d -q 1 -h 011731f7928541588a6cdfbbedfc63f4.s1.eu.hivemq.cloud -p 8883 -t "tb/mqtt-integration-tutorial/sensors/SN-001/telemetry" -u "pradeeka" -P "Kalpani123@" -m '{"temperature":10.4, "humidity":85}' 533 533 {{/code}} 534 534 535 -If the integration was performed without errors, the status of the integration changes to 'Active' after the first telemetry transmission. 536 - 537 - 538 -[[image:integration-active.png]] 539 - 540 - 541 -Also, a new device named **S31B-NB** will appear under **//Entities -> Devices -> All//**. This means the first MQTT message triggers ThingsBoard to provision a device named **S31B-NB**. 542 - 543 - 544 -[[image:device-provision-1.png]] 545 - 546 - 547 -Click on the device S31B-NB on the devices list to see its details. 548 - 549 -Then go to the **Latest telemetry** tab. 550 - 551 -You can see the fields temperature and humidity with the values you previously sent using the MQTT message. 552 - 553 - 554 -[[image:telemetry-1.png]] 555 - 556 - 557 -Now, change the values of the fields and send the MQTT message again. For example, set temperature to 20 and humidity to 70. Observe how the values update in //Latest Telemetry//. 558 - 559 - 560 -[[image:telemetry-2.png]] 561 - 562 - 563 -Let's provision the second device named **LDS25-NB **with initial telemetry. Use the following MQTT message. 564 - 565 - 566 -{{code language="none"}} 567 -mosquitto_pub -d -q 1 -h 011731f7928541588a6cdfbbedfc63f4.s1.eu.hivemq.cloud -p 8883 -t "tb/mqtt-integration-tutorial/sensors/LDS25-NB/telemetry" -u "pradeeka" -P "Kalpani123@" -m '{"temperature":11, "humidity":87}' 568 -{{/code}} 569 - 570 -Now, refresh the **Devices** page, and you will see the second device, **LDS25-NB**, which was recently provisioned. 571 - 572 - 573 -[[image:device-provision-2.png]] 574 - 575 - 576 -= 6. Creating a Dashboard = 577 - 578 -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. 579 - 580 - 581 -This section guides you on how to create a dashboard to display temperature and humidity data from the device on a time-series chart. You may also use other widgets in ThingsBoard to display data according to your requirements. 582 - 583 - 584 -In **ThingsBoard**, from the left navigation menu, click **Dashboards**. Then, click the **+** button and select **Create new dashboard** from the dropdown menu. 585 - 586 - 587 -[[image:dashboard-1.png]] 588 - 589 - 590 -In the **Title** text box, enter **NB/CB Test Dashboard** as the title of the dashboard. 591 - 592 -Click on the **Add** button. 593 - 594 - 595 -[[image:dashboard-2.png||height="526" width="500"]] 596 - 597 - 598 -Click on the **Add widget / Add new widget** button. 599 - 600 - 601 -[[image:dashboard-3.png]] 602 - 603 - 604 -In the **Select widgets bundle** window, click **Charts**. 605 - 606 - 607 -[[image:dashboard-4.png||height="537" width="700"]] 608 - 609 - 610 - 611 -In the **Charts: select widget** window, click **Time series chart**. 612 - 613 - 614 -[[image:dashboard-5.png||height="525" width="700"]] 615 - 616 - 617 -Configure the **Time series chart** widget as follows: 618 - 619 -* **Datasource** - select S31B-NB device you provisioned. 620 -* **Series**: 621 -** **temperature** - you can see this key by default. 622 -** **humidity** - Click **Add series** button. Then add the **humidity** for the key and then type **%** as its unit. 623 -* Click on the **Add** button. 624 - 625 -[[image:timeseries-1.png||height="491" width="700"]] 626 - 627 - 628 -The time-series chart will appear in edit mode. Resize it by clicking and dragging the lower-right corner. 629 - 630 -Click the **Save** button to add the widget to the dashboard. 631 - 632 - 633 -[[image:timeseries-3.png||height="347" width="700"]] 634 - 635 - 636 -Now send the following MQTT messages from the terminal to simulate the data. 637 - 638 - 639 -{{code language="none"}} 640 -mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -t "tb/mqtt-integration-tutorial/sensors/S31B-NB/telemetry" -u "xxxxx" -P "xxxxx" -m '{"temperature":20, "humidity":70}' 641 - 642 -mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -t "tb/mqtt-integration-tutorial/sensors/S31B-NB/telemetry" -u "xxxxx" -P "xxxxx" -m '{"temperature":22, "humidity":71}' 643 - 644 -mosquitto_pub -d -q 1 -h 011731f7928xxxxx.s1.eu.hivemq.cloud -p 8883 -t "tb/mqtt-integration-tutorial/sensors/S31B-NB/telemetry" -u "xxxxx" -P "xxxxx" -m '{"temperature":18, "humidity":79}' 645 - 646 -{{/code}} 647 - 648 -The chart will update with the values in realtime, as shown in the below image. 649 - 650 - 651 -[[image:timeseries-4.png||height="316" width="700"]] 652 - 653 - 654 -= 7. Configure NB-IoT Sensor = 655 - 656 - 657 -Now, let's experiment with sending data to ThingsBoard using a real NB-IoT device. For example, we will use the **S31B-NB**. 658 - 659 -First, configure the NB-IoT device with the necessary MQTT settings using AT commands. Below is a list of AT commands you can use. 660 - 661 - 662 -**AT Commands** 663 - 664 -* **AT+PRO=3,3 **~/~/ Use MQTT to connect to ThingsBoard. Payload Type set to 3. 665 -* **AT+SUBTOPIC=<MQTT topic>** 666 -* **AT+PUBTOPIC=<MQTT topic>** 667 -* **AT+CLIENT=null** 668 -* **AT+UNAME=<MQTT Username>** 669 -* **AT+PWD=<MQTT Password>** 670 -* **AT+SERVADDR=<Broker address, Port>** 671 - 672 -Test your uplink by pressing the ACT button for 1 second. 421 +If the integration was performed without errors, after the transmission of the first telemetry, a new device with the name “S31B-NB” will appear in the Devices → All. Also, you can verify the input and output data, respectively, before and after conversion in Data converters → UDP Uplink Converter NB/CB → Events.
- dashboard-1.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -271.1 KB - Content
- dashboard-2.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -112.2 KB - Content
- dashboard-3.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -141.3 KB - Content
- dashboard-4.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -803.7 KB - Content
- dashboard-5.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -476.1 KB - Content
- device-provision-2.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -213.9 KB - Content
- emqx.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -39.1 KB - Content
- ins1.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -28.8 KB - Content
- mqtt-uplink.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -175.1 KB - Content
- telemetry-2.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -185.1 KB - Content
- timeseries-1.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -179.1 KB - Content
- timeseries-3.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -174.2 KB - Content
- timeseries-4.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.pradeeka - Size
-
... ... @@ -1,1 +1,0 @@ 1 -159.0 KB - Content