Add status notification support to trigger message OCPP command
[e-mobility-charging-stations-simulator.git] / src / charging-station / ocpp / 1.6 / OCPP16ResponseService.ts
index e4cc057ce9124ef408e3fa1357ab07c1b528b8fd..f2a08a1656b339f79ba5830b62cb2d96c575ace5 100644 (file)
@@ -1,26 +1,28 @@
 // Partial Copyright Jerome Benoit. 2021. All Rights Reserved.
 
 import {
-  AuthorizeRequest,
   OCPP16AuthorizationStatus,
+  OCPP16AuthorizeRequest,
   OCPP16AuthorizeResponse,
+  OCPP16StartTransactionRequest,
   OCPP16StartTransactionResponse,
+  OCPP16StopTransactionRequest,
   OCPP16StopTransactionResponse,
-  StartTransactionRequest,
-  StopTransactionRequest,
 } from '../../../types/ocpp/1.6/Transaction';
 import {
-  HeartbeatRequest,
+  OCPP16BootNotificationRequest,
   OCPP16RequestCommand,
-  StatusNotificationRequest,
+  OCPP16StatusNotificationRequest,
 } from '../../../types/ocpp/1.6/Requests';
 import {
-  HeartbeatResponse,
   OCPP16BootNotificationResponse,
   OCPP16RegistrationStatus,
-  StatusNotificationResponse,
+  OCPP16StatusNotificationResponse,
 } from '../../../types/ocpp/1.6/Responses';
-import { MeterValuesRequest, MeterValuesResponse } from '../../../types/ocpp/1.6/MeterValues';
+import {
+  OCPP16MeterValuesRequest,
+  OCPP16MeterValuesResponse,
+} from '../../../types/ocpp/1.6/MeterValues';
 
 import type ChargingStation from '../../ChargingStation';
 import { ErrorType } from '../../../types/ocpp/ErrorType';
@@ -56,9 +58,9 @@ export default class OCPP16ResponseService extends OCPPResponseService {
     ]);
   }
 
