dt-common-device 1.3.0 → 2.0.1

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.
Files changed (156) hide show
  1. package/TROUBLESHOOTING.md +184 -0
  2. package/dist/config/config.d.ts +9 -2
  3. package/dist/config/config.js +97 -14
  4. package/dist/constants/Event.d.ts +75 -0
  5. package/dist/constants/Event.js +78 -0
  6. package/dist/db/db.d.ts +1 -0
  7. package/dist/db/db.js +18 -2
  8. package/dist/device/cloud/entities/CloudDevice.d.ts +1 -0
  9. package/dist/device/cloud/entities/CloudDevice.js +3 -0
  10. package/dist/device/local/entities/AlertBuilder.d.ts +87 -0
  11. package/dist/device/local/entities/AlertBuilder.example.d.ts +11 -0
  12. package/dist/device/local/entities/AlertBuilder.example.js +117 -0
  13. package/dist/device/local/entities/AlertBuilder.js +179 -0
  14. package/dist/device/local/entities/IssueBuilder.d.ts +109 -0
  15. package/dist/device/local/entities/IssueBuilder.example.d.ts +16 -0
  16. package/dist/device/local/entities/IssueBuilder.example.js +196 -0
  17. package/dist/device/local/entities/IssueBuilder.js +237 -0
  18. package/dist/device/local/entities/index.d.ts +2 -0
  19. package/dist/device/local/entities/index.js +7 -0
  20. package/dist/device/local/events/EventHandler.js +6 -6
  21. package/dist/device/local/events/Events.d.ts +33 -12
  22. package/dist/device/local/events/Events.js +33 -12
  23. package/dist/device/local/interfaces/IDevice.d.ts +10 -9
  24. package/dist/device/local/interfaces/IDevice.js +7 -0
  25. package/dist/device/local/models/Alert.model.d.ts +28 -0
  26. package/dist/device/local/models/Alert.model.js +222 -0
  27. package/dist/device/local/models/Issue.model.d.ts +28 -0
  28. package/dist/device/local/models/Issue.model.js +260 -0
  29. package/dist/device/local/repository/Alert.repository.d.ts +106 -0
  30. package/dist/device/local/repository/Alert.repository.js +374 -0
  31. package/dist/device/local/repository/Device.repository.d.ts +11 -2
  32. package/dist/device/local/repository/Device.repository.js +163 -30
  33. package/dist/device/local/repository/Hub.repository.d.ts +1 -1
  34. package/dist/device/local/repository/Hub.repository.js +60 -18
  35. package/dist/device/local/repository/Issue.repository.d.ts +113 -0
  36. package/dist/device/local/repository/Issue.repository.js +401 -0
  37. package/dist/device/local/repository/Schedule.repository.d.ts +1 -1
  38. package/dist/device/local/repository/Schedule.repository.js +14 -18
  39. package/dist/device/local/services/Alert.service.d.ts +135 -5
  40. package/dist/device/local/services/Alert.service.js +471 -7
  41. package/dist/device/local/services/AlertService.example.d.ts +55 -0
  42. package/dist/device/local/services/AlertService.example.js +148 -0
  43. package/dist/device/local/services/Device.service.d.ts +9 -6
  44. package/dist/device/local/services/Device.service.js +61 -41
  45. package/dist/device/local/services/Issue.service.d.ts +168 -0
  46. package/dist/device/local/services/Issue.service.js +642 -0
  47. package/dist/device/local/services/IssueService.example.d.ts +68 -0
  48. package/dist/device/local/services/IssueService.example.js +177 -0
  49. package/dist/device/local/services/index.d.ts +7 -5
  50. package/dist/device/local/services/index.js +21 -11
  51. package/dist/events/BaseEventHandler.d.ts +43 -0
  52. package/dist/events/BaseEventHandler.js +111 -0
  53. package/dist/events/BaseEventTransformer.d.ts +26 -0
  54. package/dist/events/BaseEventTransformer.js +72 -0
  55. package/dist/events/DeviceEventHandler.d.ts +15 -0
  56. package/dist/events/DeviceEventHandler.js +152 -0
  57. package/dist/events/DeviceEventTransformerFactory.d.ts +27 -0
  58. package/dist/events/DeviceEventTransformerFactory.js +116 -0
  59. package/dist/events/EventHandler.d.ts +11 -0
  60. package/dist/events/EventHandler.js +111 -0
  61. package/dist/events/EventHandlerOrchestrator.d.ts +35 -0
  62. package/dist/events/EventHandlerOrchestrator.js +141 -0
  63. package/dist/events/EventProcessingService.d.ts +43 -0
  64. package/dist/events/EventProcessingService.js +243 -0
  65. package/dist/events/InternalEventSubscription.d.ts +44 -0
  66. package/dist/events/InternalEventSubscription.js +152 -0
  67. package/dist/events/index.d.ts +9 -0
  68. package/dist/events/index.js +21 -0
  69. package/dist/events/interfaces/DeviceEvent.d.ts +48 -0
  70. package/dist/events/interfaces/IEventHandler.d.ts +23 -0
  71. package/dist/{device/cloud/interface.js → events/interfaces/IEventHandler.js} +0 -1
  72. package/dist/events/interfaces/IEventTransformer.d.ts +7 -0
  73. package/dist/{device/cloud/interfaces/IDeviceConnectionService.js → events/interfaces/IEventTransformer.js} +0 -1
  74. package/dist/events/interfaces/IInternalEvent.d.ts +42 -0
  75. package/dist/events/interfaces/IInternalEvent.js +2 -0
  76. package/dist/events/interfaces/index.d.ts +4 -0
  77. package/dist/{device → events/interfaces}/index.js +4 -4
  78. package/dist/index.d.ts +6 -2
  79. package/dist/index.js +9 -2
  80. package/dist/types/alert.types.d.ts +57 -0
  81. package/dist/types/alert.types.js +22 -0
  82. package/dist/types/config.types.d.ts +15 -4
  83. package/dist/types/index.d.ts +2 -0
  84. package/dist/types/index.js +2 -0
  85. package/dist/types/issue.types.d.ts +90 -0
  86. package/dist/types/issue.types.js +40 -0
  87. package/dist/utils/http-utils.d.ts +13 -0
  88. package/dist/utils/http-utils.js +117 -0
  89. package/package.json +2 -1
  90. package/src/config/config.ts +117 -14
  91. package/src/{device/local/events/Events.ts → constants/Event.ts} +34 -13
  92. package/src/db/db.ts +14 -5
  93. package/src/device/cloud/entities/CloudDevice.ts +4 -0
  94. package/src/device/local/entities/AlertBuilder.example.ts +126 -0
  95. package/src/device/local/entities/AlertBuilder.ts +202 -0
  96. package/src/device/local/entities/IssueBuilder.example.ts +210 -0
  97. package/src/device/local/entities/IssueBuilder.ts +263 -0
  98. package/src/device/local/entities/README.md +173 -0
  99. package/src/device/local/entities/index.ts +2 -0
  100. package/src/device/local/interfaces/IDevice.ts +11 -9
  101. package/src/device/local/models/Alert.model.md +319 -0
  102. package/src/device/local/models/Alert.model.ts +283 -0
  103. package/src/device/local/models/Issue.model.md +386 -0
  104. package/src/device/local/models/Issue.model.ts +350 -0
  105. package/src/device/local/models/README.md +312 -0
  106. package/src/device/local/repository/Alert.repository.ts +465 -0
  107. package/src/device/local/repository/Device.repository.ts +251 -30
  108. package/src/device/local/repository/Hub.repository.ts +74 -18
  109. package/src/device/local/repository/Issue.repository.ts +517 -0
  110. package/src/device/local/repository/Schedule.repository.ts +28 -22
  111. package/src/device/local/services/Alert.service.ts +617 -5
  112. package/src/device/local/services/AlertService.example.ts +229 -0
  113. package/src/device/local/services/Device.service.ts +74 -52
  114. package/src/device/local/services/Issue.service.ts +872 -0
  115. package/src/device/local/services/IssueService.example.ts +307 -0
  116. package/src/device/local/services/index.ts +7 -5
  117. package/src/events/BaseEventHandler.ts +145 -0
  118. package/src/events/BaseEventTransformer.ts +97 -0
  119. package/src/events/DeviceEventHandler.ts +211 -0
  120. package/src/events/DeviceEventTransformerFactory.ts +77 -0
  121. package/src/{device/local/events → events}/EventHandler.ts +24 -19
  122. package/src/events/EventHandlerOrchestrator.ts +119 -0
  123. package/src/events/EventProcessingService.ts +248 -0
  124. package/src/events/InternalEventSubscription.ts +219 -0
  125. package/src/events/index.ts +9 -0
  126. package/src/events/interfaces/DeviceEvent.ts +56 -0
  127. package/src/events/interfaces/IEventHandler.ts +28 -0
  128. package/src/events/interfaces/IEventTransformer.ts +8 -0
  129. package/src/events/interfaces/IInternalEvent.ts +47 -0
  130. package/src/events/interfaces/index.ts +4 -0
  131. package/src/index.ts +9 -2
  132. package/src/types/alert.types.ts +64 -0
  133. package/src/types/config.types.ts +17 -4
  134. package/src/types/index.ts +2 -0
  135. package/src/types/issue.types.ts +98 -0
  136. package/src/utils/http-utils.ts +143 -0
  137. package/dist/device/cloud/interface.d.ts +0 -101
  138. package/dist/device/cloud/interfaces/IDeviceConnectionService.d.ts +0 -7
  139. package/dist/device/cloud/interfaces/IDevicesService.d.ts +0 -9
  140. package/dist/device/cloud/services/Device.service.d.ts +0 -39
  141. package/dist/device/cloud/services/Device.service.js +0 -9
  142. package/dist/device/cloud/services/DeviceCloudService.d.ts +0 -42
  143. package/dist/device/cloud/services/DeviceCloudService.js +0 -59
  144. package/dist/device/cloud/services/DeviceHub.service.d.ts +0 -3
  145. package/dist/device/cloud/services/DeviceHub.service.js +0 -6
  146. package/dist/device/cloud/services/Hub.service.d.ts +0 -25
  147. package/dist/device/cloud/services/Hub.service.js +0 -9
  148. package/dist/device/cloud/services/SmartThingsDeviceService.d.ts +0 -38
  149. package/dist/device/cloud/services/SmartThingsDeviceService.js +0 -52
  150. package/dist/device/index.d.ts +0 -4
  151. package/dist/device/local/interface.d.ts +0 -0
  152. package/dist/device/local/interface.js +0 -1
  153. package/dist/device/local/services/DeviceHub.service.d.ts +0 -11
  154. package/dist/device/local/services/DeviceHub.service.js +0 -40
  155. package/src/device/local/events/index.ts +0 -2
  156. /package/dist/{device/cloud/interfaces/IDevicesService.js → events/interfaces/DeviceEvent.js} +0 -0
