Changes for page ThingsBoard

Last modified by Dilisi S on 2025/04/23 19:23

From version 194.1
edited by Dilisi S
on 2025/03/28 00:23
Change comment: Mar 27 edits - part 3
To version 204.1
edited by Dilisi S
on 2025/04/21 16:49
Change comment: April 21 edits - part 1

Summary

Details

Page properties
Content
... ... @@ -164,34 +164,18 @@
164 164  [[image:ins1.png||height="310" width="500"]]
165 165  
166 166  
167 -= 3. Creating Devices =
168 168  
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.
171 171  
172 -
173 -In the left navigation, click **Entities -> Devices**.
174 -
175 -Click the **Add Device** button (the button with the **+** sign), and from the dropdown menu, click **Add new device**.
176 -
177 -In the **Add new device** dialog box, enter the device name in the **Name** text box. For example, we will use **Device A**.
178 -
179 -Click the **Add** button.
180 -
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 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 190  
173 +**In this section, you will create a universal uplink data converter for all Dragino NB-IoT devices. The uplink decoder converts any MQTT message coming from a device into key-value pairs that can be used to display and visualize data using various widgets on the dashboard**.
191 191  
192 -== 4.1 Uplink ==
193 193  
176 +== 3.1 Uplink ==
194 194  
178 +
195 195  In the left navigation, click **Integrations center**, and then click **Data converters**.
196 196  
197 197  
... ... @@ -198,7 +198,7 @@
198 198  [[image:data-converters-list-empty.png]]
199 199  
200 200  
201 -On the **Data converters** page, click on the ‘**+**’ button, and then click on the **Create new converter** from the dropdown menu.
185 +On the **Data converters** page, click on the ‘**+**’ button, and then click on **Create new converter** from the dropdown menu.
202 202  
203 203  
204 204  
... ... @@ -205,79 +205,67 @@
205 205  [[image:create-new-converter-menu.png||height="259" width="500"]]
206 206  
207 207  
208 -The **Add data converter** window will appear.
192 +The **Add data converter** window appears.
209 209  
210 -Let's create an uplink data converter for the device named '**Device A**'. Name it ‘**MQTT Uplink Converter - Device A**’ and select the Type as **Uplink**.
194 +Name it ‘**MQTT Uplink Converter**’ and select the Type as **Uplink**.
211 211  
212 212  Click on the **TBEL** button if it has not been selected by default.
213 213  
214 -Modify the default TBEL function to match with your device as described below:
198 +Replace the default TBEL decoder function with the following universal TBEL decoder function, which decodes MQTT payload from any Dragino NB-IoT device.
215 215  
216 216  
217 -* Uncomment** line 11**:
218 -
219 -//var data = decodeToJson(payload)//
220 -
221 -
222 -* **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.
223 -* From **line 38**: Modify the telemetry section to allow parsed data to be assigned to the fields.
224 -
225 -//telemetry: {
226 - temperature: data.temperature,
227 - humidity: data.humidity,
228 - rawData: payloadStr
229 - }//
230 -
231 -
232 -The modified uplink decoder function to match with **Device A** is shown below.
233 -
234 234  {{code language="JavaScript"}}
235 -// Decode an uplink message from a buffer
236 -// payload - array of bytes
237 -// metadata - key/value object
238 -
239 -/** Decoder **/
240 -
241 -// decode payload to string
242 -var payloadStr = decodeToString(payload);
243 -
244 244  // decode payload to JSON
203 +var pattern = "yyyy/MM/dd HH:mm:ss";
204 +var objdata = {};
205 +var obj1 = {};
245 245  var data = decodeToJson(payload);
246 -
247 -var deviceName = 'Device A';
248 -var deviceType = 'thermostat';
249 -var customerName = 'Customer C';
250 -var groupName = 'thermostat devices';
251 -var manufacturer = 'Example corporation';
252 -// use assetName and assetType instead of deviceName and deviceType
253 -// to automatically create assets instead of devices.
254 -// var assetName = 'Asset A';
255 -// var assetType = 'building';
256 -
257 -// Result object with device/asset attributes/telemetry data
258 -var result = {
259 -// Use deviceName and deviceType or assetName and assetType, but not both.
260 - deviceName: deviceName,
261 - deviceType: deviceType,
262 -// assetName: assetName,
263 -// assetType: assetType,
264 -// customerName: customerName,
265 - groupName: groupName,
266 - attributes: {
267 - model: 'Model A',
268 - serialNumber: 'SN111',
269 - integrationName: metadata['integrationName'],
270 - manufacturer: manufacturer
271 - },
272 - telemetry: {
273 - temperature: data.temperature,
274 - humidity: data.humidity,
275 - rawData: payloadStr
276 - }
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
277 277  };
278 -
279 -/** Helper functions 'decodeToString' and 'decodeToJson' are already built-in **/
280 -
281 281  return result;
282 282  {{/code}}
283 283  
... ... @@ -285,18 +285,18 @@
285 285  Once you modify the decoder function, click on the **Add** button.
286 286  
287 287  
260 +[[image:mqtt-uplink-converter.png||height="498" width="500"]]
288 288  
289 -[[image:ul-data-converter-device-a.png||height="524" width="500"]]
290 290  
291 291  
292 292  You should see that the newly added **MQTT Uplink converter **NB/CB is listed on the **Data Converters** page.
293 293  
294 294  
295 -[[image:ul-data-converter-added.png||height="257"]]
296 296  
268 +[[image:data-converters-list.png]]
297 297  
298 298  
299 -= 5. Add Integration =
271 += 4. Add Integration =
300 300  
301 301  
302 302  In the left navigation, click **Integrations center**, and then click **Integrations**.
... ... @@ -318,7 +318,7 @@
318 318  * **Integration type**: MQTT
319 319  * **Name**: MQTT integration - Device A
320 320  * **Enable integration**: YES
321 -* **Allows create devices or assets**: YES
293 +* **Allow create devices or assets**: YES
322 322  
323 323  Click **Next** button.
324 324  
... ... @@ -398,10 +398,10 @@
398 398  
399 399  
400 400  
401 -= 6. Verifying the receipt of data from virtual devices =
373 += 5. Verifying the receipt of data from virtual devices =
402 402  
403 403  
404 -== 6.1 How does it work? ==
376 +== 5.1 How does it work? ==
405 405  
406 406  
407 407  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.
... ... @@ -432,7 +432,7 @@
432 432  [[image:integration-active.png]]
433 433  
434 434  
435 -== 6.3 Viewing messages ==
407 +== 5.3 Viewing messages ==
436 436  
437 437  
438 438  Go back to the **Integrations** page.
... ... @@ -483,7 +483,7 @@
483 483  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.
484 484  
485 485  
486 -= 7. Creating a Dashboard =
458 += 6. Creating a Dashboard =
487 487  
488 488  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.
489 489  
... ... @@ -493,7 +493,7 @@
493 493  
494 494  First simulate a few messages using MQTT. This time, we have added the 'humidity' field to the payload. Eg:
495 495  
496 -{{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}}
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}}
497 497  
498 498  
499 499  In **ThingsBoard**, from the left navigation menu, click **Dashboards**. Then, click the **+** button and select **Create new dashboard** from the dropdown menu.
... ... @@ -531,15 +531,19 @@
531 531  
532 532  Configure the **Time series chart** widget as follows:
533 533  
534 -* **Datasource** - select S31B-NB device you provisioned.
506 +* **Datasource** - select **Device A** device you provisioned.
535 535  * **Series**:
536 536  ** **temperature** - you can see this key by default.
537 537  ** **humidity** - Click **Add series** button. Then add the **humidity** for the key and then type **%** as its unit.
538 538  * Click on the **Add** button.
539 539  
540 -[[image:timeseries-1.png||height="491" width="700"]]
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}}
541 541  
516 +[[image:Screenshot 2025-03-31 at 06.51.15.png||height="485" width="700"]]
542 542  
518 +
543 543  The time-series chart will appear in edit mode. Resize it by clicking and dragging the lower-right corner.
544 544  
545 545  Click the **Save** button to add the widget to the dashboard.
... ... @@ -552,12 +552,11 @@
552 552  
553 553  
554 554  {{code language="none"}}
555 -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}'
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}'
556 556  
557 -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}'
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}'
558 558  
559 -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}'
560 -
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}'
561 561  {{/code}}
562 562  
563 563  The chart will update with the values in realtime, as shown in the below image.
... ... @@ -566,7 +566,7 @@
566 566  [[image:timeseries-4.png||height="316" width="700"]]
567 567  
568 568  
569 -= 8. Configure NB-IoT Sensor =
544 += 8. Configure Physical NB-IoT Sensor =
570 570  
571 571  
572 572  Now, let's experiment with sending data to ThingsBoard using a real NB-IoT device. For example, we will use the **TS01-NB**.
... ... @@ -588,10 +588,7 @@
588 588  
589 589  
590 590  
591 -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**.
566 +The following image shows the uplink payload of a real Dragino device. The publish topic is '**TS01-NB' that contains fields in the payload, IMEI, IMSI, Model, temperature, etc**. Note that we have created a device named **TS01-NB** in the **Devices** section in advance.
592 592  
593 -{{info}}
594 -The ThingsBoard uses the device's IMEI number included in the payload to create a device in the Devices section.
595 -{{/info}}
596 596  
597 597  [[image:image-4.png]]
data-converters-list.png
Size
... ... @@ -1,1 +1,1 @@
1 -212.2 KB
1 +19.0 KB
Content
Screenshot 2025-03-31 at 06.51.15.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.pradeeka
Size
... ... @@ -1,0 +1,1 @@
1 +179.5 KB
Content
mqtt-uplink-converter.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.pradeeka
Size
... ... @@ -1,0 +1,1 @@
1 +75.3 KB
Content