Wiki source code of ThingsBoard

Version 58.1 by Dilisi S on 2025/03/06 04:16

Hide last authors
Dilisi S 1.1 1 **Table of Contents:**
2
3 {{toc/}}
4
Dilisi S 16.1 5 {{warning}}
6 Draft Document
7 {{/warning}}
Dilisi S 1.1 8
9 = Introduction =
10
Dilisi S 21.1 11 This document guides you on integrating Dragino **-NB** and **-CB** series devices data with ThingsBoard. For this guide, we use ThingsBoard Cloud, which is one of the ThingsBoard versions that allows you to try it for free.
Dilisi S 2.1 12
Dilisi S 21.1 13 The **NB series** devices end with the suffix **-NB**, and the **CB series** devices end with the suffix **-CB**. For example, **S31B-NB** is an **NB device**, and **S31-CB** is a **CB device**.
Dilisi S 11.1 14
Dilisi S 17.1 15
Dilisi S 11.1 16 = Add New Device =
17
18 In the left navigation, click **Entities** and then click **Devices**.
19
20
21 [[image:ThingsBoard-Device.png]]
22
23
Dilisi S 21.1 24 On the **Devices **page, click on the ‘**+**’ button, and then click on the **Add new device **from the dropdown menu.
Dilisi S 11.1 25
26
27 [[image:ThingsBoard-add-new-device.png||height="279" width="500"]]
28
29
30
31 = Data Converters =
32
Dilisi S 21.1 33 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.
Dilisi S 11.1 34
Dilisi S 21.1 35
Dilisi S 11.1 36 == Uplink ==
37
Dilisi S 21.1 38 In the left navigation, click **Integrations center**, and then click **Data converters**.
Dilisi S 11.1 39
40
Dilisi S 36.1 41 [[image:data-converter-list-page.png]]
Dilisi S 11.1 42
43
Dilisi S 21.1 44 On the **Data converters** page, click on the ‘+’ button, and then click on the **Create new converter** from the dropdown menu.
Dilisi S 11.1 45
46
47 [[image:ThingsBoard-new-data-converter.png||height="282" width="500"]]
48
49
Dilisi S 36.1 50 The **Add data converter** window will appear. Name it ‘**MQTT Uplink Converter NB/CB**’ and select the Type as **Uplink**.
Dilisi S 11.1 51
Dilisi S 23.1 52 Click on the **JavaScript** button. Now copy and paste the following JavaScript to the **Decoder function** section. This decoder function is valid for both NB and CB series devices.
Dilisi S 11.1 53
54 {{code language="JavaScript"}}
55 //Version: 0.1
56 // decode payload to string
57 var payloadStr = decodeToString(payload);
58
59 // decode payload to JSON
60 var objdata = {};
61 var obj1 = {};
62 var data = decodeToJson(payload);
63 var deviceName = data.IMEI;
64 delete data.IMEI;
65 var modelname = "Dragino " + data.Model;
66 //var mod = data.mod
67 delete data.Model;
68 //delete data.mod
69 var timestamp = new Date().getTime();
70
71 for (var key in data) {
72
73 if (Number(key)) {
74 obj1[key] = data[key];
75 obj1[key][obj1[key].length - 1] = Number(new Date(
76 obj1[key][obj1[key].length - 1]));
77
78 }
79 //Alec submitted25/02/25
80 //turn old key into new
81 else if (key === "Reading") {
82 objdata["reading"] = data[key];
83 } else if (key === "work mode") {
84 objdata["work_mode"] = data[key];
85 } else if (key === "hum") {
86 objdata["humidity"] = data[key];
87 }else if (key === "hum2") {
88 objdata["humidity2"] = data[key];
89 } else if (key === "hum3") {
90 objdata["humidity3"] = data[key];
91 } else if (key === "tem") {
92 objdata["temperature"] = data[key];
93 } else if (key === "tem2") {
94 objdata["temperature2"] = data[key];
95 } else if (key === "tem3") {
96 objdata["temperature3"] = data[key];
97 } else if (key === "DS18B20_Temp") {
98 objdata["temperature_pro"] = data[key];
99 } else if (key === "ds18b20_temperature") {
100 objdata["temperature_pro"] = data[key];
101 } else if (key === "DS18B20_temperature_pro") {
102 objdata["temperature_pro"] = data[key];
103 } else if (key === "tdc send flag") {
104 objdata["tdc_send_flag"] = data[key];
105 } else if (key === "trigger mode") {
106 objdata["trigger_mode"] = data[key];
107 } else if (key === "soil dielectric constant") {
108 objdata["soil_dielectric_constant"] = data[key];
109 } else if (key === "door open num") {
110 objdata["door_open_num"] = data[key];
111 } else if (key === "door duration") {
112 objdata["door_duration"] = data[key];
113 } else if (key === "count time") {
114 objdata["count_time"] = data[key];
115 } else if (key === "last open time2") {
116 objdata["last_open_time2"] = data[key];
117 } else if (key === "last open time3") {
118 objdata["last_open_time3"] = data[key];
119 }
120 //Alec submitted25/02/25
121 else {
122 objdata[key] = data[key]
123 }
124 }
125 var listdata = [{
126 "ts": timestamp,
127 "values": objdata
128 }]
129 for (var key1 in obj1) {
130 if (modelname == "Dragino RS485-NB") {
131 listdata.push({
132 "ts": obj1[key1][obj1[key1].length - 1],
133 "values": {
134 "Payload": obj1[key1][0],
135 }
136 })
137 } else {
138 listdata.push({
139 "ts": obj1[key1][obj1[key1].length - 1],
140 "values": {
141 "values": obj1[key1]
142 },
143 })
144 }
145 }
146 var result = {
147
148 deviceName: deviceName,
149 deviceType: modelname,
150 attributes: {
151 model: modelname,
152 //customerName: "NB-CB",
153 //groupName: "NB-CB",
154 //integrationName: metadata['integrationName']
155
156 },
157 telemetry: listdata
158 }
159
160 function decodeToString(payload) {
161 return String.fromCharCode.apply(String, payload);
162 }
163
164 function decodeToJson(payload) {
165 // covert payload to string.
166 var str = decodeToString(payload);
167
168 // parse string to JSON
169 var data = JSON.parse(str);
170 return data;
171 }
172
173 return result;
174
175 {{/code}}
176
Dilisi S 21.1 177 Click on the **Add** button.
Dilisi S 11.1 178
179
Dilisi S 36.1 180 [[image:uplink-data-converter.png||height="529" width="500"]]
Dilisi S 11.1 181
182
Dilisi S 36.1 183
Dilisi S 23.1 184 You should see that the newly added **uplink data converter** is listed on the **Data Converters** page.
Dilisi S 11.1 185
186
Dilisi S 36.1 187 [[image:data-converter-list-showing-uplink-dc.png]]
Dilisi S 21.1 188
189
Dilisi S 11.1 190 == Downlink ==
191
Dilisi S 21.1 192 On the **Data converters** page, click on the ‘**+**’ button, and then click on the **Create new converter** from the dropdown menu.
Dilisi S 11.1 193
194
195 [[image:ThingsBoard-new-data-converter.png||height="282" width="500"]]
196
197
Dilisi S 36.1 198 The **Add data converter** window will appear. Name it ‘**MQTT Downlink Converter NB/CB**’ and select the Type as **Downlink**.
Dilisi S 11.1 199
Dilisi S 23.1 200 Click on the **JavaScript** button. Now copy and paste the following JavaScript to the **Encoder function **section. This encoder function is valid for both NB and CB series devices.
Dilisi S 11.1 201
202
203 {{code language="JavaScript"}}
204 function hexToBase64(hexString) {
205 // 将16进制字符串两个字符转换为一个字节
206 var bytes = hexString.match(/.{2}/g);
207 // 对每个字节进行解析,并转换为对应的字符
208 var binaryString = bytes.map(function(byte) {
209 return String.fromCharCode(parseInt(byte, 16));
210 }).join('');
Dilisi S 1.1 211
Dilisi S 11.1 212 // 使用btoa进行base64编码
213 return btoa(binaryString);
214 }
215
216 // Result object with encoded downlink payload
217 var result = {
218 // downlink data content type: JSON, TEXT or BINARY (base64 format)
219 contentType: "BINARY",
220
221 // downlink data
222 data:hexToBase64(metadata.shared_value)
223
224 // Optional metadata object presented in key/value format
225 //metadata: {}
226
227 };
228
229 return result;
230 {{/code}}
231
232
233 Click on the **Add** button.
234
235
Dilisi S 36.1 236 [[image:downlink-data-converter.png||height="530" width="500"]]
Dilisi S 11.1 237
238
Dilisi S 36.1 239
Dilisi S 23.1 240 You should see that the newly added **downlink data converter** is listed on the **Data Converters** page.
Dilisi S 21.1 241
242
Dilisi S 36.1 243 [[image:data-converter-list.png]]
Dilisi S 21.1 244
245
Dilisi S 11.1 246 = Add Integration =
247
Dilisi S 21.1 248 In the left navigation, click **Integrations center**, and then click **Integrations**.
Dilisi S 11.1 249
Dilisi S 21.1 250 On the **Integrations** page, click on the '**+**' button.
Dilisi S 11.1 251
252
Dilisi S 49.1 253 [[image:data-converter-list-page.png]]
Dilisi S 11.1 254
255
Dilisi S 21.1 256 The **Add integration** window appears.
Dilisi S 11.1 257
Dilisi S 24.1 258 In the **Add integration** window, configure the following settings:
Dilisi S 11.1 259
Dilisi S 21.1 260
Dilisi S 11.1 261 **Basic settings:**
262
Dilisi S 49.1 263 * **Integration type**: MQTT
264 * **Name**: MQTT integration NB/CB
Dilisi S 11.1 265
266 Click **Next** button.
267
268
Dilisi S 16.1 269 [[image:add-integration-basic-settings.png||height="511" width="500"]]
Dilisi S 11.1 270
271
Dilisi S 49.1 272
Dilisi S 16.1 273 **Uplink data converter:**
Dilisi S 11.1 274
Dilisi S 21.1 275 * Click on the **Select existing** button.
Dilisi S 49.1 276 * **Uplink data converter**: Select **MQTT Uplink Converter NB/CB **from the dropdown list.
Dilisi S 16.1 277
278 Click **Next** button.
279
280
Dilisi S 49.1 281 [[image:add-integration-uplink-data-converter.png||width="500"]]
Dilisi S 16.1 282
283
Dilisi S 49.1 284
Dilisi S 16.1 285 **Downlink data converter:**
286
Dilisi S 21.1 287 * Click on the **Select existing** button.
Dilisi S 49.1 288 * **Downlink data converter**: Select **MQTT Downlink Converter NB/CB **from the dropdown list.
Dilisi S 16.1 289
290 Click **Next** button.
291
292
Dilisi S 49.1 293 [[image:add-integration-downlink-data-converter.png||height="510" width="500"]]
Dilisi S 16.1 294
295
Dilisi S 49.1 296
Dilisi S 16.1 297 **Connection:**
298
Dilisi S 49.1 299 * **Host**: mqtt.eu.thingsboard.cloud (This is the host name you copied from the device - See section xxxxx for more information)
300 * **Port**: 1883 (This is the port number you copied from the device - See section xxxxx for more information)
301 * **Credentials**: Basic
302 * **Username**: Access token (This is the access token you copied from the device)
303 * **Password** - Leave it as blank
304 * **Topic** - v1/devices/+/telemetry (sightly modify the topic 'v1/devices/me/telemetry' you copied for the device to enable receiving data from any 'device name')
305 * **QoS** - 0-At most once
Dilisi S 16.1 306
Dilisi S 49.1 307 Click on the **Check connection** button to verify the MQTT connection using the provided parameters.
Dilisi S 16.1 308
Dilisi S 49.1 309
310 [[image:add-integration-connection.png||width="500"]]
311
312
313 If the connection is successful, you will see the **Connected** message.
314
Dilisi S 16.1 315 Click on the **Add** button.
316
317
Dilisi S 49.1 318 [[image:add-connection-success.png||height="511" width="500"]]
Dilisi S 16.1 319
320
Dilisi S 49.1 321
322
323
324
325
Dilisi S 23.1 326 You should see that the newly added integration is listed on the **Integrations** page.
Dilisi S 16.1 327
Dilisi S 24.1 328 Since we haven't received data from a device yet, the integration **Status** is shown as **Pending.**
Dilisi S 23.1 329
330 [[image:Integrations-list.png]]
331
332
Dilisi S 16.1 333 = Verifying the receipt of data from the device =
334
335 Connect **S31B-NB** to transfer information. If the integration was performed without errors, after the transmission of the first telemetry, a new device with the name “xxxxx” 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.