DiagnosticsStatusNotificationRequest,
GetConfigurationRequest,
GetDiagnosticsRequest,
- MessageTrigger,
OCPP16AvailabilityType,
OCPP16BootNotificationRequest,
OCPP16ClearCacheRequest,
+ OCPP16DataTransferRequest,
+ OCPP16DataTransferVendorId,
OCPP16HeartbeatRequest,
OCPP16IncomingRequestCommand,
+ OCPP16MessageTrigger,
OCPP16RequestCommand,
OCPP16StatusNotificationRequest,
OCPP16TriggerMessageRequest,
SetChargingProfileRequest,
UnlockConnectorRequest,
} from '../../../types/ocpp/1.6/Requests';
-import type {
+import {
ChangeAvailabilityResponse,
ChangeConfigurationResponse,
ClearChargingProfileResponse,
GetConfigurationResponse,
GetDiagnosticsResponse,
OCPP16BootNotificationResponse,
+ OCPP16DataTransferResponse,
+ OCPP16DataTransferStatus,
OCPP16HeartbeatResponse,
OCPP16StatusNotificationResponse,
OCPP16TriggerMessageResponse,
],
[OCPP16IncomingRequestCommand.GET_DIAGNOSTICS, this.handleRequestGetDiagnostics.bind(this)],
[OCPP16IncomingRequestCommand.TRIGGER_MESSAGE, this.handleRequestTriggerMessage.bind(this)],
+ [OCPP16IncomingRequestCommand.DATA_TRANSFER, this.handleRequestDataTransfer.bind(this)],
]);
this.jsonSchemas = new Map<OCPP16IncomingRequestCommand, JSONSchemaType<JsonObject>>([
[
)
) as JSONSchemaType<OCPP16TriggerMessageRequest>,
],
+ [
+ OCPP16IncomingRequestCommand.DATA_TRANSFER,
+ JSON.parse(
+ fs.readFileSync(
+ path.resolve(
+ path.dirname(fileURLToPath(import.meta.url)),
+ '../../../assets/json-schemas/ocpp/1.6/DataTransfer.json'
+ ),
+ 'utf8'
+ )
+ ) as JSONSchemaType<OCPP16DataTransferRequest>,
+ ],
]);
this.validatePayload.bind(this);
}
): Promise<void> {
let response: JsonType;
if (
- chargingStation.getOcppStrictCompliance() &&
- chargingStation.isInPendingState() &&
+ chargingStation.getOcppStrictCompliance() === true &&
+ chargingStation.isInPendingState() === true &&
(commandName === OCPP16IncomingRequestCommand.REMOTE_START_TRANSACTION ||
commandName === OCPP16IncomingRequestCommand.REMOTE_STOP_TRANSACTION)
) {
);
}
if (
- chargingStation.isRegistered() ||
- (!chargingStation.getOcppStrictCompliance() && chargingStation.isInUnknownState())
+ chargingStation.isRegistered() === true ||
+ (chargingStation.getOcppStrictCompliance() === false &&
+ chargingStation.isInUnknownState() === true)
) {
if (
- this.incomingRequestHandlers.has(commandName) &&
- OCPP16ServiceUtils.isIncomingRequestCommandSupported(chargingStation, commandName)
+ this.incomingRequestHandlers.has(commandName) === true &&
+ OCPP16ServiceUtils.isIncomingRequestCommandSupported(chargingStation, commandName) === true
) {
try {
this.validatePayload(chargingStation, commandName, commandPayload);
chargingStation: ChargingStation,
commandPayload: ResetRequest
): DefaultResponse {
- this.asyncResource.runInAsyncScope(
- chargingStation.reset.bind(chargingStation) as (
- this: ChargingStation,
- ...args: any[]
- ) => void,
- chargingStation,
- (commandPayload.type + 'Reset') as OCPP16StopTransactionReason
- );
+ this.asyncResource
+ .runInAsyncScope(
+ chargingStation.reset.bind(chargingStation) as (
+ this: ChargingStation,
+ ...args: any[]
+ ) => Promise<void>,
+ chargingStation,
+ (commandPayload.type + 'Reset') as OCPP16StopTransactionReason
+ )
+ .catch(() => {
+ /* This is intentional */
+ });
logger.info(
`${chargingStation.logPrefix()} ${
commandPayload.type
commandPayload: UnlockConnectorRequest
): Promise<UnlockConnectorResponse> {
const connectorId = commandPayload.connectorId;
+ if (chargingStation.connectors.has(connectorId) === false) {
+ logger.error(
+ `${chargingStation.logPrefix()} Trying to unlock a non existing connector Id ${connectorId.toString()}`
+ );
+ return Constants.OCPP_RESPONSE_UNLOCK_NOT_SUPPORTED;
+ }
if (connectorId === 0) {
logger.error(
- chargingStation.logPrefix() + ' Trying to unlock connector ' + connectorId.toString()
+ chargingStation.logPrefix() + ' Trying to unlock connector Id ' + connectorId.toString()
);
return Constants.OCPP_RESPONSE_UNLOCK_NOT_SUPPORTED;
}
chargingStation.getConnectorStatus(commandPayload.connectorId)?.transactionStarted ===
false)
) {
+ logger.error(
+ `${chargingStation.logPrefix()} Trying to set transaction charging profile(s) on connector ${
+ commandPayload.connectorId
+ } without a started transaction`
+ );
return Constants.OCPP_SET_CHARGING_PROFILE_RESPONSE_REJECTED;
}
OCPP16ServiceUtils.setChargingProfile(
commandPayload: ChangeAvailabilityRequest
): Promise<ChangeAvailabilityResponse> {
const connectorId: number = commandPayload.connectorId;
- if (!chargingStation.getConnectorStatus(connectorId)) {
+ if (chargingStation.connectors.has(connectorId) === false) {
logger.error(
`${chargingStation.logPrefix()} Trying to change the availability of a non existing connector Id ${connectorId.toString()}`
);
chargingStation,
OCPP16SupportedFeatureProfiles.RemoteTrigger,
OCPP16IncomingRequestCommand.TRIGGER_MESSAGE
+ ) ||
+ !OCPP16ServiceUtils.isMessageTriggerSupported(
+ chargingStation,
+ commandPayload.requestedMessage
)
) {
return Constants.OCPP_TRIGGER_MESSAGE_RESPONSE_NOT_IMPLEMENTED;
}
- // TODO: factor out the check on connector id
- if (commandPayload?.connectorId < 0) {
- logger.warn(
- `${chargingStation.logPrefix()} ${
- OCPP16IncomingRequestCommand.TRIGGER_MESSAGE
- } incoming request received with invalid connectorId ${commandPayload.connectorId}`
- );
+ if (
+ !OCPP16ServiceUtils.isConnectorIdValid(
+ chargingStation,
+ OCPP16IncomingRequestCommand.TRIGGER_MESSAGE,
+ commandPayload.connectorId
+ )
+ ) {
return Constants.OCPP_TRIGGER_MESSAGE_RESPONSE_REJECTED;
}
try {
switch (commandPayload.requestedMessage) {
- case MessageTrigger.BootNotification:
+ case OCPP16MessageTrigger.BootNotification:
setTimeout(() => {
chargingStation.ocppRequestService
.requestHandler<OCPP16BootNotificationRequest, OCPP16BootNotificationResponse>(
});
}, Constants.OCPP_TRIGGER_MESSAGE_DELAY);
return Constants.OCPP_TRIGGER_MESSAGE_RESPONSE_ACCEPTED;
- case MessageTrigger.Heartbeat:
+ case OCPP16MessageTrigger.Heartbeat:
setTimeout(() => {
chargingStation.ocppRequestService
.requestHandler<OCPP16HeartbeatRequest, OCPP16HeartbeatResponse>(
});
}, Constants.OCPP_TRIGGER_MESSAGE_DELAY);
return Constants.OCPP_TRIGGER_MESSAGE_RESPONSE_ACCEPTED;
- case MessageTrigger.StatusNotification:
+ case OCPP16MessageTrigger.StatusNotification:
setTimeout(() => {
if (commandPayload?.connectorId) {
chargingStation.ocppRequestService
);
}
}
+
+ private handleRequestDataTransfer(
+ chargingStation: ChargingStation,
+ commandPayload: OCPP16DataTransferRequest
+ ): OCPP16DataTransferResponse {
+ try {
+ if (Object.values(OCPP16DataTransferVendorId).includes(commandPayload.vendorId)) {
+ return {
+ status: OCPP16DataTransferStatus.ACCEPTED,
+ };
+ }
+ return {
+ status: OCPP16DataTransferStatus.UNKNOWN_VENDOR_ID,
+ };
+ } catch (error) {
+ return this.handleIncomingRequestError(
+ chargingStation,
+ OCPP16IncomingRequestCommand.DATA_TRANSFER,
+ error as Error,
+ { errorResponse: Constants.OCPP_DATA_TRANSFER_RESPONSE_REJECTED }
+ );
+ }
+ }
}