dt-common-device 1.3.0 → 2.0.0
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/TROUBLESHOOTING.md +184 -0
- package/dist/config/config.d.ts +9 -2
- package/dist/config/config.js +97 -14
- package/dist/constants/Event.d.ts +75 -0
- package/dist/constants/Event.js +78 -0
- package/dist/db/db.d.ts +1 -0
- package/dist/db/db.js +18 -2
- package/dist/device/local/entities/AlertBuilder.d.ts +87 -0
- package/dist/device/local/entities/AlertBuilder.example.d.ts +11 -0
- package/dist/device/local/entities/AlertBuilder.example.js +117 -0
- package/dist/device/local/entities/AlertBuilder.js +179 -0
- package/dist/device/local/entities/IssueBuilder.d.ts +109 -0
- package/dist/device/local/entities/IssueBuilder.example.d.ts +16 -0
- package/dist/device/local/entities/IssueBuilder.example.js +196 -0
- package/dist/device/local/entities/IssueBuilder.js +237 -0
- package/dist/device/local/entities/index.d.ts +2 -0
- package/dist/device/local/entities/index.js +7 -0
- package/dist/device/local/interfaces/IDevice.d.ts +10 -9
- package/dist/device/local/interfaces/IDevice.js +7 -0
- package/dist/device/local/models/Alert.model.d.ts +28 -0
- package/dist/device/local/models/Alert.model.js +222 -0
- package/dist/device/local/models/Issue.model.d.ts +28 -0
- package/dist/device/local/models/Issue.model.js +260 -0
- package/dist/device/local/repository/Alert.repository.d.ts +106 -0
- package/dist/device/local/repository/Alert.repository.js +374 -0
- package/dist/device/local/repository/Device.repository.d.ts +10 -2
- package/dist/device/local/repository/Device.repository.js +153 -30
- package/dist/device/local/repository/Hub.repository.d.ts +1 -1
- package/dist/device/local/repository/Hub.repository.js +60 -18
- package/dist/device/local/repository/Issue.repository.d.ts +113 -0
- package/dist/device/local/repository/Issue.repository.js +401 -0
- package/dist/device/local/repository/Schedule.repository.d.ts +1 -1
- package/dist/device/local/repository/Schedule.repository.js +14 -18
- package/dist/device/local/services/Alert.service.d.ts +135 -5
- package/dist/device/local/services/Alert.service.js +471 -7
- package/dist/device/local/services/AlertService.example.d.ts +55 -0
- package/dist/device/local/services/AlertService.example.js +148 -0
- package/dist/device/local/services/Device.service.d.ts +8 -5
- package/dist/device/local/services/Device.service.js +58 -40
- package/dist/device/local/services/Issue.service.d.ts +168 -0
- package/dist/device/local/services/Issue.service.js +642 -0
- package/dist/device/local/services/IssueService.example.d.ts +68 -0
- package/dist/device/local/services/IssueService.example.js +177 -0
- package/dist/device/local/services/index.d.ts +7 -5
- package/dist/device/local/services/index.js +21 -11
- package/dist/events/BaseEventHandler.d.ts +43 -0
- package/dist/events/BaseEventHandler.js +111 -0
- package/dist/events/BaseEventTransformer.d.ts +26 -0
- package/dist/events/BaseEventTransformer.js +72 -0
- package/dist/events/DeviceEventHandler.d.ts +15 -0
- package/dist/events/DeviceEventHandler.js +152 -0
- package/dist/events/DeviceEventTransformerFactory.d.ts +27 -0
- package/dist/events/DeviceEventTransformerFactory.js +116 -0
- package/dist/events/EventHandler.d.ts +11 -0
- package/dist/events/EventHandler.js +106 -0
- package/dist/events/EventHandlerOrchestrator.d.ts +35 -0
- package/dist/events/EventHandlerOrchestrator.js +141 -0
- package/dist/events/EventProcessingService.d.ts +43 -0
- package/dist/events/EventProcessingService.js +243 -0
- package/dist/events/InternalEventSubscription.d.ts +44 -0
- package/dist/events/InternalEventSubscription.js +152 -0
- package/dist/events/index.d.ts +9 -0
- package/dist/events/index.js +21 -0
- package/dist/events/interfaces/DeviceEvent.d.ts +48 -0
- package/dist/events/interfaces/DeviceEvent.js +2 -0
- package/dist/events/interfaces/IEventHandler.d.ts +23 -0
- package/dist/events/interfaces/IEventHandler.js +2 -0
- package/dist/events/interfaces/IEventTransformer.d.ts +7 -0
- package/dist/events/interfaces/IEventTransformer.js +2 -0
- package/dist/events/interfaces/IInternalEvent.d.ts +42 -0
- package/dist/events/interfaces/IInternalEvent.js +2 -0
- package/dist/events/interfaces/index.d.ts +4 -0
- package/dist/events/interfaces/index.js +20 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.js +9 -2
- package/dist/types/alert.types.d.ts +57 -0
- package/dist/types/alert.types.js +22 -0
- package/dist/types/config.types.d.ts +15 -4
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +2 -0
- package/dist/types/issue.types.d.ts +90 -0
- package/dist/types/issue.types.js +40 -0
- package/dist/utils/http-utils.d.ts +13 -0
- package/dist/utils/http-utils.js +117 -0
- package/package.json +2 -1
- package/src/config/config.ts +117 -14
- package/src/{device/local/events/Events.ts → constants/Event.ts} +34 -13
- package/src/db/db.ts +14 -5
- package/src/device/local/entities/AlertBuilder.example.ts +126 -0
- package/src/device/local/entities/AlertBuilder.ts +202 -0
- package/src/device/local/entities/IssueBuilder.example.ts +210 -0
- package/src/device/local/entities/IssueBuilder.ts +263 -0
- package/src/device/local/entities/README.md +173 -0
- package/src/device/local/entities/index.ts +2 -0
- package/src/device/local/interfaces/IDevice.ts +11 -9
- package/src/device/local/models/Alert.model.md +319 -0
- package/src/device/local/models/Alert.model.ts +283 -0
- package/src/device/local/models/Issue.model.md +386 -0
- package/src/device/local/models/Issue.model.ts +350 -0
- package/src/device/local/models/README.md +312 -0
- package/src/device/local/repository/Alert.repository.ts +465 -0
- package/src/device/local/repository/Device.repository.ts +241 -32
- package/src/device/local/repository/Hub.repository.ts +74 -18
- package/src/device/local/repository/Issue.repository.ts +517 -0
- package/src/device/local/repository/Schedule.repository.ts +28 -22
- package/src/device/local/services/Alert.service.ts +617 -5
- package/src/device/local/services/AlertService.example.ts +229 -0
- package/src/device/local/services/Device.service.ts +70 -50
- package/src/device/local/services/Issue.service.ts +872 -0
- package/src/device/local/services/IssueService.example.ts +307 -0
- package/src/device/local/services/index.ts +7 -5
- package/src/events/BaseEventHandler.ts +145 -0
- package/src/events/BaseEventTransformer.ts +97 -0
- package/src/events/DeviceEventHandler.ts +211 -0
- package/src/events/DeviceEventTransformerFactory.ts +77 -0
- package/src/{device/local/events → events}/EventHandler.ts +19 -15
- package/src/events/EventHandlerOrchestrator.ts +119 -0
- package/src/events/EventProcessingService.ts +248 -0
- package/src/events/InternalEventSubscription.ts +219 -0
- package/src/events/index.ts +9 -0
- package/src/events/interfaces/DeviceEvent.ts +56 -0
- package/src/events/interfaces/IEventHandler.ts +28 -0
- package/src/events/interfaces/IEventTransformer.ts +8 -0
- package/src/events/interfaces/IInternalEvent.ts +47 -0
- package/src/events/interfaces/index.ts +4 -0
- package/src/index.ts +9 -2
- package/src/types/alert.types.ts +64 -0
- package/src/types/config.types.ts +17 -4
- package/src/types/index.ts +2 -0
- package/src/types/issue.types.ts +98 -0
- package/src/utils/http-utils.ts +143 -0
- package/src/device/local/events/index.ts +0 -2
|
@@ -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,20 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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
|
|
|
@@ -105,6 +99,7 @@ export class LocalDeviceService {
|
|
|
105
99
|
(key) => !isEqual(oldState[key], newState[key])
|
|
106
100
|
);
|
|
107
101
|
if (changedKeys.length > 0) {
|
|
102
|
+
await this.deviceRepository.setState(deviceId, newState);
|
|
108
103
|
return await this.eventHandler.onStateChange(deviceId, newState);
|
|
109
104
|
}
|
|
110
105
|
}
|
|
@@ -116,31 +111,27 @@ export class LocalDeviceService {
|
|
|
116
111
|
return await this.deviceRepository.getStatus(deviceId);
|
|
117
112
|
}
|
|
118
113
|
|
|
119
|
-
|
|
120
|
-
async setStatus(deviceId: string, newStatus: any) {
|
|
114
|
+
async setStatus(deviceId: string, newStatus: INewStatus) {
|
|
121
115
|
if (!deviceId || !newStatus) {
|
|
122
116
|
throw new Error("Device ID and new status are required");
|
|
123
117
|
}
|
|
124
|
-
|
|
118
|
+
|
|
125
119
|
const oldStatus = await this.getStatus(deviceId);
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
|
|
120
|
+
const isStatusChanged = !isEqual(oldStatus, newStatus);
|
|
121
|
+
|
|
122
|
+
if (isStatusChanged) {
|
|
123
|
+
await this.deviceRepository.setStatus(deviceId, newStatus);
|
|
124
|
+
await this.eventHandler.onStatusChange(deviceId, newStatus);
|
|
131
125
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
oldStatus?.
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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();
|
|
126
|
+
|
|
127
|
+
const isBothOffline =
|
|
128
|
+
oldStatus?.online === false && newStatus?.online === false;
|
|
129
|
+
if (isBothOffline && oldStatus?.lastUpdated) {
|
|
130
|
+
const timeDifference =
|
|
131
|
+
Date.now() - new Date(oldStatus.lastUpdated).getTime();
|
|
132
|
+
if (timeDifference > 86400000) {
|
|
133
|
+
//return await this.alertService.raiseOperationsAlert();
|
|
134
|
+
return;
|
|
144
135
|
}
|
|
145
136
|
}
|
|
146
137
|
}
|
|
@@ -152,33 +143,31 @@ export class LocalDeviceService {
|
|
|
152
143
|
return await this.deviceRepository.getBatteryLevel(deviceId);
|
|
153
144
|
}
|
|
154
145
|
|
|
155
|
-
|
|
156
|
-
|
|
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
|
|
146
|
+
async setBatteryLevel(deviceId: string, batteryLevel: number) {
|
|
147
|
+
// Fetch the old battery level state
|
|
161
148
|
const oldBatteryLevel = await this.getBatteryLevel(deviceId);
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
if (
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
newBatteryLevel
|
|
169
|
-
);
|
|
149
|
+
|
|
150
|
+
const isDifferent = !isEqual(oldBatteryLevel?.value, batteryLevel);
|
|
151
|
+
|
|
152
|
+
if (isDifferent) {
|
|
153
|
+
await this.deviceRepository.setBatteryLevel(deviceId, batteryLevel);
|
|
154
|
+
await this.eventHandler.onBatteryLevelChange(deviceId, batteryLevel);
|
|
170
155
|
}
|
|
171
|
-
|
|
156
|
+
|
|
157
|
+
// Check if battery is low and not updated for 8 hours
|
|
172
158
|
if (
|
|
173
|
-
|
|
174
|
-
oldBatteryLevel?.
|
|
175
|
-
|
|
176
|
-
|
|
159
|
+
batteryLevel < 20 &&
|
|
160
|
+
oldBatteryLevel?.value < 20 &&
|
|
161
|
+
oldBatteryLevel?.lastUpdated &&
|
|
162
|
+
new Date(oldBatteryLevel.lastUpdated).getTime() <
|
|
163
|
+
Date.now() - 1000 * 60 * 60 * 8 // 8 hours in ms
|
|
177
164
|
) {
|
|
178
|
-
//TODO: Raise an energy alert
|
|
179
|
-
await this.alertService.raiseEnergyAlert();
|
|
165
|
+
// TODO: Raise an energy alert
|
|
166
|
+
// await this.alertService.raiseEnergyAlert();
|
|
167
|
+
return;
|
|
180
168
|
}
|
|
181
169
|
}
|
|
170
|
+
|
|
182
171
|
async getMetaData(deviceId: string) {
|
|
183
172
|
if (!deviceId) {
|
|
184
173
|
throw new Error("Device ID is required");
|
|
@@ -189,7 +178,8 @@ export class LocalDeviceService {
|
|
|
189
178
|
if (!deviceId || !metaData) {
|
|
190
179
|
throw new Error("Device ID and meta data are required");
|
|
191
180
|
}
|
|
192
|
-
|
|
181
|
+
await this.eventHandler.onDeviceMetaChange(deviceId, metaData);
|
|
182
|
+
return await this.deviceRepository.setMetaData(deviceId, metaData);
|
|
193
183
|
}
|
|
194
184
|
|
|
195
185
|
async getDevicesByZone(zoneId: string) {
|
|
@@ -205,4 +195,34 @@ export class LocalDeviceService {
|
|
|
205
195
|
}
|
|
206
196
|
return await this.deviceRepository.getDevicesByAccessGroup(accessGroupId);
|
|
207
197
|
}
|
|
198
|
+
|
|
199
|
+
async querySelect(query: any, fields: string[]) {
|
|
200
|
+
if (!query || Object.keys(query).length === 0) {
|
|
201
|
+
throw new Error("Query is required");
|
|
202
|
+
}
|
|
203
|
+
return await this.deviceRepository.querySelect(query, fields);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
async queryCount(query: any): Promise<number> {
|
|
207
|
+
if (!query || Object.keys(query).length === 0) {
|
|
208
|
+
throw new Error("Query is required");
|
|
209
|
+
}
|
|
210
|
+
const count = await this.deviceRepository.queryCount(query);
|
|
211
|
+
return count;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async deleteDevices(query: any) {
|
|
215
|
+
if (!query || Object.keys(query).length === 0) {
|
|
216
|
+
throw new Error("Query is required");
|
|
217
|
+
}
|
|
218
|
+
return await this.deviceRepository.deleteDevices(query);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
async queryDevices(query: any) {
|
|
222
|
+
if (!query || Object.keys(query).length === 0) {
|
|
223
|
+
throw new Error("Query is required");
|
|
224
|
+
}
|
|
225
|
+
const count = await this.deviceRepository.queryDevices(query);
|
|
226
|
+
return count;
|
|
227
|
+
}
|
|
208
228
|
}
|