myio-js-library 0.1.187 → 0.1.188

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10093,18 +10093,22 @@
10093
10093
  <div class="myio-device-comparison-tooltip__main-stats">
10094
10094
  <div class="myio-device-comparison-tooltip__stat-card">
10095
10095
  <div class="myio-device-comparison-tooltip__stat-label">Consumo</div>
10096
- <div class="myio-device-comparison-tooltip__stat-value consumption">${formatConsumption(device.consumption)}</div>
10096
+ <div class="myio-device-comparison-tooltip__stat-value consumption">${formatConsumption(
10097
+ device.consumption
10098
+ )}</div>
10097
10099
  </div>
10098
10100
  <div class="myio-device-comparison-tooltip__stat-card">
10099
10101
  <div class="myio-device-comparison-tooltip__stat-label">Participacao</div>
10100
- <div class="myio-device-comparison-tooltip__stat-value percentage">${formatPercentage(device.percentage)}</div>
10102
+ <div class="myio-device-comparison-tooltip__stat-value percentage">${formatPercentage(
10103
+ device.percentage
10104
+ )}</div>
10101
10105
  </div>
10102
10106
  </div>
10103
10107
 
10104
10108
  <!-- Section: Category Comparison -->
10105
10109
  <div class="myio-device-comparison-tooltip__section-title">
10106
10110
  <span class="myio-device-comparison-tooltip__section-icon">\u{1F4CA}</span>
10107
- Comparacao por Categoria
10111
+ Compara\xE7\xE3o por Tipo
10108
10112
  </div>
10109
10113
  <div class="myio-device-comparison-tooltip__comparison">
10110
10114
  <div class="myio-device-comparison-tooltip__comparison-header">
@@ -10116,21 +10120,30 @@
10116
10120
  </div>
10117
10121
  <div class="myio-device-comparison-tooltip__progress-container">
10118
10122
  <div class="myio-device-comparison-tooltip__progress-bar">
10119
- <div class="myio-device-comparison-tooltip__progress-fill category" style="width: ${Math.min(categoryGroup.devicePercentage, 100)}%"></div>
10123
+ <div class="myio-device-comparison-tooltip__progress-fill category" style="width: ${Math.min(
10124
+ categoryGroup.devicePercentage,
10125
+ 100
10126
+ )}%"></div>
10120
10127
  </div>
10121
10128
  </div>
10122
10129
  <div class="myio-device-comparison-tooltip__comparison-stats">
10123
10130
  <div class="myio-device-comparison-tooltip__comparison-stat">
10124
10131
  <div class="myio-device-comparison-tooltip__comparison-stat-label">Este Device</div>
10125
- <div class="myio-device-comparison-tooltip__comparison-stat-value">${formatConsumption(device.consumption)}</div>
10132
+ <div class="myio-device-comparison-tooltip__comparison-stat-value">${formatConsumption(
10133
+ device.consumption
10134
+ )}</div>
10126
10135
  </div>
10127
10136
  <div class="myio-device-comparison-tooltip__comparison-stat">
10128
10137
  <div class="myio-device-comparison-tooltip__comparison-stat-label">Total Grupo</div>
10129
- <div class="myio-device-comparison-tooltip__comparison-stat-value">${formatConsumption(categoryGroup.totalConsumption)}</div>
10138
+ <div class="myio-device-comparison-tooltip__comparison-stat-value">${formatConsumption(
10139
+ categoryGroup.totalConsumption
10140
+ )}</div>
10130
10141
  </div>
10131
10142
  <div class="myio-device-comparison-tooltip__comparison-stat">
10132
10143
  <div class="myio-device-comparison-tooltip__comparison-stat-label">Participacao</div>
10133
- <div class="myio-device-comparison-tooltip__comparison-stat-value highlight">${formatPercentage(categoryGroup.devicePercentage)}</div>
10144
+ <div class="myio-device-comparison-tooltip__comparison-stat-value highlight">${formatPercentage(
10145
+ categoryGroup.devicePercentage
10146
+ )}</div>
10134
10147
  </div>
10135
10148
  </div>
10136
10149
  </div>
@@ -10138,7 +10151,7 @@
10138
10151
  <!-- Section: Widget Scope Comparison -->
10139
10152
  <div class="myio-device-comparison-tooltip__section-title">