@@ -0,0 +1,229 @@
1
+ import { AlertService } from "./Alert.service";
2
+ import { AlertBuilder } from "../entities/AlertBuilder";
3
+ import { AlertCategory, AlertSeverity, EntityType } from "../../../types/alert.types";
4
+
5
+ /**
6
+ * Example usage of the updated AlertService with AlertBuilder integration
7
+ * This file demonstrates various ways to use the AlertService with the new AlertBuilder
8
+ */
9
+
10
+ export class AlertServiceExample {
11
+ constructor(private readonly alertService: AlertService) {}
12
+
13
+ /**
14
+ * Example 1: Using the updated createAlert method with AlertBuilder
15
+ */
16
+ async createAlertWithBuilder() {
17
+ const alertBuilder = new AlertBuilder()
18
+ .setCategory(AlertCategory.OPERATIONS)
19
+ .setPropertyId("prop123")
20
+ .setTitle("Device Offline")
21
+ .setDescription("Device has been offline for more than 5 minutes")
22
+ .setEntityId("device456")
23
+ .setEntityType(EntityType.DEVICE)
24
+ .setSeverity(AlertSeverity.HIGH)
25
+ .setCreatedBy("user789");
26
+
27
+ // Pass the AlertBuilder directly to createAlert
28
+ const alert = await this.alertService.createAlert(alertBuilder);
29
+ return alert;
30
+ }
31
+
32
+ /**
33
+ * Example 2: Using convenience methods for specific alert types
34
+ */
35
+ async createSpecificAlerts() {
36
+ // Create a readiness alert
37
+ const readinessAlert = await this.alertService.raiseReadinessAlert(
38
+ "prop123",
39
+ "System Maintenance Required",
40
+ "System maintenance is scheduled for tonight",
41
+ "system456",
42
+ EntityType.PROPERTY,
43
+ "admin"
44
+ );
45
+
46
+ // Create an operations alert
47
+ const operationsAlert = await this.alertService.raiseOperationsAlert(
48
+ "prop123",
49
+ "Device Temperature High",
50
+ "Device temperature exceeds normal operating range",
51
+ "device789",
52
+ EntityType.DEVICE,
53
+ "monitor"
54
+ );
55
+
56
+ // Create a security alert
57
+ const securityAlert = await this.alertService.raiseSecurityAlert(
58
+ "prop123",
59
+ "Unauthorized Access Attempt",
60
+ "Multiple failed login attempts detected",
61
+ "user123",
62
+ EntityType.USER,
63
+ "security-system"
64
+ );
65
+
66
+ // Create an energy alert
67
+ const energyAlert = await this.alertService.raiseEnergyAlert(
68
+ "prop123",
69
+ "High Energy Consumption",
70
+ "Energy usage is 20% above normal levels",
71
+ "zone456",
72
+ EntityType.COLLECTION,
73
+ "energy-monitor"
74
+ );
75
+
76
+ return { readinessAlert, operationsAlert, securityAlert, energyAlert };
77
+ }
78
+
79
+ /**
80
+ * Example 3: Using device-specific alert methods
81
+ */
82
+ async createDeviceAlerts() {
83
+ // Create a device alert with default category and severity
84
+ const deviceAlert1 = await this.alertService.raiseDeviceAlert(
85
+ "device123",
86
+ "prop456",
87
+ "Device Battery Low",
88
+ "Device battery level is below 20%",
89
+ undefined, // Use default category
90
+ undefined, // Use default severity
91
+ "system"
92
+ );
93
+
94
+ // Create a device alert with custom category and severity
95
+ const deviceAlert2 = await this.alertService.raiseDeviceAlert(
96
+ "device789",
97
+ "prop456",
98
+ "Device Firmware Update Available",
99
+ "New firmware version is available for installation",
100
+ AlertCategory.READINESS,
101
+ AlertSeverity.MEDIUM,
102
+ "firmware-manager"
103
+ );
104
+
105
+ return { deviceAlert1, deviceAlert2 };
106
+ }
107
+
108
+ /**
109
+ * Example 4: Using hub-specific alert methods
110
+ */
111
+ async createHubAlerts() {
112
+ // Create a hub alert with default settings
113
+ const hubAlert1 = await this.alertService.raiseHubAlert(
114
+ "hub123",
115
+ "prop456",
116
+ "Hub Connection Lost",
117
+ "Hub has lost connection to the network",
118
+ undefined, // Use default category
119
+ undefined, // Use default severity
120
+ "network-monitor"
121
+ );
122
+
123
+ // Create a hub alert with custom settings
124
+ const hubAlert2 = await this.alertService.raiseHubAlert(
125
+ "hub789",
126
+ "prop456",
127
+ "Hub Maintenance Required",
128
+ "Hub requires scheduled maintenance",
129
+ AlertCategory.READINESS,
130
+ AlertSeverity.LOW,
131
+ "maintenance-system"
132
+ );
133
+
134
+ return { hubAlert1, hubAlert2 };
135
+ }
136
+
137
+ /**
138
+ * Example 5: Using static factory methods with AlertBuilder
139
+ */
140
+ async createAlertsWithStaticMethods() {
141
+ // Create a device alert using static factory method
142
+ const deviceAlert = AlertBuilder.createDeviceAlert("device123", "prop456")
143
+ .setCategory(AlertCategory.OPERATIONS)
144
+ .setTitle("Device Offline")
145
+ .setDescription("Device has been offline for more than 5 minutes")
146
+ .setSeverity(AlertSeverity.HIGH)
147
+ .setCreatedBy("monitor");
148
+
149
+ const alert1 = await this.alertService.createAlert(deviceAlert);
150
+
151
+ // Create a hub alert using static factory method
152
+ const hubAlert = AlertBuilder.createHubAlert("hub789", "prop202")
153
+ .setCategory(AlertCategory.SECURITY)
154
+ .setTitle("Hub Security Breach")
155
+ .setDescription("Unauthorized access attempt detected on hub")
156
+ .setSeverity(AlertSeverity.CRITICAL)
157
+ .setCreatedBy("security-system");
158
+
159
+ const alert2 = await this.alertService.createAlert(hubAlert);
160
+
161
+ return { alert1, alert2 };
162
+ }
163
+
164
+ /**
165
+ * Example 6: Creating multiple alerts efficiently
166
+ */
167
+ async createMultipleAlerts() {
168
+ const alerts = [];
169
+
170
+ // Create multiple device alerts efficiently
171
+ const deviceIds = ["device1", "device2", "device3"];
172
+ const propertyId = "prop123";
173
+
174
+ for (const deviceId of deviceIds) {
175
+ const alertBuilder = AlertBuilder.createDeviceAlert(deviceId, propertyId)
176
+ .setCategory(AlertCategory.OPERATIONS)
177
+ .setTitle(`Device ${deviceId} Status`)
178
+ .setDescription(`Status check for device ${deviceId}`)
179
+ .setSeverity(AlertSeverity.MEDIUM)
180
+ .setCreatedBy("batch-processor");
181
+
182
+ const alert = await this.alertService.createAlert(alertBuilder);
183
+ alerts.push(alert);
184
+ }
185
+
186
+ return alerts;
187
+ }
188
+
189
+ /**
190
+ * Example 7: Creating alerts with snooze functionality
191
+ */
192
+ async createSnoozedAlert() {
193
+ const snoozeUntil = new Date();
194
+ snoozeUntil.setHours(snoozeUntil.getHours() + 2); // Snooze for 2 hours
195
+
196
+ const alertBuilder = new AlertBuilder()
197
+ .setCategory(AlertCategory.OTHER)
198
+ .setPropertyId("prop303")
199
+ .setTitle("Scheduled Maintenance")
200
+ .setDescription("System maintenance scheduled for tonight")
201
+ .setEntityType(EntityType.PROPERTY)
202
+ .setSeverity(AlertSeverity.INFO)
203
+ .setCreatedBy("admin")
204
+ .setSnoozeUntil(snoozeUntil);
205
+
206
+ const alert = await this.alertService.createAlert(alertBuilder);
207
+ return alert;
208
+ }
209
+
210
+ /**
211
+ * Example 8: Backward compatibility - still works with CreateAlertData
212
+ */
213
+ async createAlertWithLegacyData() {
214
+ const alertData = {
215
+ category: AlertCategory.OPERATIONS,
216
+ propertyId: "prop123",
217
+ title: "Legacy Alert",
218
+ description: "This alert was created using the old CreateAlertData format",
219
+ entityId: "device456",
220
+ entityType: EntityType.DEVICE,
221
+ severity: AlertSeverity.MEDIUM,
222
+ createdBy: "legacy-system"
223
+ };
224
+
225
+ // This still works with the updated createAlert method
226
+ const alert = await this.alertService.createAlert(alertData);
227
+ return alert;
228
+ }
229
+ }
@@ -1,25 +1,21 @@
1
- import { checkAwsEnv, ensureAuditInitialized } from "../../../config/config";
2
- import { IDevice } from "../interfaces";
3
- import { EventHandler } from "../events/EventHandler";
1
+ import { IDevice, INewStatus } from "../interfaces";
2
+ import { EventHandler } from "../../../events/EventHandler";
4
3
  import { isEqual } from "lodash";
