Add occpStrictCompliance template tunable
[e-mobility-charging-stations-simulator.git] / src / charging-station / ocpp / 1.6 / OCPP16RequestService.ts
index 4daf9628b905aa08ceecffa78b8cc6abf3e35fd2..3580cc52e18701ff05f8a6939b6714bb5be9113a 100644 (file)
@@ -8,6 +8,7 @@ import { MeterValueUnit, MeterValuesRequest, OCPP16MeterValue, OCPP16MeterValueM
 
 import Constants from '../../../utils/Constants';
 import { ErrorType } from '../../../types/ocpp/ErrorType';
+import { JsonType } from '../../../types/JsonType';
 import MeasurandPerPhaseSampledValueTemplates from '../../../types/MeasurandPerPhaseSampledValueTemplates';
 import MeasurandValues from '../../../types/MeasurandValues';
 import { MessageType } from '../../../types/ocpp/MessageType';
@@ -16,23 +17,25 @@ import { OCPP16ChargePointErrorCode } from '../../../types/ocpp/1.6/ChargePointE
 import { OCPP16ChargePointStatus } from '../../../types/ocpp/1.6/ChargePointStatus';
 import { OCPP16DiagnosticsStatus } from '../../../types/ocpp/1.6/DiagnosticsStatus';
 import { OCPP16ServiceUtils } from './OCPP16ServiceUtils';
-import OCPPError from '../OCPPError';
+import OCPPError from '../../../exception/OCPPError';
 import OCPPRequestService from '../OCPPRequestService';
+import { SendParams } from '../../../types/ocpp/Requests';
 import Utils from '../../../utils/Utils';
 import logger from '../../../utils/Logger';
 
 export default class OCPP16RequestService extends OCPPRequestService {
-  public async sendHeartbeat(): Promise<void> {
+  public async sendHeartbeat(params?: SendParams): Promise<void> {
     try {
       const payload: HeartbeatRequest = {};
-      await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.HEARTBEAT);
+      await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.HEARTBEAT, params);
     } catch (error) {
-      this.handleRequestError(OCPP16RequestCommand.HEARTBEAT, error);
+      this.handleRequestError(OCPP16RequestCommand.HEARTBEAT, error as Error);
     }
   }
 
   public async sendBootNotification(chargePointModel: string, chargePointVendor: string, chargeBoxSerialNumber?: string, firmwareVersion?: string,
-      chargePointSerialNumber?: string, iccid?: string, imsi?: string, meterSerialNumber?: string, meterType?: string): Promise<OCPP16BootNotificationResponse> {
+      chargePointSerialNumber?: string, iccid?: string, imsi?: string, meterSerialNumber?: string, meterType?: string,
+      params?: SendParams): Promise<OCPP16BootNotificationResponse> {
     try {
       const payload: OCPP16BootNotificationRequest = {
         chargePointModel,
@@ -45,9 +48,10 @@ export default class OCPP16RequestService extends OCPPRequestService {
         ...!Utils.isUndefined(meterSerialNumber) && { meterSerialNumber },
         ...!Utils.isUndefined(meterType) && { meterType }
       };
-      return await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.BOOT_NOTIFICATION, true) as OCPP16BootNotificationResponse;
+      return await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE,
+        OCPP16RequestCommand.BOOT_NOTIFICATION, { ...params, skipBufferingOnError: true }) as OCPP16BootNotificationResponse;
     } catch (error) {
-      this.handleRequestError(OCPP16RequestCommand.BOOT_NOTIFICATION, error);
+      this.handleRequestError(OCPP16RequestCommand.BOOT_NOTIFICATION, error as Error);
     }
   }
 
@@ -61,7 +65,7 @@ export default class OCPP16RequestService extends OCPPRequestService {
       };
       await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.STATUS_NOTIFICATION);
     } catch (error) {
-      this.handleRequestError(OCPP16RequestCommand.STATUS_NOTIFICATION, error);
+      this.handleRequestError(OCPP16RequestCommand.STATUS_NOTIFICATION, error as Error);
     }
   }
 
@@ -73,7 +77,7 @@ export default class OCPP16RequestService extends OCPPRequestService {
       this.chargingStation.getConnectorStatus(connectorId).authorizeIdTag = idTag;
       return await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.AUTHORIZE) as OCPP16AuthorizeResponse;
     } catch (error) {
-      this.handleRequestError(OCPP16RequestCommand.AUTHORIZE, error);
+      this.handleRequestError(OCPP16RequestCommand.AUTHORIZE, error as Error);
     }
   }
 
@@ -87,7 +91,7 @@ export default class OCPP16RequestService extends OCPPRequestService {
       };
       return await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.START_TRANSACTION) as OCPP16StartTransactionResponse;
     } catch (error) {
-      this.handleRequestError(OCPP16RequestCommand.START_TRANSACTION, error);
+      this.handleRequestError(OCPP16RequestCommand.START_TRANSACTION, error as Error);
     }
   }
 
