X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FChargingStation.ts;h=ada1c4b9e19c743c7fbcbbee7ca5925d5aaf1a88;hb=3bf051e2a6a3bd41b4ffe6ccffdcc05c2ff509bc;hp=9367f6530030d0e3813e5704e68aeaae8063135d;hpb=4d9bf03b5c6ea78a866c153cbf665c3f7cb45aaf;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ChargingStation.ts b/src/charging-station/ChargingStation.ts index 9367f653..ada1c4b9 100644 --- a/src/charging-station/ChargingStation.ts +++ b/src/charging-station/ChargingStation.ts @@ -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 { 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 { - 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 { 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 { - 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 { - 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 { - 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);