From: Jérôme Benoit Date: Sun, 15 Mar 2026 15:28:51 +0000 (+0100) Subject: fix(ocpp16): harmonize error logging — log silent catches, demote business violations... X-Git-Tag: ocpp-server@v3.1.0~23 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=93e17b3e7697d2dcd718709dd98956dbf4944183;p=e-mobility-charging-stations-simulator.git fix(ocpp16): harmonize error logging — log silent catches, demote business violations to warn --- diff --git a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts index d2d3a3b9..ab39a81f 100644 --- a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts @@ -99,7 +99,6 @@ import { } from '../../../types/index.js' import { Configuration, - Constants, convertToDate, convertToInt, formatDurationMilliSeconds, @@ -572,7 +571,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { ): Promise { const { connectorId, type } = commandPayload if (!chargingStation.hasConnector(connectorId)) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleRequestChangeAvailability: Trying to change the availability of a non existing connector id ${connectorId.toString()}` ) return OCPP16Constants.OCPP_AVAILABILITY_RESPONSE_REJECTED @@ -725,7 +724,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { const { connectorId } = commandPayload if (connectorId != null) { if (!chargingStation.hasConnector(connectorId)) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleRequestClearChargingProfile: Trying to clear a charging profile(s) to a non existing connector id ${connectorId.toString()}` ) return OCPP16Constants.OCPP_CLEAR_CHARGING_PROFILE_RESPONSE_UNKNOWN @@ -808,13 +807,13 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { } const { chargingRateUnit, connectorId, duration } = commandPayload if (!chargingStation.hasConnector(connectorId)) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleRequestGetCompositeSchedule: Trying to get composite schedule to a non existing connector id ${connectorId.toString()}` ) return OCPP16Constants.OCPP_RESPONSE_REJECTED } if (connectorId === 0) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleRequestGetCompositeSchedule: Get composite schedule on connector id ${connectorId.toString()} is not yet supported` ) return OCPP16Constants.OCPP_RESPONSE_REJECTED @@ -1057,7 +1056,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { )! } } else { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleRequestGetDiagnostics: Unsupported protocol ${ uri.protocol } to transfer the diagnostic logs archive` @@ -1197,7 +1196,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { commandPayload.expiryDate = convertToDate(commandPayload.expiryDate)! const { connectorId, idTag, reservationId } = commandPayload if (!chargingStation.hasConnector(connectorId)) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleRequestReserveNow: Trying to reserve a non existing connector id ${connectorId.toString()}` ) return OCPP16Constants.OCPP_RESERVATION_RESPONSE_REJECTED @@ -1274,9 +1273,12 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { commandPayload: ResetRequest ): GenericResponse { const { type } = commandPayload - chargingStation - .reset(`${type}Reset` as OCPP16StopTransactionReason) - .catch(Constants.EMPTY_FUNCTION) + chargingStation.reset(`${type}Reset` as OCPP16StopTransactionReason).catch((error: unknown) => { + logger.error( + `${chargingStation.logPrefix()} ${moduleName}.handleRequestReset: Reset error:`, + error + ) + }) logger.info( `${chargingStation.logPrefix()} ${moduleName}.handleRequestReset: ${type} reset request received, simulating it. The station will be back online in ${formatDurationMilliSeconds( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -1301,7 +1303,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { } const { connectorId, csChargingProfiles } = commandPayload if (!chargingStation.hasConnector(connectorId)) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleRequestSetChargingProfile: Trying to set charging profile(s) to a non existing connector id ${connectorId.toString()}` ) return OCPP16Constants.OCPP_SET_CHARGING_PROFILE_RESPONSE_REJECTED @@ -1317,7 +1319,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { csChargingProfiles.chargingProfilePurpose === OCPP16ChargingProfilePurposeType.TX_PROFILE && connectorId === 0 ) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleRequestSetChargingProfile: Trying to set transaction charging profile(s) on connector ${connectorId.toString()}` ) return OCPP16Constants.OCPP_SET_CHARGING_PROFILE_RESPONSE_REJECTED @@ -1328,7 +1330,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { connectorId > 0 && connectorStatus?.transactionStarted === false ) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleRequestSetChargingProfile: Trying to set transaction charging profile(s) on connector ${connectorId.toString()} without a started transaction` ) return OCPP16Constants.OCPP_SET_CHARGING_PROFILE_RESPONSE_REJECTED @@ -1340,7 +1342,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { csChargingProfiles.transactionId != null && csChargingProfiles.transactionId !== connectorStatus.transactionId ) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleRequestSetChargingProfile: Trying to set transaction charging profile(s) on connector ${connectorId.toString()} with a different transaction id ${ csChargingProfiles.transactionId.toString() // eslint-disable-next-line @typescript-eslint/restrict-template-expressions @@ -1397,13 +1399,13 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { ): Promise { const { connectorId } = commandPayload if (!chargingStation.hasConnector(connectorId)) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleRequestUnlockConnector: Trying to unlock a non existing connector id ${connectorId.toString()}` ) return OCPP16Constants.OCPP_RESPONSE_UNLOCK_NOT_SUPPORTED } if (connectorId === 0) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleRequestUnlockConnector: Trying to unlock connector id ${connectorId.toString()}` ) return OCPP16Constants.OCPP_RESPONSE_UNLOCK_NOT_SUPPORTED @@ -1456,10 +1458,20 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { } const now = Date.now() if (retrieveDate.getTime() <= now) { - this.updateFirmwareSimulation(chargingStation).catch(Constants.EMPTY_FUNCTION) + this.updateFirmwareSimulation(chargingStation).catch((error: unknown) => { + logger.error( + `${chargingStation.logPrefix()} ${moduleName}.handleRequestUpdateFirmware: Firmware update simulation error:`, + error + ) + }) } else { setTimeout(() => { - this.updateFirmwareSimulation(chargingStation).catch(Constants.EMPTY_FUNCTION) + this.updateFirmwareSimulation(chargingStation).catch((error: unknown) => { + logger.error( + `${chargingStation.logPrefix()} ${moduleName}.handleRequestUpdateFirmware: Firmware update simulation error:`, + error + ) + }) }, retrieveDate.getTime() - now) } return OCPP16Constants.OCPP_RESPONSE_EMPTY diff --git a/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts b/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts index fce62a82..c4303c68 100644 --- a/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts @@ -246,7 +246,7 @@ export class OCPP16ResponseService extends OCPPResponseService { ) } } else { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleResponseAuthorize: idTag '${ requestPayload.idTag }' has no authorize request pending` @@ -304,7 +304,7 @@ export class OCPP16ResponseService extends OCPPResponseService { : logger.info(logMsg) } else { delete chargingStation.bootNotificationResponse - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleResponseBootNotification: Charging station boot notification response received: %j with undefined registration status`, payload ) @@ -318,7 +318,7 @@ export class OCPP16ResponseService extends OCPPResponseService { ): Promise { const { connectorId } = requestPayload if (connectorId === 0 || !chargingStation.hasConnector(connectorId)) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleResponseStartTransaction: Trying to start a transaction on a non existing connector id ${connectorId.toString()}` ) return @@ -331,7 +331,7 @@ export class OCPP16ResponseService extends OCPPResponseService { chargingStation.hasIdTags() && connectorStatus.idTagLocalAuthorized === false ) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleResponseStartTransaction: Trying to start a transaction with a not local authorized idTag ${ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions connectorStatus.localAuthorizeIdTag @@ -347,7 +347,7 @@ export class OCPP16ResponseService extends OCPPResponseService { connectorStatus.idTagLocalAuthorized === false && connectorStatus.idTagAuthorized === false ) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleResponseStartTransaction: Trying to start a transaction with a not authorized idTag ${ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions connectorStatus.authorizeIdTag @@ -361,7 +361,7 @@ export class OCPP16ResponseService extends OCPPResponseService { connectorStatus.authorizeIdTag != null && connectorStatus.authorizeIdTag !== requestPayload.idTag ) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleResponseStartTransaction: Trying to start a transaction with an idTag ${ requestPayload.idTag } different from the authorize request one ${ @@ -376,7 +376,7 @@ export class OCPP16ResponseService extends OCPPResponseService { connectorStatus.localAuthorizeIdTag != null && connectorStatus.localAuthorizeIdTag !== requestPayload.idTag ) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleResponseStartTransaction: Trying to start a transaction with an idTag ${ requestPayload.idTag } different from the local authorized one ${ @@ -387,7 +387,7 @@ export class OCPP16ResponseService extends OCPPResponseService { return } if (connectorStatus?.transactionStarted === true) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleResponseStartTransaction: Trying to start a transaction on an already used connector id ${connectorId.toString()} by idTag ${ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions connectorStatus.transactionIdTag @@ -400,7 +400,7 @@ export class OCPP16ResponseService extends OCPPResponseService { if (evseStatus.connectors.size > 1) { for (const [id, status] of evseStatus.connectors) { if (id !== connectorId && status.transactionStarted === true) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleResponseStartTransaction: Trying to start a transaction on an already used evse id ${evseId.toString()} by connector id ${id.toString()} with idTag ${ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions status.transactionIdTag @@ -417,7 +417,7 @@ export class OCPP16ResponseService extends OCPPResponseService { connectorStatus?.status !== OCPP16ChargePointStatus.Available && connectorStatus?.status !== OCPP16ChargePointStatus.Preparing ) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleResponseStartTransaction: Trying to start a transaction on connector id ${connectorId.toString()} with status ${ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions connectorStatus?.status @@ -533,7 +533,7 @@ export class OCPP16ResponseService extends OCPPResponseService { requestPayload.transactionId ) if (transactionConnectorId == null) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.handleResponseStopTransaction: Trying to stop a non existing transaction with id ${requestPayload.transactionId.toString()}` ) return diff --git a/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts b/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts index 515fffeb..52b24a5b 100644 --- a/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts +++ b/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts @@ -537,14 +537,14 @@ export class OCPP16ServiceUtils extends OCPPServiceUtils { cp: OCPP16ChargingProfile ): void { if (chargingStation.getConnectorStatus(connectorId)?.chargingProfiles == null) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.setChargingProfile: Trying to set a charging profile on connector id ${connectorId.toString()} with an uninitialized charging profiles array attribute, applying deferred initialization` ) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion chargingStation.getConnectorStatus(connectorId)!.chargingProfiles = [] } if (!Array.isArray(chargingStation.getConnectorStatus(connectorId)?.chargingProfiles)) { - logger.error( + logger.warn( `${chargingStation.logPrefix()} ${moduleName}.setChargingProfile: Trying to set a charging profile on connector id ${connectorId.toString()} with an improper attribute type for the charging profiles array, applying proper type deferred initialization` ) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion