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

From version 16.1
edited by Hera Guo
on 2024/11/04 16:45
Change comment: There is no comment for this version
To version 19.1
edited by Hera Guo
on 2024/11/05 09:51
Change comment: There is no comment for this version

Summary

Details

Page properties
Content
... ... @@ -94,52 +94,583 @@
94 94  
95 95  Asset map:
96 96  
97 -[[image:1730709409941-536.png]]
97 +[[image:1730709409941-536.png||height="729" width="1440"]]
98 98  
99 99  detail:
100 100  
101 -[[image:1730709424998-915.png]]
101 +[[image:1730709424998-915.png||height="729" width="1436"]]
102 102  
103 103  devid:
104 104  
105 -[[image:1730709442773-502.png]]
105 +[[image:1730709442773-502.png||height="738" width="1434"]]
106 106  
107 107  State:
108 108  
109 -[[image:1730709461297-207.png]]
109 +[[image:1730709461297-207.png||height="706" width="1434"]]
110 110  
111 111  Alarm:
112 112  
113 -[[image:1730709479828-595.png]]
113 +[[image:1730709479828-595.png||height="696" width="1435"]]
114 114  
115 115  Dragino&GXHL,Ltd:
116 116  
117 -[[image:1730709511861-439.png]]
117 +[[image:1730709511861-439.png||height="714" width="1435"]]
118 118  
119 119  Selected Supermarket:
120 120  
121 -[[image:1730709527720-418.png]]
121 +[[image:1730709527720-418.png||height="751" width="1433"]]
122 122  
123 123  Supermarkets:
124 124  
125 -[[image:1730709542597-321.png]]
125 +[[image:1730709542597-321.png||height="734" width="1435"]]
126 126  
127 127  Supermarket Devices:
128 128  
129 -[[image:1730709555797-383.png]]
129 +[[image:1730709555797-383.png||height="726" width="1434"]]
130 130  
131 131  
132 132  === 4.1.2.Page Configuration ===
133 133  
134 -1、Configure the interface of the third layer Davies.
134 +==== 4.1.2.1、Configure the interface of the third layer Davies. ====
135 135  
136 136  
137 -2、Configure the interface of the second layer asset
137 +==== 4.1.2.2、Configure the interface of the second layer asset ====
138 138  
139 +**Equipment distribution diagram:**
139 139  
140 -3、Configure the first layer menu interface
141 +**Data:**
141 141  
143 +[[image:1730770392454-317.png||height="745" width="1439"]]
142 142  
145 +Tooltip function:
146 +
147 +{{code language="none"}}
148 +var msg = data
149 +if(msg.Label=="gateway" && msg.type == "gateway"){
150 + var stauts
151 + if (msg.gatewaystauts=="true"){
152 + stauts = "Connect"
153 + }
154 + else{
155 + stauts = "Disconnected"
156 + }
157 + var str = "<b>"+msg.entityName+"</b><br/><b>"+stauts+"</b><br/>"
158 + return str
159 +}
160 +else if(msg.type=="gxhl01" && msg.Label!="gateway"){
161 + 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+"%"
162 + return str
163 +}
164 +else{
165 + 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/>"+
166 + "<b>Co2:"+msg.co2+"</b></br><b>Air_Pressure:"+msg.air_pressure
167 +
168 + return str
169 +}
170 +{{/code}}
171 +
172 +==== Marker image function: ====
173 +
174 +{{code language="none"}}
175 +var res
176 +var msg = data
177 +if(msg.Label=="gateway" && msg.type=="gateway"){
178 + if (msg.gatewaystauts == "true"){
179 + res = {
180 + url: images[3],
181 + size: 40
182 +}
183 +}
184 +else{
185 + res = {
186 + url: images[2],
187 + size: 40
188 +}
189 +}}
190 +else if(msg.Label!="gateway" && msg.type=="gxhl01" ){
191 + if (msg.active=="false"){
192 + res = {
193 + url: images[1],
194 + size: 40
195 +}}
196 +else{
197 + res = {
198 + url: images[0],
199 + size: 40
200 +}
201 +}
202 +}
203 +else if(msg.type=="LWL02"){
204 + if (msg.WATER_LEAK_STATUS=="0"){
205 + res = {
206 + url: images[6],
207 + size: 40
208 +}}
209 +else{
210 + res = {
211 + url: images[7],
212 + size: 40
213 +}
214 +}
215 +}
216 +else if(msg.type=="LDS02"){
217 + if (msg.DOOR_OPEN_STATUS=="0"){
218 + res = {
219 + url: images[5],
220 + size: 40
221 +}}
222 +else{
223 + res = {
224 + url: images[8],
225 + size: 40
226 +}
227 +}
228 +}
229 +else if(msg.type=="LDS12"){
230 + res = {
231 + url: images[10],
232 + size: 40
233 +}}
234 +else if(msg.type=="SE01"){
235 + res = {
236 + url: images[9],
237 + size: 40
238 +}}
239 +else if(msg.type=="PB01"){
240 + res = {
241 + url: images[11],
242 + size: 40
243 +}}
244 +else if(msg.type=="S31b"){
245 + res = {
246 + url: images[12],
247 + size: 40
248 +}}
249 +else if(msg.type=="LHT65N"){
250 + res = {
251 + url: images[13],
252 + size: 40
253 +}}
254 +else{
255 + res = {
256 + url: images[4],
257 + size: 40
258 +}
259 +}
260 +return res;
261 +{{/code}}
262 +
263 +==== [[image:1730770875793-351.png]] ====
264 +
265 +==== Actions ====
266 +
267 +{{code language="none"}}
268 +var entitySubType;
269 +var $injector = widgetContext.$scope.$injector;
270 +$injector.get(widgetContext.servicesMap.get('entityService')).getEntity(entityId.entityType, entityId.id)
271 + .subscribe(function(data) {
272 + entitySubType = data.type;
273 + console.log(entitySubType)
274 + if (entitySubType == 'gateway') {
275 + openDashboardStates('gateway_detail');
276 + } else if (entitySubType == 'gxhl01') {
277 + openDashboardStates('detail');
278 + }
279 + else if(entitySubType == 'AQS01-dragino-office'){
280 + openDashboardStates("aqs01_detail")
281 + }
282 + else if (entitySubType == 'LDS12') {
283 + openDashboardStates('lds12_detail');
284 + }
285 + else if (entitySubType == 'LDS02') {
286 + openDashboardStates('lds02_detail');
287 + }
288 + else if (entitySubType == 'SE01') {
289 + openDashboardStates('se01_detail');
290 + }
291 + else if (entitySubType == 'PB01') {
292 + openDashboardStates('pb01_detail');
293 + }
294 + else if (entitySubType == 'LWL02') {
295 + openDashboardStates('lwl02_detail');
296 + }
297 + else if (entitySubType == 'LPS8N') {
298 + openDashboardStates('lps8n_detail');
299 + }
300 + else if (entitySubType == 'LHT65N') {
301 + openDashboardStates('lht65n_detail');
302 + }
303 + else if (entitySubType == 'S31b') {
304 + openDashboardStates('s31b_detail');
305 + }
306 + });
307 +
308 +function openDashboardStates(statedId) {
309 + var stateParams = widgetContext.stateController.getStateParams();
310 + var params = {
311 + entityId: entityId,
312 + entityName: entityName
313 + };
314 +
315 + if (stateParams.city) {
316 + params.city = stateParams.city;
317 + }
318 +
319 + widgetContext.stateController.openState(statedId, params, false);
320 +}
321 +
322 +{{/code}}
323 +
324 +[[image:1730771103096-522.png]]
325 +
326 +Device List
327 +
328 +Data:
329 +
330 +[[image:1730771199343-553.png]]
331 +
332 +Actions:
333 +
334 +[[image:1730771228766-212.png]]
335 +
336 +==== Edit device: ====
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 +==== [[image:1730771256045-238.png]] ====
435 +
436 +Delete device:
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 +[[image:1730771318657-502.png]]
468 +
469 +jump
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 +==== [[image:1730771386258-676.png]] ====
529 +
530 +Add device:
531 +
532 +{{code language="none"}}
533 +let $injector = widgetContext.$scope.$injector;
534 +let customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));
535 +let deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));
536 +let attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));
537 +
538 +openAddDeviceDialog();
539 +
540 +function openAddDeviceDialog() {
541 + customDialog.customDialog(htmlTemplate, AddDeviceDialogController).subscribe();
542 +}
543 +
544 +function AddDeviceDialogController(instance) {
545 + let vm = instance;
546 +
547 + vm.addDeviceFormGroup = vm.fb.group({
548 + deviceName: ['', [vm.validators.required]],
549 + deviceType: ['', [vm.validators.required]],
550 + deviceLabel: [''],
551 + attributes: vm.fb.group({
552 + latitude: [null],
553 + longitude: [null]
554 + })
555 + });
556 +
557 + vm.cancel = function() {
558 + vm.dialogRef.close(null);
559 + };
560 +
561 + vm.save = function() {
562 + vm.addDeviceFormGroup.markAsPristine();
563 + let device = {
564 + name: vm.addDeviceFormGroup.get('deviceName').value,
565 + type: vm.addDeviceFormGroup.get('deviceType').value,
566 + label: vm.addDeviceFormGroup.get('deviceLabel').value
567 + };
568 + deviceService.saveDevice(device).subscribe(
569 + function (device) {
570 + saveAttributes(device.id).subscribe(
571 + function () {
572 + widgetContext.updateAliases();
573 + vm.dialogRef.close(null);
574 + }
575 + );
576 + }
577 + );
578 + };
579 +
580 + function saveAttributes(entityId) {
581 + let attributes = vm.addDeviceFormGroup.get('attributes').value;
582 + let attributesArray = [];
583 + for (let key in attributes) {
584 + attributesArray.push({key: key, value: attributes[key]});
585 + }
586 + if (attributesArray.length > 0) {
587 + return attributeService.saveEntityAttributes(entityId, "SERVER_SCOPE", attributesArray);
588 + } else {
589 + return widgetContext.rxjs.of([]);
590 + }
591 + }
592 +}
593 +{{/code}}
594 +
595 +==== [[image:1730771441589-122.png]] ====
596 +
597 +==== Asset Alarm: ====
598 +
599 +Data:
600 +
601 +[[image:1730771504586-433.png]]
602 +
603 +==== 4.1.2.3、Configure the first layer menu interface ====
604 +
605 +**Map:**
606 +
607 +Data:
608 +
609 +[[image:1730710271230-716.png||height="729" width="1427"]]
610 +
611 +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
612 +
613 +[[image:1730710850458-781.png||height="770" width="1429"]]
614 +
615 +Select supermarket:
616 +
617 +{{code language="none"}}
618 +var params = widgetContext.stateController.getStateParams();
619 +var selectedSupermarket = params['selectedSupermarket'];
620 +if (selectedSupermarket && selectedSupermarket.entityId.id === entityId.id) {
621 + params['selectedSupermarket'] = null;
622 +} else {
623 + params['selectedSupermarket'] = { entityId: entityId, entityName: entityName, entityLabel: entityLabel };
624 +}
625 +widgetContext.stateController.updateState(null, params);
626 +{{/code}}
627 +
628 +[[image:1730710875401-848.png||height="767" width="1429"]]
629 +
630 +Supermarket_detail:
631 +
632 +{{code language="none"}}
633 +var params = JSON.parse(JSON.stringify(widgetContext.stateController.getStateParams()));
634 +params['selectedSupermarket'] = {
635 + entityId: entityId,
636 + entityName: entityName,
637 + entityLabel: entityLabel,
638 +};
639 +params['targetEntityParamName'] = 'selectedSupermarket';
640 +params['selectedDevice'] = null;
641 +
642 +widgetContext.stateController.openState('svgmap', params);
643 +{{/code}}
644 +
645 +[[image:1730710990334-601.png||height="772" width="1433"]]
646 +
647 +* In this demo, exclusive map icons were set as follows:
648 +
649 +{{code language="none"}}
650 +var res = {
651 + url: images[0],
652 + size: 66
653 +};
654 +return res;
655 +{{/code}}
656 +
657 +[[image:1730710395303-672.png||height="771" width="1438"]]
658 +
659 +Asset List:
660 +
661 +
662 +[[image:1730710693066-349.png||height="772" width="1439"]]
663 +
664 +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
665 +
666 +[[image:1730712335338-750.png||height="751" width="1423"]]
667 +
668 +[[image:1730712473941-913.png||height="781" width="1422"]]
669 +
670 +All Alarms:
671 +
672 +[[image:1730712539209-554.png||height="764" width="1424"]]
673 +
143 143  == 4.2 Alarm configuration details ==
144 144  
145 145  == 4.3 Rule chain configuration details ==
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