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 184.1
edited by Dilisi S
on 2025/03/27 22:43
Change comment: Uploaded new attachment "ul-data-converter-added.png", version {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  
... ... @@ -208,138 +208,80 @@
208 208  
209 209  The **Add data converter** window will appear. Name it ‘**MQTT Uplink Converter NB/CB**’ and select the Type as **Uplink**.
210 210  
211 -Click on the **JavaScript** button.
210 +Click on the **TBEL** button if it has not been selected by default.
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 +Modify the default TBEL function to match with your device as described below:
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}}
218 218  
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 +
219 219  {{code language="JavaScript"}}
220 -//Version: 0.1
233 +// Decode an uplink message from a buffer
234 +// payload - array of bytes
235 +// metadata - key/value object
236 +
237 +/** Decoder **/
238 +
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]));
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';
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 -}
255 +// Result object with device/asset attributes/telemetry data
311 311  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 + }
275 +};
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']
277 +/** 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.
283 +Once you modify the decoder function, click on the **Add** button.
343 343  
344 344  
345 345  [[image:mqtt-uplink.png||width="500"]]
... ... @@ -408,16 +408,15 @@
408 408  
409 409  **Connection:**
410 410  
411 -* **Host**: Cluster URL (Eg. 011731f7xxxxxxxxxxxfbbedfc63f4.s1.eu.hivemq.cloud)
352 +* **Host**: Host URL (Eg. **//011731f7xxxxxxxxxxxfbbedfc63f4.s1.eu.hivemq.cloud//**)
412 412  * **Port**: 8883
413 -* **Credentials**: Basic
414 -* **Enable SSL**: YES
354 +* **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.)
357 +* **Enable SSL**: YES
358 +* **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 -
421 421  [[image:add-integration-connection.png||height="511" width="500"]]
422 422  
423 423  
... ... @@ -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.
402 +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.
404 +(% 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, ......}
407 +{"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.
410 +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}'
419 +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.
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.
520 520  
521 521  
522 -[[image:Screenshot 2025-03-16 at 18.38.59.png]]
458 +[[image:Screenshot 2025-03-26 at 19.49.31.png]]
523 523  
524 524  
461 +
462 +
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]]
466 +[[image:Screenshot 2025-03-26 at 19.47.52.png]]
529 529  
530 530  
469 +
470 +
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  
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
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