Changes for page ThingsBoard
Last modified by Dilisi S on 2025/04/02 02:09
Summary
-
Page properties (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -164,6 +164,7 @@ 164 164 [[image:ins1.png||height="310" width="500"]] 165 165 166 166 167 +(% class="wikigeneratedid" %) 167 167 = 3. Creating Devices = 168 168 169 169 ... ... @@ -207,76 +207,138 @@ 207 207 208 208 The **Add data converter** window will appear. Name it ‘**MQTT Uplink Converter NB/CB**’ and select the Type as **Uplink**. 209 209 210 -Click on the ** TBEL** buttonif it has not been selected by default.211 +Click on the **JavaScript** button. 211 211 212 - The defaultTBELfunction isshownbelow.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. 213 213 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 214 215 215 {{code language="JavaScript"}} 216 -// Decode an uplink message from a buffer 217 -// payload - array of bytes 218 -// metadata - key/value object 219 - 220 -/** Decoder **/ 221 - 220 +//Version: 0.1 222 222 // decode payload to string 223 223 var payloadStr = decodeToString(payload); 224 224 225 225 // decode payload to JSON 226 -// var data = decodeToJson(payload); 225 +var objdata = {}; 226 +var obj1 = {}; 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(); 227 227 228 -var deviceName = 'Device A'; 229 -var deviceType = 'thermostat'; 230 -var customerName = 'Customer C'; 231 -var groupName = 'thermostat devices'; 232 -var manufacturer = 'Example corporation'; 233 -// use assetName and assetType instead of deviceName and deviceType 234 -// to automatically create assets instead of devices. 235 -// var assetName = 'Asset A'; 236 -// var assetType = 'building'; 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])); 237 237 238 -// Result object with device/asset attributes/telemetry data 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 +} 239 239 var result = { 240 -// Use deviceName and deviceType or assetName and assetType, but not both. 241 - deviceName: deviceName, 242 - deviceType: deviceType, 243 -// assetName: assetName, 244 -// assetType: assetType, 245 -// customerName: customerName, 246 - groupName: groupName, 247 - attributes: { 248 - model: 'Model A', 249 - serialNumber: 'SN111', 250 - integrationName: metadata['integrationName'], 251 - manufacturer: manufacturer 252 - }, 253 - telemetry: { 254 - temperature: 42, 255 - humidity: 80, 256 - rawData: payloadStr 257 - } 258 -}; 259 259 260 -/** Helper functions 'decodeToString' and 'decodeToJson' are already built-in **/ 313 + deviceName: deviceName, 314 + deviceType: modelname, 315 + attributes: { 316 + model: modelname, 317 + //customerName: "NB-CB", 318 + //groupName: "NB-CB", 319 + //integrationName: metadata['integrationName'] 261 261 262 -return result; 263 -{{/code}} 321 + }, 322 + telemetry: listdata 323 +} 264 264 265 -We use the same decoder function for all our devices. However, you need to modify a few things for each device. Among these, **deviceName** is a **mandatory** field. You should assign a device name to the **deviceName** field that matches the name of your device in the **Devices** section. 325 +function decodeToString(payload) { 326 + return String.fromCharCode.apply(String, payload); 327 +} 266 266 267 -For example, if your device name is **Device B**, you can change **Device A** to **Device B**. 329 +function decodeToJson(payload) { 330 + // covert payload to string. 331 + var str = decodeToString(payload); 268 268 333 + // parse string to JSON 334 + var data = JSON.parse(str); 335 + return data; 336 +} 269 269 270 -{{code language="JavaScript"}} 271 -var deviceName = 'Device A'; 272 -var deviceType = 'thermostat'; 273 -var customerName = 'Customer C'; 274 -var groupName = 'thermostat devices'; 275 -var manufacturer = 'Example corporation'; 338 +return result; 276 276 {{/code}} 277 277 278 278 279 - Once you modify the decoder function, click on the **Add** button.342 +Click on the **Add** button. 280 280 281 281 282 282 [[image:mqtt-uplink.png||width="500"]] ... ... @@ -345,15 +345,16 @@ 345 345 346 346 **Connection:** 347 347 348 -* **Host**: Cluster URL (Eg. **//011731f7xxxxxxxxxxxfbbedfc63f4.s1.eu.hivemq.cloud//**)411 +* **Host**: Cluster URL (Eg. 011731f7xxxxxxxxxxxfbbedfc63f4.s1.eu.hivemq.cloud) 349 349 * **Port**: 8883 350 350 * **Credentials**: Basic 351 351 * **Enable SSL**: YES 352 352 * **Username**: Username (from your HiveMQ Cloud Cluster with your credentials) 353 353 * **Password:** Password (from your HiveMQ Cloud Cluster with your credentials) 354 -* **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 devices/a/telemetry.)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.) 355 355 * **QoS:** 0-At most once 356 356 420 + 357 357 [[image:add-integration-connection.png||height="511" width="500"]] 358 358 359 359