5
- import { AlertService } from "./Alert.service";
6
4
  import { DeviceRepository } from "../repository/Device.repository";
7
5
  import Container from "typedi";
8
6
 
9
7
  export class LocalDeviceService {
10
8
  private readonly eventHandler: EventHandler;
11
- private readonly alertService: AlertService;
12
9
  private readonly deviceRepository: DeviceRepository;
13
10
  constructor() {
14
- checkAwsEnv();
15
- ensureAuditInitialized();
16
11
  this.eventHandler = new EventHandler();
17
- this.alertService = new AlertService();
18
12
  this.deviceRepository = Container.get(DeviceRepository);
19
13
  }
20
14
 
21
- async createDevice(body: IDevice): Promise<void> {
22
- return await this.eventHandler.onDeviceCreate(body);
15
+ async createDevice(body: IDevice): Promise<IDevice> {
16
+ const device = await this.deviceRepository.createDevice(body);
17
+ await this.eventHandler.onDeviceCreate(device);
18
+ return device;
23
19
  }
24
20
 
25
21
  async getDevice(
@@ -105,6 +101,7 @@ export class LocalDeviceService {
105
101
  (key) => !isEqual(oldState[key], newState[key])
106
102
  );
107
103
  if (changedKeys.length > 0) {
104
+ await this.deviceRepository.setState(deviceId, newState);
108
105
  return await this.eventHandler.onStateChange(deviceId, newState);
109
106
  }
110
107
  }
@@ -116,31 +113,27 @@ export class LocalDeviceService {
116
113
  return await this.deviceRepository.getStatus(deviceId);
117
114
  }
118
115
 
119
- //TODO: Define type of newStatus
120
- async setStatus(deviceId: string, newStatus: any) {
116
+ async setStatus(deviceId: string, newStatus: INewStatus) {
121
117
  if (!deviceId || !newStatus) {
122
118
  throw new Error("Device ID and new status are required");
123
119
  }
124
- // If old status and new status are different
120
+
125
121
  const oldStatus = await this.getStatus(deviceId);
126
- const changedKeys = Object.keys(newStatus).filter(
127
- (key) => !isEqual(oldStatus?.data?.[key], newStatus?.[key])
128
- );
129
- if (changedKeys.length > 0) {
130
- return await this.eventHandler.onStatusChange(deviceId, newStatus);
122
+ const isStatusChanged = !isEqual(oldStatus, newStatus);
123
+
124
+ if (isStatusChanged) {
125
+ await this.deviceRepository.setStatus(deviceId, newStatus);
126
+ await this.eventHandler.onStatusChange(deviceId, newStatus);
131
127
  }
132
- // If both old and new status are offline, check the time difference between the last offline status and current time
133
- if (
134
- oldStatus?.data?.online === false &&
135
- oldStatus?.data?.lastUpdated &&
136
- newStatus?.online === false
137
- ) {
138
- const lastOfflineTime = new Date(oldStatus?.data?.lastUpdated).getTime();
139
- const currentTime = Date.now();
140
- const timeDifference = currentTime - lastOfflineTime;
141
- // Compare it with the baseline profile time of the device. If the difference is higher, then raise an operational alert
142
- if (timeDifference > 1000 * 60 * 60 * 24) {
143
- return await this.alertService.raiseOperationsAlert();
128
+
129
+ const isBothOffline =
130
+ oldStatus?.online === false && newStatus?.online === false;
131
+ if (isBothOffline && oldStatus?.lastUpdated) {
132
+ const timeDifference =
133
+ Date.now() - new Date(oldStatus.lastUpdated).getTime();
134
+ if (timeDifference > 86400000) {
135
+ //return await this.alertService.raiseOperationsAlert();
136
+ return;
144
137
  }
145
138
  }
146
139
  }
@@ -152,33 +145,31 @@ export class LocalDeviceService {
152
145
  return await this.deviceRepository.getBatteryLevel(deviceId);
153
146
  }
154
147
 
155
- //TODO: Define payload type of newBatteryLevel
156
- async setBatteryLevel(deviceId: string, newBatteryLevel: any) {
157
- if (!deviceId || !newBatteryLevel) {
158
- throw new Error("Device ID and new battery level are required");
159
- }
160
- // If old battery level and new battery level are different
148
+ async setBatteryLevel(deviceId: string, batteryLevel: number) {
149
+ // Fetch the old battery level state
161
150
  const oldBatteryLevel = await this.getBatteryLevel(deviceId);
162
- const changedKeys = Object.keys(newBatteryLevel).filter(
163
- (key) => !isEqual(oldBatteryLevel?.data?.[key], newBatteryLevel?.[key])
164
- );
165
- if (changedKeys.length > 0) {
166
- return await this.eventHandler.onBatteryLevelChange(
167
- deviceId,
168
- newBatteryLevel
169
- );
151
+
152
+ const isDifferent = !isEqual(oldBatteryLevel?.value, batteryLevel);
153
+
154
+ if (isDifferent) {
155
+ await this.deviceRepository.setBatteryLevel(deviceId, batteryLevel);
156
+ await this.eventHandler.onBatteryLevelChange(deviceId, batteryLevel);
170
157
  }
171
- // If current battery level is less than 20% and lsat updated time is more than 8 hours, raise an energy alert
158
+
159
+ // Check if battery is low and not updated for 8 hours
172
160
  if (
173
- newBatteryLevel?.value < 20 &&
174
- oldBatteryLevel?.data?.value < 20 &&
175
- new Date(oldBatteryLevel?.data?.lastUpdated).getTime() <
176
- Date.now() - 1000 * 60 * 60 * 8
161
+ batteryLevel < 20 &&
162
+ oldBatteryLevel?.value < 20 &&
163
+ oldBatteryLevel?.lastUpdated &&
164
+ new Date(oldBatteryLevel.lastUpdated).getTime() <
165
+ Date.now() - 1000 * 60 * 60 * 8 // 8 hours in ms
177
166
  ) {
178
- //TODO: Raise an energy alert
179
- await this.alertService.raiseEnergyAlert();
167
+ // TODO: Raise an energy alert
168
+ // await this.alertService.raiseEnergyAlert();
169
+ return;
180
170
  }
181
171
  }
172
+
182
173
  async getMetaData(deviceId: string) {
183
174
  if (!deviceId) {
184
175
  throw new Error("Device ID is required");
@@ -189,7 +180,8 @@ export class LocalDeviceService {
189
180
  if (!deviceId || !metaData) {
190
181
  throw new Error("Device ID and meta data are required");
191
182
  }
192
- return await this.eventHandler.onDeviceMetaChange(deviceId, metaData);
183
+ await this.eventHandler.onDeviceMetaChange(deviceId, metaData);
184
+ return await this.deviceRepository.setMetaData(deviceId, metaData);
193
185
  }
194
186
 
195
187
  async getDevicesByZone(zoneId: string) {
@@ -205,4 +197,34 @@ export class LocalDeviceService {
205
197
  }
206
198
  return await this.deviceRepository.getDevicesByAccessGroup(accessGroupId);
207
199
  }
200
+
201
+ async querySelect(query: any, fields: string[]) {
202
+ if (!query || Object.keys(query).length === 0) {
203
+ throw new Error("Query is required");
204
+ }
205
+ return await this.deviceRepository.querySelect(query, fields);
206
+ }
207
+
208
+ async queryCount(query: any): Promise<number> {
209
+ if (!query || Object.keys(query).length === 0) {
210
+ throw new Error("Query is required");
211
+ }
212
+ const count = await this.deviceRepository.queryCount(query);
213
+ return count;
214
+ }
215
+
216
+ async deleteDevices(query: any) {
217
+ if (!query || Object.keys(query).length === 0) {
218
+ throw new Error("Query is required");
219
+ }
220
+ return await this.deviceRepository.deleteDevices(query);
221
+ }
222
+
223
+ async queryDevices(query: any) {
224
+ if (!query || Object.keys(query).length === 0) {
225
+ throw new Error("Query is required");
226
+ }
227
+ const count = await this.deviceRepository.queryDevices(query);
228
+ return count;
229
+ }
208
230
  }