10140
10153
  <span class="myio-device-comparison-tooltip__section-icon">\u{1F3E2}</span>
10141
- Comparacao no Widget
10154
+ Compara\xE7\xE3o no Grupo
10142
10155
  </div>
10143
10156
  <div class="myio-device-comparison-tooltip__comparison">
10144
10157
  <div class="myio-device-comparison-tooltip__comparison-header">
@@ -10150,21 +10163,30 @@
10150
10163
  </div>
10151
10164
  <div class="myio-device-comparison-tooltip__progress-container">
10152
10165
  <div class="myio-device-comparison-tooltip__progress-bar">
10153
- <div class="myio-device-comparison-tooltip__progress-fill widget" style="width: ${Math.min(widgetScope.devicePercentage, 100)}%"></div>
10166
+ <div class="myio-device-comparison-tooltip__progress-fill widget" style="width: ${Math.min(
10167
+ widgetScope.devicePercentage,
10168
+ 100
10169
+ )}%"></div>
10154
10170
  </div>
10155
10171
  </div>
10156
10172
  <div class="myio-device-comparison-tooltip__comparison-stats">
10157
10173
  <div class="myio-device-comparison-tooltip__comparison-stat">
10158
10174
  <div class="myio-device-comparison-tooltip__comparison-stat-label">Este Device</div>
10159
- <div class="myio-device-comparison-tooltip__comparison-stat-value">${formatConsumption(device.consumption)}</div>
10175
+ <div class="myio-device-comparison-tooltip__comparison-stat-value">${formatConsumption(
10176
+ device.consumption
10177
+ )}</div>
10160
10178
  </div>
10161
10179
  <div class="myio-device-comparison-tooltip__comparison-stat">
10162
10180
  <div class="myio-device-comparison-tooltip__comparison-stat-label">Total Widget</div>
10163
- <div class="myio-device-comparison-tooltip__comparison-stat-value">${formatConsumption(widgetScope.totalConsumption)}</div>
10181
+ <div class="myio-device-comparison-tooltip__comparison-stat-value">${formatConsumption(
10182
+ widgetScope.totalConsumption
10183
+ )}</div>
10164
10184
  </div>
10165
10185
  <div class="myio-device-comparison-tooltip__comparison-stat">
10166
10186
  <div class="myio-device-comparison-tooltip__comparison-stat-label">Participacao</div>
10167
- <div class="myio-device-comparison-tooltip__comparison-stat-value highlight">${formatPercentage(widgetScope.devicePercentage)}</div>
10187
+ <div class="myio-device-comparison-tooltip__comparison-stat-value highlight">${formatPercentage(
10188
+ widgetScope.devicePercentage
10189
+ )}</div>
10168
10190
  </div>
10169
10191
  </div>
10170
10192
  </div>
@@ -10172,7 +10194,7 @@
10172
10194
  <!-- Section: Grand Total Comparison -->
10173
10195
  <div class="myio-device-comparison-tooltip__section-title">
10174
10196
  <span class="myio-device-comparison-tooltip__section-icon">\u{1F310}</span>
10175
- Comparacao Total
10197
+ Compara\xE7\xE3o Total
10176
10198
  </div>
10177
10199
  <div class="myio-device-comparison-tooltip__comparison">
10178
10200
  <div class="myio-device-comparison-tooltip__comparison-header">
@@ -10184,21 +10206,30 @@
10184
10206
  </div>
10185
10207
  <div class="myio-device-comparison-tooltip__progress-container">
10186
10208
  <div class="myio-device-comparison-tooltip__progress-bar">
10187
- <div class="myio-device-comparison-tooltip__progress-fill total" style="width: ${Math.min(grandTotal.devicePercentage, 100)}%"></div>
10209
+ <div class="myio-device-comparison-tooltip__progress-fill total" style="width: ${Math.min(
10210
+ grandTotal.devicePercentage,
10211
+ 100
10212
+ )}%"></div>
10188
10213
  </div>
10189
10214
  </div>
10190
10215
  <div class="myio-device-comparison-tooltip__comparison-stats">
10191
10216
  <div class="myio-device-comparison-tooltip__comparison-stat">
10192
10217
  <div class="myio-device-comparison-tooltip__comparison-stat-label">Este Device</div>
