Fix deprecated configuration key detection in a section
[e-mobility-charging-stations-simulator.git] / src / charging-station / ocpp / 1.6 / OCPP16IncomingRequestService.ts
index ed91c87ad9eab6f6db14baf135b13f75fcc13b85..bd9985048c3f9fdfa0679b96c677df0e8d674249 100644 (file)
@@ -34,7 +34,10 @@ import {
 import { Client, FTPResponse } from 'basic-ftp';
 import {
   OCPP16AuthorizationStatus,
+  OCPP16AuthorizeResponse,
+  OCPP16StartTransactionResponse,
   OCPP16StopTransactionReason,
+  OCPP16StopTransactionResponse,
 } from '../../../types/ocpp/1.6/Transaction';
 
 import type ChargingStation from '../../ChargingStation';
@@ -46,6 +49,7 @@ import { JsonType } from '../../../types/JsonType';
 import { OCPP16ChargePointErrorCode } from '../../../types/ocpp/1.6/ChargePointErrorCode';
 import { OCPP16ChargePointStatus } from '../../../types/ocpp/1.6/ChargePointStatus';
 import { OCPP16DiagnosticsStatus } from '../../../types/ocpp/1.6/DiagnosticsStatus';
+import { OCPP16ServiceUtils } from './OCPP16ServiceUtils';
 import { OCPP16StandardParametersKey } from '../../../types/ocpp/1.6/Configuration';
 import { OCPPConfigurationKey } from '../../../types/ocpp/Configuration';
 import OCPPError from '../../../exception/OCPPError';
@@ -202,12 +206,36 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
     }
     if (this.chargingStation.getConnectorStatus(connectorId)?.transactionStarted) {
       const transactionId = this.chargingStation.getConnectorStatus(connectorId).transactionId;
-      const stopResponse = await this.chargingStation.ocppRequestService.sendStopTransaction(
-        transactionId,
-        this.chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId),
-        this.chargingStation.getTransactionIdTag(transactionId),
-        OCPP16StopTransactionReason.UNLOCK_COMMAND
-      );
+      if (
+        this.chargingStation.getBeginEndMeterValues() &&
+        this.chargingStation.getOcppStrictCompliance() &&
+        !this.chargingStation.getOutOfOrderEndMeterValues()
+      ) {
+        // FIXME: Implement OCPP version agnostic helpers
+        const transactionEndMeterValue = OCPP16ServiceUtils.buildTransactionEndMeterValue(
+          this.chargingStation,
+          connectorId,
+          this.chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId)
+        );
+        await this.chargingStation.ocppRequestService.sendMessageHandler(
+          OCPP16RequestCommand.METER_VALUES,
+          {
+            connectorId,
+            transactionId,
+            meterValue: transactionEndMeterValue,
+          }
+        );
+      }
+      const stopResponse = (await this.chargingStation.ocppRequestService.sendMessageHandler(
+        OCPP16RequestCommand.STOP_TRANSACTION,
+        {
+          transactionId,
+          meterStop:
+            this.chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId),
+          idTag: this.chargingStation.getTransactionIdTag(transactionId),
+          reason: OCPP16StopTransactionReason.UNLOCK_COMMAND,
+        }
+      )) as OCPP16StopTransactionResponse;
       if (stopResponse.idTagInfo?.status === OCPP16AuthorizationStatus.ACCEPTED) {
         return Constants.OCPP_RESPONSE_UNLOCKED;
       }
