Last modified by Hera Guo on 2024/11/11 17:08

From version 15.1
edited by Hera Guo
on 2024/11/04 15:11
Change comment: There is no comment for this version
To version 43.1
edited by Hera Guo
on 2024/11/07 09:47
Change comment: There is no comment for this version

Summary

Details

Page properties
Content
... ... @@ -57,7 +57,7 @@
57 57  
58 58  **device:**This section displays the specific information collected by the device, and different types of sensors have different display interfaces
59 59  
60 -[[image:1730699212334-960.png]]
60 +[[image:屏幕截图 2024-11-04 134645.png]]
61 61  
62 62  First floor:
63 63  
... ... @@ -82,7 +82,7 @@
82 82  
83 83  High Temperature、Low Temperature、High humidity、Low humidity、Low voltage、Device Disconnected
84 84  
85 -[[image:1730699566023-958.png]]
85 +[[image:屏幕截图 2024-11-04 135045.png]]
86 86  
87 87  = 4.configuration details =
88 88  
... ... @@ -90,17 +90,987 @@
90 90  
91 91  == 4.1 Dashboard configuration details ==
92 92  
93 -1、Configure the interface of the third layer Davies.
93 +=== 4.1.1.Data source (Entity aliases) ===
94 94  
95 +detail:Obtain data based on dashboard status
95 95  
96 -2、Configure the interface of the second layer asset
97 +[[image:1730709424998-915.png||height="729" width="1436"]]
97 97  
99 +Alarm:Obtain alarm information
98 98  
99 -3、Configure the first layer menu interface
101 +[[image:1730709479828-595.png||height="696" width="1435"]]
100 100  
103 +Dragino&GXHL,Ltd:Obtain data through asset types
101 101  
105 +[[image:1730709511861-439.png||height="714" width="1435"]]
106 +
107 +Selected Supermarket:Retrieve devices by device type
108 +
109 +[[image:1730709527720-418.png||height="751" width="1433"]]
110 +
111 +Supermarket Devices:Obtain data through device type
112 +
113 +[[image:1730709555797-383.png||height="726" width="1434"]]
114 +
115 +LHT65N Device:Obtain data based on device type
116 +
117 +[[image:1730857191863-514.png||height="725" width="1433"]]
118 +
119 +=== 4.1.2.Page Configuration ===
120 +
121 +==== 4.1.2.1、Configure the interface of the third layer Davies. ====
122 +
123 +==== 4.1.2.2、Configure the interface of the second layer asset ====
124 +
125 +===== 4.1.2.2.1 Equipment distribution diagram: =====
126 +
127 +**Data:**
128 +
129 +[[image:1730770392454-317.png||height="745" width="1439"]]
130 +
131 +**Appearannce:**In this module, we need to arrange our devices in the corresponding positions and use icons to display our devices. Therefore, in the Appearance interface, we need to configure them
132 +
133 +**Tooltip function:**This module displays the current information of the device
134 +
135 +[[image:1730857537965-184.png]]
136 +
137 +{{code language="none"}}
138 +var msg = data
139 +if(msg.Label=="gateway" && msg.type == "gateway"){
140 + var stauts
141 + if (msg.gatewaystauts=="true"){
142 + stauts = "Connect"
143 + }
144 + else{
145 + stauts = "Disconnected"
146 + }
147 + var str = "<b>"+msg.entityName+"</b><br/><b>"+stauts+"</b><br/>"
148 + return str
149 +}
150 +else if(msg.type=="gxhl01" && msg.Label!="gateway"){
151 + var str = "<b>"+msg.entityName+"</b><br/><b>"+msg.Label+"</b><br/><b>Bat:</b>"+msg.BatV+"V<br/><b>Temperature:</b>"+ msg.TempC_SHT+ "°C<br/><b>Humidity:</b>"+msg.Hum_SHT+"%"
152 + return str
153 +}
154 +else{
155 + var str = "<b>"+msg.entityName+"</b><br/><b>"+msg.Label+"</b><br/><b>Bat:</b>"+msg.BatV+"V<br/><b>Temperature:</b>"+ msg.temperature+ "°C<br/><b>Humidity:"+msg.humidity+"%"+"</b><br/>"+
156 + "<b>Co2:"+msg.co2+"</b></br><b>Air_Pressure:"+msg.air_pressure
157 +
158 + return str
159 +}
160 +{{/code}}
161 +
162 +(% class="wikigeneratedid" id="HMarkerimagefunctionFF1A" %)
163 +**Marker image function:**This module can display different icons based on different types of sensors and their status to achieve its functionality
164 +
165 +(% class="wikigeneratedid" %)
166 +[[image:1730857750749-240.png]]
167 +
168 +{{code language="none"}}
169 +var res
170 +var msg = data
171 +if(msg.Label=="gateway" && msg.type=="gateway"){
172 + if (msg.gatewaystauts == "true"){
173 + res = {
174 + url: images[3],
175 + size: 40
176 +}
177 +}
178 +else{
179 + res = {
180 + url: images[2],
181 + size: 40
182 +}
183 +}}
184 +else if(msg.Label!="gateway" && msg.type=="gxhl01" ){
185 + if (msg.active=="false"){
186 + res = {
187 + url: images[1],
188 + size: 40
189 +}}
190 +else{
191 + res = {
192 + url: images[0],
193 + size: 40
194 +}
195 +}
196 +}
197 +else if(msg.type=="LWL02"){
198 + if (msg.WATER_LEAK_STATUS=="0"){
199 + res = {
200 + url: images[6],
201 + size: 40
202 +}}
203 +else{
204 + res = {
205 + url: images[7],
206 + size: 40
207 +}
208 +}
209 +}
210 +else if(msg.type=="LDS02"){
211 + if (msg.DOOR_OPEN_STATUS=="0"){
212 + res = {
213 + url: images[5],
214 + size: 40
215 +}}
216 +else{
217 + res = {
218 + url: images[8],
219 + size: 40
220 +}
221 +}
222 +}
223 +else if(msg.type=="LDS12"){
224 + res = {
225 + url: images[10],
226 + size: 40
227 +}}
228 +else if(msg.type=="SE01"){
229 + res = {
230 + url: images[9],
231 + size: 40
232 +}}
233 +else if(msg.type=="PB01"){
234 + res = {
235 + url: images[11],
236 + size: 40
237 +}}
238 +else if(msg.type=="S31b"){
239 + res = {
240 + url: images[12],
241 + size: 40
242 +}}
243 +else if(msg.type=="LHT65N"){
244 + res = {
245 + url: images[13],
246 + size: 40
247 +}}
248 +else{
249 + res = {
250 + url: images[4],
251 + size: 40
252 +}
253 +}
254 +return res;
255 +{{/code}}
256 +
257 +(% class="wikigeneratedid" %)
258 +[[image:1730770875793-351.png]]
259 +
260 +(% class="wikigeneratedid" %)
261 +**Actions:**We need to implement the function of entering the details interface through the corresponding device icon, so in this module, we need to add actions to achieve redirection
262 +
263 +{{code language="none"}}
264 +var entitySubType;
265 +var $injector = widgetContext.$scope.$injector;
266 +$injector.get(widgetContext.servicesMap.get('entityService')).getEntity(entityId.entityType, entityId.id)
267 + .subscribe(function(data) {
268 + entitySubType = data.type;
269 + console.log(entitySubType)
270 + if (entitySubType == 'gateway') {
271 + openDashboardStates('gateway_detail');
272 + } else if (entitySubType == 'gxhl01') {
273 + openDashboardStates('detail');
274 + }
275 + else if(entitySubType == 'AQS01-dragino-office'){
276 + openDashboardStates("aqs01_detail")
277 + }
278 + else if (entitySubType == 'LDS12') {
279 + openDashboardStates('lds12_detail');
280 + }
281 + else if (entitySubType == 'LDS02') {
282 + openDashboardStates('lds02_detail');
283 + }
284 + else if (entitySubType == 'SE01') {
285 + openDashboardStates('se01_detail');
286 + }
287 + else if (entitySubType == 'PB01') {
288 + openDashboardStates('pb01_detail');
289 + }
290 + else if (entitySubType == 'LWL02') {
291 + openDashboardStates('lwl02_detail');
292 + }
293 + else if (entitySubType == 'LPS8N') {
294 + openDashboardStates('lps8n_detail');
295 + }
296 + else if (entitySubType == 'LHT65N') {
297 + openDashboardStates('lht65n_detail');
298 + }
299 + else if (entitySubType == 'S31b') {
300 + openDashboardStates('s31b_detail');
301 + }
302 + });
303 +
304 +function openDashboardStates(statedId) {
305 + var stateParams = widgetContext.stateController.getStateParams();
306 + var params = {
307 + entityId: entityId,
308 + entityName: entityName
309 + };
310 +
311 + if (stateParams.city) {
312 + params.city = stateParams.city;
313 + }
314 +
315 + widgetContext.stateController.openState(statedId, params, false);
316 +}
317 +
318 +{{/code}}
319 +
320 +[[image:1730771103096-522.png]]
321 +
322 +===== 4.1.2.2.2 Device List =====
323 +
324 +(% class="wikigeneratedid" id="HDataFF1A" %)
325 +**Data:**
326 +
327 +[[image:1730771199343-553.png]]
328 +
329 +**Actions:**Equipment distribution diagram: In this module, functions need to be implemented such as adding devices, editing devices, deleting devices, and jumping to the device details page. Therefore, the following actions need to be added:
330 +
331 +[[image:1730771228766-212.png]]
332 +
333 +(% class="wikigeneratedid" id="HEditdeviceFF1A" %)
334 +**Edit device:**Implementation function: Device editing
335 +
336 +[[image:1730771256045-238.png]]
337 +
338 +{{code language="none"}}
339 +let $injector = widgetContext.$scope.$injector;
340 +let customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));
341 +let deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));
342 +let attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));
343 +
344 +openEditDeviceDialog();
345 +
346 +function openEditDeviceDialog() {
347 + customDialog.customDialog(htmlTemplate, EditDeviceDialogController).subscribe();
348 +}
349 +
350 +function EditDeviceDialogController(instance) {
351 + let vm = instance;
352 +
353 + vm.device = null;
354 + vm.attributes = {};
355 +
356 + vm.editDeviceFormGroup = vm.fb.group({
357 + deviceName: ['', [vm.validators.required]],
358 + deviceType: ['', [vm.validators.required]],
359 + deviceLabel: [''],
360 + attributes: vm.fb.group({
361 + latitude: [null],
362 + longitude: [null]
363 + })
364 + });
365 +
366 + vm.cancel = function() {
367 + vm.dialogRef.close(null);
368 + };
369 +
370 + vm.save = function() {
371 + vm.editDeviceFormGroup.markAsPristine();
372 + if (vm.editDeviceFormGroup.get('deviceType').value !== vm.device.type) {
373 + delete vm.device.deviceProfileId;
374 + }
375 + vm.device.name = vm.editDeviceFormGroup.get('deviceName').value,
376 + vm.device.type = vm.editDeviceFormGroup.get('deviceType').value,
377 + vm.device.label = vm.editDeviceFormGroup.get('deviceLabel').value
378 + deviceService.saveDevice(vm.device).subscribe(
379 + function () {
380 + saveAttributes().subscribe(
381 + function () {
382 + widgetContext.updateAliases();
383 + vm.dialogRef.close(null);
384 + }
385 + );
386 + }
387 + );
388 + };
389 +
390 + getEntityInfo();
391 +
392 + function getEntityInfo() {
393 + deviceService.getDevice(entityId.id).subscribe(
394 + function (device) {
395 + attributeService.getEntityAttributes(entityId, 'SERVER_SCOPE',
396 + ['latitude', 'longitude']).subscribe(
397 + function (attributes) {
398 + for (let i = 0; i < attributes.length; i++) {
399 + vm.attributes[attributes[i].key] = attributes[i].value;
400 + }
401 + vm.device = device;
402 + vm.editDeviceFormGroup.patchValue(
403 + {
404 + deviceName: vm.device.name,
405 + deviceType: vm.device.type,
406 + deviceLabel: vm.device.label,
407 + attributes: {
408 + latitude: vm.attributes.latitude,
409 + longitude: vm.attributes.longitude
410 + }
411 + }, {emitEvent: false}
412 + );
413 + }
414 + );
415 + }
416 + );
417 + }
418 +
419 + function saveAttributes() {
420 + let attributes = vm.editDeviceFormGroup.get('attributes').value;
421 + let attributesArray = [];
422 + for (let key in attributes) {
423 + attributesArray.push({key: key, value: attributes[key]});
424 + }
425 + if (attributesArray.length > 0) {
426 + return attributeService.saveEntityAttributes(entityId, 'SERVER_SCOPE', attributesArray);
427 + } else {
428 + return widgetContext.rxjs.of([]);
429 + }
430 + }
431 +}
432 +{{/code}}
433 +
434 +**Delete device:**Implementation function: Device deletion
435 +
436 +[[image:1730771318657-502.png]]
437 +
438 +{{code language="none"}}
439 +let $injector = widgetContext.$scope.$injector;
440 +let dialogs = $injector.get(widgetContext.servicesMap.get('dialogs'));
441 +let deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));
442 +
443 +openDeleteDeviceDialog();
444 +
445 +function openDeleteDeviceDialog() {
446 + let title = "Are you sure you want to delete the device " + entityName + "?";
447 + let content = "Be careful, after the confirmation, the device and all related data will become unrecoverable!";
448 + dialogs.confirm(title, content, 'Cancel', 'Delete').subscribe(
449 + function (result) {
450 + if (result) {
451 + deleteDevice();
452 + }
453 + }
454 + );
455 +}
456 +
457 +function deleteDevice() {
458 + deviceService.deleteDevice(entityId.id).subscribe(
459 + function () {
460 + widgetContext.updateAliases();
461 + }
462 + );
463 +}
464 +
465 +{{/code}}
466 +
467 +**jump:I**mplementation function: Jump to the device details page
468 +
469 +[[image:1730771386258-676.png]]
470 +
471 +{{code language="none"}}
472 +console.log(entityName)
473 +var entitySubType;
474 +var $injector = widgetContext.$scope.$injector;
475 +//console.log($injector)
476 +$injector.get(widgetContext.servicesMap.get('entityService')).getEntity(entityId.entityType, entityId.id)
477 + .subscribe(function(data) {
478 + console.log(data)
479 + entitySubType = data.type;
480 + console.log(entitySubType)
481 + if (entitySubType == 'AQS01-dragino-office') {
482 + openDashboardStates('aqs01_detail');
483 + }else if (entitySubType == 'gateway') {
484 + openDashboardStates('gateway_detail');
485 + } else if (entitySubType == 'gxhl01') {
486 + openDashboardStates('detail');
487 +
488 + } else if (entitySubType == 'tank-type1') {
489 + openDashboardStates('test1');
490 + }
491 + else if (entitySubType == 'LDS12') {
492 + openDashboardStates('lds12_detail');
493 + }
494 + else if (entitySubType == 'LDS02') {
495 + openDashboardStates('lds02_detail');
496 + }
497 + else if (entitySubType == 'SE01') {
498 + openDashboardStates('se01_detail');
499 + }
500 + else if (entitySubType == 'PB01') {
501 + openDashboardStates('pb01_detail');
502 + }
503 + else if (entitySubType == 'LWL02') {
504 + openDashboardStates('lwl02_detail');
505 + }
506 + else if (entitySubType == 'LPS8N') {
507 + openDashboardStates('lps8n_detail');
508 + }
509 + else if (entitySubType == 'LHT65N') {
510 + openDashboardStates('lht65n_detail');
511 + }
512 + else if (entitySubType == 'S31b') {
513 + openDashboardStates('s31b_detail');
514 + }
515 + });
516 +
517 +function openDashboardStates(statedId) {
518 + var stateParams = widgetContext.stateController.getStateParams();
519 + //console.log(stateParams)
520 + var params = {
521 + entityId: entityId,
522 + entityName: entityName
523 + };
524 + widgetContext.stateController.updateState(statedId, params, false);
525 +}
526 +{{/code}}
527 +
528 +(% class="wikigeneratedid" id="H-1" %)
529 +**Add device:**Implementation function: Add device
530 +
531 +[[image:1730771441589-122.png]]
532 +
533 +{{code language="none"}}
534 +let $injector = widgetContext.$scope.$injector;
535 +let customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));
536 +let deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));
537 +let attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));
538 +
539 +openAddDeviceDialog();
540 +
541 +function openAddDeviceDialog() {
542 + customDialog.customDialog(htmlTemplate, AddDeviceDialogController).subscribe();
543 +}
544 +
545 +function AddDeviceDialogController(instance) {
546 + let vm = instance;
547 +
548 + vm.addDeviceFormGroup = vm.fb.group({
549 + deviceName: ['', [vm.validators.required]],
550 + deviceType: ['', [vm.validators.required]],
551 + deviceLabel: [''],
552 + attributes: vm.fb.group({
553 + latitude: [null],
554 + longitude: [null]
555 + })
556 + });
557 +
558 + vm.cancel = function() {
559 + vm.dialogRef.close(null);
560 + };
561 +
562 + vm.save = function() {
563 + vm.addDeviceFormGroup.markAsPristine();
564 + let device = {
565 + name: vm.addDeviceFormGroup.get('deviceName').value,
566 + type: vm.addDeviceFormGroup.get('deviceType').value,
567 + label: vm.addDeviceFormGroup.get('deviceLabel').value
568 + };
569 + deviceService.saveDevice(device).subscribe(
570 + function (device) {
571 + saveAttributes(device.id).subscribe(
572 + function () {
573 + widgetContext.updateAliases();
574 + vm.dialogRef.close(null);
575 + }
576 + );
577 + }
578 + );
579 + };
580 +
581 + function saveAttributes(entityId) {
582 + let attributes = vm.addDeviceFormGroup.get('attributes').value;
583 + let attributesArray = [];
584 + for (let key in attributes) {
585 + attributesArray.push({key: key, value: attributes[key]});
586 + }
587 + if (attributesArray.length > 0) {
588 + return attributeService.saveEntityAttributes(entityId, "SERVER_SCOPE", attributesArray);
589 + } else {
590 + return widgetContext.rxjs.of([]);
591 + }
592 + }
593 +}
594 +{{/code}}
595 +
596 +==== ====
597 +
598 +===== **4.1.2.2.3 Asset Alarm:** =====
599 +
600 +**Data:**
601 +
602 +[[image:1730771504586-433.png]]
603 +
604 +==== 4.1.2.3、Configure the first layer menu interface ====
605 +
606 +===== =====
607 +
608 +[[image:1730710271230-716.png||height="729" width="1427"]]
609 +
610 +**Actions**:The map interface has two actions, among which Select supermarket can refresh the device list and related alarms on the right side to enter the location, and Supermarket_detail can jump to the second level physical interface to view the details of the location based on the selected location
611 +
612 +[[image:1730710850458-781.png||height="770" width="1429"]]
613 +
614 +**Select supermarket:**Implementation function: Refresh the side page
615 +
616 +{{code language="none"}}
617 +var params = widgetContext.stateController.getStateParams();
618 +var selectedSupermarket = params['selectedSupermarket'];
619 +if (selectedSupermarket && selectedSupermarket.entityId.id === entityId.id) {
620 + params['selectedSupermarket'] = null;
621 +} else {
622 + params['selectedSupermarket'] = { entityId: entityId, entityName: entityName, entityLabel: entityLabel };
623 +}
624 +widgetContext.stateController.updateState(null, params);
625 +{{/code}}
626 +
627 +[[image:1730710875401-848.png||height="767" width="1429"]]
628 +
629 +**Supermarket_detail:**Implementation function: Jump to the asset details page
630 +
631 +{{code language="none"}}
632 +var params = JSON.parse(JSON.stringify(widgetContext.stateController.getStateParams()));
633 +params['selectedSupermarket'] = {
634 + entityId: entityId,
635 + entityName: entityName,
636 + entityLabel: entityLabel,
637 +};
638 +params['targetEntityParamName'] = 'selectedSupermarket';
639 +params['selectedDevice'] = null;
640 +
641 +widgetContext.stateController.openState('svgmap', params);
642 +{{/code}}
643 +
644 +[[image:1730710990334-601.png||height="772" width="1433"]]
645 +
646 +* (((
647 +In this demo, exclusive map icons were set as follows:
648 +)))
649 +
650 +{{code language="none"}}
651 +var res = {
652 + url: images[0],
653 + size: 66
654 +};
655 +return res;
656 +{{/code}}
657 +
658 +[[image:1730710395303-672.png||height="771" width="1438"]]
659 +
660 +===== 4.1.2.3.1 Asset List: =====
661 +
662 +
663 +
664 +**Data:**
665 +
666 +[[image:1730710693066-349.png||height="772" width="1439"]]
667 +
668 +**Actions:**The Assets List interface has an action, which is the same as the Supermarket_details in the Map. You can jump to the second level entity interface to view the details of the selected location based on its location
669 +
670 +[[image:1730712335338-750.png||height="751" width="1423"]]
671 +
672 +[[image:1730712473941-913.png||height="781" width="1422"]]
673 +
674 +All Alarms:
675 +
676 +[[image:1730712539209-554.png||height="764" width="1424"]]
677 +
102 102  == 4.2 Alarm configuration details ==
103 103  
680 +=== 4.2.1 High temperature ===
681 +
682 +Creat:
683 +
684 +[[image:1730862483514-101.png||height="750" width="1407"]]
685 +
686 +Clear:
687 +
688 +[[image:1730862584519-902.png||height="758" width="1404"]]
689 +
690 +=== 4.2.2 Low Temperature ===
691 +
692 +Creat:
693 +
694 +[[image:1730863708259-750.png||height="752" width="1403"]]
695 +
696 +Clear:
697 +
698 +[[image:1730863750414-979.png||height="746" width="1403"]]
699 +
700 +=== 4.2.3 High humidity ===
701 +
702 +Creat:
703 +
704 +[[image:1730864045747-876.png||height="752" width="1396"]]
705 +
706 +Clear:
707 +
708 +[[image:1730864077395-395.png||height="735" width="1393"]]
709 +
710 +=== 4.2.4 Low humidity ===
711 +
712 +Creat:
713 +
714 +[[image:1730864117808-484.png||height="741" width="1392"]]
715 +
716 +Clear:
717 +
718 +[[image:1730864159071-895.png||height="745" width="1392"]]
719 +
720 +=== 4.2.5 Low voltage ===
721 +
722 +Creat:
723 +
724 +[[image:1730864207037-477.png||height="740" width="1388"]]
725 +
726 +Clear:
727 +
728 +[[image:1730864250506-111.png||height="735" width="1389"]]
729 +
730 +=== 4.2.6 Device Disconnected ===
731 +
732 +Creat:
733 +
734 +[[image:1730864293216-991.png||height="739" width="1387"]]
735 +
736 +Clear:
737 +
738 +[[image:1730864331859-740.png||height="735" width="1385"]]
739 +
104 104  == 4.3 Rule chain configuration details ==
105 105  
106 -= 5. =
742 +[[image:1730864784118-474.png]]
743 +
744 +**Script:**Email configuration for sending device alarm information
745 +
746 +[[image:1730864676542-406.png||height="732" width="1384"]]
747 +
748 +{{code language="none"}}
749 +function locatime(timenumber){
750 + var date = new Date(timenumber)
751 + return date.toLocaleDateString() + ' ' + date.toLocaleTimeString()
752 +}
753 +var name = msg.name
754 +var devicename = msg.originatorName
755 +var label = msg.originatorLabel
756 +var status = msg.status
757 +var detaildata =JSON.parse(msg.details.data)
758 +var tempswitch
759 +
760 +if (name != "Device Disconnected") {
761 + //detaildata=JSON.parse(msg.details.data)
762 + if (detaildata.Temperature_alarm_switch == true) {
763 + tempswitch = "open"
764 + } else {
765 + tempswitch = "close"
766 + }
767 + var humswitch
768 + if (detaildata.Humidity_alarm_switch == true) {
769 + humswitch = "open"
770 + } else {
771 + humswitch = "close"
772 + }
773 + var batswitch
774 + if (detaildata.Voltage_alarm_switch == true) {
775 + batswitch = "open"
776 + } else {
777 + batswitch = "close"
778 + }
779 + var str2 = "<p>-- Temperature alarm switch status: " +
780 + tempswitch + "</p>" +
781 + "<p>-- Humidity alarm switch status: " + humswitch +
782 + "</p>" +
783 + "<p>-- Voltage alarm switch status: " + batswitch
784 +}
785 +
786 +if (name == "High Temperature" && status ==
787 + "ACTIVE_UNACK") {
788 + var emailstr =
789 + "<div><p><span style='color: black; font-weight: bold'>" +
790 + "Device " + label + " has alarm:</span></p>" +
791 + "<p><span style='color: red; font-weight: bold'>-- High Temperature Alarm</span></p>" +
792 + "<p>-- Current Temperature : " + detaildata
793 + .TempC_SHT + "</p><br>" +
794 + "<p>Device Configure:</p>" +
795 + "<p>-- Temperature Threshold : min: " + detaildata
796 + .Low_temperature_alarm + ", max: " + detaildata
797 + .High_temperature_alarm + "</p>" +
798 + "<p>-- Humidity Threshold: min: " + detaildata
799 + .Low_humidity_alarm + ", max:" + detaildata
800 + .High_humidity_alarm + "</p>" +
801 + "<p>-- Battery threshold: min: " + detaildata
802 + .Low_voltage_alarm + "</p>" + str2 + "</div>"
803 + return {
804 + msg: {
805 + "data": emailstr
806 + },
807 + metadata: metadata,
808 + msgType: msgType
809 + };
810 +} else if (name == "Low Temperature" && status ==
811 + "ACTIVE_UNACK") {
812 + var emailstr =
813 + "<div><p><span style='color: black; font-weight: bold'>" +
814 + "Device " + label + " has alarm:</span></p>" +
815 + "<p><span style='color: red; font-weight: bold'>-- Low Temperature Alarm</span></p>" +
816 + "<p>-- Current Temperature : " + detaildata
817 + .TempC_SHT + "</p><br>" +
818 + "<p>Device Configure:</p>" +
819 + "<p>-- Temperature Threshold : min: " + detaildata
820 + .Low_temperature_alarm + ", max: " + detaildata
821 + .High_temperature_alarm + "</p>" +
822 + "<p>-- Humidity Threshold: min: " + detaildata
823 + .Low_humidity_alarm + ", max:" + detaildata
824 + .High_humidity_alarm + "</p>" +
825 + "<p>-- Battery threshold: min: " + detaildata
826 + .Low_voltage_alarm + "</p>" + str2 + "</div>"
827 +
828 + return {
829 + msg: {
830 + "data": emailstr
831 + },
832 + metadata: metadata,
833 + msgType: msgType
834 + };
835 +
836 +} else if (name == "Device Disconnected" && status ==
837 + "ACTIVE_UNACK") {
838 + var time1 = locatime(Number(detaildata.lastActivityTime))
839 + //var time1 = detaildata.lastActivityTime
840 + // var chazhi = parseInt((detaildata.inactivityAlarmTime-detaildata.lastActivityTime)/1000/60)
841 + // var emailstr =
842 + // "<div><p><span style='color: red; font-weight: bold'>" +
843 + // "Device " + label + " has Alarm</span></p><p>Last activity time: "+time1+"</p><p>Last Uplink: 21"+"minutes ago</p></div>"
844 +
845 + var emailstr ="Device " + label + " has Alarm##Last activity time: "+time1+"##Last Uplink: 21minutes ago"
846 + var newType = "POST_TELEMETRY_REQUEST"
847 + return {
848 + msg:emailstr,
849 + metadata: metadata,
850 + msgType: newType
851 + }
852 +} else if (name == "High humidity" && status ==
853 + "ACTIVE_UNACK") {
854 + var emailstr =
855 + "<div><p><span style='color: black; font-weight: bold'>" +
856 + "Device " + label + " has alarm:</span></p>" +
857 + "<p><span style='color: red; font-weight: bold'>-- High Humidity Alarm</span></p>" +
858 + "<p>-- Current Temperature : " + detaildata
859 + .Hum_SHT + "</p><br>" +
860 + "<p>Device Configure:</p>" +
861 + "<p>-- Temperature Threshold : min: " + detaildata
862 + .Low_temperature_alarm + ", max: " + detaildata
863 + .High_temperature_alarm + "</p>" +
864 + "<p>-- Humidity Threshold: min: " + detaildata
865 + .Low_humidity_alarm + ", max:" + detaildata
866 + .High_humidity_alarm + "</p>" +
867 + "<p>-- Battery threshold: min: " + detaildata
868 + .Low_voltage_alarm + "</p>" + str2 + "</div>"
869 +
870 + return {
871 + msg: {
872 + "data": emailstr
873 + },
874 + metadata: metadata,
875 + msgType: msgType
876 + };
877 +} else if (name == "Low humidity" && status ==
878 + "ACTIVE_UNACK") {
879 + var emailstr =
880 + "<div><p><span style='color: black; font-weight: bold'>" +
881 + "Device " + label + " has alarm:</span></p>" +
882 + "<p><span style='color: red; font-weight: bold'>-- Low Humidity Alarm</span></p>" +
883 + "<p>-- Current Temperature : " + detaildata
884 + .Hum_SHT + "</p><br>" +
885 + "<p>Device Configure:</p>" +
886 + "<p>-- Temperature Threshold : min: " + detaildata
887 + .Low_temperature_alarm + ", max: " + detaildata
888 + .High_temperature_alarm + "</p>" +
889 + "<p>-- Humidity Threshold: min: " + detaildata
890 + .Low_humidity_alarm + ", max:" + detaildata
891 + .High_humidity_alarm + "</p>" +
892 + "<p>-- Battery threshold: min: " + detaildata
893 + .Low_voltage_alarm + "</p>" + str2 + "</div>"
894 +
895 + return {
896 + msg: {
897 + "data": emailstr
898 + },
899 + metadata: metadata,
900 + msgType: msgType
901 + };
902 +} else if (name == "Low voltage" && status ==
903 + "ACTIVE_UNACK") {
904 + var emailstr =
905 + "<div><p><span style='color: black; font-weight: bold'>" +
906 + "Device " + label + " has alarm:</span></p>" +
907 + "<p><span style='color: red; font-weight: bold'>-- Low Voltage Alarm</span></p>" +
908 + "<p>-- Current Temperature : " + detaildata.BatV +
909 + "</p><br>" +
910 + "<p>Device Configure:</p>" +
911 + "<p>-- Temperature Threshold : min: " + detaildata
912 + .Low_temperature_alarm + ", max: " + detaildata
913 + .High_temperature_alarm + "</p>" +
914 + "<p>-- Humidity Threshold: min: " + detaildata
915 + .Low_humidity_alarm + ", max:" + detaildata
916 + .High_humidity_alarm + "</p>" +
917 + "<p>-- Battery threshold: min: " + detaildata
918 + .Low_voltage_alarm + "</p>" + str2 + "</div>"
919 +
920 + return {
921 + msg: {
922 + "data": emailstr
923 + },
924 + metadata: metadata,
925 + msgType: msgType
926 + };
927 +} else if (name == "High Temperature" && status ==
928 + "CLEARED_UNACK") {
929 + var emailstr =
930 + "<div><p><span style='color: green; font-weight: bold'>Device " +
931 + label +
932 + " High Temperature Alarm Cleared</span></p>" +
933 + "<p>-- Current Temperature : " + detaildata
934 + .TempC_SHT + "</p><br>" +
935 + "<p>Device Configure:</p>" +
936 + "<p>-- Temperature Threshold : min: " + detaildata
937 + .Low_temperature_alarm + ", max: " + detaildata
938 + .High_temperature_alarm + "</p>" +
939 + "<p>-- Humidity Threshold: min: " + detaildata
940 + .Low_humidity_alarm + ", max:" + detaildata
941 + .High_humidity_alarm + "</p>" +
942 + "<p>-- Battery threshold: min: " + detaildata
943 + .Low_voltage_alarm + "</p>" + str2 + "</div>"
944 +
945 + return {
946 + msg: {
947 + "data": emailstr
948 + },
949 + metadata: metadata,
950 + msgType: msgType
951 + };
952 +} else if (name == "Low Temperature" && status ==
953 + "CLEARED_UNACK") {
954 + var emailstr =
955 + "<div><p><span style='color: green; font-weight: bold'>Device " +
956 + label +
957 + " Low Temperature Alarm Cleared</span></p>" +
958 + "<p>-- Current Temperature : " + detaildata
959 + .TempC_SHT + "</p><br>" +
960 + "<p>Device Configure:</p>" +
961 + "<p>-- Temperature Threshold : min: " + detaildata
962 + .Low_temperature_alarm + ", max: " + detaildata
963 + .High_temperature_alarm + "</p>" +
964 + "<p>-- Humidity Threshold: min: " + detaildata
965 + .Low_humidity_alarm + ", max:" + detaildata
966 + .High_humidity_alarm + "</p>" +
967 + "<p>-- Battery threshold: min: " + detaildata
968 + .Low_voltage_alarm + "</p>" + str2 + "</div>"
969 +
970 + return {
971 + msg: {
972 + "data": emailstr
973 + },
974 + metadata: metadata,
975 + msgType: msgType
976 + };
977 +} else if (name == "High humidity" && status ==
978 + "CLEARED_UNACK") {
979 + var emailstr =
980 + "<div><p><span style='color: green; font-weight: bold'>Device " +
981 + label + " High Humidity Alarm Cleared</span></p>" +
982 + "<p>-- Current Temperature : " + detaildata
983 + .Hum_SHT + "</p><br>" +
984 + "<p>Device Configure:</p>" +
985 + "<p>-- Temperature Threshold : min: " + detaildata
986 + .Low_temperature_alarm + ", max: " + detaildata
987 + .High_temperature_alarm + "</p>" +
988 + "<p>-- Humidity Threshold: min: " + detaildata
989 + .Low_humidity_alarm + ", max:" + detaildata
990 + .High_humidity_alarm + "</p>" +
991 + "<p>-- Battery threshold: min: " + detaildata
992 + .Low_voltage_alarm + "</p>" + str2 + "</div>"
993 +
994 + return {
995 + msg: {
996 + "data": emailstr
997 + },
998 + metadata: metadata,
999 + msgType: msgType
1000 + };
1001 +} else if (name == "Low humidity" && status ==
1002 + "CLEARED_UNACK") {
1003 + var emailstr =
1004 + "<div><p><span style='color: green; font-weight: bold'>Device " +
1005 + label + " Low Humidity Alarm Cleared</span></p>" +
1006 + "<p>-- Current Temperature : " + detaildata
1007 + .Hum_SHT + "</p><br>" +
1008 + "<p>Device Configure:</p>" +
1009 + "<p>-- Temperature Threshold : min: " + detaildata
1010 + .Low_temperature_alarm + ", max: " + detaildata
1011 + .High_temperature_alarm + "</p>" +
1012 + "<p>-- Humidity Threshold: min: " + detaildata
1013 + .Low_humidity_alarm + ", max:" + detaildata
1014 + .High_humidity_alarm + "</p>" +
1015 + "<p>-- Battery threshold: min: " + detaildata
1016 + .Low_voltage_alarm + "</p>" + str2 + "</div>"
1017 + return {
1018 + msg: {
1019 + "data": emailstr
1020 + },
1021 + metadata: metadata,
1022 + msgType: msgType
1023 + };
1024 +} else if (name == "Low voltage" && status ==
1025 + "CLEARED_UNACK") {
1026 +
1027 + var emailstr =
1028 + "<div><p><span style='color: green; font-weight: bold'>Device " +
1029 + label + " Low Voltage Alarm Cleared</span></p>" +
1030 + "<p>-- Current Temperature : " + detaildata.BatV +
1031 + "</p><br><br>" +
1032 + "<p>Device Configure:</p>" +
1033 + "<p>-- Temperature Threshold : min: " + detaildata
1034 + .Low_temperature_alarm + ", max: " + detaildata
1035 + .High_temperature_alarm + "</p>" +
1036 + "<p>-- Humidity Threshold: min: " + detaildata
1037 + .Low_humidity_alarm + ", max:" + detaildata
1038 + .High_humidity_alarm + "</p>" +
1039 + "<p>-- Battery threshold: min: " + detaildata
1040 + .Low_voltage_alarm + "</p>" + str2 + "</div>"
1041 +
1042 + return {
1043 + msg: {
1044 + "data": emailstr
1045 + },
1046 + metadata: metadata,
1047 + msgType: msgType
1048 + };
1049 +} else if (name == "Device Disconnected" && status ==
1050 + "CLEARED_UNACK") {
1051 + var time1 = locatime(Number(detaildata.lastActivityTime))
1052 + //var time1 = detaildata.lastActivityTime
1053 + // var chazhi = parseInt((detaildata.inactivityAlarmTime-detaildata.lastActivityTime)/1000/60)
1054 + // var emailstr =
1055 + // "<div><p><span style='color: green; font-weight: bold'>" +
1056 + // "Device " + label + " has Alarm Cleared</span></p><p>Last activity time: "+time1+"</p></div>"
1057 + var emailstr ="Device " + label + " has Alarm Cleared##Last activity time: "+time1
1058 + var newType = "POST_TELEMETRY_REQUEST"
1059 + return {
1060 + msg: emailstr,
1061 + metadata: metadata,
1062 + msgType: newType
1063 + }
1064 +}
1065 +{{/code}}
1066 +
1067 +(% class="wikigeneratedid" %)
1068 +**Generate Report:**
1069 +
1070 +(% class="wikigeneratedid" %)
1071 +[[image:1730865053380-293.png]]
1072 +
1073 += 5.other =
1074 +
1075 +* If you want to create a similar dashboard, after understanding the case, you can download and import the dashboard, device profiles, rule chains, etc. of the case on GitHub, and make modifications based on them.
1076 +* GitHub address:[[https:~~/~~/github.com/ThingsEye-io/te-platform/tree/main/case/Dragino%20Office%20%26%20Factory>>https://github.com/ThingsEye-io/te-platform/tree/main/case/Dragino%20Office%20%26%20Factory]]
1730709382428-730.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +480.8 KB
Content
1730709409941-536.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +451.5 KB
Content
1730709424998-915.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +443.4 KB
Content
1730709442773-502.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +448.3 KB
Content
1730709461297-207.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +458.2 KB
Content
1730709479828-595.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +450.7 KB
Content
1730709511861-439.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +470.0 KB
Content
1730709527720-418.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +475.8 KB
Content
1730709542597-321.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +474.8 KB
Content
1730709555797-383.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +463.2 KB
Content
1730710271230-716.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +1.5 MB
Content
1730710395303-672.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +1.6 MB
Content
1730710693066-349.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +94.4 KB
Content
1730710850458-781.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +1.5 MB
Content
1730710875401-848.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +1.0 MB
Content
1730710949358-671.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +1.0 MB
Content
1730710990334-601.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +1.0 MB
Content
1730712335338-750.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +77.1 KB
Content
1730712473941-913.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +135.9 KB
Content
1730712539209-554.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +131.0 KB
Content
1730770392454-317.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +195.6 KB
Content
1730770636230-829.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +290.6 KB
Content
1730770875793-351.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +305.2 KB
Content
1730771103096-522.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +197.9 KB
Content
1730771199343-553.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +108.5 KB
Content
1730771228766-212.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +46.8 KB
Content
1730771256045-238.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +69.1 KB
Content
1730771318657-502.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +60.4 KB
Content
1730771386258-676.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +46.4 KB
Content
1730771441589-122.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +57.6 KB
Content
1730771504586-433.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +151.2 KB
Content
1730857191863-514.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +354.7 KB
Content
1730857537965-184.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +455.1 KB
Content
1730857750749-240.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +285.9 KB
Content
1730862483514-101.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +195.8 KB
Content
1730862584519-902.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +191.1 KB
Content
1730863708259-750.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +220.1 KB
Content
1730863750414-979.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +210.6 KB
Content
1730864045747-876.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +208.9 KB
Content
1730864077395-395.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +201.4 KB
Content
1730864117808-484.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +203.0 KB
Content
1730864159071-895.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +226.6 KB
Content
1730864207037-477.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +215.3 KB
Content
1730864250506-111.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +209.5 KB
Content
1730864293216-991.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +138.5 KB
Content
1730864331859-740.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +134.4 KB
Content
1730864460314-611.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +256.7 KB
Content
1730864617480-221.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +260.8 KB
Content
1730864676542-406.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +227.7 KB
Content
1730864784118-474.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +148.8 KB
Content
1730865053380-293.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +46.7 KB
Content
屏幕截图 2024-11-04 135045.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +29.4 KB
Content