From: Jérôme Benoit Date: Mon, 16 Mar 2026 12:11:41 +0000 (+0100) Subject: refactor(ocpp20): prefix OperationalStatusEnumType with OCPP20 X-Git-Tag: ocpp-server@v3.1.1~27 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=0f05c92e8ac1f7420bea9c6dfb435269df1367fe;p=e-mobility-charging-stations-simulator.git refactor(ocpp20): prefix OperationalStatusEnumType with OCPP20 Last unprefixed OCPP 2.0 type participating in a common union. OperationalStatusEnumType → OCPP20OperationalStatusEnumType matching the OCPP16AvailabilityType counterpart in the AvailabilityType union. --- diff --git a/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts b/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts index 5362441c..5bc9b061 100644 --- a/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts +++ b/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts @@ -80,6 +80,7 @@ import { type OCPP20NotifyCustomerInformationResponse, type OCPP20NotifyReportRequest, type OCPP20NotifyReportResponse, + OCPP20OperationalStatusEnumType, OCPP20ReadingContextEnumType, OCPP20RequestCommand, type OCPP20RequestStartTransactionRequest, @@ -104,7 +105,6 @@ import { type OCPP20UpdateFirmwareRequest, type OCPP20UpdateFirmwareResponse, OCPPVersion, - OperationalStatusEnumType, ReasonCodeEnumType, RegistrationStatusEnumType, ReportBaseEnumType, @@ -1037,7 +1037,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { chargingStation: ChargingStation, evseId: number, connectorId: number, - operationalStatus: OperationalStatusEnumType, + operationalStatus: OCPP20OperationalStatusEnumType, newConnectorStatus: OCPP20ConnectorStatusEnumType ): OCPP20ChangeAvailabilityResponse { if (!chargingStation.evses.has(evseId)) { @@ -1062,7 +1062,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { } const resolvedStatus = - operationalStatus === OperationalStatusEnumType.Operative + operationalStatus === OCPP20OperationalStatusEnumType.Operative ? this.getRestoredConnectorStatus(chargingStation, connectorId) : newConnectorStatus @@ -1087,7 +1087,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { private handleCsLevelInoperative ( chargingStation: ChargingStation, - operationalStatus: OperationalStatusEnumType, + operationalStatus: OCPP20OperationalStatusEnumType, newConnectorStatus: OCPP20ConnectorStatusEnumType ): OCPP20ChangeAvailabilityResponse | undefined { let hasActiveTransactions = false @@ -1126,7 +1126,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { private handleEvseChangeAvailability ( chargingStation: ChargingStation, evseId: number, - operationalStatus: OperationalStatusEnumType, + operationalStatus: OCPP20OperationalStatusEnumType, newConnectorStatus: OCPP20ConnectorStatusEnumType ): OCPP20ChangeAvailabilityResponse { if (!chargingStation.evses.has(evseId)) { @@ -1145,7 +1145,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { const evseStatus = chargingStation.getEvseStatus(evseId) if ( evseStatus != null && - operationalStatus === OperationalStatusEnumType.Inoperative && + operationalStatus === OCPP20OperationalStatusEnumType.Inoperative && this.hasEvseActiveTransactions(evseStatus) ) { logger.info( @@ -1159,7 +1159,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { if (evseStatus != null) { evseStatus.availability = operationalStatus } - if (operationalStatus === OperationalStatusEnumType.Operative) { + if (operationalStatus === OCPP20OperationalStatusEnumType.Operative) { this.sendRestoredEvseStatusNotifications(chargingStation, evseId) } else { this.sendEvseStatusNotifications(chargingStation, evseId, newConnectorStatus) @@ -1334,13 +1334,13 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { `${chargingStation.logPrefix()} ${moduleName}.handleRequestChangeAvailability: Received ChangeAvailability request with operationalStatus=${operationalStatus}${evseIdLabel}` ) - if (operationalStatus === OperationalStatusEnumType.Inoperative) { + if (operationalStatus === OCPP20OperationalStatusEnumType.Inoperative) { // G03.FR.07: Save current connector statuses before setting Inoperative this.savePreInoperativeStatuses(chargingStation, evse?.id) } const newConnectorStatus = - operationalStatus === OperationalStatusEnumType.Inoperative + operationalStatus === OCPP20OperationalStatusEnumType.Inoperative ? OCPP20ConnectorStatusEnumType.Unavailable : OCPP20ConnectorStatusEnumType.Available @@ -1365,7 +1365,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { } // CS-level change (no evse or evse.id === 0) - if (operationalStatus === OperationalStatusEnumType.Inoperative) { + if (operationalStatus === OCPP20OperationalStatusEnumType.Inoperative) { const result = this.handleCsLevelInoperative( chargingStation, operationalStatus, @@ -1382,7 +1382,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { evseStatus.availability = operationalStatus } } - if (operationalStatus === OperationalStatusEnumType.Operative) { + if (operationalStatus === OCPP20OperationalStatusEnumType.Operative) { this.sendRestoredAllConnectorsStatusNotifications(chargingStation) } else { this.sendAllConnectorsStatusNotifications(chargingStation, newConnectorStatus) @@ -3082,7 +3082,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { continue } if ( - evseStatus.availability !== OperationalStatusEnumType.Inoperative && + evseStatus.availability !== OCPP20OperationalStatusEnumType.Inoperative && !this.hasEvseActiveTransactions(evseStatus) ) { return evseId diff --git a/src/types/index.ts b/src/types/index.ts index 8cf719fc..f684b177 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -169,9 +169,9 @@ export { type NetworkConnectionProfileType, OCPP20ComponentName, OCPP20FirmwareStatusEnumType, + OCPP20OperationalStatusEnumType, OCPP20UnitEnumType, type OCSPRequestDataType, - OperationalStatusEnumType, ReasonCodeEnumType, ReportBaseEnumType, ResetEnumType, diff --git a/src/types/ocpp/2.0/Common.ts b/src/types/ocpp/2.0/Common.ts index cb2b72b8..21467ce8 100644 --- a/src/types/ocpp/2.0/Common.ts +++ b/src/types/ocpp/2.0/Common.ts @@ -235,6 +235,11 @@ export enum OCPP20FirmwareStatusEnumType { SignatureVerified = 'SignatureVerified', } +export enum OCPP20OperationalStatusEnumType { + Inoperative = 'Inoperative', + Operative = 'Operative', +} + export enum OCPP20UnitEnumType { AMP = 'A', ARBITRARY_STRENGTH_UNIT = 'ASU', @@ -295,11 +300,6 @@ export enum OCPPVersionEnumType { OCPP20 = 'OCPP20', } -export enum OperationalStatusEnumType { - Inoperative = 'Inoperative', - Operative = 'Operative', -} - export enum ReasonCodeEnumType { CSNotAccepted = 'CSNotAccepted', DuplicateProfile = 'DuplicateProfile', diff --git a/src/types/ocpp/2.0/Requests.ts b/src/types/ocpp/2.0/Requests.ts index b22a17b7..e78790ad 100644 --- a/src/types/ocpp/2.0/Requests.ts +++ b/src/types/ocpp/2.0/Requests.ts @@ -16,8 +16,8 @@ import type { MessageTriggerEnumType, NetworkConnectionProfileType, OCPP20FirmwareStatusEnumType, + OCPP20OperationalStatusEnumType, OCSPRequestDataType, - OperationalStatusEnumType, ReportBaseEnumType, ResetEnumType, UploadLogStatusEnumType, @@ -88,7 +88,7 @@ export interface OCPP20CertificateSignedRequest extends JsonObject { export interface OCPP20ChangeAvailabilityRequest extends JsonObject { customData?: CustomDataType evse?: OCPP20EVSEType - operationalStatus: OperationalStatusEnumType + operationalStatus: OCPP20OperationalStatusEnumType } export type OCPP20ClearCacheRequest = EmptyObject diff --git a/src/types/ocpp/Requests.ts b/src/types/ocpp/Requests.ts index f7df86a5..9ed57117 100644 --- a/src/types/ocpp/Requests.ts +++ b/src/types/ocpp/Requests.ts @@ -21,7 +21,7 @@ import { type OCPP16ReserveNowRequest, type OCPP16StatusNotificationRequest, } from './1.6/Requests.js' -import { OCPP20FirmwareStatusEnumType, OperationalStatusEnumType } from './2.0/Common.js' +import { OCPP20FirmwareStatusEnumType, OCPP20OperationalStatusEnumType } from './2.0/Common.js' import { type OCPP20BootNotificationRequest, type OCPP20FirmwareStatusNotificationRequest, @@ -96,10 +96,10 @@ export type StatusNotificationRequest = export const AvailabilityType = { ...OCPP16AvailabilityType, - ...OperationalStatusEnumType, + ...OCPP20OperationalStatusEnumType, } as const // eslint-disable-next-line @typescript-eslint/no-redeclare -export type AvailabilityType = OCPP16AvailabilityType | OperationalStatusEnumType +export type AvailabilityType = OCPP16AvailabilityType | OCPP20OperationalStatusEnumType export type CancelReservationRequest = OCPP16CancelReservationRequest diff --git a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-ChangeAvailability.test.ts b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-ChangeAvailability.test.ts index 5b3262f3..9408511b 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-ChangeAvailability.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-ChangeAvailability.test.ts @@ -12,8 +12,8 @@ import { createTestableIncomingRequestService } from '../../../../src/charging-s import { OCPP20IncomingRequestService } from '../../../../src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.js' import { ChangeAvailabilityStatusEnumType, + OCPP20OperationalStatusEnumType, OCPPVersion, - OperationalStatusEnumType, } from '../../../../src/types/index.js' import { Constants } from '../../../../src/utils/index.js' import { @@ -55,18 +55,18 @@ await describe('G03 - ChangeAvailability', async () => { await it('should accept EVSE-level Inoperative when no ongoing transaction', () => { const response = testableService.handleRequestChangeAvailability(station, { evse: { id: 1 }, - operationalStatus: OperationalStatusEnumType.Inoperative, + operationalStatus: OCPP20OperationalStatusEnumType.Inoperative, }) assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Accepted) const evseStatus = station.getEvseStatus(1) - assert.strictEqual(evseStatus?.availability, OperationalStatusEnumType.Inoperative) + assert.strictEqual(evseStatus?.availability, OCPP20OperationalStatusEnumType.Inoperative) }) // FR: G03.FR.02 await it('should accept CS-level Inoperative when no ongoing transaction', () => { const response = testableService.handleRequestChangeAvailability(station, { - operationalStatus: OperationalStatusEnumType.Inoperative, + operationalStatus: OCPP20OperationalStatusEnumType.Inoperative, }) assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Accepted) @@ -74,7 +74,7 @@ await describe('G03 - ChangeAvailability', async () => { if (evseId > 0) { assert.strictEqual( evseStatus.availability, - OperationalStatusEnumType.Inoperative, + OCPP20OperationalStatusEnumType.Inoperative, `EVSE ${String(evseId)} should be Inoperative` ) } @@ -89,7 +89,7 @@ await describe('G03 - ChangeAvailability', async () => { const response = testableService.handleRequestChangeAvailability(station, { evse: { id: 1 }, - operationalStatus: OperationalStatusEnumType.Inoperative, + operationalStatus: OCPP20OperationalStatusEnumType.Inoperative, }) assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Scheduled) @@ -102,7 +102,7 @@ await describe('G03 - ChangeAvailability', async () => { }) const response = testableService.handleRequestChangeAvailability(station, { - operationalStatus: OperationalStatusEnumType.Inoperative, + operationalStatus: OCPP20OperationalStatusEnumType.Inoperative, }) assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Scheduled) @@ -111,7 +111,7 @@ await describe('G03 - ChangeAvailability', async () => { await it('should reject when EVSE does not exist', () => { const response = testableService.handleRequestChangeAvailability(station, { evse: { id: 999 }, - operationalStatus: OperationalStatusEnumType.Inoperative, + operationalStatus: OCPP20OperationalStatusEnumType.Inoperative, }) assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Rejected) @@ -122,43 +122,43 @@ await describe('G03 - ChangeAvailability', async () => { await it('should accept when already in requested state (idempotent)', () => { const evseStatus = station.getEvseStatus(1) if (evseStatus != null) { - evseStatus.availability = OperationalStatusEnumType.Operative + evseStatus.availability = OCPP20OperationalStatusEnumType.Operative } const response = testableService.handleRequestChangeAvailability(station, { evse: { id: 1 }, - operationalStatus: OperationalStatusEnumType.Operative, + operationalStatus: OCPP20OperationalStatusEnumType.Operative, }) assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Accepted) - assert.strictEqual(evseStatus?.availability, OperationalStatusEnumType.Operative) + assert.strictEqual(evseStatus?.availability, OCPP20OperationalStatusEnumType.Operative) }) await it('should set Operative after Inoperative, connectors return to Available', () => { const evseStatus = station.getEvseStatus(1) if (evseStatus != null) { - evseStatus.availability = OperationalStatusEnumType.Inoperative + evseStatus.availability = OCPP20OperationalStatusEnumType.Inoperative } const response = testableService.handleRequestChangeAvailability(station, { evse: { id: 1 }, - operationalStatus: OperationalStatusEnumType.Operative, + operationalStatus: OCPP20OperationalStatusEnumType.Operative, }) assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Accepted) - assert.strictEqual(evseStatus?.availability, OperationalStatusEnumType.Operative) + assert.strictEqual(evseStatus?.availability, OCPP20OperationalStatusEnumType.Operative) }) await it('should accept CS-level change with evse.id === 0', () => { const response = testableService.handleRequestChangeAvailability(station, { evse: { id: 0 }, - operationalStatus: OperationalStatusEnumType.Inoperative, + operationalStatus: OCPP20OperationalStatusEnumType.Inoperative, }) assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Accepted) for (const [evseId, evseStatus] of station.evses) { if (evseId > 0) { - assert.strictEqual(evseStatus.availability, OperationalStatusEnumType.Inoperative) + assert.strictEqual(evseStatus.availability, OCPP20OperationalStatusEnumType.Inoperative) } } }) diff --git a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RemoteStartAuth.test.ts b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RemoteStartAuth.test.ts index 86769620..257fde13 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RemoteStartAuth.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RemoteStartAuth.test.ts @@ -15,7 +15,7 @@ import { type OCPP20RequestStartTransactionRequest, RequestStartStopStatusEnumType, } from '../../../../src/types/index.js' -import { OperationalStatusEnumType } from '../../../../src/types/ocpp/2.0/Common.js' +import { OCPP20OperationalStatusEnumType } from '../../../../src/types/ocpp/2.0/Common.js' import { OCPP20ChargingProfileKindEnumType, OCPP20ChargingProfilePurposeEnumType, @@ -41,7 +41,7 @@ await describe('G03 - Remote Start Pre-Authorization', async () => { ], ]), getConnectorStatus: (_connectorId: number): ConnectorStatus => ({ - availability: OperationalStatusEnumType.Operative, + availability: OCPP20OperationalStatusEnumType.Operative, MeterValues: [], status: ConnectorStatusEnum.Available, transactionId: undefined, @@ -240,7 +240,7 @@ await describe('G03 - Remote Start Pre-Authorization', async () => { assert(mockStation != null) // Given: Connector with active transaction mockStation.getConnectorStatus = (): ConnectorStatus => ({ - availability: OperationalStatusEnumType.Operative, + availability: OCPP20OperationalStatusEnumType.Operative, MeterValues: [], status: ConnectorStatusEnum.Occupied, transactionId: 'existing-tx-123', @@ -266,7 +266,7 @@ await describe('G03 - Remote Start Pre-Authorization', async () => { const existingTransactionId = 'existing-tx-456' const existingTokenTag = 'EXISTING_TOKEN_002' mockStation.getConnectorStatus = (): ConnectorStatus => ({ - availability: OperationalStatusEnumType.Operative, + availability: OCPP20OperationalStatusEnumType.Operative, MeterValues: [], status: ConnectorStatusEnum.Occupied, transactionId: existingTransactionId,