-  public async handleResponse(
+  public async responseHandler(
     commandName: OCPP16RequestCommand,
-    payload: JsonType | string,
+    payload: JsonType,
     requestPayload: JsonType
   ): Promise<void> {
     if (
@@ -104,12 +106,15 @@ export default class OCPP16ResponseService extends OCPPResponseService {
     if (payload.status === OCPP16RegistrationStatus.ACCEPTED) {
       this.chargingStation.addConfigurationKey(
         OCPP16StandardParametersKey.HeartBeatInterval,
-        payload.interval.toString()
+        payload.interval.toString(),
+        {},
+        { overwrite: true, save: true }
       );
       this.chargingStation.addConfigurationKey(
         OCPP16StandardParametersKey.HeartbeatInterval,
         payload.interval.toString(),
-        { visible: false }
+        { visible: false },
+        { overwrite: true, save: true }
       );
       this.chargingStation.heartbeatSetInterval
         ? this.chargingStation.restartHeartbeat()
@@ -131,21 +136,12 @@ export default class OCPP16ResponseService extends OCPPResponseService {
     }
   }
 
-  private handleResponseHeartbeat(
-    payload: HeartbeatResponse,
-    requestPayload: HeartbeatRequest
-  ): void {
-    logger.debug(
-      this.chargingStation.logPrefix() +
-        ' Heartbeat response received: %j to Heartbeat request: %j',
-      payload,
-      requestPayload
-    );
-  }
+  // eslint-disable-next-line @typescript-eslint/no-empty-function
+  private handleResponseHeartbeat(): void {}
 
   private handleResponseAuthorize(
     payload: OCPP16AuthorizeResponse,
-    requestPayload: AuthorizeRequest
+    requestPayload: OCPP16AuthorizeRequest
   ): void {
     let authorizeConnectorId: number;
     for (const connectorId of this.chargingStation.connectors.keys()) {
@@ -169,16 +165,16 @@ export default class OCPP16ResponseService extends OCPPResponseService {
       this.chargingStation.getConnectorStatus(authorizeConnectorId).idTagAuthorized = false;
       delete this.chargingStation.getConnectorStatus(authorizeConnectorId).authorizeIdTag;
       logger.debug(
-        `${this.chargingStation.logPrefix()} IdTag ${requestPayload.idTag} refused with status ${
+        `${this.chargingStation.logPrefix()} IdTag ${requestPayload.idTag} refused with status '${
           payload.idTagInfo.status
-        } on connector ${authorizeConnectorId}`
+        }' on connector ${authorizeConnectorId}`
       );
     }
   }
 
   private async handleResponseStartTransaction(
     payload: OCPP16StartTransactionResponse,
-    requestPayload: StartTransactionRequest
+    requestPayload: OCPP16StartTransactionRequest
   ): Promise<void> {
     const connectorId = requestPayload.connectorId;
 
@@ -310,23 +306,23 @@ export default class OCPP16ResponseService extends OCPPResponseService {
           requestPayload.meterStart
         );
       this.chargingStation.getBeginEndMeterValues() &&
-        (await this.chargingStation.ocppRequestService.sendMessageHandler(
-          OCPP16RequestCommand.METER_VALUES,
-          {
-            connectorId,
-            transactionId: payload.transactionId,
-            meterValue:
-              this.chargingStation.getConnectorStatus(connectorId).transactionBeginMeterValue,
-          }
-        ));
-      await this.chargingStation.ocppRequestService.sendMessageHandler(
-        OCPP16RequestCommand.STATUS_NOTIFICATION,
-        {
+        (await this.chargingStation.ocppRequestService.requestHandler<
+          OCPP16MeterValuesRequest,
+          OCPP16MeterValuesResponse
+        >(OCPP16RequestCommand.METER_VALUES, {
           connectorId,
-          status: OCPP16ChargePointStatus.CHARGING,
-          errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
-        }
-      );
+          transactionId: payload.transactionId,
+          meterValue:
+            this.chargingStation.getConnectorStatus(connectorId).transactionBeginMeterValue,
+        }));
+      await this.chargingStation.ocppRequestService.requestHandler<
+        OCPP16StatusNotificationRequest,
+        OCPP16StatusNotificationResponse
+      >(OCPP16RequestCommand.STATUS_NOTIFICATION, {
+        connectorId,
+        status: OCPP16ChargePointStatus.CHARGING,
+        errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
+      });
       this.chargingStation.getConnectorStatus(connectorId).status =
         OCPP16ChargePointStatus.CHARGING;
       logger.info(
@@ -357,9 +353,9 @@ export default class OCPP16ResponseService extends OCPPResponseService {
         this.chargingStation.logPrefix() +
           ' Starting transaction id ' +
           payload.transactionId.toString() +
-          ' REJECTED with status ' +
+          " REJECTED with status '" +
           payload?.idTagInfo?.status +
-          ', idTag ' +
+          "', idTag " +
           requestPayload.idTag
       );
       await this.resetConnectorOnStartTransactionError(connectorId);
@@ -372,14 +368,14 @@ export default class OCPP16ResponseService extends OCPPResponseService {
       this.chargingStation.getConnectorStatus(connectorId).status !==
       OCPP16ChargePointStatus.AVAILABLE
     ) {
-      await this.chargingStation.ocppRequestService.sendMessageHandler(
-        OCPP16RequestCommand.STATUS_NOTIFICATION,
-        {
-          connectorId,
-          status: OCPP16ChargePointStatus.AVAILABLE,
-          errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
-        }
-      );
+      await this.chargingStation.ocppRequestService.requestHandler<
+        OCPP16StatusNotificationRequest,
+        OCPP16StatusNotificationResponse
+      >(OCPP16RequestCommand.STATUS_NOTIFICATION, {
+        connectorId,
+        status: OCPP16ChargePointStatus.AVAILABLE,
+        errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
+      });
       this.chargingStation.getConnectorStatus(connectorId).status =
         OCPP16ChargePointStatus.AVAILABLE;
     }
@@ -387,19 +383,11 @@ export default class OCPP16ResponseService extends OCPPResponseService {
 
   private async handleResponseStopTransaction(
     payload: OCPP16StopTransactionResponse,
-    requestPayload: StopTransactionRequest
+    requestPayload: OCPP16StopTransactionRequest
   ): Promise<void> {
-    let transactionConnectorId: number;
-    for (const connectorId of this.chargingStation.connectors.keys()) {
-      if (
-        connectorId > 0 &&
-        this.chargingStation.getConnectorStatus(connectorId)?.transactionId ===
-          requestPayload.transactionId
-      ) {
-        transactionConnectorId = connectorId;
-        break;
-      }
-    }
+    const transactionConnectorId = this.chargingStation.getConnectorIdByTransactionId(
+      requestPayload.transactionId
+    );
     if (!transactionConnectorId) {
       logger.error(
         this.chargingStation.logPrefix() +
@@ -412,38 +400,41 @@ export default class OCPP16ResponseService extends OCPPResponseService {
       this.chargingStation.getBeginEndMeterValues() &&
         !this.chargingStation.getOcppStrictCompliance() &&
         this.chargingStation.getOutOfOrderEndMeterValues() &&
-        (await this.chargingStation.ocppRequestService.sendTransactionEndMeterValues(
-          transactionConnectorId,
-          requestPayload.transactionId,
-          OCPP16ServiceUtils.buildTransactionEndMeterValue(
+        (await this.chargingStation.ocppRequestService.requestHandler<
+          OCPP16MeterValuesRequest,
+          OCPP16MeterValuesResponse
+        >(OCPP16RequestCommand.METER_VALUES, {
+          connectorId: transactionConnectorId,
+          transactionId: requestPayload.transactionId,
+          meterValue: OCPP16ServiceUtils.buildTransactionEndMeterValue(
             this.chargingStation,
             transactionConnectorId,
             requestPayload.meterStop
-          )
-        ));
+          ),
+        }));
       if (
         !this.chargingStation.isChargingStationAvailable() ||
         !this.chargingStation.isConnectorAvailable(transactionConnectorId)
       ) {
-        await this.chargingStation.ocppRequestService.sendMessageHandler(
-          OCPP16RequestCommand.STATUS_NOTIFICATION,
-          {
-            connectorId: transactionConnectorId,
-            status: OCPP16ChargePointStatus.UNAVAILABLE,
-            errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
-          }
-        );
+        await this.chargingStation.ocppRequestService.requestHandler<
+          OCPP16StatusNotificationRequest,
+          OCPP16StatusNotificationResponse
+        >(OCPP16RequestCommand.STATUS_NOTIFICATION, {
+          connectorId: transactionConnectorId,
+          status: OCPP16ChargePointStatus.UNAVAILABLE,
+          errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
+        });
         this.chargingStation.getConnectorStatus(transactionConnectorId).status =
           OCPP16ChargePointStatus.UNAVAILABLE;
       } else {
-        await this.chargingStation.ocppRequestService.sendMessageHandler(
-          OCPP16RequestCommand.STATUS_NOTIFICATION,
-          {
-            connectorId: transactionConnectorId,
-            status: OCPP16ChargePointStatus.AVAILABLE,
-            errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
-          }
-        );
+        await this.chargingStation.ocppRequestService.requestHandler<
+          OCPP16BootNotificationRequest,
+          OCPP16BootNotificationResponse
+        >(OCPP16RequestCommand.STATUS_NOTIFICATION, {
+          connectorId: transactionConnectorId,
+          status: OCPP16ChargePointStatus.AVAILABLE,
+          errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
+        });
         this.chargingStation.getConnectorStatus(transactionConnectorId).status =
           OCPP16ChargePointStatus.AVAILABLE;
       }
@@ -465,33 +456,16 @@ export default class OCPP16ResponseService extends OCPPResponseService {
         this.chargingStation.logPrefix() +
           ' Stopping transaction id ' +
           requestPayload.transactionId.toString() +
-          ' REJECTED with status ' +
-          payload.idTagInfo?.status
+          " REJECTED with status '" +
+          payload.idTagInfo?.status +
+          "'"
       );
     }
   }
 
-  private handleResponseStatusNotification(
-    payload: StatusNotificationRequest,
-    requestPayload: StatusNotificationResponse
-  ): void {
-    logger.debug(
-      this.chargingStation.logPrefix() +
-        ' Status notification response received: %j to StatusNotification request: %j',
-      payload,
-      requestPayload
-    );
-  }
+  // eslint-disable-next-line @typescript-eslint/no-empty-function
+  private handleResponseStatusNotification(): void {}
 
-  private handleResponseMeterValues(
-    payload: MeterValuesRequest,
-    requestPayload: MeterValuesResponse
-  ): void {
-    logger.debug(
-      this.chargingStation.logPrefix() +
-        ' MeterValues response received: %j to MeterValues request: %j',
-      payload,
-      requestPayload
-    );
-  }
+  // eslint-disable-next-line @typescript-eslint/no-empty-function
+  private handleResponseMeterValues(): void {}
 }