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.
- 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/cloud/entities/CloudDevice.d.ts +1 -0
- package/dist/device/cloud/entities/CloudDevice.js +3 -0
- 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/events/EventHandler.js +6 -6
- package/dist/device/local/events/Events.d.ts +33 -12
- package/dist/device/local/events/Events.js +33 -12
- 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 +11 -2
- package/dist/device/local/repository/Device.repository.js +163 -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 +9 -6
- package/dist/device/local/services/Device.service.js +61 -41
- 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 +111 -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/IEventHandler.d.ts +23 -0
- package/dist/{device/cloud/interface.js → events/interfaces/IEventHandler.js} +0 -1
- package/dist/events/interfaces/IEventTransformer.d.ts +7 -0
- package/dist/{device/cloud/interfaces/IDeviceConnectionService.js → events/interfaces/IEventTransformer.js} +0 -1
- 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/{device → events/interfaces}/index.js +4 -4
- 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/cloud/entities/CloudDevice.ts +4 -0
- 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 +251 -30
- 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 +74 -52
- 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 +24 -19
- 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/dist/device/cloud/interface.d.ts +0 -101
- package/dist/device/cloud/interfaces/IDeviceConnectionService.d.ts +0 -7
- package/dist/device/cloud/interfaces/IDevicesService.d.ts +0 -9
- package/dist/device/cloud/services/Device.service.d.ts +0 -39
- package/dist/device/cloud/services/Device.service.js +0 -9
- package/dist/device/cloud/services/DeviceCloudService.d.ts +0 -42
- package/dist/device/cloud/services/DeviceCloudService.js +0 -59
- package/dist/device/cloud/services/DeviceHub.service.d.ts +0 -3
- package/dist/device/cloud/services/DeviceHub.service.js +0 -6
- package/dist/device/cloud/services/Hub.service.d.ts +0 -25
- package/dist/device/cloud/services/Hub.service.js +0 -9
- package/dist/device/cloud/services/SmartThingsDeviceService.d.ts +0 -38
- package/dist/device/cloud/services/SmartThingsDeviceService.js +0 -52
- package/dist/device/index.d.ts +0 -4
- package/dist/device/local/interface.d.ts +0 -0
- package/dist/device/local/interface.js +0 -1
- package/dist/device/local/services/DeviceHub.service.d.ts +0 -11
- package/dist/device/local/services/DeviceHub.service.js +0 -40
- package/src/device/local/events/index.ts +0 -2
- /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 {
|
|
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
|
|
|
21
|
-
async createDevice(body: IDevice): Promise<
|
|
22
|
-
|
|
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
|
-
|
|
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
|
-
|
|
120
|
+
|
|
125
121
|
const oldStatus = await this.getStatus(deviceId);
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
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();
|
|
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
|
-
|
|
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
|
|
148
|
+
async setBatteryLevel(deviceId: string, batteryLevel: number) {
|
|
149
|
+
// Fetch the old battery level state
|
|
161
150
|
const oldBatteryLevel = await this.getBatteryLevel(deviceId);
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
if (
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
158
|
+
|
|
159
|
+
// Check if battery is low and not updated for 8 hours
|
|
172
160
|
if (
|
|
173
|
-
|
|
174
|
-
oldBatteryLevel?.
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
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
|
}
|