@@ -103,7 +107,7 @@ export default class OCPP16RequestService extends OCPPRequestService {
       }
       const transactionEndMeterValue = OCPP16ServiceUtils.buildTransactionEndMeterValue(this.chargingStation, connectorId, meterStop);
       // FIXME: should be a callback, each OCPP commands implementation must do only one job
-      (this.chargingStation.getBeginEndMeterValues() && !this.chargingStation.getOutOfOrderEndMeterValues())
+      (this.chargingStation.getBeginEndMeterValues() && this.chargingStation.getOcppStrictCompliance() && !this.chargingStation.getOutOfOrderEndMeterValues())
         && await this.sendTransactionEndMeterValues(connectorId, transactionId, transactionEndMeterValue);
       const payload: StopTransactionRequest = {
         transactionId,
@@ -115,7 +119,7 @@ export default class OCPP16RequestService extends OCPPRequestService {
       };
       return await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.STOP_TRANSACTION) as OCPP16StartTransactionResponse;
     } catch (error) {
-      this.handleRequestError(OCPP16RequestCommand.STOP_TRANSACTION, error);
+      this.handleRequestError(OCPP16RequestCommand.STOP_TRANSACTION, error as Error);
     }
   }
 
@@ -316,7 +320,7 @@ export default class OCPP16RequestService extends OCPPRequestService {
           : Utils.getRandomFloatRounded(maxEnergyRounded);
         // Persist previous value on connector
         if (connector && !Utils.isNullOrUndefined(connector.energyActiveImportRegisterValue) && connector.energyActiveImportRegisterValue >= 0 &&
-            !Utils.isNullOrUndefined(connector.transactionEnergyActiveImportRegisterValue) && connector.transactionEnergyActiveImportRegisterValue >= 0) {
+          !Utils.isNullOrUndefined(connector.transactionEnergyActiveImportRegisterValue) && connector.transactionEnergyActiveImportRegisterValue >= 0) {
           connector.energyActiveImportRegisterValue += energyValueRounded;
           connector.transactionEnergyActiveImportRegisterValue += energyValueRounded;
         } else {
@@ -337,7 +341,7 @@ export default class OCPP16RequestService extends OCPPRequestService {
       };
       await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.METER_VALUES);
     } catch (error) {
-      this.handleRequestError(OCPP16RequestCommand.METER_VALUES, error);
+      this.handleRequestError(OCPP16RequestCommand.METER_VALUES, error as Error);
     }
   }
 
@@ -350,7 +354,7 @@ export default class OCPP16RequestService extends OCPPRequestService {
       };
       await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.METER_VALUES);
     } catch (error) {
-      this.handleRequestError(OCPP16RequestCommand.METER_VALUES, error);
+      this.handleRequestError(OCPP16RequestCommand.METER_VALUES, error as Error);
     }
   }
 
@@ -363,7 +367,7 @@ export default class OCPP16RequestService extends OCPPRequestService {
       };
       await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.METER_VALUES);
     } catch (error) {
-      this.handleRequestError(OCPP16RequestCommand.METER_VALUES, error);
+      this.handleRequestError(OCPP16RequestCommand.METER_VALUES, error as Error);
     }
   }
 
@@ -374,16 +378,25 @@ export default class OCPP16RequestService extends OCPPRequestService {
       };
       await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION);
     } catch (error) {
-      this.handleRequestError(OCPP16RequestCommand.METER_VALUES, error);
+      this.handleRequestError(OCPP16RequestCommand.METER_VALUES, error as Error);
     }
   }
 
-  public async sendError(messageId: string, error: OCPPError, commandName: OCPP16RequestCommand | OCPP16IncomingRequestCommand): Promise<unknown> {
+  public async sendResult(messageId: string, resultMessageData: JsonType, commandName: OCPP16RequestCommand | OCPP16IncomingRequestCommand): Promise<JsonType> {
     try {
       // Send error
-      return await this.sendMessage(messageId, error, MessageType.CALL_ERROR_MESSAGE, commandName);
-    } catch (err) {
-      this.handleRequestError(commandName as OCPP16RequestCommand, err);
+      return await this.sendMessage(messageId, resultMessageData, MessageType.CALL_RESULT_MESSAGE, commandName) as JsonType;
+    } catch (error) {
+      this.handleRequestError(commandName as OCPP16RequestCommand, error as Error);
+    }
+  }
+
+  public async sendError(messageId: string, ocppError: OCPPError, commandName: OCPP16RequestCommand | OCPP16IncomingRequestCommand): Promise<JsonType> {
+    try {
+      // Send error
+      return await this.sendMessage(messageId, ocppError, MessageType.CALL_ERROR_MESSAGE, commandName) as JsonType;
+    } catch (error) {
+      this.handleRequestError(commandName as OCPP16RequestCommand, error as Error);
     }
   }
 }