10193
- <div class="myio-device-comparison-tooltip__comparison-stat-value">${formatConsumption(device.consumption)}</div>
10218
+ <div class="myio-device-comparison-tooltip__comparison-stat-value">${formatConsumption(
10219
+ device.consumption
10220
+ )}</div>
10194
10221
  </div>
10195
10222
  <div class="myio-device-comparison-tooltip__comparison-stat">
10196
10223
  <div class="myio-device-comparison-tooltip__comparison-stat-label">Total Geral</div>
10197
- <div class="myio-device-comparison-tooltip__comparison-stat-value">${formatConsumption(grandTotal.totalConsumption)}</div>
10224
+ <div class="myio-device-comparison-tooltip__comparison-stat-value">${formatConsumption(
10225
+ grandTotal.totalConsumption
10226
+ )}</div>
10198
10227
  </div>
10199
10228
  <div class="myio-device-comparison-tooltip__comparison-stat">
10200
10229
  <div class="myio-device-comparison-tooltip__comparison-stat-label">Participacao</div>
10201
- <div class="myio-device-comparison-tooltip__comparison-stat-value highlight">${formatPercentage(grandTotal.devicePercentage)}</div>
10230
+ <div class="myio-device-comparison-tooltip__comparison-stat-value highlight">${formatPercentage(
10231
+ grandTotal.devicePercentage
10232
+ )}</div>
10202
10233
  </div>
10203
10234
  </div>
10204
10235
  </div>
@@ -33878,8 +33909,11 @@
33878
33909
  /**
33879
33910
  * Build summary data from TELEMETRY_INFO STATE
33880
33911
  * This is called by the widget controller to get data for the tooltip
33912
+ *
33913
+ * RFC-0105 Enhancement: Now fetches device lists from MyIOOrchestratorData
33914
+ * to populate device lists for status popup display
33881
33915
  */
