Add Hearbeat command to OCPP 2.0.1
[e-mobility-charging-stations-simulator.git] / src / charging-station / ChargingStation.ts
index 806bcd752cd50a2cfdc8408e8b9147e48fcaa81a..84aa81ca649336eda64779744c87600ac5d9a098 100644 (file)
@@ -173,17 +173,15 @@ export default class ChargingStation {
     );
   }
 
-  public getEnableStatistics(): boolean | undefined {
-    return !Utils.isUndefined(this.stationInfo.enableStatistics)
-      ? this.stationInfo.enableStatistics
-      : true;
+  public getEnableStatistics(): boolean {
+    return this.stationInfo.enableStatistics ?? false;
   }
 
-  public getMustAuthorizeAtRemoteStart(): boolean | undefined {
+  public getMustAuthorizeAtRemoteStart(): boolean {
     return this.stationInfo.mustAuthorizeAtRemoteStart ?? true;
   }
 
-  public getPayloadSchemaValidation(): boolean | undefined {
+  public getPayloadSchemaValidation(): boolean {
     return this.stationInfo.payloadSchemaValidation ?? true;
   }
 
@@ -487,7 +485,7 @@ export default class ChargingStation {
     if (this.started === false) {
       if (this.starting === false) {
         this.starting = true;
-        if (this.getEnableStatistics()) {
+        if (this.getEnableStatistics() === true) {
           this.performanceStatistics.start();
         }
         this.openWSConnection();
@@ -515,7 +513,7 @@ export default class ChargingStation {
                 ) {
                   this.startAutomaticTransactionGenerator();
                 }
-                if (this.getEnableStatistics()) {
+                if (this.getEnableStatistics() === true) {
                   this.performanceStatistics.restart();
                 } else {
                   this.performanceStatistics.stop();
@@ -547,7 +545,7 @@ export default class ChargingStation {
         this.stopping = true;
         await this.stopMessageSequence(reason);
         this.closeWSConnection();
-        if (this.getEnableStatistics()) {
+        if (this.getEnableStatistics() === true) {
           this.performanceStatistics.stop();
         }
         this.sharedLRUCache.deleteChargingStationConfiguration(this.configurationFileHash);
@@ -827,21 +825,6 @@ export default class ChargingStation {
       'supervisionUrl',
       'supervisionUrls'
     );
-    const firmwareVersionRegExp = stationTemplate.firmwareVersionPattern
-      ? new RegExp(stationTemplate.firmwareVersionPattern)
-      : Constants.SEMVER_REGEXP;
-    if (
-      stationTemplate.firmwareVersion &&
-      firmwareVersionRegExp.test(stationTemplate.firmwareVersion) === false
-    ) {
-      logger.warn(
-        `${this.logPrefix()} Firmware version '${
-          stationTemplate.firmwareVersion
-        }' in template file ${
-          this.templateFile
-        } does not match regular expression '${firmwareVersionRegExp.toString()}'`
-      );
-    }
     const stationInfo: ChargingStationInfo =
       ChargingStationUtils.stationTemplateToStationInfo(stationTemplate);
     stationInfo.hashId = ChargingStationUtils.getHashId(this.index, stationTemplate);
@@ -864,6 +847,18 @@ export default class ChargingStation {
           ? stationTemplate.power * 1000
           : stationTemplate.power;
     }
+    stationInfo.firmwareVersionPattern =
+      stationTemplate.firmwareVersionPattern ?? Constants.SEMVER_PATTERN;
+    if (
+      stationInfo.firmwareVersion &&
+      new RegExp(stationInfo.firmwareVersionPattern).test(stationInfo.firmwareVersion) === false
+    ) {
+      logger.warn(
+        `${this.logPrefix()} Firmware version '${stationInfo.firmwareVersion}' in template file ${
+          this.templateFile
+        } does not match firmware version pattern '${stationInfo.firmwareVersionPattern}'`
+      );
+    }
     stationInfo.resetTime = stationTemplate.resetTime
       ? stationTemplate.resetTime * 1000
       : Constants.CHARGING_STATION_DEFAULT_RESET_TIME;
@@ -961,7 +956,7 @@ export default class ChargingStation {
     // Avoid duplication of connectors related information in RAM
     this.stationInfo?.Connectors && delete this.stationInfo.Connectors;
     this.configuredSupervisionUrl = this.getConfiguredSupervisionUrl();
-    if (this.getEnableStatistics()) {
+    if (this.getEnableStatistics() === true) {
       this.performanceStatistics = PerformanceStatistics.getInstance(
         this.stationInfo.hashId,
         this.stationInfo.chargingStationId,
@@ -1002,6 +997,18 @@ export default class ChargingStation {
         status: RegistrationStatusEnumType.ACCEPTED,
       };
     }
+    if (
+      this.stationInfo.firmwareStatus === FirmwareStatus.Installing &&
+      this.stationInfo.firmwareVersion &&
+      this.stationInfo.firmwareVersionPattern
+    ) {
+      const match = this.stationInfo.firmwareVersion
+        .match(new RegExp(this.stationInfo.firmwareVersionPattern))
+        .slice(1, this.stationInfo.firmwareVersion.split('.').length + 1);
+      const patchLevelIndex = match.length - 1;
+      match[patchLevelIndex] = (Utils.convertToInt(match[patchLevelIndex]) + 1).toString();
+      this.stationInfo.firmwareVersion = match.join('.');
+    }
   }
 
   private initializeOcppConfiguration(): void {
@@ -1848,8 +1855,8 @@ export default class ChargingStation {
         status: FirmwareStatus.Installed,
       });
       this.stationInfo.firmwareStatus = FirmwareStatus.Installed;
-      // TODO: bump firmware version
     }
+
     // Start the ATG
     if (this.getAutomaticTransactionGeneratorConfigurationFromTemplate()?.enable === true) {
       this.startAutomaticTransactionGenerator();