AuthorizationStatus,
StartTransactionRequest,
StartTransactionResponse,
- StopTransactionReason,
StopTransactionRequest,
StopTransactionResponse,
} from '../types/ocpp/Transaction';
BroadcastChannelResponsePayload,
MessageEvent,
} from '../types/WorkerBroadcastChannel';
-import { ResponseStatus } from '../ui/web/src/type/UIProtocol';
+import { ResponseStatus } from '../ui/web/src/types/UIProtocol';
import logger from '../utils/Logger';
import type ChargingStation from './ChargingStation';
import WorkerBroadcastChannel from './WorkerBroadcastChannel';
if (this.isResponse(messageEvent.data)) {
return;
}
- if (Array.isArray(messageEvent.data) === false) {
- throw new BaseError('Worker broadcast channel protocol request is not an array');
- }
-
- const [uuid, command, requestPayload] = messageEvent.data as BroadcastChannelRequest;
+ const [uuid, command, requestPayload] = this.validateMessageEvent(messageEvent)
+ .data as BroadcastChannelRequest;
- if (requestPayload?.hashId !== this.chargingStation.hashId) {
- return;
+ if (requestPayload?.hashIds !== undefined || requestPayload?.hashId !== undefined) {
+ if (
+ requestPayload?.hashId === undefined &&
+ requestPayload?.hashIds?.includes(this.chargingStation.stationInfo.hashId) === false
+ ) {
+ return;
+ }
+ if (
+ requestPayload?.hashIds === undefined &&
+ requestPayload?.hashId !== this.chargingStation.stationInfo.hashId
+ ) {
+ return;
+ }
+ if (requestPayload?.hashId !== undefined) {
+ logger.warn(
+ `${this.chargingStation.logPrefix()} ${moduleName}.requestHandler: 'hashId' field usage in PDU is deprecated, use 'hashIds' instead`
+ );
+ }
}
let responsePayload: BroadcastChannelResponsePayload;
try {
commandResponse = await this.commandHandler(command, requestPayload);
if (commandResponse === undefined) {
- responsePayload = { status: ResponseStatus.SUCCESS };
+ responsePayload = {
+ hashId: this.chargingStation.stationInfo.hashId,
+ status: ResponseStatus.SUCCESS,
+ };
} else {
- responsePayload = { status: this.commandResponseToResponseStatus(commandResponse) };
+ responsePayload = {
+ hashId: this.chargingStation.stationInfo.hashId,
+ status: this.commandResponseToResponseStatus(commandResponse),
+ };
}
} catch (error) {
logger.error(
error
);
responsePayload = {
+ hashId: this.chargingStation.stationInfo.hashId,
status: ResponseStatus.FAILURE,
command,
requestPayload,
private messageErrorHandler(messageEvent: MessageEvent): void {
logger.error(
`${this.chargingStation.logPrefix()} ${moduleName}.messageErrorHandler: Error at handling message:`,
- { messageEvent, messageEventData: messageEvent.data }
+ { messageEvent }
);
}
requestPayload: BroadcastChannelRequestPayload
): Promise<CommandResponse | undefined> {
switch (command) {
+ case BroadcastChannelProcedureName.START_CHARGING_STATION:
+ this.chargingStation.start();
+ break;
+ case BroadcastChannelProcedureName.STOP_CHARGING_STATION:
+ await this.chargingStation.stop();
+ break;
+ case BroadcastChannelProcedureName.OPEN_CONNECTION:
+ this.chargingStation.openWSConnection();
+ break;
+ case BroadcastChannelProcedureName.CLOSE_CONNECTION:
+ this.chargingStation.closeWSConnection();
+ break;
case BroadcastChannelProcedureName.START_TRANSACTION:
return this.chargingStation.ocppRequestService.requestHandler<
StartTransactionRequest,
>(this.chargingStation, RequestCommand.STOP_TRANSACTION, {
transactionId: requestPayload.transactionId,
meterStop: this.chargingStation.getEnergyActiveImportRegisterByTransactionId(
- requestPayload.transactionId
+ requestPayload.transactionId,
+ true
),
idTag: this.chargingStation.getTransactionIdTag(requestPayload.transactionId),
- reason: StopTransactionReason.NONE,
+ ...(requestPayload.reason && { reason: requestPayload.reason }),
});
- case BroadcastChannelProcedureName.START_CHARGING_STATION:
- this.chargingStation.start();
- break;
- case BroadcastChannelProcedureName.STOP_CHARGING_STATION:
- await this.chargingStation.stop();
+ case BroadcastChannelProcedureName.START_AUTOMATIC_TRANSACTION_GENERATOR:
+ this.chargingStation.startAutomaticTransactionGenerator(requestPayload.connectorIds);
break;
- case BroadcastChannelProcedureName.OPEN_CONNECTION:
- this.chargingStation.openWSConnection();
- break;
- case BroadcastChannelProcedureName.CLOSE_CONNECTION:
- this.chargingStation.closeWSConnection();
+ case BroadcastChannelProcedureName.STOP_AUTOMATIC_TRANSACTION_GENERATOR:
+ this.chargingStation.stopAutomaticTransactionGenerator(requestPayload.connectorIds);
break;
default:
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
- throw new BaseError(`Unknown broadcast channel command: ${command}`);
+ throw new BaseError(`Unknown worker broadcast channel command: ${command}`);
}
}