33882
- buildSummaryFromState(state5, receivedData) {
33916
+ buildSummaryFromState(state5, receivedData, domain = "energy") {
33883
33917
  const summary = {
33884
33918
  totalDevices: 0,
33885
33919
  totalConsumption: 0,
@@ -33891,7 +33925,14 @@
33891
33925
  failure: 0,
33892
33926
  standby: 0,
33893
33927
  offline: 0,
33894
- noConsumption: 0
33928
+ noConsumption: 0,
33929
+ // Device lists - populated from orchestrator data
33930
+ normalDevices: [],
33931
+ alertDevices: [],
33932
+ failureDevices: [],
33933
+ standbyDevices: [],
33934
+ offlineDevices: [],
33935
+ noConsumptionDevices: []
33895
33936
  },
33896
33937
  lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
33897
33938
  };
@@ -34008,38 +34049,106 @@
34008
34049
  summary.byCategory = [entrada, lojas, areaComum];
34009
34050
  summary.totalDevices = entrada.deviceCount + lojas.deviceCount + areaComumDeviceCount;
34010
34051
  summary.totalConsumption = state5.grandTotal || entrada.consumption;
34011
- const totalDevices = summary.totalDevices;
34012
- const statusData = receivedData?.statusCounts || receivedData?.deviceStatus || null;
34013
- if (statusData && typeof statusData === "object") {
34014
- summary.byStatus = {
34015
- normal: statusData.normal || 0,
34016
- alert: statusData.alert || 0,
34017
- failure: statusData.failure || 0,
34018
- standby: statusData.standby || 0,
34019
- offline: statusData.offline || 0,
34020
- noConsumption: statusData.noConsumption || statusData.zeroConsumption || 0
34021
- };
34052
+ const statusAggregation = this._aggregateDeviceStatusFromOrchestrator(domain);
34053
+ if (statusAggregation.hasData) {
34054
+ summary.byStatus = statusAggregation.byStatus;
34022
34055
  } else {
34023
- summary.byStatus = {
34024
- normal: Math.floor(totalDevices * 0.75),
34025
- // Estimate 75% normal (with consumption)
34026
- alert: Math.floor(totalDevices * 0.06),
34027
- // Estimate 6% alert
34028
- failure: Math.floor(totalDevices * 0.02),
34029
- // Estimate 2% failure
34030
- standby: Math.floor(totalDevices * 0.02),
34031
- // Estimate 2% standby
34032
- offline: Math.floor(totalDevices * 0.03),
34033
- // Estimate 3% offline
34034
- noConsumption: Math.floor(totalDevices * 0.12)
34035
- // Estimate 12% sem consumo
34036
- };
34037
- }
34038
- const statusSum = Object.values(summary.byStatus).reduce((a, b) => a + b, 0);
34039
- if (statusSum !== totalDevices && totalDevices > 0) {
34040
- summary.byStatus.normal += totalDevices - statusSum;
34056
+ const totalDevices = summary.totalDevices;
34057
+ const statusData = receivedData?.statusCounts || receivedData?.deviceStatus || null;
34058
+ if (statusData && typeof statusData === "object") {
34059
+ summary.byStatus = {
34060
+ normal: statusData.normal || 0,
34061
+ alert: statusData.alert || 0,
34062
+ failure: statusData.failure || 0,
34063
+ standby: statusData.standby || 0,
34064
+ offline: statusData.offline || 0,
34065
+ noConsumption: statusData.noConsumption || statusData.zeroConsumption || 0
34066
+ };
34067
+ } else {
34068
+ summary.byStatus = {
34069
+ normal: Math.floor(totalDevices * 0.75),
34070
+ alert: Math.floor(totalDevices * 0.06),
34071
+ failure: Math.floor(totalDevices * 0.02),
34072
+ standby: Math.floor(totalDevices * 0.02),
34073
+ offline: Math.floor(totalDevices * 0.03),
34074
+ noConsumption: Math.floor(totalDevices * 0.12)
34075
+ };
34076
+ const statusSum = Object.values(summary.byStatus).reduce((a, b) => {
34077
+ return typeof b === "number" ? a + b : a;
34078
+ }, 0);
34079
+ if (statusSum !== totalDevices && totalDevices > 0) {
34080
+ summary.byStatus.normal += totalDevices - statusSum;
34081
+ }
34082
+ }
34041
34083
  }
34042
34084
  return summary;
34085
+ },
34086
+ /**
34087
+ * RFC-0105: Aggregate device status from MyIOOrchestratorData
34088
+ * Iterates through all orchestrator items and groups devices by status
34089
+ * Returns both counts and device lists
34090
+ */
34091
+ _aggregateDeviceStatusFromOrchestrator(domain = "energy") {
34092
+ const result = {
34093
+ normal: 0,
34094
+ alert: 0,
34095
+ failure: 0,
34096
+ standby: 0,
34097
+ offline: 0,
34098
+ noConsumption: 0,
34099
+ normalDevices: [],
34100
+ alertDevices: [],
34101
+ failureDevices: [],
34102
+ standbyDevices: [],
34103
+ offlineDevices: [],
34104
+ noConsumptionDevices: []
34105
+ };
34106
+ const win = typeof window !== "undefined" ? window : null;
34107
+ if (!win) return { hasData: false, byStatus: result };
34108
+ const orchestratorData = win.MyIOOrchestratorData || win.parent?.MyIOOrchestratorData;
34109
+ if (!orchestratorData || !orchestratorData[domain]) {
34110
+ return { hasData: false, byStatus: result };
34111
+ }
34112
+ const domainData = orchestratorData[domain];
34113
+ const items = domainData.items || [];
34114
+ if (!items || items.length === 0) {
34115
+ return { hasData: false, byStatus: result };
34116
+ }
34117
+ const NO_CONSUMPTION_THRESHOLD = 0.01;
34118
+ const statusMapping = {
34119
+ "power_on": "normal",
34120
+ "warning": "alert",
34121
+ "failure": "failure",
34122
+ "standby": "standby",
34123
+ "power_off": "offline",
34124
+ "maintenance": "offline",
34125
+ "no_info": "offline",
34126
+ "not_installed": "offline",
34127
+ "offline": "offline"
34128
+ };
34129
+ items.forEach((item) => {
34130
+ const deviceInfo = {
34131
+ id: item.id || item.deviceId || "",
34132
+ label: item.label || item.entityLabel || item.name || item.deviceIdentifier || "",
34133
+ name: item.name || item.entityLabel || ""
34134
+ };
34135
+ const deviceStatus = item.deviceStatus || "no_info";
34136
+ const value = Number(item.value || item.val || 0);
34137
+ const isOnline = !["no_info", "offline", "not_installed", "maintenance", "power_off"].includes(deviceStatus);
34138
+ if (isOnline && Math.abs(value) < NO_CONSUMPTION_THRESHOLD) {
34139
+ result.noConsumption++;
34140
+ result.noConsumptionDevices?.push(deviceInfo);
34141
+ return;
34142
+ }
34143
+ const mappedStatus = statusMapping[deviceStatus] || "offline";
34144
+ result[mappedStatus]++;
34145
+ const deviceListKey = `${mappedStatus}Devices`;
34146
+ const deviceList = result[deviceListKey];
34147
+ if (deviceList) {
34148
+ deviceList.push(deviceInfo);
34149
+ }
34150
+ });
34151
+ return { hasData: true, byStatus: result };
34043
34152
  }
34044
34153
  };
