X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Focpp%2F1.6%2FOCPP16IncomingRequestService.ts;h=218f97ea26a00bde102d61db8417aac0659420d7;hb=fba11dc656de000473d0639be238c8151f217d93;hp=596f684c3098870e1f3f8792bf586ecbcd49aa67;hpb=ec9f36cc584e72b454151d8c871d8bf0faa7b7d7;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts index 596f684c..218f97ea 100644 --- a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts @@ -1,19 +1,19 @@ // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved. -import fs from 'node:fs'; -import path from 'node:path'; +import { createWriteStream, readdirSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; import { URL, fileURLToPath } from 'node:url'; import type { JSONSchemaType } from 'ajv'; import { Client, type FTPResponse } from 'basic-ftp'; -import tar from 'tar'; +import { create } from 'tar'; import { OCPP16Constants } from './OCPP16Constants'; import { OCPP16ServiceUtils } from './OCPP16ServiceUtils'; import { type ChargingStation, ChargingStationConfigurationUtils, - ChargingStationUtils, + checkChargingStation, } from '../../../charging-station'; import { OCPPError } from '../../../exception'; import { @@ -39,7 +39,6 @@ import { type OCPP16BootNotificationRequest, type OCPP16BootNotificationResponse, type OCPP16CancelReservationRequest, - type OCPP16CancelReservationResponse, OCPP16ChargePointErrorCode, OCPP16ChargePointStatus, type OCPP16ChargingProfile, @@ -88,7 +87,20 @@ import { type UnlockConnectorRequest, type UnlockConnectorResponse, } from '../../../types'; -import { Constants, Utils, logger } from '../../../utils'; +import { + Constants, + convertToDate, + convertToInt, + formatDurationMilliSeconds, + getRandomInteger, + isEmptyArray, + isNotEmptyArray, + isNotEmptyString, + isNullOrUndefined, + isUndefined, + logger, + sleep, +} from '../../../utils'; import { OCPPIncomingRequestService } from '../OCPPIncomingRequestService'; const moduleName = 'OCPP16IncomingRequestService'; @@ -413,7 +425,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { `${chargingStation.logPrefix()} ${ commandPayload.type } reset command received, simulating it. The station will be - back online in ${Utils.formatDurationMilliSeconds(chargingStation.stationInfo.resetTime)}` + back online in ${formatDurationMilliSeconds(chargingStation.stationInfo.resetTime)}` ); return OCPP16Constants.OCPP_RESPONSE_ACCEPTED; } @@ -460,9 +472,9 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { ): GetConfigurationResponse { const configurationKey: OCPPConfigurationKey[] = []; const unknownKey: string[] = []; - if (Utils.isUndefined(commandPayload.key) === true) { + if (isUndefined(commandPayload.key) === true) { for (const configuration of chargingStation.ocppConfiguration.configurationKey) { - if (Utils.isUndefined(configuration.visible) === true) { + if (isUndefined(configuration.visible) === true) { configuration.visible = true; } if (configuration.visible === false) { @@ -474,7 +486,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { value: configuration.value, }); } - } else if (Utils.isNotEmptyArray(commandPayload.key) === true) { + } else if (isNotEmptyArray(commandPayload.key) === true) { for (const key of commandPayload.key) { const keyFound = ChargingStationConfigurationUtils.getConfigurationKey( chargingStation, @@ -482,7 +494,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { true ); if (keyFound) { - if (Utils.isUndefined(keyFound.visible) === true) { + if (isUndefined(keyFound.visible) === true) { keyFound.visible = true; } if (keyFound.visible === false) { @@ -633,9 +645,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { return OCPP16Constants.OCPP_RESPONSE_REJECTED; } if ( - Utils.isEmptyArray( - chargingStation.getConnectorStatus(commandPayload.connectorId)?.chargingProfiles - ) + isEmptyArray(chargingStation.getConnectorStatus(commandPayload.connectorId)?.chargingProfiles) ) { return OCPP16Constants.OCPP_RESPONSE_REJECTED; } @@ -682,8 +692,8 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { return OCPP16Constants.OCPP_CLEAR_CHARGING_PROFILE_RESPONSE_UNKNOWN; } if ( - !Utils.isNullOrUndefined(commandPayload.connectorId) && - Utils.isNotEmptyArray( + !isNullOrUndefined(commandPayload.connectorId) && + isNotEmptyArray( chargingStation.getConnectorStatus(commandPayload.connectorId)?.chargingProfiles ) ) { @@ -695,10 +705,10 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { ); return OCPP16Constants.OCPP_CLEAR_CHARGING_PROFILE_RESPONSE_ACCEPTED; } - if (Utils.isNullOrUndefined(commandPayload.connectorId)) { + if (isNullOrUndefined(commandPayload.connectorId)) { let clearedCP = false; const clearChargingProfiles = (connectorStatus: ConnectorStatus) => { - if (Utils.isNotEmptyArray(connectorStatus?.chargingProfiles)) { + if (isNotEmptyArray(connectorStatus?.chargingProfiles)) { connectorStatus?.chargingProfiles?.forEach( (chargingProfile: OCPP16ChargingProfile, index: number) => { let clearCurrentCP = false; @@ -1063,7 +1073,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { return OCPP16Constants.OCPP_RESPONSE_EMPTY; } if ( - !Utils.isNullOrUndefined(chargingStation.stationInfo.firmwareStatus) && + !isNullOrUndefined(chargingStation.stationInfo.firmwareStatus) && chargingStation.stationInfo.firmwareStatus !== OCPP16FirmwareStatus.Installed ) { logger.warn( @@ -1072,7 +1082,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { ); return OCPP16Constants.OCPP_RESPONSE_EMPTY; } - const retrieveDate = Utils.convertToDate(commandPayload.retrieveDate); + const retrieveDate = convertToDate(commandPayload.retrieveDate); const now = Date.now(); if (retrieveDate?.getTime() <= now) { this.runInAsyncScope( @@ -1103,10 +1113,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { maxDelay = 30, minDelay = 15 ): Promise { - if ( - ChargingStationUtils.checkChargingStation(chargingStation, chargingStation.logPrefix()) === - false - ) { + if (checkChargingStation(chargingStation, chargingStation.logPrefix()) === false) { return; } if (chargingStation.hasEvses) { @@ -1148,7 +1155,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { chargingStation.stationInfo?.firmwareUpgrade?.failureStatus === OCPP16FirmwareStatus.DownloadFailed ) { - await Utils.sleep(Utils.getRandomInteger(maxDelay, minDelay) * 1000); + await sleep(getRandomInteger(maxDelay, minDelay) * 1000); await chargingStation.ocppRequestService.requestHandler< OCPP16FirmwareStatusNotificationRequest, OCPP16FirmwareStatusNotificationResponse @@ -1159,7 +1166,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { chargingStation.stationInfo?.firmwareUpgrade?.failureStatus; return; } - await Utils.sleep(Utils.getRandomInteger(maxDelay, minDelay) * 1000); + await sleep(getRandomInteger(maxDelay, minDelay) * 1000); await chargingStation.ocppRequestService.requestHandler< OCPP16FirmwareStatusNotificationRequest, OCPP16FirmwareStatusNotificationResponse @@ -1179,7 +1186,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { waitTime / 1000 } seconds before continuing firmware update simulation` ); - await Utils.sleep(waitTime); + await sleep(waitTime); transactionsStarted = true; wasTransactionsStarted = true; } else { @@ -1215,12 +1222,8 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { transactionsStarted = false; } } while (transactionsStarted); - !wasTransactionsStarted && - (await Utils.sleep(Utils.getRandomInteger(maxDelay, minDelay) * 1000)); - if ( - ChargingStationUtils.checkChargingStation(chargingStation, chargingStation.logPrefix()) === - false - ) { + !wasTransactionsStarted && (await sleep(getRandomInteger(maxDelay, minDelay) * 1000)); + if (checkChargingStation(chargingStation, chargingStation.logPrefix()) === false) { return; } await chargingStation.ocppRequestService.requestHandler< @@ -1234,7 +1237,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { chargingStation.stationInfo?.firmwareUpgrade?.failureStatus === OCPP16FirmwareStatus.InstallationFailed ) { - await Utils.sleep(Utils.getRandomInteger(maxDelay, minDelay) * 1000); + await sleep(getRandomInteger(maxDelay, minDelay) * 1000); await chargingStation.ocppRequestService.requestHandler< OCPP16FirmwareStatusNotificationRequest, OCPP16FirmwareStatusNotificationResponse @@ -1246,7 +1249,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { return; } if (chargingStation.stationInfo?.firmwareUpgrade?.reset === true) { - await Utils.sleep(Utils.getRandomInteger(maxDelay, minDelay) * 1000); + await sleep(getRandomInteger(maxDelay, minDelay) * 1000); await chargingStation.reset(OCPP16StopTransactionReason.REBOOT); } } @@ -1272,18 +1275,17 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { if (uri.protocol.startsWith('ftp:')) { let ftpClient: Client; try { - const logFiles = fs - .readdirSync(path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../')) + const logFiles = readdirSync(resolve(dirname(fileURLToPath(import.meta.url)), '../')) .filter((file) => file.endsWith('.log')) - .map((file) => path.join('./', file)); + .map((file) => join('./', file)); const diagnosticsArchive = `${chargingStation.stationInfo.chargingStationId}_logs.tar.gz`; - tar.create({ gzip: true }, logFiles).pipe(fs.createWriteStream(diagnosticsArchive)); + create({ gzip: true }, logFiles).pipe(createWriteStream(diagnosticsArchive)); ftpClient = new Client(); const accessResponse = await ftpClient.access({ host: uri.host, - ...(Utils.isNotEmptyString(uri.port) && { port: Utils.convertToInt(uri.port) }), - ...(Utils.isNotEmptyString(uri.username) && { user: uri.username }), - ...(Utils.isNotEmptyString(uri.password) && { password: uri.password }), + ...(isNotEmptyString(uri.port) && { port: convertToInt(uri.port) }), + ...(isNotEmptyString(uri.username) && { user: uri.username }), + ...(isNotEmptyString(uri.password) && { password: uri.password }), }); let uploadResponse: FTPResponse; if (accessResponse.code === 220) { @@ -1309,10 +1311,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { }); }); uploadResponse = await ftpClient.uploadFrom( - path.join( - path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../'), - diagnosticsArchive - ), + join(resolve(dirname(fileURLToPath(import.meta.url)), '../'), diagnosticsArchive), `${uri.pathname}${diagnosticsArchive}` ); if (uploadResponse.code === 226) { @@ -1434,7 +1433,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { return OCPP16Constants.OCPP_TRIGGER_MESSAGE_RESPONSE_ACCEPTED; case OCPP16MessageTrigger.StatusNotification: setTimeout(() => { - if (!Utils.isNullOrUndefined(commandPayload?.connectorId)) { + if (!isNullOrUndefined(commandPayload?.connectorId)) { chargingStation.ocppRequestService .requestHandler( chargingStation, @@ -1601,7 +1600,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { private async handleRequestCancelReservation( chargingStation: ChargingStation, commandPayload: OCPP16CancelReservationRequest - ): Promise { + ): Promise { if ( !OCPP16ServiceUtils.checkFeatureProfile( chargingStation,