@@ -535,10 +563,15 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
               true;
             authorized = true;
           } else if (this.chargingStation.getMayAuthorizeAtRemoteStart()) {
-            const authorizeResponse = await this.chargingStation.ocppRequestService.sendAuthorize(
-              transactionConnectorId,
-              commandPayload.idTag
-            );
+            this.chargingStation.getConnectorStatus(transactionConnectorId).authorizeIdTag =
+              commandPayload.idTag;
+            const authorizeResponse: OCPP16AuthorizeResponse =
+              (await this.chargingStation.ocppRequestService.sendMessageHandler(
+                OCPP16RequestCommand.AUTHORIZE,
+                {
+                  idTag: commandPayload.idTag,
+                }
+              )) as OCPP16AuthorizeResponse;
             if (authorizeResponse?.idTagInfo?.status === OCPP16AuthorizationStatus.ACCEPTED) {
               authorized = true;
             }
@@ -560,10 +593,13 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
               ).transactionRemoteStarted = true;
               if (
                 (
-                  await this.chargingStation.ocppRequestService.sendStartTransaction(
-                    transactionConnectorId,
-                    commandPayload.idTag
-                  )
+                  (await this.chargingStation.ocppRequestService.sendMessageHandler(
+                    OCPP16RequestCommand.START_TRANSACTION,
+                    {
+                      connectorId: transactionConnectorId,
+                      idTag: commandPayload.idTag,
+                    }
+                  )) as OCPP16StartTransactionResponse
                 ).idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED
               ) {
                 logger.debug(
@@ -603,10 +639,13 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
             true;
           if (
             (
-              await this.chargingStation.ocppRequestService.sendStartTransaction(
-                transactionConnectorId,
-                commandPayload.idTag
-              )
+              (await this.chargingStation.ocppRequestService.sendMessageHandler(
+                OCPP16RequestCommand.START_TRANSACTION,
+                {
+                  connectorId: transactionConnectorId,
+                  idTag: commandPayload.idTag,
+                }
+              )) as OCPP16StartTransactionResponse
             ).idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED
           ) {
             logger.debug(
@@ -713,10 +752,34 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
         );
         this.chargingStation.getConnectorStatus(connectorId).status =
           OCPP16ChargePointStatus.FINISHING;
-        await this.chargingStation.ocppRequestService.sendStopTransaction(
-          transactionId,
-          this.chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId),
-          this.chargingStation.getTransactionIdTag(transactionId)
+        if (
+          this.chargingStation.getBeginEndMeterValues() &&
+          this.chargingStation.getOcppStrictCompliance() &&
+          !this.chargingStation.getOutOfOrderEndMeterValues()
+        ) {
+          // FIXME: Implement OCPP version agnostic helpers
+          const transactionEndMeterValue = OCPP16ServiceUtils.buildTransactionEndMeterValue(
+            this.chargingStation,
+            connectorId,
+            this.chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId)
+          );
+          await this.chargingStation.ocppRequestService.sendMessageHandler(
+            OCPP16RequestCommand.METER_VALUES,
+            {
+              connectorId,
+              transactionId,
+              meterValue: transactionEndMeterValue,
+            }
+          );
+        }
+        await this.chargingStation.ocppRequestService.sendMessageHandler(
+          OCPP16RequestCommand.STOP_TRANSACTION,
+          {
+            transactionId,
+            meterStop:
+              this.chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId),
+            idTag: this.chargingStation.getTransactionIdTag(transactionId),
+          }
         );
         return Constants.OCPP_RESPONSE_ACCEPTED;
       }
@@ -766,8 +829,11 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
                 info.bytes / 1024
               } bytes transferred from diagnostics archive ${info.name}`
             );
-            await this.chargingStation.ocppRequestService.sendDiagnosticsStatusNotification(
-              OCPP16DiagnosticsStatus.Uploading
+            await this.chargingStation.ocppRequestService.sendMessageHandler(
+              OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION,
+              {
+                status: OCPP16DiagnosticsStatus.Uploading,
+              }
             );
           });
           uploadResponse = await ftpClient.uploadFrom(
@@ -775,8 +841,11 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
             uri.pathname + diagnosticsArchive
           );
           if (uploadResponse.code === 226) {
-            await this.chargingStation.ocppRequestService.sendDiagnosticsStatusNotification(
-              OCPP16DiagnosticsStatus.Uploaded
+            await this.chargingStation.ocppRequestService.sendMessageHandler(
+              OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION,
+              {
+                status: OCPP16DiagnosticsStatus.Uploaded,
+              }
             );
             if (ftpClient) {
               ftpClient.close();
@@ -799,8 +868,11 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
           OCPP16IncomingRequestCommand.GET_DIAGNOSTICS
         );
       } catch (error) {
-        await this.chargingStation.ocppRequestService.sendDiagnosticsStatusNotification(
-          OCPP16DiagnosticsStatus.UploadFailed
+        await this.chargingStation.ocppRequestService.sendMessageHandler(
+          OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION,
+          {
+            status: OCPP16DiagnosticsStatus.UploadFailed,
+          }
         );
         if (ftpClient) {
           ftpClient.close();
@@ -817,8 +889,11 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
           uri.protocol
         } to transfer the diagnostic logs archive`
       );
-      await this.chargingStation.ocppRequestService.sendDiagnosticsStatusNotification(
-        OCPP16DiagnosticsStatus.UploadFailed
+      await this.chargingStation.ocppRequestService.sendMessageHandler(
+        OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION,
+        {
+          status: OCPP16DiagnosticsStatus.UploadFailed,
+        }
       );
       return Constants.OCPP_RESPONSE_EMPTY;
     }