-// Partial Copyright Jerome Benoit. 2021. All Rights Reserved.
+// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
import fs from 'fs';
import path from 'path';
OCPP16MeterValuesResponse,
} from '../../../types/ocpp/1.6/MeterValues';
import {
- OCPP16BootNotificationRequest,
+ type OCPP16BootNotificationRequest,
OCPP16RequestCommand,
- OCPP16StatusNotificationRequest,
+ type OCPP16StatusNotificationRequest,
} from '../../../types/ocpp/1.6/Requests';
-import {
+import type {
DiagnosticsStatusNotificationResponse,
OCPP16BootNotificationResponse,
+ OCPP16DataTransferResponse,
OCPP16HeartbeatResponse,
- OCPP16RegistrationStatus,
OCPP16StatusNotificationResponse,
} from '../../../types/ocpp/1.6/Responses';
import {
OCPP16AuthorizationStatus,
- OCPP16AuthorizeRequest,
- OCPP16AuthorizeResponse,
- OCPP16StartTransactionRequest,
- OCPP16StartTransactionResponse,
- OCPP16StopTransactionRequest,
- OCPP16StopTransactionResponse,
+ type OCPP16AuthorizeRequest,
+ type OCPP16AuthorizeResponse,
+ type OCPP16StartTransactionRequest,
+ type OCPP16StartTransactionResponse,
+ type OCPP16StopTransactionRequest,
+ type OCPP16StopTransactionResponse,
} from '../../../types/ocpp/1.6/Transaction';
import { ErrorType } from '../../../types/ocpp/ErrorType';
-import type { ResponseHandler } from '../../../types/ocpp/Responses';
+import { OCPPVersion } from '../../../types/ocpp/OCPPVersion';
+import { RegistrationStatusEnumType, type ResponseHandler } from '../../../types/ocpp/Responses';
+import Constants from '../../../utils/Constants';
import logger from '../../../utils/Logger';
import Utils from '../../../utils/Utils';
import type ChargingStation from '../../ChargingStation';
import { ChargingStationConfigurationUtils } from '../../ChargingStationConfigurationUtils';
-import { ChargingStationUtils } from '../../ChargingStationUtils';
import OCPPResponseService from '../OCPPResponseService';
import { OCPP16ServiceUtils } from './OCPP16ServiceUtils';
if (new.target?.name === moduleName) {
throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
}
- super();
+ super(OCPPVersion.VERSION_16);
this.responseHandlers = new Map<OCPP16RequestCommand, ResponseHandler>([
[OCPP16RequestCommand.BOOT_NOTIFICATION, this.handleResponseBootNotification.bind(this)],
[OCPP16RequestCommand.HEARTBEAT, this.emptyResponseHandler.bind(this)],
[OCPP16RequestCommand.STATUS_NOTIFICATION, this.emptyResponseHandler.bind(this)],
[OCPP16RequestCommand.METER_VALUES, this.emptyResponseHandler.bind(this)],
[OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION, this.emptyResponseHandler.bind(this)],
+ [OCPP16RequestCommand.DATA_TRANSFER, this.emptyResponseHandler.bind(this)],
]);
this.jsonSchemas = new Map<OCPP16RequestCommand, JSONSchemaType<JsonObject>>([
[
)
) as JSONSchemaType<DiagnosticsStatusNotificationResponse>,
],
+ [
+ OCPP16RequestCommand.DATA_TRANSFER,
+ JSON.parse(
+ fs.readFileSync(
+ path.resolve(
+ path.dirname(fileURLToPath(import.meta.url)),
+ '../../../assets/json-schemas/ocpp/1.6/DataTransferResponse.json'
+ ),
+ 'utf8'
+ )
+ ) as JSONSchemaType<OCPP16DataTransferResponse>,
+ ],
]);
this.validatePayload.bind(this);
}
payload: JsonType,
requestPayload: JsonType
): Promise<void> {
- if (chargingStation.isRegistered() || commandName === OCPP16RequestCommand.BOOT_NOTIFICATION) {
+ if (
+ chargingStation.isRegistered() === true ||
+ commandName === OCPP16RequestCommand.BOOT_NOTIFICATION
+ ) {
if (
- this.responseHandlers.has(commandName) &&
- ChargingStationUtils.isRequestCommandSupported(commandName, chargingStation)
+ this.responseHandlers.has(commandName) === true &&
+ OCPP16ServiceUtils.isRequestCommandSupported(chargingStation, commandName) === true
) {
try {
this.validatePayload(chargingStation, commandName, payload);
payload,
null,
2
- )} while the charging station is not registered on the central server. `,
+ )} while the charging station is not registered on the central server.`,
commandName,
payload
);
chargingStation: ChargingStation,
payload: OCPP16BootNotificationResponse
): void {
- if (payload.status === OCPP16RegistrationStatus.ACCEPTED) {
+ if (payload.status === RegistrationStatusEnumType.ACCEPTED) {
ChargingStationConfigurationUtils.addConfigurationKey(
chargingStation,
OCPP16StandardParametersKey.HeartbeatInterval,
? chargingStation.restartHeartbeat()
: chargingStation.startHeartbeat();
}
- if (Object.values(OCPP16RegistrationStatus).includes(payload.status)) {
+ if (Object.values(RegistrationStatusEnumType).includes(payload.status)) {
const logMsg = `${chargingStation.logPrefix()} Charging station in '${
payload.status
}' state on the central server`;
- payload.status === OCPP16RegistrationStatus.REJECTED
+ payload.status === RegistrationStatusEnumType.REJECTED
? logger.warn(logMsg)
: logger.info(logMsg);
} else {
break;
}
}
+ const isAuthorizeConnectorIdDefined = authorizeConnectorId !== undefined;
if (payload.idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED) {
- chargingStation.getConnectorStatus(authorizeConnectorId).idTagAuthorized = true;
+ isAuthorizeConnectorIdDefined &&
+ (chargingStation.getConnectorStatus(authorizeConnectorId).idTagAuthorized = true);
logger.debug(
- `${chargingStation.logPrefix()} IdTag '${
- requestPayload.idTag
- }' authorized on connector ${authorizeConnectorId}`
+ `${chargingStation.logPrefix()} IdTag '${requestPayload.idTag}' accepted${
+ isAuthorizeConnectorIdDefined ? ` on connector ${authorizeConnectorId}` : ''
+ }`
);
} else {
- chargingStation.getConnectorStatus(authorizeConnectorId).idTagAuthorized = false;
- delete chargingStation.getConnectorStatus(authorizeConnectorId).authorizeIdTag;
+ if (isAuthorizeConnectorIdDefined) {
+ chargingStation.getConnectorStatus(authorizeConnectorId).idTagAuthorized = false;
+ delete chargingStation.getConnectorStatus(authorizeConnectorId).authorizeIdTag;
+ }
logger.debug(
- `${chargingStation.logPrefix()} IdTag '${requestPayload.idTag}' refused with status '${
+ `${chargingStation.logPrefix()} IdTag '${requestPayload.idTag}' rejected with status '${
payload.idTagInfo.status
- }' on connector ${authorizeConnectorId}`
+ }'${isAuthorizeConnectorIdDefined ? ` on connector ${authorizeConnectorId}` : ''}`
);
}
}
}
if (
chargingStation.getConnectorStatus(connectorId).transactionRemoteStarted === true &&
- chargingStation.getAuthorizeRemoteTxRequests() &&
- chargingStation.getLocalAuthListEnabled() &&
+ chargingStation.getAuthorizeRemoteTxRequests() === true &&
+ chargingStation.getLocalAuthListEnabled() === true &&
chargingStation.hasAuthorizedTags() &&
chargingStation.getConnectorStatus(connectorId).idTagLocalAuthorized === false
) {
}
if (
chargingStation.getConnectorStatus(connectorId).transactionRemoteStarted === true &&
- chargingStation.getAuthorizeRemoteTxRequests() &&
- chargingStation.getMustAuthorizeAtRemoteStart() &&
+ chargingStation.getAuthorizeRemoteTxRequests() === true &&
+ chargingStation.getMustAuthorizeAtRemoteStart() === true &&
chargingStation.getConnectorStatus(connectorId).idTagLocalAuthorized === false &&
chargingStation.getConnectorStatus(connectorId).idTagAuthorized === false
) {
connectorId,
configuredMeterValueSampleInterval
? Utils.convertToInt(configuredMeterValueSampleInterval.value) * 1000
- : 60000
+ : Constants.DEFAULT_METER_VALUES_INTERVAL
);
} else {
logger.warn(
return;
}
if (payload.idTagInfo?.status === OCPP16AuthorizationStatus.ACCEPTED) {
- chargingStation.getBeginEndMeterValues() &&
- !chargingStation.getOcppStrictCompliance() &&
- chargingStation.getOutOfOrderEndMeterValues() &&
+ chargingStation.getBeginEndMeterValues() === true &&
+ chargingStation.getOcppStrictCompliance() === false &&
+ chargingStation.getOutOfOrderEndMeterValues() === true &&
(await chargingStation.ocppRequestService.requestHandler<
OCPP16MeterValuesRequest,
OCPP16MeterValuesResponse
],
}));
if (
- !chargingStation.isChargingStationAvailable() ||
- !chargingStation.isConnectorAvailable(transactionConnectorId)
+ chargingStation.isChargingStationAvailable() === false ||
+ chargingStation.isConnectorAvailable(transactionConnectorId) === false
) {
await chargingStation.ocppRequestService.requestHandler<
OCPP16StatusNotificationRequest,
if (chargingStation.stationInfo.powerSharedByConnectors) {
chargingStation.powerDivider--;
}
+ chargingStation.resetConnectorStatus(transactionConnectorId);
logger.info(
chargingStation.logPrefix() +
' Transaction ' +
'#' +
transactionConnectorId.toString()
);
- chargingStation.resetConnectorStatus(transactionConnectorId);
} else {
logger.warn(
chargingStation.logPrefix() +