From f611016b6820336b74aaa7fd6f9d37c41b1b150e Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Wed, 18 Mar 2026 16:03:31 +0100 Subject: [PATCH] refactor(ocpp): use buildStatusNotificationRequest helper in TriggerMessage handlers Replace inline StatusNotification payload construction in both OCPP 1.6 and 2.0 TriggerMessage handlers with the centralized buildStatusNotificationRequest helper. Export the helper from OCPPServiceUtils to make it available. This eliminates 5 inline duplications of the same payload structure that risked diverging from the single source of truth. --- .../ocpp/1.6/OCPP16IncomingRequestService.ts | 37 +++++++++-------- .../ocpp/2.0/OCPP20IncomingRequestService.ts | 41 +++++-------------- src/charging-station/ocpp/OCPPServiceUtils.ts | 2 +- 3 files changed, 32 insertions(+), 48 deletions(-) diff --git a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts index 0973ed7f..23f0c402 100644 --- a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts @@ -52,7 +52,6 @@ import { type OCPP16CancelReservationRequest, type OCPP16ChangeAvailabilityRequest, type OCPP16ChangeAvailabilityResponse, - OCPP16ChargePointErrorCode, OCPP16ChargePointStatus, type OCPP16ChargingProfile, OCPP16ChargingProfilePurposeType, @@ -117,7 +116,11 @@ import { } from '../../../utils/index.js' import { OCPPConstants } from '../OCPPConstants.js' import { OCPPIncomingRequestService } from '../OCPPIncomingRequestService.js' -import { buildMeterValue, OCPPServiceUtils } from '../OCPPServiceUtils.js' +import { + buildMeterValue, + buildStatusNotificationRequest, + OCPPServiceUtils, +} from '../OCPPServiceUtils.js' import { OCPP16Constants } from './OCPP16Constants.js' import { OCPP16ServiceUtils } from './OCPP16ServiceUtils.js' @@ -484,12 +487,12 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { .requestHandler( chargingStation, OCPP16RequestCommand.STATUS_NOTIFICATION, - { + buildStatusNotificationRequest( + chargingStation, connectorId, - errorCode: OCPP16ChargePointErrorCode.NO_ERROR, - status: chargingStation.getConnectorStatus(connectorId) - ?.status as OCPP16ChargePointStatus, - }, + chargingStation.getConnectorStatus(connectorId) + ?.status as OCPP16ChargePointStatus + ) as OCPP16StatusNotificationRequest, { triggerMessage: true, } @@ -505,11 +508,11 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { >( chargingStation, OCPP16RequestCommand.STATUS_NOTIFICATION, - { - connectorId: id, - errorCode: OCPP16ChargePointErrorCode.NO_ERROR, - status: connectorStatus.status as OCPP16ChargePointStatus, - }, + buildStatusNotificationRequest( + chargingStation, + id, + connectorStatus.status as OCPP16ChargePointStatus + ) as OCPP16StatusNotificationRequest, { triggerMessage: true, } @@ -526,11 +529,11 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { >( chargingStation, OCPP16RequestCommand.STATUS_NOTIFICATION, - { - connectorId: id, - errorCode: OCPP16ChargePointErrorCode.NO_ERROR, - status: connectorStatus.status as OCPP16ChargePointStatus, - }, + buildStatusNotificationRequest( + chargingStation, + id, + connectorStatus.status as OCPP16ChargePointStatus + ) as OCPP16StatusNotificationRequest, { triggerMessage: true, } diff --git a/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts b/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts index 40375f28..19afdf32 100644 --- a/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts +++ b/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts @@ -144,6 +144,7 @@ import { OCPPAuthServiceFactory } from '../auth/index.js' import { OCPPIncomingRequestService } from '../OCPPIncomingRequestService.js' import { buildMeterValue, + buildStatusNotificationRequest, restoreConnectorStatus, sendAndSetConnectorStatus, } from '../OCPPServiceUtils.js' @@ -3684,22 +3685,12 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { for (const [evseId, evseStatus] of chargingStation.evses) { if (evseId > 0) { for (const [connectorId, connectorStatus] of evseStatus.connectors) { - const resolvedConnectorStatus = - connectorStatus.status != null - ? (connectorStatus.status as unknown as OCPP20ConnectorStatusEnumType) - : OCPP20ConnectorStatusEnumType.Available + const resolvedStatus = connectorStatus.status ?? ConnectorStatusEnum.Available chargingStation.ocppRequestService - .requestHandler( - chargingStation, - OCPP20RequestCommand.STATUS_NOTIFICATION, - { - connectorId, - connectorStatus: resolvedConnectorStatus, - evseId, - timestamp: new Date(), - }, - { skipBufferingOnError: true, triggerMessage: true } - ) + .requestHandler< + OCPP20StatusNotificationRequest, + OCPP20StatusNotificationResponse + >(chargingStation, OCPP20RequestCommand.STATUS_NOTIFICATION, buildStatusNotificationRequest(chargingStation, connectorId, resolvedStatus, evseId) as OCPP20StatusNotificationRequest, { skipBufferingOnError: true, triggerMessage: true }) .catch(errorHandler) } } @@ -3714,22 +3705,12 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { if (evse?.id !== undefined && evse.id > 0 && evse.connectorId !== undefined) { const evseStatus = chargingStation.evses.get(evse.id) const connectorStatus = evseStatus?.connectors.get(evse.connectorId) - const resolvedStatus = - connectorStatus?.status != null - ? (connectorStatus.status as unknown as OCPP20ConnectorStatusEnumType) - : OCPP20ConnectorStatusEnumType.Available + const resolvedStatus = connectorStatus?.status ?? ConnectorStatusEnum.Available chargingStation.ocppRequestService - .requestHandler( - chargingStation, - OCPP20RequestCommand.STATUS_NOTIFICATION, - { - connectorId: evse.connectorId, - connectorStatus: resolvedStatus, - evseId: evse.id, - timestamp: new Date(), - }, - { skipBufferingOnError: true, triggerMessage: true } - ) + .requestHandler< + OCPP20StatusNotificationRequest, + OCPP20StatusNotificationResponse + >(chargingStation, OCPP20RequestCommand.STATUS_NOTIFICATION, buildStatusNotificationRequest(chargingStation, evse.connectorId, resolvedStatus, evse.id) as OCPP20StatusNotificationRequest, { skipBufferingOnError: true, triggerMessage: true }) .catch(errorHandler) } else if (chargingStation.hasEvses) { this.triggerAllEvseStatusNotifications(chargingStation, errorHandler) diff --git a/src/charging-station/ocpp/OCPPServiceUtils.ts b/src/charging-station/ocpp/OCPPServiceUtils.ts index f41c24af..829df23f 100644 --- a/src/charging-station/ocpp/OCPPServiceUtils.ts +++ b/src/charging-station/ocpp/OCPPServiceUtils.ts @@ -98,7 +98,7 @@ export const getMessageTypeString = (messageType: MessageType | undefined): stri } } -const buildStatusNotificationRequest = ( +export const buildStatusNotificationRequest = ( chargingStation: ChargingStation, connectorId: number, status: ConnectorStatusEnum, -- 2.53.0