Fix merge.
[e-mobility-charging-stations-simulator.git] / src / charging-station / ChargingStation.ts
index 9367f6530030d0e3813e5704e68aeaae8063135d..ada1c4b9e19c743c7fbcbbee7ca5925d5aaf1a88 100644 (file)
@@ -231,7 +231,7 @@ export default class ChargingStation {
   _getNumberOfPhases(): number {
     switch (this._getPowerOutType()) {
       case PowerOutType.AC:
-        return !Utils.isUndefined(this._stationInfo.numberOfPhases) ? Utils.convertToInt(this._stationInfo.numberOfPhases) : 3;
+        return !Utils.isUndefined(this._stationInfo.numberOfPhases) ? this._stationInfo.numberOfPhases : 3;
       case PowerOutType.DC:
         return 0;
     }
@@ -315,7 +315,7 @@ export default class ChargingStation {
         logger.error(errMsg);
         throw Error(errMsg);
     }
-    return !Utils.isUndefined(this._stationInfo.voltageOut) ? Utils.convertToInt(this._stationInfo.voltageOut) : defaultVoltageOut;
+    return !Utils.isUndefined(this._stationInfo.voltageOut) ? this._stationInfo.voltageOut : defaultVoltageOut;
   }
 
   _getTransactionIdTag(transactionId: number): string {
@@ -536,13 +536,16 @@ export default class ChargingStation {
     }
   }
 
-  _openWSConnection(options?: WebSocket.ClientOptions): void {
+  _openWSConnection(options?: WebSocket.ClientOptions, forceCloseOpened = false): void {
     if (Utils.isUndefined(options)) {
       options = {} as WebSocket.ClientOptions;
     }
     if (Utils.isUndefined(options.handshakeTimeout)) {
       options.handshakeTimeout = this._connectionTimeout;
     }
+    if (this._wsConnection?.readyState === WebSocket.OPEN && forceCloseOpened) {
+      this._wsConnection.close();
+    }
     this._wsConnection = new WebSocket(this._wsConnectionUrl, 'ocpp' + Constants.OCPP_VERSION_16, options);
     logger.info(this._logPrefix() + ' Will communicate through URL ' + this._supervisionUrl);
   }
@@ -600,6 +603,7 @@ export default class ChargingStation {
       await Utils.sleep(reconnectDelay);
       logger.error(this._logPrefix() + ' Socket: reconnecting try #' + this._autoReconnectRetryCount.toString());
       this._openWSConnection({ handshakeTimeout: reconnectDelay - 100 });
+      this._hasSocketRestarted = true;
     } else if (this._autoReconnectMaxRetries !== -1) {
       logger.error(`${this._logPrefix()} Socket: max retries reached (${this._autoReconnectRetryCount}) or retry disabled (${this._autoReconnectMaxRetries})`);
     }
@@ -637,7 +641,6 @@ export default class ChargingStation {
   async onError(errorEvent): Promise<void> {
     switch (errorEvent.code) {
       case 'ECONNREFUSED':
-        this._hasSocketRestarted = true;
         await this._reconnect(errorEvent);
         break;
       default:
@@ -654,7 +657,6 @@ export default class ChargingStation {
         this._autoReconnectRetryCount = 0;
         break;
       default: // Abnormal close
-        this._hasSocketRestarted = true;
         await this._reconnect(closeEvent);
         break;
     }
@@ -1120,7 +1122,7 @@ export default class ChargingStation {
 
   handleResponseBootNotification(payload: BootNotificationResponse, requestPayload: BootNotificationRequest): void {
     if (payload.status === RegistrationStatus.ACCEPTED) {
-      this._heartbeatInterval = Utils.convertToInt(payload.interval) * 1000;
+      this._heartbeatInterval = payload.interval * 1000;
       this._heartbeatSetInterval ? this._restartHeartbeat() : this._startHeartbeat();
       this._addConfigurationKey('HeartBeatInterval', payload.interval.toString());
       this._addConfigurationKey('HeartbeatInterval', payload.interval.toString(), false, false);
@@ -1147,7 +1149,7 @@ export default class ChargingStation {
   }
 
   async handleResponseStartTransaction(payload: StartTransactionResponse, requestPayload: StartTransactionRequest): Promise<void> {
-    const connectorId = Utils.convertToInt(requestPayload.connectorId);
+    const connectorId = requestPayload.connectorId;
     if (this.getConnector(connectorId).transactionStarted) {
       logger.debug(this._logPrefix() + ' Trying to start a transaction on an already used connector ' + connectorId.toString() + ': %j', this.getConnector(connectorId));
       return;
@@ -1187,7 +1189,7 @@ export default class ChargingStation {
   async handleResponseStopTransaction(payload: StopTransactionResponse, requestPayload: StopTransactionRequest): Promise<void> {
     let transactionConnectorId: number;
     for (const connector in this._connectors) {
-      if (Utils.convertToInt(connector) > 0 && this.getConnector(Utils.convertToInt(connector)).transactionId === Utils.convertToInt(requestPayload.transactionId)) {
+      if (Utils.convertToInt(connector) > 0 && this.getConnector(Utils.convertToInt(connector)).transactionId === requestPayload.transactionId) {
         transactionConnectorId = Utils.convertToInt(connector);
         break;
       }
@@ -1259,7 +1261,7 @@ export default class ChargingStation {
   }
 
   async handleRequestUnlockConnector(commandPayload: UnlockConnectorRequest): Promise<UnlockConnectorResponse> {
-    const connectorId = Utils.convertToInt(commandPayload.connectorId);
+    const connectorId = commandPayload.connectorId;
     if (connectorId === 0) {
       logger.error(this._logPrefix() + ' Trying to unlock connector ' + connectorId.toString());
       return Constants.OCPP_RESPONSE_UNLOCK_NOT_SUPPORTED;
@@ -1344,6 +1346,13 @@ export default class ChargingStation {
   }
 
   handleRequestChangeConfiguration(commandPayload: ChangeConfigurationRequest): ChangeConfigurationResponse {
+    // JSON request fields type sanity check
+    if (!Utils.isString(commandPayload.key)) {
+      logger.error(`${this._logPrefix()} ChangeConfiguration request key field is not a string:`, commandPayload);
+    }
+    if (!Utils.isString(commandPayload.value)) {
+      logger.error(`${this._logPrefix()} ChangeConfiguration request value field is not a string:`, commandPayload);
+    }
     const keyToChange = this._getConfigurationKey(commandPayload.key);
     if (!keyToChange) {
       return Constants.OCPP_CONFIGURATION_RESPONSE_NOT_SUPPORTED;
@@ -1399,7 +1408,7 @@ export default class ChargingStation {
   }
 
   async handleRequestRemoteStartTransaction(commandPayload: RemoteStartTransactionRequest): Promise<DefaultResponse> {
-    const transactionConnectorID: number = commandPayload.connectorId ? Utils.convertToInt(commandPayload.connectorId) : 1;
+    const transactionConnectorID: number = commandPayload.connectorId ? commandPayload.connectorId : 1;
     if (this._getAuthorizeRemoteTxRequests() && this._getLocalAuthListEnabled() && this.hasAuthorizedTags()) {
       // Check if authorized
       if (this._authorizedTags.find((value) => value === commandPayload.idTag)) {
@@ -1418,7 +1427,7 @@ export default class ChargingStation {
   }
 
   async handleRequestRemoteStopTransaction(commandPayload: RemoteStopTransactionRequest): Promise<DefaultResponse> {
-    const transactionId = Utils.convertToInt(commandPayload.transactionId);
+    const transactionId = commandPayload.transactionId;
     for (const connector in this._connectors) {
       if (Utils.convertToInt(connector) > 0 && this.getConnector(Utils.convertToInt(connector)).transactionId === transactionId) {
         await this.sendStopTransaction(transactionId);