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 CHANGED
@@ -1775,8 +1775,8 @@ function normalizeConnectionStatus(rawStatus) {
1775
1775
  }
1776
1776
  return "offline";
1777
1777
  }
1778
- function isTelemetryStale(telemetryTimestamp, lastActivityTime = null, delayMins = 1440) {
1779
- const timestamp = telemetryTimestamp && telemetryTimestamp > 0 ? telemetryTimestamp : lastActivityTime && lastActivityTime > 0 ? lastActivityTime : null;
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 = null,
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
- // v3: MUST be domain-specific (consumptionTs, pulsesTs, etc.)
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 = 1440,
1866
- // For 'online' status (24h default)
1867
- shortDelayMins = 60,
1868
- // For 'offline'/'bad' status (60 mins default)
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 = hasEffectiveTimestampForRecovery && !isTelemetryStale(effectiveTimestampForRecovery, null, shortDelayMins);
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 = hasEffectiveTimestampForRecovery && !isTelemetryStale(effectiveTimestampForRecovery, null, shortDelayMins);
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, null, delayTimeConnectionInMins);
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
- lastActivityTime = null,
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: telemetryTimestamp || lastConnectTime || lastDisconnectTime,
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, null, SHORT_DELAY_MINS);
2149
- const staleTelemetryLong = isTelemetryStale(telemetryTs, null, delayTimeConnectionInMins);
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 - Primary: timestamp from telemetry data
539
- * @param {number|Date|null} lastActivityTime - Fallback: ThingsBoard lastActivityTime
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, null, 1440); // false
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, null, 1440); // true
548
+ * isTelemetryStale(Date.now() - 25 * 60 * 60 * 1000, 1440); // true
550
549
  */
551
- declare function isTelemetryStale(telemetryTimestamp: number | Date | null, lastActivityTime?: number | Date | null, delayMins?: number): boolean;
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|Date|null} params.lastActivityTime - Fallback: timestamp da última atividade
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, lastActivityTime, delayTimeConnectionInMins, }?: {
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 with fallback.
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) or lastActivityTime as fallback
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 effective timestamp → OFFLINE
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=1440] - Long threshold for 'online' status (default: 24h)
656
- * @param {number} [params.shortDelayMins=60] - Short threshold for 'offline'/'bad' status (default: 60 mins)
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, // Primary: domain-specific timestamp
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, lastActivityTime, ranges, delayTimeConnectionInMins, shortDelayMins, lastConsumptionValue, limitOfPowerOnStandByWatts, limitOfPowerOnAlertWatts, limitOfPowerOnFailureWatts, lastConnectTime, lastDisconnectTime, }: {
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|null} [params.lastActivityTime] - RFC-0110: Fallback timestamp
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, lastActivityTime, delayTimeConnectionInMins, lastConnectTime, lastDisconnectTime, }: {
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=1440] - Long threshold in minutes (default: 24h)
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, lastActivityTime = null, delayMins = 1440) {
1503
- const timestamp = telemetryTimestamp && telemetryTimestamp > 0 ? telemetryTimestamp : lastActivityTime && lastActivityTime > 0 ? lastActivityTime : null;
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 = null,
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
- // v3: MUST be domain-specific (consumptionTs, pulsesTs, etc.)
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 = 1440,
1590
- // For 'online' status (24h default)
1591
- shortDelayMins = 60,
1592
- // For 'offline'/'bad' status (60 mins default)
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 = hasEffectiveTimestampForRecovery && !isTelemetryStale(effectiveTimestampForRecovery, null, shortDelayMins);
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 = hasEffectiveTimestampForRecovery && !isTelemetryStale(effectiveTimestampForRecovery, null, shortDelayMins);
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, null, delayTimeConnectionInMins);
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
- lastActivityTime = null,
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: telemetryTimestamp || lastConnectTime || lastDisconnectTime,
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, null, SHORT_DELAY_MINS);
1873
- const staleTelemetryLong = isTelemetryStale(telemetryTs, null, delayTimeConnectionInMins);
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, lastActivityTime = null, delayMins = 1440) {
1509
- const timestamp = telemetryTimestamp && telemetryTimestamp > 0 ? telemetryTimestamp : lastActivityTime && lastActivityTime > 0 ? lastActivityTime : null;
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 = null,
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
- // v3: MUST be domain-specific (consumptionTs, pulsesTs, etc.)
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 = 1440,
1596
- // For 'online' status (24h default)
1597
- shortDelayMins = 60,
1598
- // For 'offline'/'bad' status (60 mins default)
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 = hasEffectiveTimestampForRecovery && !isTelemetryStale(effectiveTimestampForRecovery, null, shortDelayMins);
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 = hasEffectiveTimestampForRecovery && !isTelemetryStale(effectiveTimestampForRecovery, null, shortDelayMins);
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, null, delayTimeConnectionInMins);
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
- lastActivityTime = null,
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: telemetryTimestamp || lastConnectTime || lastDisconnectTime,
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, null, SHORT_DELAY_MINS);
1878
- const staleTelemetryLong = isTelemetryStale(telemetryTs, null, delayTimeConnectionInMins);
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,