34045
34154
 
@@ -35197,8 +35306,11 @@
35197
35306
  /**
35198
35307
  * Build summary data from TELEMETRY_INFO STATE_WATER
35199
35308
  * This is called by the widget controller to get data for the tooltip
35309
+ *
35310
+ * RFC-0105 Enhancement: Now fetches device lists from MyIOOrchestratorData
35311
+ * to populate device lists for status popup display
35200
35312
  */
35201
- buildSummaryFromState(state5, receivedData, includeBathrooms = false) {
35313
+ buildSummaryFromState(state5, receivedData, includeBathrooms = false, domain = "water") {
35202
35314
  const summary = {
35203
35315
  totalDevices: 0,
35204
35316
  totalConsumption: 0,
@@ -35210,7 +35322,14 @@
35210
35322
  failure: 0,
35211
35323
  standby: 0,
35212
35324
  offline: 0,
35213
- noConsumption: 0
35325
+ noConsumption: 0,
35326
+ // Device lists - populated from orchestrator data
35327
+ normalDevices: [],
35328
+ alertDevices: [],
35329
+ failureDevices: [],
35330
+ standbyDevices: [],
35331
+ offlineDevices: [],
35332
+ noConsumptionDevices: []
35214
35333
  },
35215
35334
  lastUpdated: (/* @__PURE__ */ new Date()).toISOString(),
35216
35335
  includeBathrooms
@@ -35266,32 +35385,106 @@
35266
35385
  }
35267
35386
  summary.totalDevices = summary.byCategory.reduce((sum, cat) => sum + cat.deviceCount, 0);
35268
35387
  summary.totalConsumption = state5.entrada?.total || 0;
35269
- const totalDevices = summary.totalDevices;
35270
- const statusData = receivedData?.statusCounts || receivedData?.deviceStatus || null;
35271
- if (statusData && typeof statusData === "object") {
35272
- summary.byStatus = {
35273
- normal: statusData.normal || 0,
35274
- alert: statusData.alert || 0,
35275
- failure: statusData.failure || 0,
35276
- standby: statusData.standby || 0,
35277
- offline: statusData.offline || 0,
35278
- noConsumption: statusData.noConsumption || statusData.zeroConsumption || 0
35279
- };
35388
+ const statusAggregation = this._aggregateDeviceStatusFromOrchestrator(domain);
35389
+ if (statusAggregation.hasData) {
35390
+ summary.byStatus = statusAggregation.byStatus;
35280
35391
  } else {
35281
- summary.byStatus = {
35282
- normal: Math.floor(totalDevices * 0.8),
35283
- alert: Math.floor(totalDevices * 0.05),
35284
- failure: Math.floor(totalDevices * 0.02),
35285
- standby: Math.floor(totalDevices * 0.02),
35286
- offline: Math.floor(totalDevices * 0.03),
35287
- noConsumption: Math.floor(totalDevices * 0.08)
35288
- };
35289
- }
35290
- const statusSum = Object.values(summary.byStatus).reduce((a, b) => a + b, 0);
35291
- if (statusSum !== totalDevices && totalDevices > 0) {
35292
- summary.byStatus.normal += totalDevices - statusSum;
35392
+ const totalDevices = summary.totalDevices;
35393
+ const statusData = receivedData?.statusCounts || receivedData?.deviceStatus || null;
35394
+ if (statusData && typeof statusData === "object") {
35395
+ summary.byStatus = {
35396
+ normal: statusData.normal || 0,
35397
+ alert: statusData.alert || 0,
35398
+ failure: statusData.failure || 0,
35399
+ standby: statusData.standby || 0,
35400
+ offline: statusData.offline || 0,
35401
+ noConsumption: statusData.noConsumption || statusData.zeroConsumption || 0
35402
+ };
35403
+ } else {
35404
+ summary.byStatus = {
35405
+ normal: Math.floor(totalDevices * 0.8),
35406
+ alert: Math.floor(totalDevices * 0.05),
35407
+ failure: Math.floor(totalDevices * 0.02),
35408
+ standby: Math.floor(totalDevices * 0.02),
35409
+ offline: Math.floor(totalDevices * 0.03),
35410
+ noConsumption: Math.floor(totalDevices * 0.08)
35411
+ };
35412
+ const statusSum = Object.values(summary.byStatus).reduce((a, b) => {
35413
+ return typeof b === "number" ? a + b : a;
35414
+ }, 0);
35415
+ if (statusSum !== totalDevices && totalDevices > 0) {
35416
+ summary.byStatus.normal += totalDevices - statusSum;
35417
+ }
35418
+ }
35293
35419
  }
35294
35420
  return summary;
35421
+ },
35422
+ /**
35423
+ * RFC-0105: Aggregate device status from MyIOOrchestratorData
35424
+ * Iterates through all orchestrator items and groups devices by status
35425
+ * Returns both counts and device lists
35426
+ */
35427
+ _aggregateDeviceStatusFromOrchestrator(domain = "water") {
35428
+ const result = {
35429
+ normal: 0,
35430
+ alert: 0,
35431
+ failure: 0,
35432
+ standby: 0,
35433
+ offline: 0,
35434
+ noConsumption: 0,
35435
+ normalDevices: [],
35436
+ alertDevices: [],
35437
+ failureDevices: [],
35438
+ standbyDevices: [],
35439
+ offlineDevices: [],
35440
+ noConsumptionDevices: []
35441
+ };
35442
+ const win = typeof window !== "undefined" ? window : null;
35443
+ if (!win) return { hasData: false, byStatus: result };
35444
+ const orchestratorData = win.MyIOOrchestratorData || win.parent?.MyIOOrchestratorData;
35445
+ if (!orchestratorData || !orchestratorData[domain]) {
35446
+ return { hasData: false, byStatus: result };
35447
+ }
35448
+ const domainData = orchestratorData[domain];
35449
+ const items = domainData.items || [];
35450
+ if (!items || items.length === 0) {
35451
+ return { hasData: false, byStatus: result };
35452
+ }
35453
+ const NO_CONSUMPTION_THRESHOLD = 1e-3;
35454
+ const statusMapping = {
35455
+ "power_on": "normal",
35456
+ "warning": "alert",
35457
+ "failure": "failure",
35458
+ "standby": "standby",
35459
+ "power_off": "offline",
35460
+ "maintenance": "offline",
35461
+ "no_info": "offline",
35462
+ "not_installed": "offline",
35463
+ "offline": "offline"
35464
+ };
35465
+ items.forEach((item) => {
35466
+ const deviceInfo = {
35467
+ id: item.id || item.deviceId || "",
35468
+ label: item.label || item.entityLabel || item.name || item.deviceIdentifier || "",
35469
+ name: item.name || item.entityLabel || ""
35470
+ };
35471
+ const deviceStatus = item.deviceStatus || "no_info";
35472
+ const value = Number(item.value || item.val || 0);
35473
+ const isOnline = !["no_info", "offline", "not_installed", "maintenance", "power_off"].includes(deviceStatus);
35474
+ if (isOnline && Math.abs(value) < NO_CONSUMPTION_THRESHOLD) {
35475
+ result.noConsumption++;
35476
+ result.noConsumptionDevices?.push(deviceInfo);
35477
+ return;
35478
+ }
35479
+ const mappedStatus = statusMapping[deviceStatus] || "offline";
35480
+ result[mappedStatus]++;
35481
+ const deviceListKey = `${mappedStatus}Devices`;
35482
+ const deviceList = result[deviceListKey];
35483
+ if (deviceList) {
35484
+ deviceList.push(deviceInfo);
35485
+ }
35486
+ });
35487
+ return { hasData: true, byStatus: result };
35295
35488
  }
35296
35489
  };
35297
35490