1 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
4 import path from
'path';
5 import { fileURLToPath
} from
'url';
7 import type { JSONSchemaType
} from
'ajv';
9 import OCPPError from
'../../../exception/OCPPError';
10 import type { JsonObject
, JsonType
} from
'../../../types/JsonType';
11 import { OCPP16ChargePointErrorCode
} from
'../../../types/ocpp/1.6/ChargePointErrorCode';
12 import { OCPP16ChargePointStatus
} from
'../../../types/ocpp/1.6/ChargePointStatus';
13 import { OCPP16StandardParametersKey
} from
'../../../types/ocpp/1.6/Configuration';
15 OCPP16MeterValuesRequest
,
16 OCPP16MeterValuesResponse
,
17 } from
'../../../types/ocpp/1.6/MeterValues';
19 type OCPP16BootNotificationRequest
,
20 OCPP16IncomingRequestCommand
,
22 type OCPP16StatusNotificationRequest
,
23 } from
'../../../types/ocpp/1.6/Requests';
25 ChangeAvailabilityResponse
,
26 ChangeConfigurationResponse
,
27 ClearChargingProfileResponse
,
28 DiagnosticsStatusNotificationResponse
,
29 GetConfigurationResponse
,
30 GetDiagnosticsResponse
,
31 OCPP16BootNotificationResponse
,
32 OCPP16DataTransferResponse
,
33 OCPP16HeartbeatResponse
,
34 OCPP16StatusNotificationResponse
,
35 OCPP16TriggerMessageResponse
,
36 OCPP16UpdateFirmwareResponse
,
37 SetChargingProfileResponse
,
38 UnlockConnectorResponse
,
39 } from
'../../../types/ocpp/1.6/Responses';
41 OCPP16AuthorizationStatus
,
42 type OCPP16AuthorizeRequest
,
43 type OCPP16AuthorizeResponse
,
44 type OCPP16StartTransactionRequest
,
45 type OCPP16StartTransactionResponse
,
46 type OCPP16StopTransactionRequest
,
47 type OCPP16StopTransactionResponse
,
48 } from
'../../../types/ocpp/1.6/Transaction';
49 import { ErrorType
} from
'../../../types/ocpp/ErrorType';
50 import { OCPPVersion
} from
'../../../types/ocpp/OCPPVersion';
53 RegistrationStatusEnumType
,
55 } from
'../../../types/ocpp/Responses';
56 import Constants from
'../../../utils/Constants';
57 import logger from
'../../../utils/Logger';
58 import Utils from
'../../../utils/Utils';
59 import type ChargingStation from
'../../ChargingStation';
60 import { ChargingStationConfigurationUtils
} from
'../../ChargingStationConfigurationUtils';
61 import OCPPResponseService from
'../OCPPResponseService';
62 import { OCPP16ServiceUtils
} from
'./OCPP16ServiceUtils';
64 const moduleName
= 'OCPP16ResponseService';
66 export default class OCPP16ResponseService
extends OCPPResponseService
{
67 public jsonIncomingRequestResponseSchemas
: Map
<
68 OCPP16IncomingRequestCommand
,
69 JSONSchemaType
<JsonObject
>
72 private responseHandlers
: Map
<OCPP16RequestCommand
, ResponseHandler
>;
73 private jsonSchemas
: Map
<OCPP16RequestCommand
, JSONSchemaType
<JsonObject
>>;
75 public constructor() {
76 if (new.target
?.name
=== moduleName
) {
77 throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
79 super(OCPPVersion
.VERSION_16
);
80 this.responseHandlers
= new Map
<OCPP16RequestCommand
, ResponseHandler
>([
81 [OCPP16RequestCommand
.BOOT_NOTIFICATION
, this.handleResponseBootNotification
.bind(this)],
82 [OCPP16RequestCommand
.HEARTBEAT
, this.emptyResponseHandler
.bind(this)],
83 [OCPP16RequestCommand
.AUTHORIZE
, this.handleResponseAuthorize
.bind(this)],
84 [OCPP16RequestCommand
.START_TRANSACTION
, this.handleResponseStartTransaction
.bind(this)],
85 [OCPP16RequestCommand
.STOP_TRANSACTION
, this.handleResponseStopTransaction
.bind(this)],
86 [OCPP16RequestCommand
.STATUS_NOTIFICATION
, this.emptyResponseHandler
.bind(this)],
87 [OCPP16RequestCommand
.METER_VALUES
, this.emptyResponseHandler
.bind(this)],
88 [OCPP16RequestCommand
.DIAGNOSTICS_STATUS_NOTIFICATION
, this.emptyResponseHandler
.bind(this)],
89 [OCPP16RequestCommand
.DATA_TRANSFER
, this.emptyResponseHandler
.bind(this)],
91 this.jsonSchemas
= new Map
<OCPP16RequestCommand
, JSONSchemaType
<JsonObject
>>([
93 OCPP16RequestCommand
.BOOT_NOTIFICATION
,
97 path
.dirname(fileURLToPath(import.meta
.url
)),
98 '../../../assets/json-schemas/ocpp/1.6/BootNotificationResponse.json'
102 ) as JSONSchemaType
<OCPP16BootNotificationResponse
>,
105 OCPP16RequestCommand
.HEARTBEAT
,
109 path
.dirname(fileURLToPath(import.meta
.url
)),
110 '../../../assets/json-schemas/ocpp/1.6/HeartbeatResponse.json'
114 ) as JSONSchemaType
<OCPP16HeartbeatResponse
>,
117 OCPP16RequestCommand
.AUTHORIZE
,
121 path
.dirname(fileURLToPath(import.meta
.url
)),
122 '../../../assets/json-schemas/ocpp/1.6/AuthorizeResponse.json'
126 ) as JSONSchemaType
<OCPP16AuthorizeResponse
>,
129 OCPP16RequestCommand
.START_TRANSACTION
,
133 path
.dirname(fileURLToPath(import.meta
.url
)),
134 '../../../assets/json-schemas/ocpp/1.6/StartTransactionResponse.json'
138 ) as JSONSchemaType
<OCPP16StartTransactionResponse
>,
141 OCPP16RequestCommand
.STOP_TRANSACTION
,
145 path
.dirname(fileURLToPath(import.meta
.url
)),
146 '../../../assets/json-schemas/ocpp/1.6/StopTransactionResponse.json'
150 ) as JSONSchemaType
<OCPP16StopTransactionResponse
>,
153 OCPP16RequestCommand
.STATUS_NOTIFICATION
,
157 path
.dirname(fileURLToPath(import.meta
.url
)),
158 '../../../assets/json-schemas/ocpp/1.6/StatusNotificationResponse.json'
162 ) as JSONSchemaType
<OCPP16StatusNotificationResponse
>,
165 OCPP16RequestCommand
.METER_VALUES
,
169 path
.dirname(fileURLToPath(import.meta
.url
)),
170 '../../../assets/json-schemas/ocpp/1.6/MeterValuesResponse.json'
174 ) as JSONSchemaType
<OCPP16MeterValuesResponse
>,
177 OCPP16RequestCommand
.DIAGNOSTICS_STATUS_NOTIFICATION
,
181 path
.dirname(fileURLToPath(import.meta
.url
)),
182 '../../../assets/json-schemas/ocpp/1.6/DiagnosticsStatusNotificationResponse.json'
186 ) as JSONSchemaType
<DiagnosticsStatusNotificationResponse
>,
189 OCPP16RequestCommand
.DATA_TRANSFER
,
193 path
.dirname(fileURLToPath(import.meta
.url
)),
194 '../../../assets/json-schemas/ocpp/1.6/DataTransferResponse.json'
198 ) as JSONSchemaType
<OCPP16DataTransferResponse
>,
201 this.jsonIncomingRequestResponseSchemas
= new Map([
203 OCPP16IncomingRequestCommand
.RESET
,
207 path
.dirname(fileURLToPath(import.meta
.url
)),
208 '../../../assets/json-schemas/ocpp/1.6/ResetResponse.json'
212 ) as JSONSchemaType
<DefaultResponse
>,
215 OCPP16IncomingRequestCommand
.CLEAR_CACHE
,
219 path
.dirname(fileURLToPath(import.meta
.url
)),
220 '../../../assets/json-schemas/ocpp/1.6/ClearCacheResponse.json'
224 ) as JSONSchemaType
<DefaultResponse
>,
227 OCPP16IncomingRequestCommand
.CHANGE_AVAILABILITY
,
231 path
.dirname(fileURLToPath(import.meta
.url
)),
232 '../../../assets/json-schemas/ocpp/1.6/ChangeAvailabilityResponse.json'
236 ) as JSONSchemaType
<ChangeAvailabilityResponse
>,
239 OCPP16IncomingRequestCommand
.UNLOCK_CONNECTOR
,
243 path
.dirname(fileURLToPath(import.meta
.url
)),
244 '../../../assets/json-schemas/ocpp/1.6/UnlockConnectorResponse.json'
248 ) as JSONSchemaType
<UnlockConnectorResponse
>,
251 OCPP16IncomingRequestCommand
.GET_CONFIGURATION
,
255 path
.dirname(fileURLToPath(import.meta
.url
)),
256 '../../../assets/json-schemas/ocpp/1.6/GetConfigurationResponse.json'
260 ) as JSONSchemaType
<GetConfigurationResponse
>,
263 OCPP16IncomingRequestCommand
.CHANGE_CONFIGURATION
,
267 path
.dirname(fileURLToPath(import.meta
.url
)),
268 '../../../assets/json-schemas/ocpp/1.6/ChangeConfigurationResponse.json'
272 ) as JSONSchemaType
<ChangeConfigurationResponse
>,
275 OCPP16IncomingRequestCommand
.SET_CHARGING_PROFILE
,
279 path
.dirname(fileURLToPath(import.meta
.url
)),
280 '../../../assets/json-schemas/ocpp/1.6/SetChargingProfileResponse.json'
284 ) as JSONSchemaType
<SetChargingProfileResponse
>,
287 OCPP16IncomingRequestCommand
.CLEAR_CHARGING_PROFILE
,
291 path
.dirname(fileURLToPath(import.meta
.url
)),
292 '../../../assets/json-schemas/ocpp/1.6/ClearChargingProfileResponse.json'
296 ) as JSONSchemaType
<ClearChargingProfileResponse
>,
299 OCPP16IncomingRequestCommand
.REMOTE_START_TRANSACTION
,
303 path
.dirname(fileURLToPath(import.meta
.url
)),
304 '../../../assets/json-schemas/ocpp/1.6/RemoteStartTransactionResponse.json'
308 ) as JSONSchemaType
<DefaultResponse
>,
311 OCPP16IncomingRequestCommand
.REMOTE_STOP_TRANSACTION
,
315 path
.dirname(fileURLToPath(import.meta
.url
)),
316 '../../../assets/json-schemas/ocpp/1.6/RemoteStopTransactionResponse.json'
320 ) as JSONSchemaType
<DefaultResponse
>,
323 OCPP16IncomingRequestCommand
.GET_DIAGNOSTICS
,
327 path
.dirname(fileURLToPath(import.meta
.url
)),
328 '../../../assets/json-schemas/ocpp/1.6/GetDiagnosticsResponse.json'
332 ) as JSONSchemaType
<GetDiagnosticsResponse
>,
335 OCPP16IncomingRequestCommand
.TRIGGER_MESSAGE
,
339 path
.dirname(fileURLToPath(import.meta
.url
)),
340 '../../../assets/json-schemas/ocpp/1.6/TriggerMessageResponse.json'
344 ) as JSONSchemaType
<OCPP16TriggerMessageResponse
>,
347 OCPP16IncomingRequestCommand
.DATA_TRANSFER
,
351 path
.dirname(fileURLToPath(import.meta
.url
)),
352 '../../../assets/json-schemas/ocpp/1.6/DataTransferResponse.json'
356 ) as JSONSchemaType
<OCPP16DataTransferResponse
>,
359 OCPP16IncomingRequestCommand
.UPDATE_FIRMWARE
,
363 path
.dirname(fileURLToPath(import.meta
.url
)),
364 '../../../assets/json-schemas/ocpp/1.6/UpdateFirmwareResponse.json'
368 ) as JSONSchemaType
<OCPP16UpdateFirmwareResponse
>,
371 this.validatePayload
.bind(this);
374 public async responseHandler(
375 chargingStation
: ChargingStation
,
376 commandName
: OCPP16RequestCommand
,
378 requestPayload
: JsonType
381 chargingStation
.isRegistered() === true ||
382 commandName
=== OCPP16RequestCommand
.BOOT_NOTIFICATION
385 this.responseHandlers
.has(commandName
) === true &&
386 OCPP16ServiceUtils
.isRequestCommandSupported(chargingStation
, commandName
) === true
389 this.validatePayload(chargingStation
, commandName
, payload
);
390 await this.responseHandlers
.get(commandName
)(chargingStation
, payload
, requestPayload
);
393 `${chargingStation.logPrefix()} ${moduleName}.responseHandler: Handle response error:`,
401 ErrorType
.NOT_IMPLEMENTED
,
402 `${commandName} is not implemented to handle response PDU ${JSON.stringify(
413 ErrorType
.SECURITY_ERROR
,
414 `${commandName} cannot be issued to handle response PDU ${JSON.stringify(
418 )} while the charging station is not registered on the central server.`,
425 private validatePayload(
426 chargingStation
: ChargingStation
,
427 commandName
: OCPP16RequestCommand
,
430 if (this.jsonSchemas
.has(commandName
) === true) {
431 return this.validateResponsePayload(
434 this.jsonSchemas
.get(commandName
),
439 `${chargingStation.logPrefix()} ${moduleName}.validatePayload: No JSON schema found for command '${commandName}' PDU validation`
444 private handleResponseBootNotification(
445 chargingStation
: ChargingStation
,
446 payload
: OCPP16BootNotificationResponse
448 if (payload
.status === RegistrationStatusEnumType
.ACCEPTED
) {
449 ChargingStationConfigurationUtils
.addConfigurationKey(
451 OCPP16StandardParametersKey
.HeartbeatInterval
,
452 payload
.interval
.toString(),
454 { overwrite
: true, save
: true }
456 ChargingStationConfigurationUtils
.addConfigurationKey(
458 OCPP16StandardParametersKey
.HeartBeatInterval
,
459 payload
.interval
.toString(),
461 { overwrite
: true, save
: true }
463 chargingStation
.heartbeatSetInterval
464 ? chargingStation
.restartHeartbeat()
465 : chargingStation
.startHeartbeat();
467 if (Object.values(RegistrationStatusEnumType
).includes(payload
.status)) {
468 const logMsg
= `${chargingStation.logPrefix()} Charging station in '${
470 }' state on the central server`;
471 payload
.status === RegistrationStatusEnumType
.REJECTED
472 ? logger
.warn(logMsg
)
473 : logger
.info(logMsg
);
476 chargingStation
.logPrefix() +
477 ' Charging station boot notification response received: %j with undefined registration status',
483 private handleResponseAuthorize(
484 chargingStation
: ChargingStation
,
485 payload
: OCPP16AuthorizeResponse
,
486 requestPayload
: OCPP16AuthorizeRequest
488 let authorizeConnectorId
: number;
489 for (const connectorId
of chargingStation
.connectors
.keys()) {
492 chargingStation
.getConnectorStatus(connectorId
)?.authorizeIdTag
=== requestPayload
.idTag
494 authorizeConnectorId
= connectorId
;
498 const isAuthorizeConnectorIdDefined
= authorizeConnectorId
!== undefined;
499 if (payload
.idTagInfo
.status === OCPP16AuthorizationStatus
.ACCEPTED
) {
500 isAuthorizeConnectorIdDefined
&&
501 (chargingStation
.getConnectorStatus(authorizeConnectorId
).idTagAuthorized
= true);
503 `${chargingStation.logPrefix()} IdTag '${requestPayload.idTag}' accepted${
504 isAuthorizeConnectorIdDefined ? ` on connector ${authorizeConnectorId}
` : ''
508 if (isAuthorizeConnectorIdDefined
) {
509 chargingStation
.getConnectorStatus(authorizeConnectorId
).idTagAuthorized
= false;
510 delete chargingStation
.getConnectorStatus(authorizeConnectorId
).authorizeIdTag
;
513 `${chargingStation.logPrefix()} IdTag '${requestPayload.idTag}' rejected with status '${
514 payload.idTagInfo.status
515 }'${isAuthorizeConnectorIdDefined ? ` on connector ${authorizeConnectorId}` : ''}`
520 private async handleResponseStartTransaction(
521 chargingStation: ChargingStation,
522 payload: OCPP16StartTransactionResponse,
523 requestPayload: OCPP16StartTransactionRequest
525 const connectorId = requestPayload.connectorId;
527 let transactionConnectorId: number;
528 for (const id of chargingStation.connectors.keys()) {
529 if (id > 0 && id === connectorId) {
530 transactionConnectorId = id;
534 if (!transactionConnectorId) {
536 chargingStation.logPrefix() +
537 ' Trying to start a transaction on a non existing connector Id ' +
538 connectorId.toString()
543 chargingStation.getConnectorStatus(connectorId).transactionRemoteStarted === true &&
544 chargingStation.getAuthorizeRemoteTxRequests() === true &&
545 chargingStation.getLocalAuthListEnabled() === true &&
546 chargingStation.hasAuthorizedTags() &&
547 chargingStation.getConnectorStatus(connectorId).idTagLocalAuthorized === false
550 chargingStation.logPrefix() +
551 ' Trying to start a transaction with a not local authorized idTag ' +
552 chargingStation.getConnectorStatus(connectorId).localAuthorizeIdTag +
553 ' on connector Id ' +
554 connectorId.toString()
556 await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
560 chargingStation.getConnectorStatus(connectorId).transactionRemoteStarted === true &&
561 chargingStation.getAuthorizeRemoteTxRequests() === true &&
562 chargingStation.getMustAuthorizeAtRemoteStart() === true &&
563 chargingStation.getConnectorStatus(connectorId).idTagLocalAuthorized === false &&
564 chargingStation.getConnectorStatus(connectorId).idTagAuthorized === false
567 chargingStation.logPrefix() +
568 ' Trying to start a transaction with a not authorized idTag ' +
569 chargingStation.getConnectorStatus(connectorId).authorizeIdTag +
570 ' on connector Id ' +
571 connectorId.toString()
573 await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
577 chargingStation.getConnectorStatus(connectorId).idTagAuthorized &&
578 chargingStation.getConnectorStatus(connectorId).authorizeIdTag !== requestPayload.idTag
581 chargingStation.logPrefix() +
582 ' Trying to start a transaction with an idTag ' +
583 requestPayload.idTag +
584 ' different from the authorize request one ' +
585 chargingStation.getConnectorStatus(connectorId).authorizeIdTag +
586 ' on connector Id ' +
587 connectorId.toString()
589 await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
593 chargingStation.getConnectorStatus(connectorId).idTagLocalAuthorized &&
594 chargingStation.getConnectorStatus(connectorId).localAuthorizeIdTag !== requestPayload.idTag
597 chargingStation.logPrefix() +
598 ' Trying to start a transaction with an idTag ' +
599 requestPayload.idTag +
600 ' different from the local authorized one ' +
601 chargingStation.getConnectorStatus(connectorId).localAuthorizeIdTag +
602 ' on connector Id ' +
603 connectorId.toString()
605 await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
608 if (chargingStation.getConnectorStatus(connectorId)?.transactionStarted === true) {
610 chargingStation.logPrefix() +
611 ' Trying to start a transaction on an already used connector ' +
612 connectorId.toString() +
614 chargingStation.getConnectorStatus(connectorId)
619 chargingStation.getConnectorStatus(connectorId)?.status !==
620 OCPP16ChargePointStatus.AVAILABLE &&
621 chargingStation.getConnectorStatus(connectorId)?.status !== OCPP16ChargePointStatus.PREPARING
624 `${chargingStation.logPrefix()} Trying to start a transaction on connector ${connectorId.toString()}
with status $
{
625 chargingStation
.getConnectorStatus(connectorId
)?.status
630 // if (!Number.isInteger(payload.transactionId)) {
632 // `${chargingStation.logPrefix()} Trying to start a transaction on connector ${connectorId.toString()}
with a non integer transaction Id $
{
633 // payload.transactionId
634 // }, converting to integer`
636 // payload.transactionId = Utils.convertToInt(payload.transactionId);
639 if (payload
.idTagInfo
?.status === OCPP16AuthorizationStatus
.ACCEPTED
) {
640 chargingStation
.getConnectorStatus(connectorId
).transactionStarted
= true;
641 chargingStation
.getConnectorStatus(connectorId
).transactionId
= payload
.transactionId
;
642 chargingStation
.getConnectorStatus(connectorId
).transactionIdTag
= requestPayload
.idTag
;
643 chargingStation
.getConnectorStatus(
645 ).transactionEnergyActiveImportRegisterValue
= 0;
646 chargingStation
.getConnectorStatus(connectorId
).transactionBeginMeterValue
=
647 OCPP16ServiceUtils
.buildTransactionBeginMeterValue(
650 requestPayload
.meterStart
652 chargingStation
.getBeginEndMeterValues() &&
653 (await chargingStation
.ocppRequestService
.requestHandler
<
654 OCPP16MeterValuesRequest
,
655 OCPP16MeterValuesResponse
656 >(chargingStation
, OCPP16RequestCommand
.METER_VALUES
, {
658 transactionId
: payload
.transactionId
,
659 meterValue
: [chargingStation
.getConnectorStatus(connectorId
).transactionBeginMeterValue
],
661 await chargingStation
.ocppRequestService
.requestHandler
<
662 OCPP16StatusNotificationRequest
,
663 OCPP16StatusNotificationResponse
664 >(chargingStation
, OCPP16RequestCommand
.STATUS_NOTIFICATION
, {
666 status: OCPP16ChargePointStatus
.CHARGING
,
667 errorCode
: OCPP16ChargePointErrorCode
.NO_ERROR
,
669 chargingStation
.getConnectorStatus(connectorId
).status = OCPP16ChargePointStatus
.CHARGING
;
671 chargingStation
.logPrefix() +
673 payload
.transactionId
.toString() +
675 chargingStation
.stationInfo
.chargingStationId
+
677 connectorId
.toString() +
679 requestPayload
.idTag
+
682 if (chargingStation
.stationInfo
.powerSharedByConnectors
) {
683 chargingStation
.powerDivider
++;
685 const configuredMeterValueSampleInterval
=
686 ChargingStationConfigurationUtils
.getConfigurationKey(
688 OCPP16StandardParametersKey
.MeterValueSampleInterval
690 chargingStation
.startMeterValues(
692 configuredMeterValueSampleInterval
693 ? Utils
.convertToInt(configuredMeterValueSampleInterval
.value
) * 1000
694 : Constants
.DEFAULT_METER_VALUES_INTERVAL
698 chargingStation
.logPrefix() +
699 ' Starting transaction id ' +
700 payload
.transactionId
.toString() +
701 " REJECTED with status '" +
702 payload
?.idTagInfo
?.status +
704 requestPayload
.idTag
+
707 await this.resetConnectorOnStartTransactionError(chargingStation
, connectorId
);
711 private async resetConnectorOnStartTransactionError(
712 chargingStation
: ChargingStation
,
715 chargingStation
.resetConnectorStatus(connectorId
);
717 chargingStation
.getConnectorStatus(connectorId
).status !== OCPP16ChargePointStatus
.AVAILABLE
719 await chargingStation
.ocppRequestService
.requestHandler
<
720 OCPP16StatusNotificationRequest
,
721 OCPP16StatusNotificationResponse
722 >(chargingStation
, OCPP16RequestCommand
.STATUS_NOTIFICATION
, {
724 status: OCPP16ChargePointStatus
.AVAILABLE
,
725 errorCode
: OCPP16ChargePointErrorCode
.NO_ERROR
,
727 chargingStation
.getConnectorStatus(connectorId
).status = OCPP16ChargePointStatus
.AVAILABLE
;
731 private async handleResponseStopTransaction(
732 chargingStation
: ChargingStation
,
733 payload
: OCPP16StopTransactionResponse
,
734 requestPayload
: OCPP16StopTransactionRequest
736 const transactionConnectorId
= chargingStation
.getConnectorIdByTransactionId(
737 requestPayload
.transactionId
739 if (!transactionConnectorId
) {
741 chargingStation
.logPrefix() +
742 ' Trying to stop a non existing transaction ' +
743 requestPayload
.transactionId
.toString()
747 if (payload
.idTagInfo
?.status === OCPP16AuthorizationStatus
.ACCEPTED
) {
748 chargingStation
.getBeginEndMeterValues() === true &&
749 chargingStation
.getOcppStrictCompliance() === false &&
750 chargingStation
.getOutOfOrderEndMeterValues() === true &&
751 (await chargingStation
.ocppRequestService
.requestHandler
<
752 OCPP16MeterValuesRequest
,
753 OCPP16MeterValuesResponse
754 >(chargingStation
, OCPP16RequestCommand
.METER_VALUES
, {
755 connectorId
: transactionConnectorId
,
756 transactionId
: requestPayload
.transactionId
,
758 OCPP16ServiceUtils
.buildTransactionEndMeterValue(
760 transactionConnectorId
,
761 requestPayload
.meterStop
766 chargingStation
.isChargingStationAvailable() === false ||
767 chargingStation
.isConnectorAvailable(transactionConnectorId
) === false
769 await chargingStation
.ocppRequestService
.requestHandler
<
770 OCPP16StatusNotificationRequest
,
771 OCPP16StatusNotificationResponse
772 >(chargingStation
, OCPP16RequestCommand
.STATUS_NOTIFICATION
, {
773 connectorId
: transactionConnectorId
,
774 status: OCPP16ChargePointStatus
.UNAVAILABLE
,
775 errorCode
: OCPP16ChargePointErrorCode
.NO_ERROR
,
777 chargingStation
.getConnectorStatus(transactionConnectorId
).status =
778 OCPP16ChargePointStatus
.UNAVAILABLE
;
780 await chargingStation
.ocppRequestService
.requestHandler
<
781 OCPP16BootNotificationRequest
,
782 OCPP16BootNotificationResponse
783 >(chargingStation
, OCPP16RequestCommand
.STATUS_NOTIFICATION
, {
784 connectorId
: transactionConnectorId
,
785 status: OCPP16ChargePointStatus
.AVAILABLE
,
786 errorCode
: OCPP16ChargePointErrorCode
.NO_ERROR
,
788 chargingStation
.getConnectorStatus(transactionConnectorId
).status =
789 OCPP16ChargePointStatus
.AVAILABLE
;
791 if (chargingStation
.stationInfo
.powerSharedByConnectors
) {
792 chargingStation
.powerDivider
--;
794 chargingStation
.resetConnectorStatus(transactionConnectorId
);
796 chargingStation
.logPrefix() +
798 requestPayload
.transactionId
.toString() +
800 chargingStation
.stationInfo
.chargingStationId
+
802 transactionConnectorId
.toString()
806 chargingStation
.logPrefix() +
807 ' Stopping transaction id ' +
808 requestPayload
.transactionId
.toString() +
809 " REJECTED with status '" +
810 payload
.idTagInfo
?.status +