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.
- package/dist/index.cjs +266 -73
- package/dist/index.d.cts +26 -2
- package/dist/index.js +266 -73
- package/dist/myio-js-library.umd.js +266 -73
- package/dist/myio-js-library.umd.min.js +1 -1
- package/package.json +1 -1
|
@@ -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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
34012
|
-
|
|
34013
|
-
|
|
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
|
-
|
|
34024
|
-
|
|
34025
|
-
|
|
34026
|
-
|
|
34027
|
-
|
|
34028
|
-
|
|
34029
|
-
|
|
34030
|
-
|
|
34031
|
-
|
|
34032
|
-
|
|
34033
|
-
|
|
34034
|
-
|
|
34035
|
-
|
|
34036
|
-
|
|
34037
|
-
|
|
34038
|
-
|
|
34039
|
-
|
|
34040
|
-
|
|
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
|
|
35270
|
-
|
|
35271
|
-
|
|
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
|
-
|
|
35282
|
-
|
|
35283
|
-
|
|
35284
|
-
|
|
35285
|
-
|
|
35286
|
-
|
|
35287
|
-
|
|
35288
|
-
|
|
35289
|
-
|
|
35290
|
-
|
|
35291
|
-
|
|
35292
|
-
|
|
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
|
|