fix: fix return at getting connector status with evses
[e-mobility-charging-stations-simulator.git] / src / charging-station / ChargingStationUtils.ts
index c5c42f02944a451c2b8469c0d325361ed6a77376..f967ddd40ebc3df51d4597b917d6b5ed9cb8a470 100644 (file)
@@ -18,7 +18,9 @@ import {
   type ChargingSchedulePeriod,
   type ChargingStationInfo,
   type ChargingStationTemplate,
+  ConnectorPhaseRotation,
   type ConnectorStatus,
+  ConnectorStatusEnum,
   CurrentType,
   type EvseTemplate,
   type OCPP16BootNotificationRequest,
@@ -95,6 +97,23 @@ export class ChargingStationUtils {
     return true;
   }
 
+  public static getPhaseRotationValue(
+    connectorId: number,
+    numberOfPhases: number
+  ): string | undefined {
+    // AC/DC
+    if (connectorId === 0 && numberOfPhases === 0) {
+      return `${connectorId}.${ConnectorPhaseRotation.RST}`;
+    } else if (connectorId > 0 && numberOfPhases === 0) {
+      return `${connectorId}.${ConnectorPhaseRotation.NotApplicable}`;
+      // AC
+    } else if (connectorId > 0 && numberOfPhases === 1) {
+      return `${connectorId}.${ConnectorPhaseRotation.NotApplicable}`;
+    } else if (connectorId > 0 && numberOfPhases === 3) {
+      return `${connectorId}.${ConnectorPhaseRotation.RST}`;
+    }
+  }
+
   public static getMaxNumberOfEvses(evses: Record<string, EvseTemplate>): number {
     if (!evses) {
       return -1;
@@ -125,6 +144,31 @@ export class ChargingStationUtils {
     }
   }
 
+  public static getBootConnectorStatus(
+    chargingStation: ChargingStation,
+    connectorId: number,
+    connectorStatus: ConnectorStatus
+  ): ConnectorStatusEnum {
+    let connectorBootStatus: ConnectorStatusEnum;
+    if (
+      !connectorStatus?.status &&
+      (chargingStation.isChargingStationAvailable() === false ||
+        chargingStation.isConnectorAvailable(connectorId) === false)
+    ) {
+      connectorBootStatus = ConnectorStatusEnum.Unavailable;
+    } else if (!connectorStatus?.status && connectorStatus?.bootStatus) {
+      // Set boot status in template at startup
+      connectorBootStatus = connectorStatus?.bootStatus;
+    } else if (connectorStatus?.status) {
+      // Set previous status at startup
+      connectorBootStatus = connectorStatus?.status;
+    } else {
+      // Set default status
+      connectorBootStatus = ConnectorStatusEnum.Available;
+    }
+    return connectorBootStatus;
+  }
+
   public static getConfiguredNumberOfConnectors(stationInfo: ChargingStationInfo): number {
     let configuredMaxConnectors: number;
     if (Utils.isNotEmptyArray(stationInfo.numberOfConnectors) === true) {
@@ -171,7 +215,7 @@ export class ChargingStationUtils {
   ): void {
     if (!Utils.isNullOrUndefined(connectorStatus?.status)) {
       logger.warn(
-        `${logPrefix} Charging station information from template ${templateFile} with connector ${connectorId} status configuration defined, undefine it`
+        `${logPrefix} Charging station information from template ${templateFile} with connector id ${connectorId} status configuration defined, undefine it`
       );
       delete connectorStatus.status;
     }
@@ -194,10 +238,6 @@ export class ChargingStationUtils {
           templateFile
         );
         connectorsMap.set(connectorId, Utils.cloneObject<ConnectorStatus>(connectorStatus));
-        connectorsMap.get(connectorId).availability = AvailabilityType.Operative;
-        if (Utils.isUndefined(connectorsMap.get(connectorId)?.chargingProfiles)) {
-          connectorsMap.get(connectorId).chargingProfiles = [];
-        }
       }
     } else {
       logger.warn(
@@ -214,12 +254,17 @@ export class ChargingStationUtils {
     for (const connectorId of connectors.keys()) {
       if (connectorId > 0 && connectors.get(connectorId)?.transactionStarted === true) {
         logger.warn(
-          `${logPrefix} Connector ${connectorId} at initialization has a transaction started: ${
+          `${logPrefix} Connector id ${connectorId} at initialization has a transaction started with id ${
             connectors.get(connectorId)?.transactionId
           }`
         );
       }
-      if (
+      if (connectorId === 0) {
+        connectors.get(connectorId).availability = AvailabilityType.Operative;
+        if (Utils.isUndefined(connectors.get(connectorId)?.chargingProfiles)) {
+          connectors.get(connectorId).chargingProfiles = [];
+        }
+      } else if (
         connectorId > 0 &&
         Utils.isNullOrUndefined(connectors.get(connectorId)?.transactionStarted)
       ) {
@@ -228,15 +273,6 @@ export class ChargingStationUtils {
     }
   }
 
-  public static initializeConnectorStatus(connectorStatus: ConnectorStatus): void {
-    connectorStatus.idTagLocalAuthorized = false;
-    connectorStatus.idTagAuthorized = false;
-    connectorStatus.transactionRemoteStarted = false;
-    connectorStatus.transactionStarted = false;
-    connectorStatus.energyActiveImportRegisterValue = 0;
-    connectorStatus.transactionEnergyActiveImportRegisterValue = 0;
-  }
-
   public static resetConnectorStatus(connectorStatus: ConnectorStatus): void {
     connectorStatus.idTagLocalAuthorized = false;
     connectorStatus.idTagAuthorized = false;
@@ -523,6 +559,19 @@ export class ChargingStationUtils {
     );
   }
 
+  private static initializeConnectorStatus(connectorStatus: ConnectorStatus): void {
+    connectorStatus.availability = AvailabilityType.Operative;
+    connectorStatus.idTagLocalAuthorized = false;
+    connectorStatus.idTagAuthorized = false;
+    connectorStatus.transactionRemoteStarted = false;
+    connectorStatus.transactionStarted = false;
+    connectorStatus.energyActiveImportRegisterValue = 0;
+    connectorStatus.transactionEnergyActiveImportRegisterValue = 0;
+    if (Utils.isUndefined(connectorStatus.chargingProfiles)) {
+      connectorStatus.chargingProfiles = [];
+    }
+  }
+
   private static warnDeprecatedTemplateKey(
     template: ChargingStationTemplate,
     key: string,
@@ -551,7 +600,7 @@ export class ChargingStationUtils {
   }
 
   /**
-   * Charging profiles should already be sorted by connectorId and stack level (highest stack level has priority)
+   * Charging profiles should already be sorted by connector id and stack level (highest stack level has priority)
    *
    * @param chargingProfiles -
    * @param logPrefix -