diff --git a/libs/common/src/firebase/devices-status/dtos/add.devices-status.dto.ts b/libs/common/src/firebase/devices-status/dtos/add.devices-status.dto.ts index ded0771..560943b 100644 --- a/libs/common/src/firebase/devices-status/dtos/add.devices-status.dto.ts +++ b/libs/common/src/firebase/devices-status/dtos/add.devices-status.dto.ts @@ -13,6 +13,7 @@ class StatusDto { @IsNotEmpty() value: any; + t?: string | number | Date; } export class AddDeviceStatusDto { diff --git a/libs/common/src/firebase/devices-status/services/devices-status.service.ts b/libs/common/src/firebase/devices-status/services/devices-status.service.ts index 4b0b0f7..4f11f89 100644 --- a/libs/common/src/firebase/devices-status/services/devices-status.service.ts +++ b/libs/common/src/firebase/devices-status/services/devices-status.service.ts @@ -28,6 +28,8 @@ import { AqiDataService } from '@app/common/helper/services/aqi.data.service'; export class DeviceStatusFirebaseService { private tuya: TuyaContext; private firebaseDb: Database; + private readonly isDevEnv: boolean; + constructor( private readonly configService: ConfigService, private readonly deviceRepository: DeviceRepository, @@ -47,6 +49,8 @@ export class DeviceStatusFirebaseService { // Initialize firebaseDb using firebaseDataBase function this.firebaseDb = firebaseDataBase(this.configService); + this.isDevEnv = + this.configService.get('NODE_ENV') === 'development'; } async addDeviceStatusByDeviceUuid( deviceTuyaUuid: string, @@ -61,7 +65,7 @@ export class DeviceStatusFirebaseService { const deviceStatusSaved = await this.createDeviceStatusFirebase({ deviceUuid: device.uuid, deviceTuyaUuid: deviceTuyaUuid, - status: deviceStatus.status, + status: deviceStatus?.status, productUuid: deviceStatus.productUuid, productType: deviceStatus.productType, }); @@ -122,7 +126,7 @@ export class DeviceStatusFirebaseService { return { productUuid: deviceDetails.productDevice.uuid, productType: deviceDetails.productDevice.prodType, - status: deviceStatus.result[0].status, + status: deviceStatus.result[0]?.status, }; } catch (error) { throw new HttpException( @@ -187,18 +191,18 @@ export class DeviceStatusFirebaseService { if (!existingData.productType) { existingData.productType = addDeviceStatusDto.productType; } - if (!existingData.status) { + if (!existingData?.status) { existingData.status = []; } // Create a map to track existing status codes 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 - for (const statusItem of addDeviceStatusDto.status) { + for (const statusItem of addDeviceStatusDto?.status) { statusMap.set(statusItem.code, statusItem.value); } @@ -211,64 +215,126 @@ export class DeviceStatusFirebaseService { return existingData; }); - // Save logs to your repository - const newLogs = addDeviceStatusDto.log.properties.map((property) => { - return this.deviceStatusLogRepository.create({ - deviceId: addDeviceStatusDto.deviceUuid, - deviceTuyaId: addDeviceStatusDto.deviceTuyaUuid, - productId: addDeviceStatusDto.log.productId, - log: addDeviceStatusDto.log, - code: property.code, - value: property.value, - eventId: addDeviceStatusDto.log.dataId, - eventTime: new Date(property.time).toISOString(), + if (this.isDevEnv) { + // Save logs to your repository + const newLogs = addDeviceStatusDto.log.properties.map((property) => { + return this.deviceStatusLogRepository.create({ + deviceId: addDeviceStatusDto.deviceUuid, + deviceTuyaId: addDeviceStatusDto.deviceTuyaUuid, + productId: addDeviceStatusDto.log.productId, + log: addDeviceStatusDto.log, + code: property.code, + value: property.value, + 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) { - const energyCodes = new Set([ - PowerClampEnergyEnum.ENERGY_CONSUMED, - PowerClampEnergyEnum.ENERGY_CONSUMED_A, - PowerClampEnergyEnum.ENERGY_CONSUMED_B, - PowerClampEnergyEnum.ENERGY_CONSUMED_C, - ]); + if (addDeviceStatusDto.productType === ProductType.PC) { + const energyCodes = new Set([ + PowerClampEnergyEnum.ENERGY_CONSUMED, + PowerClampEnergyEnum.ENERGY_CONSUMED_A, + PowerClampEnergyEnum.ENERGY_CONSUMED_B, + PowerClampEnergyEnum.ENERGY_CONSUMED_C, + ]); - const energyStatus = addDeviceStatusDto?.log?.properties?.find((status) => - energyCodes.has(status.code), - ); + const energyStatus = addDeviceStatusDto?.log?.properties?.find( + (status) => energyCodes.has(status.code), + ); - if (energyStatus) { - await this.powerClampService.updateEnergyConsumedHistoricalData( + if (energyStatus) { + 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, ); } - } + } 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 ( - addDeviceStatusDto.productType === ProductType.CPS || - addDeviceStatusDto.productType === ProductType.WPS - ) { - const occupancyCodes = new Set([PresenceSensorEnum.PRESENCE_STATE]); + if (addDeviceStatusDto.productType === ProductType.PC) { + const energyCodes = new Set([ + PowerClampEnergyEnum.ENERGY_CONSUMED, + PowerClampEnergyEnum.ENERGY_CONSUMED_A, + PowerClampEnergyEnum.ENERGY_CONSUMED_B, + PowerClampEnergyEnum.ENERGY_CONSUMED_C, + ]); - const occupancyStatus = addDeviceStatusDto?.log?.properties?.find( - (status) => occupancyCodes.has(status.code), - ); + const energyStatus = addDeviceStatusDto?.status?.find((status) => { + return energyCodes.has(status.code as PowerClampEnergyEnum); + }); - if (occupancyStatus) { - await this.occupancyService.updateOccupancySensorHistoricalData( - addDeviceStatusDto.deviceUuid, - ); - await this.occupancyService.updateOccupancySensorHistoricalDurationData( + if (energyStatus) { + 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?.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 const snapshot: DataSnapshot = await get(dataRef); return snapshot.val(); diff --git a/libs/common/src/helper/services/power.clamp.service.ts b/libs/common/src/helper/services/power.clamp.service.ts index b0e852f..7c83208 100644 --- a/libs/common/src/helper/services/power.clamp.service.ts +++ b/libs/common/src/helper/services/power.clamp.service.ts @@ -22,21 +22,20 @@ export class PowerClampService { }) .replace('/', '-'); // MM-YYYY - await this.executeProcedure('fact_hourly_energy_consumed_procedure', [ - deviceUuid, - dateStr, - hour, - ]); + await this.executeProcedure( + 'fact_hourly_device_energy_consumed_procedure', + [deviceUuid, dateStr, hour], + ); - await this.executeProcedure('fact_daily_energy_consumed_procedure', [ - deviceUuid, - dateStr, - ]); + await this.executeProcedure( + 'fact_daily_device_energy_consumed_procedure', + [deviceUuid, dateStr], + ); - await this.executeProcedure('fact_monthly_energy_consumed_procedure', [ - deviceUuid, - monthYear, - ]); + await this.executeProcedure( + 'fact_monthly_device_energy_consumed_procedure', + [deviceUuid, monthYear], + ); } catch (err) { console.error('Failed to insert or update energy data:', err); throw err; @@ -47,15 +46,15 @@ export class PowerClampService { procedureFileName: string, params: (string | number | null)[], ): Promise { - const query = this.loadQuery(procedureFileName); + const query = this.loadQuery( + 'fact_device_energy_consumed', + procedureFileName, + ); await this.dataSource.query(query, params); + console.log(`Procedure ${procedureFileName} executed successfully.`); } - private loadQuery(fileName: string): string { - return this.sqlLoader.loadQuery( - 'fact_energy_consumed', - fileName, - SQL_PROCEDURES_PATH, - ); + private loadQuery(folderName: string, fileName: string): string { + return this.sqlLoader.loadQuery(folderName, fileName, SQL_PROCEDURES_PATH); } }