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

From version 59.1
edited by Hera Guo
on 2024/11/07 10:20
Change comment: There is no comment for this version
To version 15.1
edited by Hera Guo
on 2024/11/04 15:11
Change comment: There is no comment for this version

Summary

Details

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