type OCPP16DiagnosticsStatusNotificationRequest,
type OCPP16FirmwareStatusNotificationRequest,
type OCPP16HeartbeatRequest,
+ type OCPP16MeterValue,
type OCPP16MeterValuesRequest,
OCPP16RequestCommand,
type OCPP16StartTransactionRequest,
OCPPVersion,
type RequestParams,
} from '../../../types/index.js'
-import { Constants, generateUUID } from '../../../utils/index.js'
+import { Constants, generateUUID, logger } from '../../../utils/index.js'
import { OCPPRequestService } from '../OCPPRequestService.js'
import { OCPP16Constants } from './OCPP16Constants.js'
import { OCPP16ServiceUtils } from './OCPP16ServiceUtils.js'
commandParams?: RequestType,
params?: RequestParams
): Promise<ResponseType> {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.requestHandler: Processing '${commandName}' request`
+ )
// FIXME?: add sanity checks on charging station availability, connector availability, connector status, etc.
if (OCPP16ServiceUtils.isRequestCommandSupported(chargingStation, commandName)) {
- // Pre request actions hook
- switch (commandName) {
- case OCPP16RequestCommand.START_TRANSACTION:
- await OCPP16ServiceUtils.sendAndSetConnectorStatus(
- chargingStation,
- (commandParams as OCPP16StartTransactionRequest).connectorId,
- OCPP16ChargePointStatus.Preparing
- )
- break
+ try {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.requestHandler: Building request payload for '${commandName}'`
+ )
+ const requestPayload = this.buildRequestPayload<RequestType>(
+ chargingStation,
+ commandName,
+ commandParams
+ )
+ const messageId = generateUUID()
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.requestHandler: Sending '${commandName}' request with message ID '${messageId}'`
+ )
+ // Pre request actions hook
+ switch (commandName) {
+ case OCPP16RequestCommand.START_TRANSACTION:
+ await OCPP16ServiceUtils.sendAndSetConnectorStatus(
+ chargingStation,
+ (commandParams as OCPP16StartTransactionRequest).connectorId,
+ OCPP16ChargePointStatus.Preparing
+ )
+ break
+ }
+ const response = (await this.sendMessage(
+ chargingStation,
+ messageId,
+ requestPayload,
+ commandName,
+ params
+ )) as ResponseType
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.requestHandler: '${commandName}' request completed successfully`
+ )
+ return response
+ } catch (error) {
+ logger.error(
+ `${chargingStation.logPrefix()} ${moduleName}.requestHandler: Error processing '${commandName}' request:`,
+ error
+ )
+ throw error
}
- return (await this.sendMessage(
- chargingStation,
- generateUUID(),
- this.buildRequestPayload<RequestType>(chargingStation, commandName, commandParams),
- commandName,
- params
- )) as ResponseType
}
// OCPPError usage here is debatable: it's an error in the OCPP stack but not targeted to sendError().
- throw new OCPPError(
- ErrorType.NOT_SUPPORTED,
- `Unsupported OCPP command ${commandName}`,
- commandName,
- commandParams
- )
+ const errorMsg = `Unsupported OCPP command ${commandName}`
+ logger.error(`${chargingStation.logPrefix()} ${moduleName}.requestHandler: ${errorMsg}`)
+ throw new OCPPError(ErrorType.NOT_SUPPORTED, errorMsg, commandName, commandParams)
}
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
commandParams = commandParams as JsonObject
switch (commandName) {
case OCPP16RequestCommand.AUTHORIZE:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP16RequestCommand.AUTHORIZE} payload with default idTag`
+ )
return {
idTag: Constants.DEFAULT_IDTAG,
...commandParams,
} as unknown as Request
case OCPP16RequestCommand.BOOT_NOTIFICATION:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP16RequestCommand.BOOT_NOTIFICATION} payload`
+ )
+ return commandParams as unknown as Request
case OCPP16RequestCommand.DATA_TRANSFER:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP16RequestCommand.DATA_TRANSFER} payload`
+ )
+ return commandParams as unknown as Request
case OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION} payload`
+ )
+ return commandParams as unknown as Request
case OCPP16RequestCommand.FIRMWARE_STATUS_NOTIFICATION:
- case OCPP16RequestCommand.METER_VALUES:
- case OCPP16RequestCommand.STATUS_NOTIFICATION:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP16RequestCommand.FIRMWARE_STATUS_NOTIFICATION} payload`
+ )
return commandParams as unknown as Request
case OCPP16RequestCommand.HEARTBEAT:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP16RequestCommand.HEARTBEAT} payload (empty)`
+ )
return OCPP16Constants.OCPP_REQUEST_EMPTY as unknown as Request
+ case OCPP16RequestCommand.METER_VALUES:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP16RequestCommand.METER_VALUES} payload`
+ )
+ return commandParams as unknown as Request
case OCPP16RequestCommand.START_TRANSACTION:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP16RequestCommand.START_TRANSACTION} payload with meter start and timestamp`
+ )
return {
idTag: Constants.DEFAULT_IDTAG,
meterStart: chargingStation.getEnergyActiveImportRegisterByConnectorId(
}),
...commandParams,
} as unknown as Request
+ case OCPP16RequestCommand.STATUS_NOTIFICATION:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP16RequestCommand.STATUS_NOTIFICATION} payload`
+ )
+ return commandParams as unknown as Request
case OCPP16RequestCommand.STOP_TRANSACTION:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP16RequestCommand.STOP_TRANSACTION} payload with meter stop and timestamp`
+ )
chargingStation.stationInfo?.transactionDataMeterValues === true &&
(connectorId = chargingStation.getConnectorIdByTransactionId(
commandParams.transactionId as number
...(chargingStation.stationInfo?.transactionDataMeterValues === true && {
transactionData: OCPP16ServiceUtils.buildTransactionDataMeterValues(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- chargingStation.getConnectorStatus(connectorId!)!.transactionBeginMeterValue!,
+ chargingStation.getConnectorStatus(connectorId!)!
+ .transactionBeginMeterValue! as OCPP16MeterValue,
OCPP16ServiceUtils.buildTransactionEndMeterValue(
chargingStation,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
connectorId!,
energyActiveImportRegister
- )
+ ) as OCPP16MeterValue
),
}),
...commandParams,
} as unknown as Request
- default:
+ default: {
// OCPPError usage here is debatable: it's an error in the OCPP stack but not targeted to sendError().
- throw new OCPPError(
- ErrorType.NOT_SUPPORTED,
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
- `Unsupported OCPP command ${commandName}`,
- commandName,
- commandParams
+ const errorMsg = `Unsupported OCPP command ${commandName as string} for payload building`
+ logger.error(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: ${errorMsg}`
)
+ throw new OCPPError(ErrorType.NOT_SUPPORTED, errorMsg, commandName, commandParams)
+ }
}
}
}
type OCPP16GetCompositeScheduleResponse,
type OCPP16HeartbeatResponse,
OCPP16IncomingRequestCommand,
+ type OCPP16MeterValue,
type OCPP16MeterValuesRequest,
type OCPP16MeterValuesResponse,
OCPP16RequestCommand,
) {
try {
this.validatePayload(chargingStation, commandName, payload)
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.responseHandler: Handling '${commandName}' response`
+ )
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const responseHandler = this.responseHandlers.get(commandName)!
if (isAsyncFunction(responseHandler)) {
) => void
)(chargingStation, payload, requestPayload)
}
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.responseHandler: '${commandName}' response processed successfully`
+ )
} catch (error) {
logger.error(
- `${chargingStation.logPrefix()} ${moduleName}.responseHandler: Handle response error:`,
+ `${chargingStation.logPrefix()} ${moduleName}.responseHandler: Handle '${commandName}' response error:`,
error
)
throw error
chargingStation.bootNotificationResponse = payload
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (payload.interval != null) {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseBootNotification: Setting HeartbeatInterval to ${payload.interval.toString()}s`
+ )
addConfigurationKey(
chargingStation,
OCPP16StandardParametersKey.HeartbeatInterval,
)
}
if (chargingStation.inAcceptedState()) {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseBootNotification: Emitting '${RegistrationStatusEnumType.ACCEPTED}' event`
+ )
chargingStation.emitChargingStationEvent(ChargingStationEvents.accepted)
} else if (chargingStation.inPendingState()) {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseBootNotification: Emitting '${RegistrationStatusEnumType.REJECTED}' event`
+ )
chargingStation.emitChargingStationEvent(ChargingStationEvents.pending)
} else if (chargingStation.inRejectedState()) {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseBootNotification: Emitting '${RegistrationStatusEnumType.ACCEPTED}' event`
+ )
chargingStation.emitChargingStationEvent(ChargingStationEvents.rejected)
}
const logMsg = `${chargingStation.logPrefix()} ${moduleName}.handleResponseBootNotification: Charging station in '${
chargingStation,
transactionConnectorId,
requestPayload.meterStop
- ),
+ ) as OCPP16MeterValue,
],
transactionId: requestPayload.transactionId,
}))
payload: JsonType
): boolean {
if (this.payloadValidateFunctions.has(commandName)) {
- return this.validateResponsePayload(chargingStation, commandName, payload)
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.validatePayload: Validating '${commandName}' response payload`
+ )
+ const isValid = this.validateResponsePayload(chargingStation, commandName, payload)
+ if (!isValid) {
+ logger.warn(
+ `${chargingStation.logPrefix()} ${moduleName}.validatePayload: '${commandName}' response payload validation failed`
+ )
+ } else {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.validatePayload: '${commandName}' response payload validation successful`
+ )
+ }
+ return isValid
}
logger.warn(
`${chargingStation.logPrefix()} ${moduleName}.validatePayload: No JSON schema validation function found for command '${commandName}' PDU validation`
// Validate that EVSE ID is provided
if (evseId == null) {
const errorMsg = 'EVSE ID is required for RequestStartTransaction'
- logger.error(
+ logger.warn(
`${chargingStation.logPrefix()} ${moduleName}.handleRequestRequestStartTransaction: ${errorMsg}`
)
throw new OCPPError(
const evse = chargingStation.evses.get(evseId)
if (evse == null) {
const errorMsg = `EVSE ${evseId.toString()} does not exist on charging station`
- logger.error(
+ logger.warn(
`${chargingStation.logPrefix()} ${moduleName}.handleRequestRequestStartTransaction: ${errorMsg}`
)
throw new OCPPError(
if (connectorStatus == null || connectorId == null) {
const errorMsg = `Connector ${connectorId?.toString() ?? 'undefined'} status is undefined`
- logger.error(
+ logger.warn(
`${chargingStation.logPrefix()} ${moduleName}.handleRequestRequestStartTransaction: ${errorMsg}`
)
throw new OCPPError(
try {
// Set connector transaction state
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleRequestRequestStartTransaction: Setting transaction state for connector ${connectorId.toString()}, transaction ID: ${transactionId}`
+ )
connectorStatus.transactionStarted = true
connectorStatus.transactionId = transactionId
connectorStatus.transactionIdTag = idToken.idToken
connectorStatus.transactionStart = new Date()
connectorStatus.transactionEnergyActiveImportRegisterValue = 0
connectorStatus.remoteStartId = remoteStartId
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleRequestRequestStartTransaction: Transaction state set successfully for connector ${connectorId.toString()}`
+ )
// Update connector status to Occupied
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleRequestRequestStartTransaction: Updating connector ${connectorId.toString()} status to Occupied`
+ )
await sendAndSetConnectorStatus(
chargingStation,
connectorId,
}
logger.info(
- `${chargingStation.logPrefix()} ${moduleName}.handleRequestRequestStartTransaction: Remote start transaction accepted on EVSE ${evseId.toString()}, connector ${connectorId.toString()} with transaction ID ${transactionId} for idToken ${idToken.idToken}`
+ `${chargingStation.logPrefix()} ${moduleName}.handleRequestRequestStartTransaction: Remote start transaction ACCEPTED on #${connectorId.toString()} for idToken '${idToken.idToken}'`
)
return {
if (stopResponse.status === GenericStatus.Accepted) {
logger.info(
- `${chargingStation.logPrefix()} ${moduleName}.handleRequestRequestStopTransaction: Remote stop transaction accepted for transaction ID ${transactionId} on connector ${connectorId.toString()}`
+ `${chargingStation.logPrefix()} ${moduleName}.handleRequestRequestStopTransaction: Remote stop transaction ACCEPTED for transactionId '${transactionId}'`
)
return {
status: RequestStartStopStatusEnumType.Accepted,
}
logger.warn(
- `${chargingStation.logPrefix()} ${moduleName}.handleRequestRequestStopTransaction: Remote stop transaction rejected for transaction ID ${transactionId} on connector ${connectorId.toString()}`
+ `${chargingStation.logPrefix()} ${moduleName}.handleRequestRequestStopTransaction: Remote stop transaction REJECTED for transactionId '${transactionId}'`
)
return {
status: RequestStartStopStatusEnumType.Rejected,
OCPPVersion,
type RequestParams,
} from '../../../types/index.js'
-import { generateUUID } from '../../../utils/index.js'
+import { generateUUID, logger } from '../../../utils/index.js'
import { OCPPRequestService } from '../OCPPRequestService.js'
import { OCPP20Constants } from './OCPP20Constants.js'
import { OCPP20ServiceUtils } from './OCPP20ServiceUtils.js'
commandParams?: RequestType,
params?: RequestParams
): Promise<ResponseType> {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.requestHandler: Processing '${commandName}' request`
+ )
// FIXME?: add sanity checks on charging station availability, connector availability, connector status, etc.
if (OCPP20ServiceUtils.isRequestCommandSupported(chargingStation, commandName)) {
- // TODO: pre request actions hook
- return (await this.sendMessage(
- chargingStation,
- generateUUID(),
- this.buildRequestPayload<RequestType>(chargingStation, commandName, commandParams),
- commandName,
- params
- )) as ResponseType
+ try {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.requestHandler: Building request payload for '${commandName}'`
+ )
+ const requestPayload = this.buildRequestPayload<RequestType>(
+ chargingStation,
+ commandName,
+ commandParams
+ )
+ const messageId = generateUUID()
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.requestHandler: Sending '${commandName}' request with message ID '${messageId}'`
+ )
+ // TODO: pre request actions hook
+ const response = (await this.sendMessage(
+ chargingStation,
+ messageId,
+ requestPayload,
+ commandName,
+ params
+ )) as ResponseType
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.requestHandler: '${commandName}' request completed successfully`
+ )
+ return response
+ } catch (error) {
+ logger.error(
+ `${chargingStation.logPrefix()} ${moduleName}.requestHandler: Error processing '${commandName}' request:`,
+ error
+ )
+ throw error
+ }
}
// OCPPError usage here is debatable: it's an error in the OCPP stack but not targeted to sendError().
- throw new OCPPError(
- ErrorType.NOT_SUPPORTED,
- `Unsupported OCPP command ${commandName}`,
- commandName,
- commandParams
- )
+ const errorMsg = `Unsupported OCPP command ${commandName}`
+ logger.error(`${chargingStation.logPrefix()} ${moduleName}.requestHandler: ${errorMsg}`)
+ throw new OCPPError(ErrorType.NOT_SUPPORTED, errorMsg, commandName, commandParams)
}
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
commandParams = commandParams as JsonObject
switch (commandName) {
case OCPP20RequestCommand.BOOT_NOTIFICATION:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP20RequestCommand.BOOT_NOTIFICATION} payload`
+ )
return commandParams as unknown as Request
case OCPP20RequestCommand.HEARTBEAT:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP20RequestCommand.HEARTBEAT} payload (empty)`
+ )
return OCPP20Constants.OCPP_RESPONSE_EMPTY as unknown as Request
case OCPP20RequestCommand.NOTIFY_REPORT:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP20RequestCommand.NOTIFY_REPORT} payload`
+ )
return {
...commandParams,
} as unknown as Request
case OCPP20RequestCommand.STATUS_NOTIFICATION:
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building ${OCPP20RequestCommand.STATUS_NOTIFICATION} payload with timestamp`
+ )
return {
timestamp: new Date(),
...commandParams,
} as unknown as Request
- default:
+ default: {
// OCPPError usage here is debatable: it's an error in the OCPP stack but not targeted to sendError().
- throw new OCPPError(
- ErrorType.NOT_SUPPORTED,
- `Unsupported OCPP command ${commandName}`,
- commandName,
- commandParams
+ const errorMsg = `Unsupported OCPP command ${commandName} for payload building`
+ logger.error(
+ `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: ${errorMsg}`
)
+ throw new OCPPError(ErrorType.NOT_SUPPORTED, errorMsg, commandName, commandParams)
+ }
}
}
}
OCPP20RequestCommand.BOOT_NOTIFICATION,
this.handleResponseBootNotification.bind(this) as ResponseHandler,
],
- [OCPP20RequestCommand.HEARTBEAT, this.emptyResponseHandler],
- [OCPP20RequestCommand.NOTIFY_REPORT, this.emptyResponseHandler],
- [OCPP20RequestCommand.STATUS_NOTIFICATION, this.emptyResponseHandler],
+ [OCPP20RequestCommand.HEARTBEAT, this.handleResponseHeartbeat.bind(this) as ResponseHandler],
+ [
+ OCPP20RequestCommand.NOTIFY_REPORT,
+ this.handleResponseNotifyReport.bind(this) as ResponseHandler,
+ ],
+ [
+ OCPP20RequestCommand.STATUS_NOTIFICATION,
+ this.handleResponseStatusNotification.bind(this) as ResponseHandler,
+ ],
])
this.payloadValidateFunctions = new Map<OCPP20RequestCommand, ValidateFunction<JsonType>>([
[
) {
try {
this.validatePayload(chargingStation, commandName, payload)
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.responseHandler: Handling '${commandName}' response`
+ )
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const responseHandler = this.responseHandlers.get(commandName)!
if (isAsyncFunction(responseHandler)) {
) => void
)(chargingStation, payload, requestPayload)
}
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.responseHandler: '${commandName}' response processed successfully`
+ )
} catch (error) {
logger.error(
- `${chargingStation.logPrefix()} ${moduleName}.responseHandler: Handle response error:`,
+ `${chargingStation.logPrefix()} ${moduleName}.responseHandler: Handle '${commandName}' response error:`,
error
)
throw error
chargingStation.bootNotificationResponse = payload
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (payload.interval != null) {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseBootNotification: Setting HeartbeatInterval to ${payload.interval.toString()}s`
+ )
addConfigurationKey(
chargingStation,
OCPP20OptionalVariableName.HeartbeatInterval,
)
}
if (chargingStation.inAcceptedState()) {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseBootNotification: Emitting '${RegistrationStatusEnumType.ACCEPTED}' event`
+ )
chargingStation.emitChargingStationEvent(ChargingStationEvents.accepted)
} else if (chargingStation.inPendingState()) {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseBootNotification: Emitting '${RegistrationStatusEnumType.PENDING}' event`
+ )
chargingStation.emitChargingStationEvent(ChargingStationEvents.pending)
} else if (chargingStation.inRejectedState()) {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseBootNotification: Emitting '${RegistrationStatusEnumType.REJECTED}' event`
+ )
chargingStation.emitChargingStationEvent(ChargingStationEvents.rejected)
}
- const logMsg = `${chargingStation.logPrefix()} Charging station in '${
+ const logMsg = `${chargingStation.logPrefix()} ${moduleName}.handleResponseBootNotification: Charging station in '${
payload.status
}' state on the central server`
payload.status === RegistrationStatusEnumType.REJECTED
} else {
delete chargingStation.bootNotificationResponse
logger.error(
- `${chargingStation.logPrefix()} Charging station boot notification response received: %j with undefined registration status`,
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseBootNotification: Charging station boot notification response received: %j with undefined registration status`,
payload
)
}
}
+ private handleResponseHeartbeat (
+ chargingStation: ChargingStation,
+ payload: OCPP20HeartbeatResponse
+ ): void {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseHeartbeat: Heartbeat response received at ${payload.currentTime.toISOString()}`
+ )
+ }
+
+ private handleResponseNotifyReport (
+ chargingStation: ChargingStation,
+ payload: OCPP20NotifyReportResponse
+ ): void {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseNotifyReport: NotifyReport response received successfully`
+ )
+ }
+
+ private handleResponseStatusNotification (
+ chargingStation: ChargingStation,
+ payload: OCPP20StatusNotificationResponse
+ ): void {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.handleResponseStatusNotification: StatusNotification response received successfully`
+ )
+ }
+
private validatePayload (
chargingStation: ChargingStation,
commandName: OCPP20RequestCommand,
payload: JsonType
): boolean {
if (this.payloadValidateFunctions.has(commandName)) {
- return this.validateResponsePayload(chargingStation, commandName, payload)
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.validatePayload: Validating '${commandName}' response payload`
+ )
+ const isValid = this.validateResponsePayload(chargingStation, commandName, payload)
+ if (!isValid) {
+ logger.warn(
+ `${chargingStation.logPrefix()} ${moduleName}.validatePayload: '${commandName}' response payload validation failed`
+ )
+ } else {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.validatePayload: '${commandName}' response payload validation successful`
+ )
+ }
+ return isValid
}
logger.warn(
`${chargingStation.logPrefix()} ${moduleName}.validatePayload: No JSON schema validation function found for command '${commandName}' PDU validation`