Changes for page ThingsBoard

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

From version 176.1
edited by Dilisi S
on 2025/03/26 20:27
Change comment: Mar 26 edits - part 1
To version 189.1
edited by Dilisi S
on 2025/03/27 22:54
Change comment: Mar 27 edits - part 1

Summary

Details

Page properties
Content
... ... @@ -164,7 +164,6 @@
164 164  [[image:ins1.png||height="310" width="500"]]
165 165  
166 166  
167 -(% class="wikigeneratedid" %)
168 168  = 3. Creating Devices =
169 169  
170 170  
... ... @@ -206,152 +206,97 @@
206 206  [[image:create-new-converter-menu.png||height="259" width="500"]]
207 207  
208 208  
209 -The **Add data converter** window will appear. Name it ‘**MQTT Uplink Converter NB/CB**’ and select the Type as **Uplink**.
208 +The **Add data converter** window will appear.
210 210  
211 -Click on the **JavaScript** button.
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**.
212 212  
213 -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.
212 +Click on the **TBEL** button if it has not been selected by default.
214 214  
215 -{{info}}
216 -Please note that the value assigned to the IMEI field in the payload will be used by ThingsBoard to create a device on the platform with the same name.
217 -{{/info}}
214 +Modify the default TBEL function to match with your device as described below:
218 218  
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 +
219 219  {{code language="JavaScript"}}
220 -//Version: 0.1
235 +// Decode an uplink message from a buffer
236 +// payload - array of bytes
237 +// metadata - key/value object
238 +
239 +/** Decoder **/
240 +
221 221  // decode payload to string
222 222  var payloadStr = decodeToString(payload);
223 223  
224 224  // decode payload to JSON
225 -var objdata = {};
226 -var obj1 = {};
227 227  var data = decodeToJson(payload);
228 -var deviceName = data.IMEI;
229 -delete data.IMEI;
230 -var modelname = "Dragino " + data.Model;
231 -//var mod = data.mod
232 -delete data.Model;
233 -//delete data.mod
234 -var timestamp = new Date().getTime();
235 235  
236 -for (var key in data) {
237 -
238 - if (Number(key)) {
239 - obj1[key] = data[key];
240 - obj1[key][obj1[key].length - 1] = Number(new Date(
241 - obj1[key][obj1[key].length - 1]));
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';
242 242  
243 - }
244 -//Alec submitted25/02/25
245 -//turn old key into new
246 - else if (key === "Reading") {
247 - objdata["reading"] = data[key];
248 - } else if (key === "work mode") {
249 - objdata["work_mode"] = data[key];
250 - } else if (key === "hum") {
251 - objdata["humidity"] = data[key];
252 - }else if (key === "hum2") {
253 - objdata["humidity2"] = data[key];
254 - } else if (key === "hum3") {
255 - objdata["humidity3"] = data[key];
256 - } else if (key === "tem") {
257 - objdata["temperature"] = data[key];
258 - } else if (key === "tem2") {
259 - objdata["temperature2"] = data[key];
260 - } else if (key === "tem3") {
261 - objdata["temperature3"] = data[key];
262 - } else if (key === "DS18B20_Temp") {
263 - objdata["temperature_pro"] = data[key];
264 - } else if (key === "ds18b20_temperature") {
265 - objdata["temperature_pro"] = data[key];
266 - } else if (key === "DS18B20_temperature_pro") {
267 - objdata["temperature_pro"] = data[key];
268 - } else if (key === "tdc send flag") {
269 - objdata["tdc_send_flag"] = data[key];
270 - } else if (key === "trigger mode") {
271 - objdata["trigger_mode"] = data[key];
272 - } else if (key === "soil dielectric constant") {
273 - objdata["soil_dielectric_constant"] = data[key];
274 - } else if (key === "door open num") {
275 - objdata["door_open_num"] = data[key];
276 - } else if (key === "door duration") {
277 - objdata["door_duration"] = data[key];
278 - } else if (key === "count time") {
279 - objdata["count_time"] = data[key];
280 - } else if (key === "last open time2") {
281 - objdata["last_open_time2"] = data[key];
282 - } else if (key === "last open time3") {
283 - objdata["last_open_time3"] = data[key];
284 - }
285 -//Alec submitted25/02/25
286 - else {
287 - objdata[key] = data[key]
288 - }
289 -}
290 -var listdata = [{
291 - "ts": timestamp,
292 - "values": objdata
293 -}]
294 -for (var key1 in obj1) {
295 - if (modelname == "Dragino RS485-NB") {
296 - listdata.push({
297 - "ts": obj1[key1][obj1[key1].length - 1],
298 - "values": {
299 - "Payload": obj1[key1][0],
300 - }
301 - })
302 - } else {
303 - listdata.push({
304 - "ts": obj1[key1][obj1[key1].length - 1],
305 - "values": {
306 - "values": obj1[key1]
307 - },
308 - })
309 - }
310 -}
257 +// Result object with device/asset attributes/telemetry data
311 311  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 + }
277 +};
312 312  
313 - deviceName: deviceName,
314 - deviceType: modelname,
315 - attributes: {
316 - model: modelname,
317 - //customerName: "NB-CB",
318 - //groupName: "NB-CB",
319 - //integrationName: metadata['integrationName']
279 +/** Helper functions 'decodeToString' and 'decodeToJson' are already built-in **/
320 320  
321 - },
322 - telemetry: listdata
323 -}
324 -
325 -function decodeToString(payload) {
326 - return String.fromCharCode.apply(String, payload);
327 -}
328 -
329 -function decodeToJson(payload) {
330 - // covert payload to string.
331 - var str = decodeToString(payload);
332 -
333 - // parse string to JSON
334 - var data = JSON.parse(str);
335 - return data;
336 -}
337 -
338 338  return result;
339 339  {{/code}}
340 340  
341 341  
342 -Click on the **Add** button.
285 +Once you modify the decoder function, click on the **Add** button.
343 343  
344 344  
345 -[[image:mqtt-uplink.png||width="500"]]
346 346  
289 +[[image:ul-data-converter-device-a.png||height="524" width="500"]]
347 347  
348 348  
349 349  You should see that the newly added **MQTT Uplink converter **NB/CB is listed on the **Data Converters** page.
350 350  
351 351  
352 -[[image:data-converter-list-showing-uplink-dc.png]]
295 +[[image:ul-data-converter-added.png||height="257"]]
353 353  
354 354  
298 +
355 355  = 5. Add Integration =
356 356  
357 357  
... ... @@ -372,7 +372,7 @@
372 372  **Basic settings:**
373 373  
374 374  * **Integration type**: MQTT
375 -* **Name**: MQTT integration NB/CB
319 +* **Name**: MQTT integration - Device A
376 376  * **Enable integration**: YES
377 377  * **Allows create devices or assets**: YES
378 378  
... ... @@ -379,9 +379,11 @@
379 379  Click **Next** button.
380 380  
381 381  
382 -[[image:add-integration-basic-settings.png||height="511" width="500"]]
326 +[[image:add-integration-basic-settings.png||height="504" width="500"]]
383 383  
384 384  
329 +
330 +
385 385  **Uplink data converter:**
386 386  
387 387  * Click on the **Select existing** button.
... ... @@ -390,9 +390,10 @@
390 390  Click **Next** button.
391 391  
392 392  
393 -[[image:add-integration-uplink-data-converter.png||height="511" width="500"]]
339 +[[image:add-integration-ul-data-converter.png||height="505" width="500"]]
394 394  
395 395  
342 +
396 396  **Downlink data converter:**
397 397  
398 398  Dragino NB/CB devices don't require a downlink data converter to decode their payloads, so you can skip this step.
... ... @@ -408,19 +408,20 @@
408 408  
409 409  **Connection:**
410 410  
411 -* **Host**: Cluster URL (Eg. 011731f7xxxxxxxxxxxfbbedfc63f4.s1.eu.hivemq.cloud)
358 +* **Host**: Host URL (Eg. **//011731f7xxxxxxxxxxxfbbedfc63f4.s1.eu.hivemq.cloud//**)
412 412  * **Port**: 8883
413 -* **Credentials**: Basic
414 -* **Enable SSL**: YES
360 +* **Credentials type**: Basic
415 415  * **Username**: Username (from your HiveMQ Cloud Cluster with your credentials)
416 416  * **Password:** Password (from your HiveMQ Cloud Cluster with your credentials)
417 -* **Topic: v1/devices/me/telemetry** (The topic can be anything; you can even use just the device name. For example, you can use your device name here, such as S31B-NB.)
363 +* **Enable SSL**: YES
364 +* **Topic: device/a** (The topic can be anything; you can even use just the device name.)
418 418  * **QoS:** 0-At most once
419 419  
420 420  
421 -[[image:add-integration-connection.png||height="511" width="500"]]
422 422  
369 +[[image:add-integartion-connection.png||height="505" width="500"]]
423 423  
371 +
424 424  Click on the **Advanced settings** button.
425 425  
426 426  * **Clean session:** YES
... ... @@ -459,15 +459,15 @@
459 459  
460 460  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.
461 461  
462 -The Mosquitto client publishes messages (payloads) on the topic **v1/devices/me/telemetry**. Of course, you can use any topic for testing.
410 +The Mosquitto client publishes messages (payloads) on the topic **/device/a**. Of course, you can use any topic for testing.
463 463  
464 -(% id="cke_bm_37386S" style="display:none" %) (%%)The MQTT payload format is as follows, which is common for all **~-~-NB** and **~-~-CB** series devices. The **IMEI** field is mandatory and is used to provision a new device with the name assigned to it in ThingsBoard.
412 +(% id="cke_bm_37386S" style="display:none" %) (%%)The MQTT payload format is as follows:
465 465  
466 466  {{code language="none"}}
467 -{"IMEI": "S31B-NB", "temperature": 27, ......}
415 +{"IMEI": "350693903995577", "temperature":25, "humidity":80, "pressure":1005}
468 468  {{/code}}
469 469  
470 -Once ThingsBoard receives this message, it automatically creates (provisions) the device mentioned in the **IMEI**, for example, S31B-NB.
418 +Once ThingsBoard receives this message, it forwards this payload to the matching device through the integration.
471 471  
472 472  
473 473  == 5.2 Sending messages ==
... ... @@ -476,7 +476,7 @@
476 476  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.
477 477  
478 478  {{code language="none"}}
479 -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}'
427 +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}'
480 480  {{/code}}
481 481  
482 482  If the integration was performed without errors, the status of the integration changes to 'Active' after the first telemetry transmission.
... ... @@ -485,12 +485,8 @@
485 485  [[image:integration-active.png]]
486 486  
487 487  
488 -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**.
489 489  
490 490  
491 -[[image:new-device.png]]
492 -
493 -
494 494  == 6.3 Viewing messages ==
495 495  
496 496  
... ... @@ -516,18 +516,22 @@
516 516  
517 517  Select the Event type as **Debug** from the dropdown list.
518 518  
519 -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.
463 +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.
520 520  
521 521  
522 -[[image:Screenshot 2025-03-16 at 18.38.59.png]]
466 +[[image:Screenshot 2025-03-26 at 19.49.31.png]]
523 523  
524 524  
469 +
470 +
525 525  Then click on the **three dots (...)** in the **Message** column. You can see the uplink message's **payload** in the **Message** window.
526 526  
527 527  
528 -[[image:Screenshot 2025-03-16 at 18.39.12.png]]
474 +[[image:Screenshot 2025-03-26 at 19.47.52.png]]
529 529  
530 530  
477 +
478 +
531 531  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.
532 532  
533 533  
... ... @@ -645,4 +645,3 @@
645 645  [[image:image-4.png]]
646 646  
647 647  
648 -
add-integration-basic-settings.png
Size
... ... @@ -1,1 +1,1 @@
1 -122.5 KB
1 +123.8 KB
Content
Screenshot 2025-03-26 at 18.15.08.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.pradeeka
Size
... ... @@ -1,0 +1,1 @@
1 +92.2 KB
Content
Screenshot 2025-03-26 at 19.47.52.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.pradeeka
Size
... ... @@ -1,0 +1,1 @@
1 +168.4 KB
Content
Screenshot 2025-03-26 at 19.49.31.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.pradeeka
Size
... ... @@ -1,0 +1,1 @@
1 +133.0 KB
Content
add-integartion-connection.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.pradeeka
Size
... ... @@ -1,0 +1,1 @@
1 +110.3 KB
Content
add-integartion-connetcion.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.pradeeka
Size
... ... @@ -1,0 +1,1 @@
1 +146.0 KB
Content
add-integration-ul-data-converter.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.pradeeka
Size
... ... @@ -1,0 +1,1 @@
1 +121.2 KB
Content
ul-data-converter-added.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.pradeeka
Size
... ... @@ -1,0 +1,1 @@
1 +189.4 KB
Content
ul-data-converter-device-a.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.pradeeka
Size
... ... @@ -1,0 +1,1 @@
1 +168.3 KB
Content