// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
+import { parentPort } from 'node:worker_threads';
+
import type { JSONSchemaType } from 'ajv';
-import { type ChargingStation, ChargingStationConfigurationUtils } from '../../../charging-station';
+import {
+ type ChargingStation,
+ ChargingStationConfigurationUtils,
+ ChargingStationUtils,
+ MessageChannelUtils,
+} from '../../../charging-station';
import { OCPPError } from '../../../exception';
import {
type ChangeAvailabilityResponse,
OCPP16AuthorizationStatus,
type OCPP16AuthorizeRequest,
type OCPP16AuthorizeResponse,
- type OCPP16BootNotificationRequest,
type OCPP16BootNotificationResponse,
- OCPP16ChargePointErrorCode,
OCPP16ChargePointStatus,
type OCPP16DataTransferResponse,
type OCPP16DiagnosticsStatusNotificationResponse,
type OCPP16FirmwareStatusNotificationResponse,
+ type OCPP16GetCompositeScheduleResponse,
type OCPP16HeartbeatResponse,
OCPP16IncomingRequestCommand,
type OCPP16MeterValuesRequest,
OCPP16StandardParametersKey,
type OCPP16StartTransactionRequest,
type OCPP16StartTransactionResponse,
- type OCPP16StatusNotificationRequest,
type OCPP16StatusNotificationResponse,
type OCPP16StopTransactionRequest,
type OCPP16StopTransactionResponse,
'constructor'
),
],
+ [
+ OCPP16IncomingRequestCommand.GET_COMPOSITE_SCHEDULE,
+ OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16GetCompositeScheduleResponse>(
+ '../../../assets/json-schemas/ocpp/1.6/GetCompositeScheduleResponse.json',
+ moduleName,
+ 'constructor'
+ ),
+ ],
[
OCPP16IncomingRequestCommand.SET_CHARGING_PROFILE,
OCPP16ServiceUtils.parseJsonSchemaFile<SetChargingProfileResponse>(
),
],
]);
- this.validatePayload.bind(this);
+ this.validatePayload = this.validatePayload.bind(this) as (
+ chargingStation: ChargingStation,
+ commandName: OCPP16RequestCommand,
+ payload: JsonType
+ ) => boolean;
}
public async responseHandler(
break;
}
}
- const authorizeConnectorIdDefined = authorizeConnectorId !== undefined;
+ const authorizeConnectorIdDefined = !Utils.isNullOrUndefined(authorizeConnectorId);
if (payload.idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED) {
authorizeConnectorIdDefined &&
(chargingStation.getConnectorStatus(authorizeConnectorId).idTagAuthorized = true);
logger.debug(
- `${chargingStation.logPrefix()} IdTag '${requestPayload.idTag}' accepted${
- authorizeConnectorIdDefined ? ` on connector ${authorizeConnectorId}` : ''
+ `${chargingStation.logPrefix()} idTag '${requestPayload.idTag}' accepted${
+ authorizeConnectorIdDefined ? ` on connector id ${authorizeConnectorId}` : ''
}`
);
} else {
delete chargingStation.getConnectorStatus(authorizeConnectorId)?.authorizeIdTag;
}
logger.debug(
- `${chargingStation.logPrefix()} IdTag '${requestPayload.idTag}' rejected with status '${
+ `${chargingStation.logPrefix()} idTag '${requestPayload.idTag}' rejected with status '${
payload.idTagInfo.status
- }'${authorizeConnectorIdDefined ? ` on connector ${authorizeConnectorId}` : ''}`
+ }'${authorizeConnectorIdDefined ? ` on connector id ${authorizeConnectorId}` : ''}`
);
}
}
requestPayload: OCPP16StartTransactionRequest
): Promise<void> {
const connectorId = requestPayload.connectorId;
-
- let transactionConnectorId: number;
- for (const id of chargingStation.connectors.keys()) {
- if (id > 0 && id === connectorId) {
- transactionConnectorId = id;
- break;
- }
- }
- if (Utils.isNullOrUndefined(transactionConnectorId)) {
+ if (connectorId === 0 || !chargingStation.connectors.has(connectorId)) {
logger.error(
- `${chargingStation.logPrefix()} Trying to start a transaction on a non existing connector Id ${connectorId.toString()}`
+ `${chargingStation.logPrefix()} Trying to start a transaction on a non existing connector id ${connectorId.toString()}`
);
return;
}
chargingStation.getConnectorStatus(connectorId)?.transactionRemoteStarted === true &&
chargingStation.getAuthorizeRemoteTxRequests() === true &&
chargingStation.getLocalAuthListEnabled() === true &&
- chargingStation.hasAuthorizedTags() &&
+ chargingStation.hasIdTags() &&
chargingStation.getConnectorStatus(connectorId)?.idTagLocalAuthorized === false
) {
logger.error(
`${chargingStation.logPrefix()} Trying to start a transaction with a not local authorized idTag ${
chargingStation.getConnectorStatus(connectorId)?.localAuthorizeIdTag
- } on connector Id ${connectorId.toString()}`
+ } on connector id ${connectorId.toString()}`
);
await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
return;
logger.error(
`${chargingStation.logPrefix()} Trying to start a transaction with a not authorized idTag ${
chargingStation.getConnectorStatus(connectorId)?.authorizeIdTag
- } on connector Id ${connectorId.toString()}`
+ } on connector id ${connectorId.toString()}`
);
await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
return;
requestPayload.idTag
} different from the authorize request one ${
chargingStation.getConnectorStatus(connectorId)?.authorizeIdTag
- } on connector Id ${connectorId.toString()}`
+ } on connector id ${connectorId.toString()}`
);
await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
return;
requestPayload.idTag
} different from the local authorized one ${
chargingStation.getConnectorStatus(connectorId)?.localAuthorizeIdTag
- } on connector Id ${connectorId.toString()}`
+ } on connector id ${connectorId.toString()}`
);
await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
return;
}
if (chargingStation.getConnectorStatus(connectorId)?.transactionStarted === true) {
logger.debug(
- `${chargingStation.logPrefix()} Trying to start a transaction on an already used connector ${connectorId.toString()}: %j`,
+ `${chargingStation.logPrefix()} Trying to start a transaction on an already used connector id ${connectorId.toString()}: %j`,
chargingStation.getConnectorStatus(connectorId)
);
return;
chargingStation.getConnectorStatus(connectorId)?.status !== OCPP16ChargePointStatus.Preparing
) {
logger.error(
- `${chargingStation.logPrefix()} Trying to start a transaction on connector ${connectorId.toString()} with status ${
+ `${chargingStation.logPrefix()} Trying to start a transaction on connector id ${connectorId.toString()} with status ${
chargingStation.getConnectorStatus(connectorId)?.status
}`
);
return;
}
- // if (!Number.isInteger(payload.transactionId)) {
- // logger.warn(
- // `${chargingStation.logPrefix()} Trying to start a transaction on connector ${connectorId.toString()} with a non integer transaction Id ${
- // payload.transactionId
- // }, converting to integer`
- // );
- // payload.transactionId = Utils.convertToInt(payload.transactionId);
- // }
+ if (!Number.isInteger(payload.transactionId)) {
+ logger.warn(
+ `${chargingStation.logPrefix()} Trying to start a transaction on connector id ${connectorId.toString()} with a non integer transaction id ${
+ payload.transactionId
+ }, converting to integer`
+ );
+ payload.transactionId = Utils.convertToInt(payload.transactionId);
+ }
if (payload.idTagInfo?.status === OCPP16AuthorizationStatus.ACCEPTED) {
chargingStation.getConnectorStatus(connectorId).transactionStarted = true;
transactionId: payload.transactionId,
meterValue: [chargingStation.getConnectorStatus(connectorId).transactionBeginMeterValue],
}));
- await chargingStation.ocppRequestService.requestHandler<
- OCPP16StatusNotificationRequest,
- OCPP16StatusNotificationResponse
- >(chargingStation, OCPP16RequestCommand.STATUS_NOTIFICATION, {
+ await OCPP16ServiceUtils.sendAndSetConnectorStatus(
+ chargingStation,
connectorId,
- status: OCPP16ChargePointStatus.Charging,
- errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
- });
- chargingStation.getConnectorStatus(connectorId).status = OCPP16ChargePointStatus.Charging;
+ OCPP16ChargePointStatus.Charging
+ );
logger.info(
- `${chargingStation.logPrefix()} Transaction ${payload.transactionId.toString()} STARTED on ${
+ `${chargingStation.logPrefix()} Transaction with id ${payload.transactionId.toString()} STARTED on ${
chargingStation.stationInfo.chargingStationId
}#${connectorId.toString()} for idTag '${requestPayload.idTag}'`
);
);
} else {
logger.warn(
- `${chargingStation.logPrefix()} Starting transaction id ${payload.transactionId.toString()} REJECTED with status '${
+ `${chargingStation.logPrefix()} Starting transaction with id ${payload.transactionId.toString()} REJECTED with status '${
payload.idTagInfo?.status
}', idTag '${requestPayload.idTag}'`
);
chargingStation: ChargingStation,
connectorId: number
): Promise<void> {
- chargingStation.resetConnectorStatus(connectorId);
+ ChargingStationUtils.resetConnectorStatus(chargingStation.getConnectorStatus(connectorId));
+ chargingStation.stopMeterValues(connectorId);
+ parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(chargingStation));
if (
chargingStation.getConnectorStatus(connectorId)?.status !== OCPP16ChargePointStatus.Available
) {
- await chargingStation.ocppRequestService.requestHandler<
- OCPP16StatusNotificationRequest,
- OCPP16StatusNotificationResponse
- >(chargingStation, OCPP16RequestCommand.STATUS_NOTIFICATION, {
+ await OCPP16ServiceUtils.sendAndSetConnectorStatus(
+ chargingStation,
connectorId,
- status: OCPP16ChargePointStatus.Available,
- errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
- });
- chargingStation.getConnectorStatus(connectorId).status = OCPP16ChargePointStatus.Available;
+ OCPP16ChargePointStatus.Available
+ );
}
}
);
if (Utils.isNullOrUndefined(transactionConnectorId)) {
logger.error(
- `${chargingStation.logPrefix()} Trying to stop a non existing transaction ${requestPayload.transactionId.toString()}`
+ `${chargingStation.logPrefix()} Trying to stop a non existing transaction with id ${requestPayload.transactionId.toString()}`
);
return;
}
chargingStation.isChargingStationAvailable() === false ||
chargingStation.isConnectorAvailable(transactionConnectorId) === false
) {
- await chargingStation.ocppRequestService.requestHandler<
- OCPP16StatusNotificationRequest,
- OCPP16StatusNotificationResponse
- >(chargingStation, OCPP16RequestCommand.STATUS_NOTIFICATION, {
- connectorId: transactionConnectorId,
- status: OCPP16ChargePointStatus.Unavailable,
- errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
- });
- chargingStation.getConnectorStatus(transactionConnectorId).status =
- OCPP16ChargePointStatus.Unavailable;
+ await OCPP16ServiceUtils.sendAndSetConnectorStatus(
+ chargingStation,
+ transactionConnectorId,
+ OCPP16ChargePointStatus.Unavailable
+ );
} else {
- await chargingStation.ocppRequestService.requestHandler<
- OCPP16BootNotificationRequest,
- OCPP16BootNotificationResponse
- >(chargingStation, OCPP16RequestCommand.STATUS_NOTIFICATION, {
- connectorId: transactionConnectorId,
- status: OCPP16ChargePointStatus.Available,
- errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
- });
- chargingStation.getConnectorStatus(transactionConnectorId).status =
- OCPP16ChargePointStatus.Available;
+ await OCPP16ServiceUtils.sendAndSetConnectorStatus(
+ chargingStation,
+ transactionConnectorId,
+ OCPP16ChargePointStatus.Available
+ );
}
if (chargingStation.stationInfo.powerSharedByConnectors) {
chargingStation.powerDivider--;
}
- chargingStation.resetConnectorStatus(transactionConnectorId);
- const logMsg = `${chargingStation.logPrefix()} Transaction ${requestPayload.transactionId.toString()} STOPPED on ${
+ ChargingStationUtils.resetConnectorStatus(
+ chargingStation.getConnectorStatus(transactionConnectorId)
+ );
+ chargingStation.stopMeterValues(transactionConnectorId);
+ parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(chargingStation));
+ const logMsg = `${chargingStation.logPrefix()} Transaction with id ${requestPayload.transactionId.toString()} STOPPED on ${
chargingStation.stationInfo.chargingStationId
}#${transactionConnectorId?.toString()} with status '${
payload.idTagInfo?.status ?? 'undefined'