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, 5 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -2,9 +2,310 @@ 2 2 3 3 {{toc/}} 4 4 5 +{{warning}} 6 +Draft Document 7 +{{/warning}} 5 5 6 6 = Introduction = 7 7 8 8 This document guides you on integrating Dragino -NB and -CB series devices with ThingsBoard. For this guide, we use ThingsBoard Cloud, which is one of the ThingsBoard versions that allows you to try it for free. 9 9 13 +For example, the following devices fall into the -NB and -CB series: 14 + 15 +(% style="width:556px" %) 16 +|(% style="width:261px" %)**NB Series**|(% style="width:293px" %)**CB Series** 17 +|(% style="width:261px" %)S31B-NB|(% style="width:293px" %)S31-CB 18 +|(% style="width:261px" %) |(% style="width:293px" %) 19 + 20 + 21 + 22 += Add New Device = 23 + 24 +In the left navigation, click **Entities** and then click **Devices**. 25 + 26 + 27 +[[image:ThingsBoard-Device.png]] 28 + 29 + 30 +On the ‘**Devices**’ page, click on the ‘**+**’ button, and then click on the ‘**Add new device**’ from the dropdown menu. 31 + 32 + 33 +[[image:ThingsBoard-add-new-device.png||height="279" width="500"]] 34 + 35 + 36 + 37 += Data Converters = 38 + 39 + 40 +== Uplink == 41 + 42 +In the left navigation, click ‘Integrations center’, and then click ‘Data converters’. 43 + 44 + 45 +[[image:ThingsBoard-Data-Converters.png]] 46 + 47 + 48 +On the ‘Data converters’ page, click on the ‘+’ button, and then click on the ‘Create new converter’ from the dropdown menu. 49 + 50 + 51 +[[image:ThingsBoard-new-data-converter.png||height="282" width="500"]] 52 + 53 + 54 +The ‘Add data converter’ window will appear. Name it ‘**UDP Uplink Converter NB/CB**’ and select the Type as ‘Uplink’. 55 + 56 +Click on the ‘JavaScript’ button. Now copy and paste the following script to the ‘Decoder function’ section: 57 + 58 +{{code language="JavaScript"}} 59 +//Version: 0.1 60 +// decode payload to string 61 +var payloadStr = decodeToString(payload); 62 + 63 +// decode payload to JSON 64 +var objdata = {}; 65 +var obj1 = {}; 66 +var data = decodeToJson(payload); 67 +var deviceName = data.IMEI; 68 +delete data.IMEI; 69 +var modelname = "Dragino " + data.Model; 70 +//var mod = data.mod 71 +delete data.Model; 72 +//delete data.mod 73 +var timestamp = new Date().getTime(); 74 + 75 +for (var key in data) { 76 + 77 + if (Number(key)) { 78 + obj1[key] = data[key]; 79 + obj1[key][obj1[key].length - 1] = Number(new Date( 80 + obj1[key][obj1[key].length - 1])); 81 + 82 + } 83 +//Alec submitted25/02/25 84 +//turn old key into new 85 + else if (key === "Reading") { 86 + objdata["reading"] = data[key]; 87 + } else if (key === "work mode") { 88 + objdata["work_mode"] = data[key]; 89 + } else if (key === "hum") { 90 + objdata["humidity"] = data[key]; 91 + }else if (key === "hum2") { 92 + objdata["humidity2"] = data[key]; 93 + } else if (key === "hum3") { 94 + objdata["humidity3"] = data[key]; 95 + } else if (key === "tem") { 96 + objdata["temperature"] = data[key]; 97 + } else if (key === "tem2") { 98 + objdata["temperature2"] = data[key]; 99 + } else if (key === "tem3") { 100 + objdata["temperature3"] = data[key]; 101 + } else if (key === "DS18B20_Temp") { 102 + objdata["temperature_pro"] = data[key]; 103 + } else if (key === "ds18b20_temperature") { 104 + objdata["temperature_pro"] = data[key]; 105 + } else if (key === "DS18B20_temperature_pro") { 106 + objdata["temperature_pro"] = data[key]; 107 + } else if (key === "tdc send flag") { 108 + objdata["tdc_send_flag"] = data[key]; 109 + } else if (key === "trigger mode") { 110 + objdata["trigger_mode"] = data[key]; 111 + } else if (key === "soil dielectric constant") { 112 + objdata["soil_dielectric_constant"] = data[key]; 113 + } else if (key === "door open num") { 114 + objdata["door_open_num"] = data[key]; 115 + } else if (key === "door duration") { 116 + objdata["door_duration"] = data[key]; 117 + } else if (key === "count time") { 118 + objdata["count_time"] = data[key]; 119 + } else if (key === "last open time2") { 120 + objdata["last_open_time2"] = data[key]; 121 + } else if (key === "last open time3") { 122 + objdata["last_open_time3"] = data[key]; 123 + } 124 +//Alec submitted25/02/25 125 + else { 126 + objdata[key] = data[key] 127 + } 128 +} 129 +var listdata = [{ 130 + "ts": timestamp, 131 + "values": objdata 132 +}] 133 +for (var key1 in obj1) { 134 + if (modelname == "Dragino RS485-NB") { 135 + listdata.push({ 136 + "ts": obj1[key1][obj1[key1].length - 1], 137 + "values": { 138 + "Payload": obj1[key1][0], 139 + } 140 + }) 141 + } else { 142 + listdata.push({ 143 + "ts": obj1[key1][obj1[key1].length - 1], 144 + "values": { 145 + "values": obj1[key1] 146 + }, 147 + }) 148 + } 149 +} 150 +var result = { 151 + 152 + deviceName: deviceName, 153 + deviceType: modelname, 154 + attributes: { 155 + model: modelname, 156 + //customerName: "NB-CB", 157 + //groupName: "NB-CB", 158 + //integrationName: metadata['integrationName'] 159 + 160 + }, 161 + telemetry: listdata 162 +} 163 + 164 +function decodeToString(payload) { 165 + return String.fromCharCode.apply(String, payload); 166 +} 167 + 168 +function decodeToJson(payload) { 169 + // covert payload to string. 170 + var str = decodeToString(payload); 171 + 172 + // parse string to JSON 173 + var data = JSON.parse(str); 174 + return data; 175 +} 176 + 177 +return result; 178 + 179 +{{/code}} 180 + 181 +Click on the ‘Add’ button. 182 + 183 + 184 +[[image:ThingsBoard-add-data-converter-uplink.png||width="500"]] 185 + 186 + 187 +The uplink data converter is added to ThingsBoard and appears on the ‘Data Converters’ page 188 + 189 + 190 +== Downlink == 191 + 192 +On the ‘Data converters’ page, click on the ‘+’ button, and then click on the ‘Create new converter’ from the dropdown menu. 193 + 194 + 195 +[[image:ThingsBoard-new-data-converter.png||height="282" width="500"]] 196 + 197 + 198 +The ‘**Add data converter**’ window will appear. Name it ‘**UDP Downlink Converter NB/CB**’ and select the Type as ‘**Downlink**’. 199 + 200 +Click on the ‘**JavaScript**’ button. Now copy and paste the following script to the ‘**Encoder function**’ section: 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(''); 10 10 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 + 236 +[[image:ThingsBoard-add-data-converter-downlink.png||height="532" width="500"]] 237 + 238 + 239 += Add Integration = 240 + 241 +In the left navigation, click ‘Integrations center’, and then click ‘Integrations’. 242 + 243 +On the ‘Integrations’ page, click on the “+” button. 244 + 245 + 246 +[[image:ThingsBoard-add-integration.png]] 247 + 248 + 249 +The ‘Add integration’ window appears. 250 + 251 +In the Add Integration window, configure the following settings: 252 + 253 +**Basic settings:** 254 + 255 +* **Integration type**: UDP 256 +* **Name**: UDP Integration NB/CB 257 + 258 +Click **Next** button. 259 + 260 + 261 +[[image:add-integration-basic-settings.png||height="511" width="500"]] 262 + 263 + 264 +**Uplink data converter:** 265 + 266 +* Click on the ‘**Select existing**’ button. 267 +* Uplink data converter: Select ‘**UDP Uplink Converter NB/CB**’ from the dropdown list. 268 + 269 +Click **Next** button. 270 + 271 + 272 +[[image:add-integration-uplink-data-converter.png||height="511" width="500"]] 273 + 274 + 275 +**Downlink data converter:** 276 + 277 +* Click on the ‘**Select existing**’ button. 278 +* Downlink data converter: Select ‘**UDP Downlink Converter NB/CB**’ from the dropdown list. 279 + 280 +Click **Next** button. 281 + 282 + 283 +[[image:add-integration-downlink-data-converter.png||height="512" width="500"]] 284 + 285 + 286 +**Connection:** 287 + 288 +**Port**: 11582 289 + 290 +**Size of the buffer for inbound socket (in KB)**: 64 291 + 292 +**Cache Size**: 10000000 293 + 294 +**Cache time to live in minutes**: 1440 295 + 296 + 297 +Copy the two keys, **Integration key** and **Integration secret** into a text editor, as you will need them in the section ‘xxxxx’. 298 + 299 +Click on the **Add** button. 300 + 301 + 302 +[[image:add-integration-connection.png||height="511" width="500"]] 303 + 304 + 305 + 306 += Verifying the receipt of data from the device = 307 + 308 +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. 309 + 310 + 311 +
- ThingsBoard-add-integration.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.pradeeka - Size
-
... ... @@ -1,0 +1,1 @@ 1 +128.6 KB - Content
- add-integration-basic-settings.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.pradeeka - Size
-
... ... @@ -1,0 +1,1 @@ 1 +122.5 KB - Content
- add-integration-connection.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.pradeeka - Size
-
... ... @@ -1,0 +1,1 @@ 1 +124.4 KB - Content
- add-integration-downlink-data-converter.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.pradeeka - Size
-
... ... @@ -1,0 +1,1 @@ 1 +123.0 KB - Content
- add-integration-uplink-data-converter.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.pradeeka - Size
-
... ... @@ -1,0 +1,1 @@ 1 +120.7 KB - Content