// Partial Copyright Jerome Benoit. 2021-2024. All Rights Reserved.
+import { randomInt } from 'node:crypto'
import { createWriteStream, readdirSync } from 'node:fs'
import { dirname, extname, join, resolve } from 'node:path'
import { fileURLToPath, URL } from 'node:url'
secondsToMilliseconds
} from 'date-fns'
import { maxTime } from 'date-fns/constants'
+import { isEmpty } from 'rambda'
import { create } from 'tar'
import {
convertToDate,
convertToInt,
formatDurationMilliSeconds,
- getRandomInteger,
isAsyncFunction,
- isEmptyArray,
isNotEmptyArray,
isNotEmptyString,
logger,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
chargingStation.getConnectorStatus(connectorId)!.transactionRemoteStarted = true
chargingStation.ocppRequestService
- .requestHandler<OCPP16StartTransactionRequest, OCPP16StartTransactionResponse>(
+ .requestHandler<Partial<OCPP16StartTransactionRequest>, OCPP16StartTransactionResponse>(
chargingStation,
OCPP16RequestCommand.START_TRANSACTION,
{
)
}
})
- .catch(error => {
+ .catch((error: unknown) => {
logger.error(
`${chargingStation.logPrefix()} ${moduleName}.constructor: Remote start transaction error:`,
error
)
}
})
- .catch(error => {
+ .catch((error: unknown) => {
logger.error(
`${chargingStation.logPrefix()} ${moduleName}.constructor: Remote stop transaction error:`,
error
return
}
const { requestedMessage, connectorId } = request
- const errorHandler = (error: Error): void => {
+ const errorHandler = (error: unknown): void => {
logger.error(
`${chargingStation.logPrefix()} ${moduleName}.constructor: Trigger ${requestedMessage} error:`,
error
.requestHandler<OCPP16BootNotificationRequest, OCPP16BootNotificationResponse>(
chargingStation,
OCPP16RequestCommand.BOOT_NOTIFICATION,
- chargingStation.bootNotificationRequest,
+ chargingStation.bootNotificationRequest as OCPP16BootNotificationRequest,
{ skipBufferingOnError: true, triggerMessage: true }
)
.then(response => {
{
connectorId,
errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
- status: chargingStation.getConnectorStatus(connectorId)?.status
+ status: chargingStation.getConnectorStatus(connectorId)
+ ?.status as OCPP16ChargePointStatus
},
{
triggerMessage: true
{
connectorId: id,
errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
- status: connectorStatus.status
+ status: connectorStatus.status as OCPP16ChargePointStatus
},
{
triggerMessage: true
{
connectorId: id,
errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
- status: connectorStatus.status
+ status: connectorStatus.status as OCPP16ChargePointStatus
},
{
triggerMessage: true
}
const connectorStatus = chargingStation.getConnectorStatus(connectorId)
if (
- isEmptyArray(connectorStatus?.chargingProfiles) &&
- isEmptyArray(chargingStation.getConnectorStatus(0)?.chargingProfiles)
+ isEmpty(connectorStatus?.chargingProfiles) &&
+ isEmpty(chargingStation.getConnectorStatus(0)?.chargingProfiles)
) {
return OCPP16Constants.OCPP_RESPONSE_REJECTED
}
): Promise<GenericResponse> {
const { connectorId: transactionConnectorId, idTag, chargingProfile } = commandPayload
if (!chargingStation.hasConnector(transactionConnectorId)) {
- return await this.notifyRemoteStartTransactionRejected(
+ return this.notifyRemoteStartTransactionRejected(
chargingStation,
transactionConnectorId,
idTag
!chargingStation.isChargingStationAvailable() ||
!chargingStation.isConnectorAvailable(transactionConnectorId)
) {
- return await this.notifyRemoteStartTransactionRejected(
+ return this.notifyRemoteStartTransactionRejected(
chargingStation,
transactionConnectorId,
idTag
chargingStation.getAuthorizeRemoteTxRequests() &&
!(await OCPP16ServiceUtils.isIdTagAuthorized(chargingStation, transactionConnectorId, idTag))
) {
- return await this.notifyRemoteStartTransactionRejected(
+ return this.notifyRemoteStartTransactionRejected(
chargingStation,
transactionConnectorId,
idTag
)
}
- await OCPP16ServiceUtils.sendAndSetConnectorStatus(
- chargingStation,
- transactionConnectorId,
- OCPP16ChargePointStatus.Preparing
- )
if (
chargingProfile != null &&
!this.setRemoteStartTransactionChargingProfile(
chargingProfile
)
) {
- return await this.notifyRemoteStartTransactionRejected(
+ return this.notifyRemoteStartTransactionRejected(
chargingStation,
transactionConnectorId,
idTag
)
}
logger.debug(
- `${chargingStation.logPrefix()} Remote start transaction ACCEPTED on connector id ${transactionConnectorId}, idTag '${idTag}'`
+ `${chargingStation.logPrefix()} Remote start transaction ACCEPTED on ${chargingStation.stationInfo?.chargingStationId}#${transactionConnectorId}}, idTag '${idTag}'`
)
return OCPP16Constants.OCPP_RESPONSE_ACCEPTED
}
- private async notifyRemoteStartTransactionRejected (
+ private notifyRemoteStartTransactionRejected (
chargingStation: ChargingStation,
connectorId: number,
idTag: string
- ): Promise<GenericResponse> {
+ ): GenericResponse {
const connectorStatus = chargingStation.getConnectorStatus(connectorId)
- if (connectorStatus?.status !== OCPP16ChargePointStatus.Available) {
- await OCPP16ServiceUtils.sendAndSetConnectorStatus(
- chargingStation,
- connectorId,
- OCPP16ChargePointStatus.Available
- )
- }
logger.debug(
- `${chargingStation.logPrefix()} Remote start transaction REJECTED on connector id ${connectorId}, idTag '${idTag}', availability '${connectorStatus?.availability}', status '${connectorStatus?.status}'`
+ `${chargingStation.logPrefix()} Remote start transaction REJECTED on ${chargingStation.stationInfo?.chargingStationId}#${connectorId}, idTag '${idTag}', availability '${connectorStatus?.availability}', status '${connectorStatus?.status}'`
)
return OCPP16Constants.OCPP_RESPONSE_REJECTED
}
if (chargingProfile.chargingProfilePurpose === OCPP16ChargingProfilePurposeType.TX_PROFILE) {
OCPP16ServiceUtils.setChargingProfile(chargingStation, connectorId, chargingProfile)
logger.debug(
- `${chargingStation.logPrefix()} Charging profile(s) set at remote start transaction on connector id ${connectorId}: %j`,
+ `${chargingStation.logPrefix()} Charging profile(s) set at remote start transaction on ${chargingStation.stationInfo?.chargingStationId}#${connectorId}`,
chargingProfile
)
return true
chargingStation.stationInfo?.firmwareUpgrade?.failureStatus ===
OCPP16FirmwareStatus.DownloadFailed
) {
- await sleep(secondsToMilliseconds(getRandomInteger(maxDelay, minDelay)))
+ await sleep(secondsToMilliseconds(randomInt(minDelay, maxDelay)))
await chargingStation.ocppRequestService.requestHandler<
OCPP16FirmwareStatusNotificationRequest,
OCPP16FirmwareStatusNotificationResponse
chargingStation.stationInfo.firmwareUpgrade.failureStatus
return
}
- await sleep(secondsToMilliseconds(getRandomInteger(maxDelay, minDelay)))
+ await sleep(secondsToMilliseconds(randomInt(minDelay, maxDelay)))
await chargingStation.ocppRequestService.requestHandler<
OCPP16FirmwareStatusNotificationRequest,
OCPP16FirmwareStatusNotificationResponse
transactionsStarted = false
}
} while (transactionsStarted)
- !wasTransactionsStarted &&
- (await sleep(secondsToMilliseconds(getRandomInteger(maxDelay, minDelay))))
+ !wasTransactionsStarted && (await sleep(secondsToMilliseconds(randomInt(minDelay, maxDelay))))
if (!checkChargingStation(chargingStation, chargingStation.logPrefix())) {
return
}
chargingStation.stationInfo?.firmwareUpgrade?.failureStatus ===
OCPP16FirmwareStatus.InstallationFailed
) {
- await sleep(secondsToMilliseconds(getRandomInteger(maxDelay, minDelay)))
+ await sleep(secondsToMilliseconds(randomInt(minDelay, maxDelay)))
await chargingStation.ocppRequestService.requestHandler<
OCPP16FirmwareStatusNotificationRequest,
OCPP16FirmwareStatusNotificationResponse
return
}
if (chargingStation.stationInfo?.firmwareUpgrade?.reset === true) {
- await sleep(secondsToMilliseconds(getRandomInteger(maxDelay, minDelay)))
+ await sleep(secondsToMilliseconds(randomInt(minDelay, maxDelay)))
await chargingStation.reset(OCPP16StopTransactionReason.REBOOT)
}
}
>(chargingStation, OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION, {
status: OCPP16DiagnosticsStatus.Uploading
})
- .catch(error => {
+ .catch((error: unknown) => {
logger.error(
`${chargingStation.logPrefix()} ${moduleName}.handleRequestGetDiagnostics: Error while sending '${
OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION