fix: ensure custom meterValues values are taken
[e-mobility-charging-stations-simulator.git] / src / charging-station / ocpp / OCPPServiceUtils.ts
index ef16bfb8703302c74488af11ff635b8c6da4dd2d..8036079a4b2031c67613bf69ec5744e59cd9ae65 100644 (file)
@@ -15,6 +15,7 @@ import {
   type AuthorizeRequest,
   type AuthorizeResponse,
   ChargePointErrorCode,
+  ChargingStationEvents,
   type ConnectorStatus,
   type ConnectorStatusEnum,
   ErrorType,
@@ -173,7 +174,7 @@ export class OCPPServiceUtils {
     status: ConnectorStatusEnum,
     evseId?: number,
   ): StatusNotificationRequest {
-    switch (chargingStation.stationInfo.ocppVersion ?? OCPPVersion.VERSION_16) {
+    switch (chargingStation.stationInfo?.ocppVersion) {
       case OCPPVersion.VERSION_16:
         return {
           connectorId,
@@ -226,6 +227,10 @@ export class OCPPServiceUtils {
       );
     }
     chargingStation.getConnectorStatus(connectorId)!.status = status;
+    chargingStation.emit(ChargingStationEvents.connectorStatusChanged, {
+      connectorId,
+      ...chargingStation.getConnectorStatus(connectorId),
+    });
   }
 
   public static async isIdTagAuthorized(
@@ -233,7 +238,10 @@ export class OCPPServiceUtils {
     connectorId: number,
     idTag: string,
   ): Promise<boolean> {
-    if (!chargingStation.getLocalAuthListEnabled() && !chargingStation.getRemoteAuthorization()) {
+    if (
+      !chargingStation.getLocalAuthListEnabled() &&
+      !chargingStation.stationInfo?.remoteAuthorization
+    ) {
       logger.warn(
         `${chargingStation.logPrefix()} The charging station expects to authorize RFID tags but nor local authorization nor remote authorization are enabled. Misbehavior may occur`,
       );
@@ -246,7 +254,7 @@ export class OCPPServiceUtils {
       connectorStatus.localAuthorizeIdTag = idTag;
       connectorStatus.idTagLocalAuthorized = true;
       return true;
-    } else if (chargingStation.getRemoteAuthorization()) {
+    } else if (chargingStation.stationInfo?.remoteAuthorization) {
       return await OCPPServiceUtils.isIdTagRemoteAuthorized(chargingStation, connectorId, idTag);
     }
     return false;
@@ -259,7 +267,7 @@ export class OCPPServiceUtils {
   ): boolean {
     const fromStatus = chargingStation.getConnectorStatus(connectorId)!.status;
     let transitionAllowed = false;
-    switch (chargingStation.stationInfo.ocppVersion) {
+    switch (chargingStation.stationInfo?.ocppVersion) {
       case OCPPVersion.VERSION_16:
         if (
           (connectorId === 0 &&
@@ -292,14 +300,13 @@ export class OCPPServiceUtils {
       default:
         throw new BaseError(
           // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
-          `Cannot check connector status transition: OCPP version ${chargingStation.stationInfo.ocppVersion} not supported`,
+          `Cannot check connector status transition: OCPP version ${chargingStation.stationInfo?.ocppVersion} not supported`,
         );
     }
     if (transitionAllowed === false) {
       logger.warn(
-        `${chargingStation.logPrefix()} OCPP ${
-          chargingStation.stationInfo.ocppVersion
-        } connector id ${connectorId} status transition from '${
+        `${chargingStation.logPrefix()} OCPP ${chargingStation.stationInfo
+          ?.ocppVersion} connector id ${connectorId} status transition from '${
           chargingStation.getConnectorStatus(connectorId)!.status
         }' to '${status}' is not allowed`,
       );
@@ -412,20 +419,21 @@ export class OCPPServiceUtils {
   protected static getLimitFromSampledValueTemplateCustomValue(
     value: string,
     limit: number,
-    options?: { limitationEnabled?: boolean; unitMultiplier?: number },
+    options?: { limitationEnabled?: boolean; unitMultiplier?: number; defaultValue?: number },
   ): number {
     options = {
       ...{
         limitationEnabled: true,
         unitMultiplier: 1,
+        defaultValue: 0,
       },
       ...options,
     };
-    const parsedInt = parseInt(value);
-    const numberValue = isNaN(parsedInt) ? Infinity : parsedInt;
-    return options?.limitationEnabled
-      ? min(numberValue * options.unitMultiplier!, limit)
-      : numberValue * options.unitMultiplier!;
+    const parsedValue = parseInt(value);
+    if (options?.limitationEnabled) {
+      return min((!isNaN(parsedValue) ? parsedValue : Infinity) * options.unitMultiplier!, limit);
+    }
+    return (!isNaN(parsedValue) ? parsedValue : options.defaultValue!) * options.unitMultiplier!;
   }
 
   private static isIdTagLocalAuthorized(chargingStation: ChargingStation, idTag: string): boolean {