mirror of
https://github.com/SyncrowIOT/backend.git
synced 2025-07-10 07:07:21 +00:00
feat: enhance device status DTO and service with optional properties and environment checks
This commit is contained in:
@ -13,6 +13,7 @@ class StatusDto {
|
|||||||
|
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
value: any;
|
value: any;
|
||||||
|
t?: string | number | Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class AddDeviceStatusDto {
|
export class AddDeviceStatusDto {
|
||||||
|
@ -28,6 +28,8 @@ import { AqiDataService } from '@app/common/helper/services/aqi.data.service';
|
|||||||
export class DeviceStatusFirebaseService {
|
export class DeviceStatusFirebaseService {
|
||||||
private tuya: TuyaContext;
|
private tuya: TuyaContext;
|
||||||
private firebaseDb: Database;
|
private firebaseDb: Database;
|
||||||
|
private readonly isDevEnv: boolean;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private readonly configService: ConfigService,
|
private readonly configService: ConfigService,
|
||||||
private readonly deviceRepository: DeviceRepository,
|
private readonly deviceRepository: DeviceRepository,
|
||||||
@ -47,6 +49,8 @@ export class DeviceStatusFirebaseService {
|
|||||||
|
|
||||||
// Initialize firebaseDb using firebaseDataBase function
|
// Initialize firebaseDb using firebaseDataBase function
|
||||||
this.firebaseDb = firebaseDataBase(this.configService);
|
this.firebaseDb = firebaseDataBase(this.configService);
|
||||||
|
this.isDevEnv =
|
||||||
|
this.configService.get<string>('NODE_ENV') === 'development';
|
||||||
}
|
}
|
||||||
async addDeviceStatusByDeviceUuid(
|
async addDeviceStatusByDeviceUuid(
|
||||||
deviceTuyaUuid: string,
|
deviceTuyaUuid: string,
|
||||||
@ -61,7 +65,7 @@ export class DeviceStatusFirebaseService {
|
|||||||
const deviceStatusSaved = await this.createDeviceStatusFirebase({
|
const deviceStatusSaved = await this.createDeviceStatusFirebase({
|
||||||
deviceUuid: device.uuid,
|
deviceUuid: device.uuid,
|
||||||
deviceTuyaUuid: deviceTuyaUuid,
|
deviceTuyaUuid: deviceTuyaUuid,
|
||||||
status: deviceStatus.status,
|
status: deviceStatus?.status,
|
||||||
productUuid: deviceStatus.productUuid,
|
productUuid: deviceStatus.productUuid,
|
||||||
productType: deviceStatus.productType,
|
productType: deviceStatus.productType,
|
||||||
});
|
});
|
||||||
@ -122,7 +126,7 @@ export class DeviceStatusFirebaseService {
|
|||||||
return {
|
return {
|
||||||
productUuid: deviceDetails.productDevice.uuid,
|
productUuid: deviceDetails.productDevice.uuid,
|
||||||
productType: deviceDetails.productDevice.prodType,
|
productType: deviceDetails.productDevice.prodType,
|
||||||
status: deviceStatus.result[0].status,
|
status: deviceStatus.result[0]?.status,
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new HttpException(
|
throw new HttpException(
|
||||||
@ -187,18 +191,18 @@ export class DeviceStatusFirebaseService {
|
|||||||
if (!existingData.productType) {
|
if (!existingData.productType) {
|
||||||
existingData.productType = addDeviceStatusDto.productType;
|
existingData.productType = addDeviceStatusDto.productType;
|
||||||
}
|
}
|
||||||
if (!existingData.status) {
|
if (!existingData?.status) {
|
||||||
existingData.status = [];
|
existingData.status = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a map to track existing status codes
|
// Create a map to track existing status codes
|
||||||
const statusMap = new Map(
|
const statusMap = new Map(
|
||||||
existingData.status.map((item) => [item.code, item.value]),
|
existingData?.status.map((item) => [item.code, item.value]),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Update or add status codes
|
// Update or add status codes
|
||||||
|
|
||||||
for (const statusItem of addDeviceStatusDto.status) {
|
for (const statusItem of addDeviceStatusDto?.status) {
|
||||||
statusMap.set(statusItem.code, statusItem.value);
|
statusMap.set(statusItem.code, statusItem.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,63 +215,125 @@ export class DeviceStatusFirebaseService {
|
|||||||
return existingData;
|
return existingData;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Save logs to your repository
|
if (this.isDevEnv) {
|
||||||
const newLogs = addDeviceStatusDto.log.properties.map((property) => {
|
// Save logs to your repository
|
||||||
return this.deviceStatusLogRepository.create({
|
const newLogs = addDeviceStatusDto.log.properties.map((property) => {
|
||||||
deviceId: addDeviceStatusDto.deviceUuid,
|
return this.deviceStatusLogRepository.create({
|
||||||
deviceTuyaId: addDeviceStatusDto.deviceTuyaUuid,
|
deviceId: addDeviceStatusDto.deviceUuid,
|
||||||
productId: addDeviceStatusDto.log.productId,
|
deviceTuyaId: addDeviceStatusDto.deviceTuyaUuid,
|
||||||
log: addDeviceStatusDto.log,
|
productId: addDeviceStatusDto.log.productId,
|
||||||
code: property.code,
|
log: addDeviceStatusDto.log,
|
||||||
value: property.value,
|
code: property.code,
|
||||||
eventId: addDeviceStatusDto.log.dataId,
|
value: property.value,
|
||||||
eventTime: new Date(property.time).toISOString(),
|
eventId: addDeviceStatusDto.log.dataId,
|
||||||
|
eventTime: new Date(property.time).toISOString(),
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
await this.deviceStatusLogRepository.save(newLogs);
|
||||||
await this.deviceStatusLogRepository.save(newLogs);
|
|
||||||
|
|
||||||
if (addDeviceStatusDto.productType === ProductType.PC) {
|
if (addDeviceStatusDto.productType === ProductType.PC) {
|
||||||
const energyCodes = new Set([
|
const energyCodes = new Set([
|
||||||
PowerClampEnergyEnum.ENERGY_CONSUMED,
|
PowerClampEnergyEnum.ENERGY_CONSUMED,
|
||||||
PowerClampEnergyEnum.ENERGY_CONSUMED_A,
|
PowerClampEnergyEnum.ENERGY_CONSUMED_A,
|
||||||
PowerClampEnergyEnum.ENERGY_CONSUMED_B,
|
PowerClampEnergyEnum.ENERGY_CONSUMED_B,
|
||||||
PowerClampEnergyEnum.ENERGY_CONSUMED_C,
|
PowerClampEnergyEnum.ENERGY_CONSUMED_C,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const energyStatus = addDeviceStatusDto?.log?.properties?.find((status) =>
|
const energyStatus = addDeviceStatusDto?.log?.properties?.find(
|
||||||
energyCodes.has(status.code),
|
(status) => energyCodes.has(status.code),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (energyStatus) {
|
if (energyStatus) {
|
||||||
await this.powerClampService.updateEnergyConsumedHistoricalData(
|
await this.powerClampService.updateEnergyConsumedHistoricalData(
|
||||||
|
addDeviceStatusDto.deviceUuid,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
addDeviceStatusDto.productType === ProductType.CPS ||
|
||||||
|
addDeviceStatusDto.productType === ProductType.WPS
|
||||||
|
) {
|
||||||
|
const occupancyCodes = new Set([PresenceSensorEnum.PRESENCE_STATE]);
|
||||||
|
|
||||||
|
const occupancyStatus = addDeviceStatusDto?.log?.properties?.find(
|
||||||
|
(status) => occupancyCodes.has(status.code),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (occupancyStatus) {
|
||||||
|
await this.occupancyService.updateOccupancySensorHistoricalData(
|
||||||
|
addDeviceStatusDto.deviceUuid,
|
||||||
|
);
|
||||||
|
await this.occupancyService.updateOccupancySensorHistoricalDurationData(
|
||||||
|
addDeviceStatusDto.deviceUuid,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (addDeviceStatusDto.productType === ProductType.AQI) {
|
||||||
|
await this.aqiDataService.updateAQISensorHistoricalData(
|
||||||
addDeviceStatusDto.deviceUuid,
|
addDeviceStatusDto.deviceUuid,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
// Save logs to your repository
|
||||||
|
const newLogs = addDeviceStatusDto?.status.map((property) => {
|
||||||
|
return this.deviceStatusLogRepository.create({
|
||||||
|
deviceId: addDeviceStatusDto.deviceUuid,
|
||||||
|
deviceTuyaId: addDeviceStatusDto.deviceTuyaUuid,
|
||||||
|
productId: addDeviceStatusDto.log.productKey,
|
||||||
|
log: addDeviceStatusDto.log,
|
||||||
|
code: property.code,
|
||||||
|
value: property.value,
|
||||||
|
eventId: addDeviceStatusDto.log.dataId,
|
||||||
|
eventTime: new Date(property.t).toISOString(),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
await this.deviceStatusLogRepository.save(newLogs);
|
||||||
|
|
||||||
if (
|
if (addDeviceStatusDto.productType === ProductType.PC) {
|
||||||
addDeviceStatusDto.productType === ProductType.CPS ||
|
const energyCodes = new Set([
|
||||||
addDeviceStatusDto.productType === ProductType.WPS
|
PowerClampEnergyEnum.ENERGY_CONSUMED,
|
||||||
) {
|
PowerClampEnergyEnum.ENERGY_CONSUMED_A,
|
||||||
const occupancyCodes = new Set([PresenceSensorEnum.PRESENCE_STATE]);
|
PowerClampEnergyEnum.ENERGY_CONSUMED_B,
|
||||||
|
PowerClampEnergyEnum.ENERGY_CONSUMED_C,
|
||||||
|
]);
|
||||||
|
|
||||||
const occupancyStatus = addDeviceStatusDto?.log?.properties?.find(
|
const energyStatus = addDeviceStatusDto?.status?.find((status) => {
|
||||||
(status) => occupancyCodes.has(status.code),
|
return energyCodes.has(status.code as PowerClampEnergyEnum);
|
||||||
);
|
});
|
||||||
|
|
||||||
if (occupancyStatus) {
|
if (energyStatus) {
|
||||||
await this.occupancyService.updateOccupancySensorHistoricalData(
|
await this.powerClampService.updateEnergyConsumedHistoricalData(
|
||||||
addDeviceStatusDto.deviceUuid,
|
addDeviceStatusDto.deviceUuid,
|
||||||
);
|
);
|
||||||
await this.occupancyService.updateOccupancySensorHistoricalDurationData(
|
}
|
||||||
addDeviceStatusDto.deviceUuid,
|
}
|
||||||
);
|
|
||||||
|
if (
|
||||||
|
addDeviceStatusDto.productType === ProductType.CPS ||
|
||||||
|
addDeviceStatusDto.productType === ProductType.WPS
|
||||||
|
) {
|
||||||
|
const occupancyCodes = new Set([PresenceSensorEnum.PRESENCE_STATE]);
|
||||||
|
|
||||||
|
const occupancyStatus = addDeviceStatusDto?.status?.find((status) => {
|
||||||
|
return occupancyCodes.has(status.code as PresenceSensorEnum);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (occupancyStatus) {
|
||||||
|
await this.occupancyService.updateOccupancySensorHistoricalData(
|
||||||
|
addDeviceStatusDto.deviceUuid,
|
||||||
|
);
|
||||||
|
await this.occupancyService.updateOccupancySensorHistoricalDurationData(
|
||||||
|
addDeviceStatusDto.deviceUuid,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addDeviceStatusDto.productType === ProductType.AQI) {
|
||||||
|
// await this.aqiDataService.updateAQISensorHistoricalData(
|
||||||
|
// addDeviceStatusDto.deviceUuid,
|
||||||
|
// );
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (addDeviceStatusDto.productType === ProductType.AQI) {
|
|
||||||
await this.aqiDataService.updateAQISensorHistoricalData(
|
|
||||||
addDeviceStatusDto.deviceUuid,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
// Return the updated data
|
// Return the updated data
|
||||||
const snapshot: DataSnapshot = await get(dataRef);
|
const snapshot: DataSnapshot = await get(dataRef);
|
||||||
|
Reference in New Issue
Block a user