myio-js-library 0.1.321 → 0.1.323
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 +34 -46
- package/dist/index.d.cts +17 -30
- package/dist/index.js +34 -46
- package/dist/myio-js-library.umd.js +34 -46
- package/dist/myio-js-library.umd.min.js +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1775,8 +1775,8 @@ function normalizeConnectionStatus(rawStatus) {
|
|
|
1775
1775
|
}
|
|
1776
1776
|
return "offline";
|
|
1777
1777
|
}
|
|
1778
|
-
function isTelemetryStale(telemetryTimestamp,
|
|
1779
|
-
const timestamp = telemetryTimestamp && telemetryTimestamp > 0 ? telemetryTimestamp :
|
|
1778
|
+
function isTelemetryStale(telemetryTimestamp, delayMins) {
|
|
1779
|
+
const timestamp = telemetryTimestamp && telemetryTimestamp > 0 ? telemetryTimestamp : null;
|
|
1780
1780
|
if (!timestamp) {
|
|
1781
1781
|
return false;
|
|
1782
1782
|
}
|
|
@@ -1786,12 +1786,8 @@ function isTelemetryStale(telemetryTimestamp, lastActivityTime = null, delayMins
|
|
|
1786
1786
|
const timeSinceUpdate = now.getTime() - lastUpdate.getTime();
|
|
1787
1787
|
return timeSinceUpdate > delayMs;
|
|
1788
1788
|
}
|
|
1789
|
-
function isConnectionStale({
|
|
1790
|
-
connectionStatusTs
|
|
1791
|
-
lastActivityTime = null,
|
|
1792
|
-
delayTimeConnectionInMins = 1440
|
|
1793
|
-
} = {}) {
|
|
1794
|
-
return isTelemetryStale(connectionStatusTs, lastActivityTime, delayTimeConnectionInMins);
|
|
1789
|
+
function isConnectionStale({ connectionStatusTs = null, delayTimeConnectionInMins } = {}) {
|
|
1790
|
+
return isTelemetryStale(connectionStatusTs, delayTimeConnectionInMins);
|
|
1795
1791
|
}
|
|
1796
1792
|
function mapDeviceStatusToCardStatus(deviceStatus) {
|
|
1797
1793
|
const statusMap = {
|
|
@@ -1857,41 +1853,33 @@ function calculateDeviceStatus({
|
|
|
1857
1853
|
domain = "energy",
|
|
1858
1854
|
telemetryValue = null,
|
|
1859
1855
|
telemetryTimestamp = null,
|
|
1860
|
-
//
|
|
1861
|
-
lastActivityTime = null,
|
|
1862
|
-
// v3: NOT USED as fallback anymore
|
|
1856
|
+
// MUST be domain-specific (consumptionTs, pulsesTs, etc.)
|
|
1863
1857
|
ranges = null,
|
|
1864
1858
|
// RFC-0110 v2: Dual threshold configuration
|
|
1865
|
-
delayTimeConnectionInMins
|
|
1866
|
-
// For 'online' status
|
|
1867
|
-
shortDelayMins
|
|
1868
|
-
// For 'offline'/'bad' status
|
|
1859
|
+
delayTimeConnectionInMins,
|
|
1860
|
+
// For 'online' status
|
|
1861
|
+
shortDelayMins,
|
|
1862
|
+
// For 'offline'/'bad' status
|
|
1869
1863
|
// Legacy parameters (backward compatibility)
|
|
1870
1864
|
lastConsumptionValue = null,
|
|
1871
1865
|
limitOfPowerOnStandByWatts = null,
|
|
1872
1866
|
limitOfPowerOnAlertWatts = null,
|
|
1873
|
-
limitOfPowerOnFailureWatts = null
|
|
1874
|
-
// @deprecated - kept for backward compatibility
|
|
1875
|
-
lastConnectTime = null,
|
|
1876
|
-
lastDisconnectTime = null
|
|
1867
|
+
limitOfPowerOnFailureWatts = null
|
|
1877
1868
|
}) {
|
|
1878
1869
|
const normalizedStatus = normalizeConnectionStatus(connectionStatus);
|
|
1879
1870
|
if (normalizedStatus === "waiting") {
|
|
1880
1871
|
return DeviceStatusType.NOT_INSTALLED;
|
|
1881
1872
|
}
|
|
1882
1873
|
const hasTelemetryTs = telemetryTimestamp !== null && telemetryTimestamp !== void 0 && telemetryTimestamp > 0;
|
|
1883
|
-
const hasLastActivityTime = lastActivityTime !== null && lastActivityTime !== void 0 && lastActivityTime > 0;
|
|
1884
|
-
const effectiveTimestampForRecovery = hasTelemetryTs ? telemetryTimestamp : hasLastActivityTime ? lastActivityTime : null;
|
|
1885
|
-
const hasEffectiveTimestampForRecovery = effectiveTimestampForRecovery !== null;
|
|
1886
1874
|
if (normalizedStatus === "bad") {
|
|
1887
|
-
const hasRecentTelemetry =
|
|
1875
|
+
const hasRecentTelemetry = hasTelemetryTs && !isTelemetryStale(telemetryTimestamp, shortDelayMins);
|
|
1888
1876
|
if (hasRecentTelemetry) {
|
|
1889
1877
|
} else {
|
|
1890
1878
|
return DeviceStatusType.WEAK_CONNECTION;
|
|
1891
1879
|
}
|
|
1892
1880
|
}
|
|
1893
1881
|
if (normalizedStatus === "offline") {
|
|
1894
|
-
const hasRecentTelemetry =
|
|
1882
|
+
const hasRecentTelemetry = hasTelemetryTs && !isTelemetryStale(telemetryTimestamp, shortDelayMins);
|
|
1895
1883
|
if (!hasRecentTelemetry) {
|
|
1896
1884
|
return DeviceStatusType.OFFLINE;
|
|
1897
1885
|
}
|
|
@@ -1900,7 +1888,7 @@ function calculateDeviceStatus({
|
|
|
1900
1888
|
if (!hasTelemetryTs) {
|
|
1901
1889
|
return DeviceStatusType.OFFLINE;
|
|
1902
1890
|
}
|
|
1903
|
-
const telemetryStale = isTelemetryStale(telemetryTimestamp,
|
|
1891
|
+
const telemetryStale = isTelemetryStale(telemetryTimestamp, delayTimeConnectionInMins);
|
|
1904
1892
|
if (telemetryStale) {
|
|
1905
1893
|
return DeviceStatusType.OFFLINE;
|
|
1906
1894
|
}
|
|
@@ -1953,31 +1941,19 @@ function calculateDeviceStatusWithRanges({
|
|
|
1953
1941
|
ranges,
|
|
1954
1942
|
// RFC-0110: New parameters
|
|
1955
1943
|
telemetryTimestamp = null,
|
|
1956
|
-
|
|
1957
|
-
delayTimeConnectionInMins = 1440,
|
|
1958
|
-
// @deprecated - kept for backward compatibility
|
|
1959
|
-
lastConnectTime = null,
|
|
1960
|
-
lastDisconnectTime = null
|
|
1944
|
+
delayTimeConnectionInMins
|
|
1961
1945
|
}) {
|
|
1962
1946
|
return calculateDeviceStatus({
|
|
1963
1947
|
connectionStatus,
|
|
1964
1948
|
domain: "energy",
|
|
1965
1949
|
telemetryValue: lastConsumptionValue,
|
|
1966
|
-
telemetryTimestamp
|
|
1967
|
-
lastActivityTime,
|
|
1950
|
+
telemetryTimestamp,
|
|
1968
1951
|
ranges,
|
|
1969
1952
|
delayTimeConnectionInMins
|
|
1970
1953
|
});
|
|
1971
1954
|
}
|
|
1972
1955
|
function calculateDeviceStatusMasterRules(options = {}) {
|
|
1973
|
-
const {
|
|
1974
|
-
connectionStatus = "",
|
|
1975
|
-
telemetryTimestamp = null,
|
|
1976
|
-
delayMins = 1440,
|
|
1977
|
-
// 24h for online status
|
|
1978
|
-
domain = "energy"
|
|
1979
|
-
} = options;
|
|
1980
|
-
const SHORT_DELAY_MINS = 60;
|
|
1956
|
+
const { connectionStatus, telemetryTimestamp = null, delayMins, domain, SHORT_DELAY_MINS } = options;
|
|
1981
1957
|
const now = Date.now();
|
|
1982
1958
|
const normalizedStatus = (connectionStatus || "").toLowerCase().trim();
|
|
1983
1959
|
if (normalizedStatus === "waiting" || normalizedStatus === "connecting" || normalizedStatus === "pending") {
|
|
@@ -2132,9 +2108,6 @@ function createDeviceItem(entityId, meta, options = {}) {
|
|
|
2132
2108
|
domain: "energy",
|
|
2133
2109
|
telemetryValue: consumptionValue,
|
|
2134
2110
|
telemetryTimestamp: telemetryTs,
|
|
2135
|
-
// v3: MUST be consumptionTs, NOT lastActivityTime
|
|
2136
|
-
lastActivityTime: null,
|
|
2137
|
-
// v3: NOT used as fallback
|
|
2138
2111
|
ranges,
|
|
2139
2112
|
delayTimeConnectionInMins
|
|
2140
2113
|
});
|
|
@@ -2145,8 +2118,8 @@ function createDeviceItem(entityId, meta, options = {}) {
|
|
|
2145
2118
|
deviceStatus = DeviceStatusType.OFFLINE;
|
|
2146
2119
|
} else {
|
|
2147
2120
|
const SHORT_DELAY_MINS = 60;
|
|
2148
|
-
const hasRecentTelemetry = !isTelemetryStale(telemetryTs,
|
|
2149
|
-
const staleTelemetryLong = isTelemetryStale(telemetryTs,
|
|
2121
|
+
const hasRecentTelemetry = !isTelemetryStale(telemetryTs, SHORT_DELAY_MINS);
|
|
2122
|
+
const staleTelemetryLong = isTelemetryStale(telemetryTs, delayTimeConnectionInMins);
|
|
2150
2123
|
if (connectionStatus === "bad") {
|
|
2151
2124
|
deviceStatus = hasRecentTelemetry ? DeviceStatusType.POWER_ON : DeviceStatusType.WEAK_CONNECTION;
|
|
2152
2125
|
} else if (connectionStatus === "offline") {
|
|
@@ -50833,7 +50806,22 @@ function createConsumption7DaysChart(config) {
|
|
|
50833
50806
|
"#65a30d",
|
|
50834
50807
|
"#d97706",
|
|
50835
50808
|
"#be185d",
|
|
50836
|
-
"#0d9488"
|
|
50809
|
+
"#0d9488",
|
|
50810
|
+
"#7c3aed",
|
|
50811
|
+
"#059669",
|
|
50812
|
+
"#db2777",
|
|
50813
|
+
"#9333ea",
|
|
50814
|
+
"#0284c7",
|
|
50815
|
+
"#ca8a04",
|
|
50816
|
+
"#4f46e5",
|
|
50817
|
+
"#c026d3",
|
|
50818
|
+
"#14b8a6",
|
|
50819
|
+
"#f97316",
|
|
50820
|
+
"#6366f1",
|
|
50821
|
+
"#84cc16",
|
|
50822
|
+
"#ec4899",
|
|
50823
|
+
"#06b6d4",
|
|
50824
|
+
"#a855f7"
|
|
50837
50825
|
];
|
|
50838
50826
|
datasets = Object.entries(data.shoppingData).map(([shoppingId, values], index) => ({
|
|
50839
50827
|
label: data.shoppingNames?.[shoppingId] || shoppingId,
|
package/dist/index.d.cts
CHANGED
|
@@ -535,20 +535,19 @@ declare function normalizeConnectionStatus(rawStatus: string | boolean): "online
|
|
|
535
535
|
* device is offline. Telemetry (consumption/pulses/temperature) only updates when
|
|
536
536
|
* the device actually sends data, making it a reliable indicator of activity.
|
|
537
537
|
*
|
|
538
|
-
* @param {number|Date|null} telemetryTimestamp -
|
|
539
|
-
* @param {number
|
|
540
|
-
* @param {number} [delayMins=1440] - Threshold in minutes (default: 24 hours)
|
|
538
|
+
* @param {number|Date|null} telemetryTimestamp - Timestamp from telemetry data
|
|
539
|
+
* @param {number} [delayMins] - Threshold in minutes
|
|
541
540
|
* @returns {boolean} true if telemetry is stale (device should be considered offline)
|
|
542
541
|
*
|
|
543
542
|
* @example
|
|
544
543
|
* // Recent telemetry (30 min ago) → not stale
|
|
545
|
-
* isTelemetryStale(Date.now() - 30 * 60 * 1000,
|
|
544
|
+
* isTelemetryStale(Date.now() - 30 * 60 * 1000, 1440); // false
|
|
546
545
|
*
|
|
547
546
|
* @example
|
|
548
547
|
* // Old telemetry (25 hours ago) → stale
|
|
549
|
-
* isTelemetryStale(Date.now() - 25 * 60 * 60 * 1000,
|
|
548
|
+
* isTelemetryStale(Date.now() - 25 * 60 * 60 * 1000, 1440); // true
|
|
550
549
|
*/
|
|
551
|
-
declare function isTelemetryStale(telemetryTimestamp: number | Date | null,
|
|
550
|
+
declare function isTelemetryStale(telemetryTimestamp: number | Date | null, delayMins?: number): boolean;
|
|
552
551
|
/**
|
|
553
552
|
* @deprecated Use isTelemetryStale() instead. This function is kept for backward compatibility.
|
|
554
553
|
*
|
|
@@ -557,13 +556,11 @@ declare function isTelemetryStale(telemetryTimestamp: number | Date | null, last
|
|
|
557
556
|
*
|
|
558
557
|
* @param {Object} params
|
|
559
558
|
* @param {number|Date|null} params.connectionStatusTs - Timestamp do connectionStatus do ThingsBoard
|
|
560
|
-
* @param {number
|
|
561
|
-
* @param {number} [params.delayTimeConnectionInMins=1440] - Tempo em minutos para considerar conexão obsoleta
|
|
559
|
+
* @param {number} [params.delayTimeConnectionInMins] - Tempo em minutos para considerar conexão obsoleta
|
|
562
560
|
* @returns {boolean} true se conexão está obsoleta (deve ser considerado offline)
|
|
563
561
|
*/
|
|
564
|
-
declare function isConnectionStale({ connectionStatusTs,
|
|
562
|
+
declare function isConnectionStale({ connectionStatusTs, delayTimeConnectionInMins }?: {
|
|
565
563
|
connectionStatusTs: number | Date | null;
|
|
566
|
-
lastActivityTime: number | Date | null;
|
|
567
564
|
delayTimeConnectionInMins?: number;
|
|
568
565
|
}): boolean;
|
|
569
566
|
/**
|
|
@@ -625,11 +622,11 @@ declare function isValidConnectionStatus(status: string): boolean;
|
|
|
625
622
|
*/
|
|
626
623
|
declare function getDeviceStatusInfo(deviceStatus: string): any;
|
|
627
624
|
/**
|
|
628
|
-
* RFC-0110 v5: Unified device status calculation based on telemetry timestamps
|
|
625
|
+
* RFC-0110 v5: Unified device status calculation based on telemetry timestamps.
|
|
629
626
|
*
|
|
630
627
|
* This function determines device status using:
|
|
631
628
|
* 1. connectionStatus for immediate states (waiting)
|
|
632
|
-
* 2. telemetryTimestamp (domain-specific)
|
|
629
|
+
* 2. telemetryTimestamp (domain-specific)
|
|
633
630
|
* 3. Dual threshold for stale/offline detection
|
|
634
631
|
* 4. telemetryValue for operational status (standby, power_on, warning, failure)
|
|
635
632
|
*
|
|
@@ -637,23 +634,18 @@ declare function getDeviceStatusInfo(deviceStatus: string): any;
|
|
|
637
634
|
* - WAITING → NOT_INSTALLED (absolute, no discussion)
|
|
638
635
|
* - BAD + recent telemetry (< 60 mins) → POWER_ON, else WEAK_CONNECTION
|
|
639
636
|
* - OFFLINE + recent telemetry (< 60 mins) → POWER_ON, else OFFLINE
|
|
640
|
-
* - ONLINE + no
|
|
637
|
+
* - ONLINE + no telemetry timestamp → OFFLINE
|
|
641
638
|
* - ONLINE + stale (> 24h) → OFFLINE
|
|
642
639
|
* - ONLINE + fresh (< 24h) → continue to value-based calculation
|
|
643
640
|
*
|
|
644
|
-
* Timestamp priority:
|
|
645
|
-
* 1. telemetryTimestamp (domain-specific: consumptionTs, pulsesTs, etc.)
|
|
646
|
-
* 2. lastActivityTime (fallback when no domain telemetry)
|
|
647
|
-
*
|
|
648
641
|
* @param {Object} params - Configuration object
|
|
649
642
|
* @param {string} params.connectionStatus - Connection status: "waiting", "offline", "bad", or "online"
|
|
650
643
|
* @param {string} [params.domain='energy'] - Device domain: 'energy', 'water', or 'temperature'
|
|
651
644
|
* @param {number|null} [params.telemetryValue] - Telemetry value (consumption/pulses/temperature)
|
|
652
645
|
* @param {number|null} [params.telemetryTimestamp] - Unix timestamp (ms) of domain-specific telemetry
|
|
653
|
-
* @param {number|null} [params.lastActivityTime] - Fallback timestamp when no domain telemetry
|
|
654
646
|
* @param {Object} [params.ranges] - Consumption ranges for status calculation
|
|
655
|
-
* @param {number} [params.delayTimeConnectionInMins
|
|
656
|
-
* @param {number} [params.shortDelayMins
|
|
647
|
+
* @param {number} [params.delayTimeConnectionInMins] - Long threshold for 'online' status
|
|
648
|
+
* @param {number} [params.shortDelayMins] - Short threshold for 'offline'/'bad' status
|
|
657
649
|
* @param {number|null} [params.lastConsumptionValue] - @deprecated Use telemetryValue instead
|
|
658
650
|
* @param {number} [params.limitOfPowerOnStandByWatts] - @deprecated Use ranges instead
|
|
659
651
|
* @param {number} [params.limitOfPowerOnAlertWatts] - @deprecated Use ranges instead
|
|
@@ -661,23 +653,20 @@ declare function getDeviceStatusInfo(deviceStatus: string): any;
|
|
|
661
653
|
* @returns {string} Device status from DeviceStatusType enum
|
|
662
654
|
*
|
|
663
655
|
* @example
|
|
664
|
-
* // RFC-0110 v5: With domain telemetry
|
|
665
656
|
* calculateDeviceStatus({
|
|
666
657
|
* connectionStatus: "online",
|
|
667
658
|
* domain: "energy",
|
|
668
659
|
* telemetryValue: 500,
|
|
669
|
-
* telemetryTimestamp: consumptionTs,
|
|
670
|
-
* lastActivityTime: lastActivityTime, // Fallback if consumptionTs is null
|
|
660
|
+
* telemetryTimestamp: consumptionTs,
|
|
671
661
|
* ranges: { ... },
|
|
672
662
|
* delayTimeConnectionInMins: 1440
|
|
673
663
|
* }); // Returns "power_on" if fresh telemetry, "offline" if stale/missing
|
|
674
664
|
*/
|
|
675
|
-
declare function calculateDeviceStatus({ connectionStatus, domain, telemetryValue, telemetryTimestamp,
|
|
665
|
+
declare function calculateDeviceStatus({ connectionStatus, domain, telemetryValue, telemetryTimestamp, ranges, delayTimeConnectionInMins, shortDelayMins, lastConsumptionValue, limitOfPowerOnStandByWatts, limitOfPowerOnAlertWatts, limitOfPowerOnFailureWatts, }: {
|
|
676
666
|
connectionStatus: string;
|
|
677
667
|
domain?: string;
|
|
678
668
|
telemetryValue?: number | null;
|
|
679
669
|
telemetryTimestamp?: number | null;
|
|
680
|
-
lastActivityTime?: number | null;
|
|
681
670
|
ranges?: any;
|
|
682
671
|
delayTimeConnectionInMins?: number;
|
|
683
672
|
shortDelayMins?: number;
|
|
@@ -696,16 +685,14 @@ declare function calculateDeviceStatus({ connectionStatus, domain, telemetryValu
|
|
|
696
685
|
* @param {number|null} params.lastConsumptionValue - Last power consumption value in watts
|
|
697
686
|
* @param {Object} params.ranges - Consumption ranges object
|
|
698
687
|
* @param {number|null} [params.telemetryTimestamp] - RFC-0110: Timestamp of telemetry
|
|
699
|
-
* @param {number
|
|
700
|
-
* @param {number} [params.delayTimeConnectionInMins=1440] - RFC-0110: Stale threshold (default 24h)
|
|
688
|
+
* @param {number} [params.delayTimeConnectionInMins] - RFC-0110: Stale threshold
|
|
701
689
|
* @returns {string} Device status from DeviceStatusType enum
|
|
702
690
|
*/
|
|
703
|
-
declare function calculateDeviceStatusWithRanges({ connectionStatus, lastConsumptionValue, ranges, telemetryTimestamp,
|
|
691
|
+
declare function calculateDeviceStatusWithRanges({ connectionStatus, lastConsumptionValue, ranges, telemetryTimestamp, delayTimeConnectionInMins, }: {
|
|
704
692
|
connectionStatus: string;
|
|
705
693
|
lastConsumptionValue: number | null;
|
|
706
694
|
ranges: any;
|
|
707
695
|
telemetryTimestamp?: number | null;
|
|
708
|
-
lastActivityTime?: number | null;
|
|
709
696
|
delayTimeConnectionInMins?: number;
|
|
710
697
|
}): string;
|
|
711
698
|
/**
|
|
@@ -725,7 +712,7 @@ declare function calculateDeviceStatusWithRanges({ connectionStatus, lastConsump
|
|
|
725
712
|
* @param {Object} options - Configuration object
|
|
726
713
|
* @param {string} [options.connectionStatus=''] - Connection status from ThingsBoard
|
|
727
714
|
* @param {number|null} [options.telemetryTimestamp=null] - Domain-specific telemetry timestamp (ms)
|
|
728
|
-
* @param {number} [options.delayMins
|
|
715
|
+
* @param {number} [options.delayMins] - Long threshold in minutes
|
|
729
716
|
* @param {string} [options.domain='energy'] - Device domain (for logging/debug)
|
|
730
717
|
* @returns {string} Device status: 'not_installed', 'offline', 'power_on', or 'weak_connection'
|
|
731
718
|
*
|
package/dist/index.js
CHANGED
|
@@ -1499,8 +1499,8 @@ function normalizeConnectionStatus(rawStatus) {
|
|
|
1499
1499
|
}
|
|
1500
1500
|
return "offline";
|
|
1501
1501
|
}
|
|
1502
|
-
function isTelemetryStale(telemetryTimestamp,
|
|
1503
|
-
const timestamp = telemetryTimestamp && telemetryTimestamp > 0 ? telemetryTimestamp :
|
|
1502
|
+
function isTelemetryStale(telemetryTimestamp, delayMins) {
|
|
1503
|
+
const timestamp = telemetryTimestamp && telemetryTimestamp > 0 ? telemetryTimestamp : null;
|
|
1504
1504
|
if (!timestamp) {
|
|
1505
1505
|
return false;
|
|
1506
1506
|
}
|
|
@@ -1510,12 +1510,8 @@ function isTelemetryStale(telemetryTimestamp, lastActivityTime = null, delayMins
|
|
|
1510
1510
|
const timeSinceUpdate = now.getTime() - lastUpdate.getTime();
|
|
1511
1511
|
return timeSinceUpdate > delayMs;
|
|
1512
1512
|
}
|
|
1513
|
-
function isConnectionStale({
|
|
1514
|
-
connectionStatusTs
|
|
1515
|
-
lastActivityTime = null,
|
|
1516
|
-
delayTimeConnectionInMins = 1440
|
|
1517
|
-
} = {}) {
|
|
1518
|
-
return isTelemetryStale(connectionStatusTs, lastActivityTime, delayTimeConnectionInMins);
|
|
1513
|
+
function isConnectionStale({ connectionStatusTs = null, delayTimeConnectionInMins } = {}) {
|
|
1514
|
+
return isTelemetryStale(connectionStatusTs, delayTimeConnectionInMins);
|
|
1519
1515
|
}
|
|
1520
1516
|
function mapDeviceStatusToCardStatus(deviceStatus) {
|
|
1521
1517
|
const statusMap = {
|
|
@@ -1581,41 +1577,33 @@ function calculateDeviceStatus({
|
|
|
1581
1577
|
domain = "energy",
|
|
1582
1578
|
telemetryValue = null,
|
|
1583
1579
|
telemetryTimestamp = null,
|
|
1584
|
-
//
|
|
1585
|
-
lastActivityTime = null,
|
|
1586
|
-
// v3: NOT USED as fallback anymore
|
|
1580
|
+
// MUST be domain-specific (consumptionTs, pulsesTs, etc.)
|
|
1587
1581
|
ranges = null,
|
|
1588
1582
|
// RFC-0110 v2: Dual threshold configuration
|
|
1589
|
-
delayTimeConnectionInMins
|
|
1590
|
-
// For 'online' status
|
|
1591
|
-
shortDelayMins
|
|
1592
|
-
// For 'offline'/'bad' status
|
|
1583
|
+
delayTimeConnectionInMins,
|
|
1584
|
+
// For 'online' status
|
|
1585
|
+
shortDelayMins,
|
|
1586
|
+
// For 'offline'/'bad' status
|
|
1593
1587
|
// Legacy parameters (backward compatibility)
|
|
1594
1588
|
lastConsumptionValue = null,
|
|
1595
1589
|
limitOfPowerOnStandByWatts = null,
|
|
1596
1590
|
limitOfPowerOnAlertWatts = null,
|
|
1597
|
-
limitOfPowerOnFailureWatts = null
|
|
1598
|
-
// @deprecated - kept for backward compatibility
|
|
1599
|
-
lastConnectTime = null,
|
|
1600
|
-
lastDisconnectTime = null
|
|
1591
|
+
limitOfPowerOnFailureWatts = null
|
|
1601
1592
|
}) {
|
|
1602
1593
|
const normalizedStatus = normalizeConnectionStatus(connectionStatus);
|
|
1603
1594
|
if (normalizedStatus === "waiting") {
|
|
1604
1595
|
return DeviceStatusType.NOT_INSTALLED;
|
|
1605
1596
|
}
|
|
1606
1597
|
const hasTelemetryTs = telemetryTimestamp !== null && telemetryTimestamp !== void 0 && telemetryTimestamp > 0;
|
|
1607
|
-
const hasLastActivityTime = lastActivityTime !== null && lastActivityTime !== void 0 && lastActivityTime > 0;
|
|
1608
|
-
const effectiveTimestampForRecovery = hasTelemetryTs ? telemetryTimestamp : hasLastActivityTime ? lastActivityTime : null;
|
|
1609
|
-
const hasEffectiveTimestampForRecovery = effectiveTimestampForRecovery !== null;
|
|
1610
1598
|
if (normalizedStatus === "bad") {
|
|
1611
|
-
const hasRecentTelemetry =
|
|
1599
|
+
const hasRecentTelemetry = hasTelemetryTs && !isTelemetryStale(telemetryTimestamp, shortDelayMins);
|
|
1612
1600
|
if (hasRecentTelemetry) {
|
|
1613
1601
|
} else {
|
|
1614
1602
|
return DeviceStatusType.WEAK_CONNECTION;
|
|
1615
1603
|
}
|
|
1616
1604
|
}
|
|
1617
1605
|
if (normalizedStatus === "offline") {
|
|
1618
|
-
const hasRecentTelemetry =
|
|
1606
|
+
const hasRecentTelemetry = hasTelemetryTs && !isTelemetryStale(telemetryTimestamp, shortDelayMins);
|
|
1619
1607
|
if (!hasRecentTelemetry) {
|
|
1620
1608
|
return DeviceStatusType.OFFLINE;
|
|
1621
1609
|
}
|
|
@@ -1624,7 +1612,7 @@ function calculateDeviceStatus({
|
|
|
1624
1612
|
if (!hasTelemetryTs) {
|
|
1625
1613
|
return DeviceStatusType.OFFLINE;
|
|
1626
1614
|
}
|
|
1627
|
-
const telemetryStale = isTelemetryStale(telemetryTimestamp,
|
|
1615
|
+
const telemetryStale = isTelemetryStale(telemetryTimestamp, delayTimeConnectionInMins);
|
|
1628
1616
|
if (telemetryStale) {
|
|
1629
1617
|
return DeviceStatusType.OFFLINE;
|
|
1630
1618
|
}
|
|
@@ -1677,31 +1665,19 @@ function calculateDeviceStatusWithRanges({
|
|
|
1677
1665
|
ranges,
|
|
1678
1666
|
// RFC-0110: New parameters
|
|
1679
1667
|
telemetryTimestamp = null,
|
|
1680
|
-
|
|
1681
|
-
delayTimeConnectionInMins = 1440,
|
|
1682
|
-
// @deprecated - kept for backward compatibility
|
|
1683
|
-
lastConnectTime = null,
|
|
1684
|
-
lastDisconnectTime = null
|
|
1668
|
+
delayTimeConnectionInMins
|
|
1685
1669
|
}) {
|
|
1686
1670
|
return calculateDeviceStatus({
|
|
1687
1671
|
connectionStatus,
|
|
1688
1672
|
domain: "energy",
|
|
1689
1673
|
telemetryValue: lastConsumptionValue,
|
|
1690
|
-
telemetryTimestamp
|
|
1691
|
-
lastActivityTime,
|
|
1674
|
+
telemetryTimestamp,
|
|
1692
1675
|
ranges,
|
|
1693
1676
|
delayTimeConnectionInMins
|
|
1694
1677
|
});
|
|
1695
1678
|
}
|
|
1696
1679
|
function calculateDeviceStatusMasterRules(options = {}) {
|
|
1697
|
-
const {
|
|
1698
|
-
connectionStatus = "",
|
|
1699
|
-
telemetryTimestamp = null,
|
|
1700
|
-
delayMins = 1440,
|
|
1701
|
-
// 24h for online status
|
|
1702
|
-
domain = "energy"
|
|
1703
|
-
} = options;
|
|
1704
|
-
const SHORT_DELAY_MINS = 60;
|
|
1680
|
+
const { connectionStatus, telemetryTimestamp = null, delayMins, domain, SHORT_DELAY_MINS } = options;
|
|
1705
1681
|
const now = Date.now();
|
|
1706
1682
|
const normalizedStatus = (connectionStatus || "").toLowerCase().trim();
|
|
1707
1683
|
if (normalizedStatus === "waiting" || normalizedStatus === "connecting" || normalizedStatus === "pending") {
|
|
@@ -1856,9 +1832,6 @@ function createDeviceItem(entityId, meta, options = {}) {
|
|
|
1856
1832
|
domain: "energy",
|
|
1857
1833
|
telemetryValue: consumptionValue,
|
|
1858
1834
|
telemetryTimestamp: telemetryTs,
|
|
1859
|
-
// v3: MUST be consumptionTs, NOT lastActivityTime
|
|
1860
|
-
lastActivityTime: null,
|
|
1861
|
-
// v3: NOT used as fallback
|
|
1862
1835
|
ranges,
|
|
1863
1836
|
delayTimeConnectionInMins
|
|
1864
1837
|
});
|
|
@@ -1869,8 +1842,8 @@ function createDeviceItem(entityId, meta, options = {}) {
|
|
|
1869
1842
|
deviceStatus = DeviceStatusType.OFFLINE;
|
|
1870
1843
|
} else {
|
|
1871
1844
|
const SHORT_DELAY_MINS = 60;
|
|
1872
|
-
const hasRecentTelemetry = !isTelemetryStale(telemetryTs,
|
|
1873
|
-
const staleTelemetryLong = isTelemetryStale(telemetryTs,
|
|
1845
|
+
const hasRecentTelemetry = !isTelemetryStale(telemetryTs, SHORT_DELAY_MINS);
|
|
1846
|
+
const staleTelemetryLong = isTelemetryStale(telemetryTs, delayTimeConnectionInMins);
|
|
1874
1847
|
if (connectionStatus === "bad") {
|
|
1875
1848
|
deviceStatus = hasRecentTelemetry ? DeviceStatusType.POWER_ON : DeviceStatusType.WEAK_CONNECTION;
|
|
1876
1849
|
} else if (connectionStatus === "offline") {
|
|
@@ -50557,7 +50530,22 @@ function createConsumption7DaysChart(config) {
|
|
|
50557
50530
|
"#65a30d",
|
|
50558
50531
|
"#d97706",
|
|
50559
50532
|
"#be185d",
|
|
50560
|
-
"#0d9488"
|
|
50533
|
+
"#0d9488",
|
|
50534
|
+
"#7c3aed",
|
|
50535
|
+
"#059669",
|
|
50536
|
+
"#db2777",
|
|
50537
|
+
"#9333ea",
|
|
50538
|
+
"#0284c7",
|
|
50539
|
+
"#ca8a04",
|
|
50540
|
+
"#4f46e5",
|
|
50541
|
+
"#c026d3",
|
|
50542
|
+
"#14b8a6",
|
|
50543
|
+
"#f97316",
|
|
50544
|
+
"#6366f1",
|
|
50545
|
+
"#84cc16",
|
|
50546
|
+
"#ec4899",
|
|
50547
|
+
"#06b6d4",
|
|
50548
|
+
"#a855f7"
|
|
50561
50549
|
];
|
|
50562
50550
|
datasets = Object.entries(data.shoppingData).map(([shoppingId, values], index) => ({
|
|
50563
50551
|
label: data.shoppingNames?.[shoppingId] || shoppingId,
|
|
@@ -1505,8 +1505,8 @@
|
|
|
1505
1505
|
}
|
|
1506
1506
|
return "offline";
|
|
1507
1507
|
}
|
|
1508
|
-
function isTelemetryStale(telemetryTimestamp,
|
|
1509
|
-
const timestamp = telemetryTimestamp && telemetryTimestamp > 0 ? telemetryTimestamp :
|
|
1508
|
+
function isTelemetryStale(telemetryTimestamp, delayMins) {
|
|
1509
|
+
const timestamp = telemetryTimestamp && telemetryTimestamp > 0 ? telemetryTimestamp : null;
|
|
1510
1510
|
if (!timestamp) {
|
|
1511
1511
|
return false;
|
|
1512
1512
|
}
|
|
@@ -1516,12 +1516,8 @@
|
|
|
1516
1516
|
const timeSinceUpdate = now.getTime() - lastUpdate.getTime();
|
|
1517
1517
|
return timeSinceUpdate > delayMs;
|
|
1518
1518
|
}
|
|
1519
|
-
function isConnectionStale({
|
|
1520
|
-
connectionStatusTs
|
|
1521
|
-
lastActivityTime = null,
|
|
1522
|
-
delayTimeConnectionInMins = 1440
|
|
1523
|
-
} = {}) {
|
|
1524
|
-
return isTelemetryStale(connectionStatusTs, lastActivityTime, delayTimeConnectionInMins);
|
|
1519
|
+
function isConnectionStale({ connectionStatusTs = null, delayTimeConnectionInMins } = {}) {
|
|
1520
|
+
return isTelemetryStale(connectionStatusTs, delayTimeConnectionInMins);
|
|
1525
1521
|
}
|
|
1526
1522
|
function mapDeviceStatusToCardStatus(deviceStatus) {
|
|
1527
1523
|
const statusMap = {
|
|
@@ -1587,40 +1583,32 @@
|
|
|
1587
1583
|
domain = "energy",
|
|
1588
1584
|
telemetryValue = null,
|
|
1589
1585
|
telemetryTimestamp = null,
|
|
1590
|
-
//
|
|
1591
|
-
lastActivityTime = null,
|
|
1592
|
-
// v3: NOT USED as fallback anymore
|
|
1586
|
+
// MUST be domain-specific (consumptionTs, pulsesTs, etc.)
|
|
1593
1587
|
ranges = null,
|
|
1594
1588
|
// RFC-0110 v2: Dual threshold configuration
|
|
1595
|
-
delayTimeConnectionInMins
|
|
1596
|
-
// For 'online' status
|
|
1597
|
-
shortDelayMins
|
|
1598
|
-
// For 'offline'/'bad' status
|
|
1589
|
+
delayTimeConnectionInMins,
|
|
1590
|
+
// For 'online' status
|
|
1591
|
+
shortDelayMins,
|
|
1592
|
+
// For 'offline'/'bad' status
|
|
1599
1593
|
// Legacy parameters (backward compatibility)
|
|
1600
1594
|
lastConsumptionValue = null,
|
|
1601
1595
|
limitOfPowerOnStandByWatts = null,
|
|
1602
1596
|
limitOfPowerOnAlertWatts = null,
|
|
1603
|
-
limitOfPowerOnFailureWatts = null
|
|
1604
|
-
// @deprecated - kept for backward compatibility
|
|
1605
|
-
lastConnectTime = null,
|
|
1606
|
-
lastDisconnectTime = null
|
|
1597
|
+
limitOfPowerOnFailureWatts = null
|
|
1607
1598
|
}) {
|
|
1608
1599
|
const normalizedStatus = normalizeConnectionStatus(connectionStatus);
|
|
1609
1600
|
if (normalizedStatus === "waiting") {
|
|
1610
1601
|
return DeviceStatusType.NOT_INSTALLED;
|
|
1611
1602
|
}
|
|
1612
1603
|
const hasTelemetryTs = telemetryTimestamp !== null && telemetryTimestamp !== void 0 && telemetryTimestamp > 0;
|
|
1613
|
-
const hasLastActivityTime = lastActivityTime !== null && lastActivityTime !== void 0 && lastActivityTime > 0;
|
|
1614
|
-
const effectiveTimestampForRecovery = hasTelemetryTs ? telemetryTimestamp : hasLastActivityTime ? lastActivityTime : null;
|
|
1615
|
-
const hasEffectiveTimestampForRecovery = effectiveTimestampForRecovery !== null;
|
|
1616
1604
|
if (normalizedStatus === "bad") {
|
|
1617
|
-
const hasRecentTelemetry =
|
|
1605
|
+
const hasRecentTelemetry = hasTelemetryTs && !isTelemetryStale(telemetryTimestamp, shortDelayMins);
|
|
1618
1606
|
if (hasRecentTelemetry) ; else {
|
|
1619
1607
|
return DeviceStatusType.WEAK_CONNECTION;
|
|
1620
1608
|
}
|
|
1621
1609
|
}
|
|
1622
1610
|
if (normalizedStatus === "offline") {
|
|
1623
|
-
const hasRecentTelemetry =
|
|
1611
|
+
const hasRecentTelemetry = hasTelemetryTs && !isTelemetryStale(telemetryTimestamp, shortDelayMins);
|
|
1624
1612
|
if (!hasRecentTelemetry) {
|
|
1625
1613
|
return DeviceStatusType.OFFLINE;
|
|
1626
1614
|
}
|
|
@@ -1629,7 +1617,7 @@
|
|
|
1629
1617
|
if (!hasTelemetryTs) {
|
|
1630
1618
|
return DeviceStatusType.OFFLINE;
|
|
1631
1619
|
}
|
|
1632
|
-
const telemetryStale = isTelemetryStale(telemetryTimestamp,
|
|
1620
|
+
const telemetryStale = isTelemetryStale(telemetryTimestamp, delayTimeConnectionInMins);
|
|
1633
1621
|
if (telemetryStale) {
|
|
1634
1622
|
return DeviceStatusType.OFFLINE;
|
|
1635
1623
|
}
|
|
@@ -1682,31 +1670,19 @@
|
|
|
1682
1670
|
ranges,
|
|
1683
1671
|
// RFC-0110: New parameters
|
|
1684
1672
|
telemetryTimestamp = null,
|
|
1685
|
-
|
|
1686
|
-
delayTimeConnectionInMins = 1440,
|
|
1687
|
-
// @deprecated - kept for backward compatibility
|
|
1688
|
-
lastConnectTime = null,
|
|
1689
|
-
lastDisconnectTime = null
|
|
1673
|
+
delayTimeConnectionInMins
|
|
1690
1674
|
}) {
|
|
1691
1675
|
return calculateDeviceStatus({
|
|
1692
1676
|
connectionStatus,
|
|
1693
1677
|
domain: "energy",
|
|
1694
1678
|
telemetryValue: lastConsumptionValue,
|
|
1695
|
-
telemetryTimestamp
|
|
1696
|
-
lastActivityTime,
|
|
1679
|
+
telemetryTimestamp,
|
|
1697
1680
|
ranges,
|
|
1698
1681
|
delayTimeConnectionInMins
|
|
1699
1682
|
});
|
|
1700
1683
|
}
|
|
1701
1684
|
function calculateDeviceStatusMasterRules(options = {}) {
|
|
1702
|
-
const {
|
|
1703
|
-
connectionStatus = "",
|
|
1704
|
-
telemetryTimestamp = null,
|
|
1705
|
-
delayMins = 1440,
|
|
1706
|
-
// 24h for online status
|
|
1707
|
-
domain = "energy"
|
|
1708
|
-
} = options;
|
|
1709
|
-
const SHORT_DELAY_MINS = 60;
|
|
1685
|
+
const { connectionStatus, telemetryTimestamp = null, delayMins, domain, SHORT_DELAY_MINS } = options;
|
|
1710
1686
|
const now = Date.now();
|
|
1711
1687
|
const normalizedStatus = (connectionStatus || "").toLowerCase().trim();
|
|
1712
1688
|
if (normalizedStatus === "waiting" || normalizedStatus === "connecting" || normalizedStatus === "pending") {
|
|
@@ -1861,9 +1837,6 @@
|
|
|
1861
1837
|
domain: "energy",
|
|
1862
1838
|
telemetryValue: consumptionValue,
|
|
1863
1839
|
telemetryTimestamp: telemetryTs,
|
|
1864
|
-
// v3: MUST be consumptionTs, NOT lastActivityTime
|
|
1865
|
-
lastActivityTime: null,
|
|
1866
|
-
// v3: NOT used as fallback
|
|
1867
1840
|
ranges,
|
|
1868
1841
|
delayTimeConnectionInMins
|
|
1869
1842
|
});
|
|
@@ -1874,8 +1847,8 @@
|
|
|
1874
1847
|
deviceStatus = DeviceStatusType.OFFLINE;
|
|
1875
1848
|
} else {
|
|
1876
1849
|
const SHORT_DELAY_MINS = 60;
|
|
1877
|
-
const hasRecentTelemetry = !isTelemetryStale(telemetryTs,
|
|
1878
|
-
const staleTelemetryLong = isTelemetryStale(telemetryTs,
|
|
1850
|
+
const hasRecentTelemetry = !isTelemetryStale(telemetryTs, SHORT_DELAY_MINS);
|
|
1851
|
+
const staleTelemetryLong = isTelemetryStale(telemetryTs, delayTimeConnectionInMins);
|
|
1879
1852
|
if (connectionStatus === "bad") {
|
|
1880
1853
|
deviceStatus = hasRecentTelemetry ? DeviceStatusType.POWER_ON : DeviceStatusType.WEAK_CONNECTION;
|
|
1881
1854
|
} else if (connectionStatus === "offline") {
|
|
@@ -50368,7 +50341,22 @@
|
|
|
50368
50341
|
"#65a30d",
|
|
50369
50342
|
"#d97706",
|
|
50370
50343
|
"#be185d",
|
|
50371
|
-
"#0d9488"
|
|
50344
|
+
"#0d9488",
|
|
50345
|
+
"#7c3aed",
|
|
50346
|
+
"#059669",
|
|
50347
|
+
"#db2777",
|
|
50348
|
+
"#9333ea",
|
|
50349
|
+
"#0284c7",
|
|
50350
|
+
"#ca8a04",
|
|
50351
|
+
"#4f46e5",
|
|
50352
|
+
"#c026d3",
|
|
50353
|
+
"#14b8a6",
|
|
50354
|
+
"#f97316",
|
|
50355
|
+
"#6366f1",
|
|
50356
|
+
"#84cc16",
|
|
50357
|
+
"#ec4899",
|
|
50358
|
+
"#06b6d4",
|
|
50359
|
+
"#a855f7"
|
|
50372
50360
|
];
|
|
50373
50361
|
datasets = Object.entries(data.shoppingData).map(([shoppingId, values], index) => ({
|
|
50374
50362
|
label: data.shoppingNames?.[shoppingId] || shoppingId,
|