]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
fix(ocpp16): harmonize error logging — log silent catches, demote business violations...
authorJérôme Benoit <jerome.benoit@sap.com>
Sun, 15 Mar 2026 15:28:51 +0000 (16:28 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Sun, 15 Mar 2026 15:28:51 +0000 (16:28 +0100)
src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts
src/charging-station/ocpp/1.6/OCPP16ResponseService.ts
src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts

index d2d3a3b99bb2112301236eaf56959e33c34e24e2..ab39a81f6668a829901af41581a197c0b7e16529 100644 (file)
@@ -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<OCPP16ChangeAvailabilityResponse> {
     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<UnlockConnectorResponse> {
     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
index fce62a828170562e65d2adc8e4242bec31a30d6a..c4303c68c386408efcfb818efc2fd6c3cd6f5abf 100644 (file)
@@ -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<void> {
     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
index 515fffeb6916927a5b0f9bc3a6d1f5990e172a9d..52b24a5b436185af0884da2a74e67f8594b7619e 100644 (file)
@@ -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