1 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
3 import type { JSONSchemaType
} from
'ajv';
5 import { OCPP16ServiceUtils
} from
'./OCPP16ServiceUtils';
6 import { OCPPError
} from
'../../../exception';
8 type ChangeAvailabilityResponse
,
9 type ChangeConfigurationResponse
,
10 type ClearChargingProfileResponse
,
13 type GetConfigurationResponse
,
14 type GetDiagnosticsResponse
,
17 OCPP16AuthorizationStatus
,
18 type OCPP16AuthorizeRequest
,
19 type OCPP16AuthorizeResponse
,
20 type OCPP16BootNotificationRequest
,
21 type OCPP16BootNotificationResponse
,
22 OCPP16ChargePointErrorCode
,
23 OCPP16ChargePointStatus
,
24 type OCPP16DataTransferResponse
,
25 type OCPP16DiagnosticsStatusNotificationResponse
,
26 type OCPP16FirmwareStatusNotificationResponse
,
27 type OCPP16HeartbeatResponse
,
28 OCPP16IncomingRequestCommand
,
29 type OCPP16MeterValuesRequest
,
30 type OCPP16MeterValuesResponse
,
32 OCPP16StandardParametersKey
,
33 type OCPP16StartTransactionRequest
,
34 type OCPP16StartTransactionResponse
,
35 type OCPP16StatusNotificationRequest
,
36 type OCPP16StatusNotificationResponse
,
37 type OCPP16StopTransactionRequest
,
38 type OCPP16StopTransactionResponse
,
39 type OCPP16TriggerMessageResponse
,
40 type OCPP16UpdateFirmwareResponse
,
42 RegistrationStatusEnumType
,
44 type SetChargingProfileResponse
,
45 type UnlockConnectorResponse
,
46 } from
'../../../types';
47 import { Constants
} from
'../../../utils/Constants';
48 import { logger
} from
'../../../utils/Logger';
49 import { Utils
} from
'../../../utils/Utils';
50 import type { ChargingStation
} from
'../../ChargingStation';
51 import { ChargingStationConfigurationUtils
} from
'../../ChargingStationConfigurationUtils';
52 import { OCPPResponseService
} from
'../OCPPResponseService';
54 const moduleName
= 'OCPP16ResponseService';
56 export class OCPP16ResponseService
extends OCPPResponseService
{
57 public jsonIncomingRequestResponseSchemas
: Map
<
58 OCPP16IncomingRequestCommand
,
59 JSONSchemaType
<JsonObject
>
62 private responseHandlers
: Map
<OCPP16RequestCommand
, ResponseHandler
>;
63 private jsonSchemas
: Map
<OCPP16RequestCommand
, JSONSchemaType
<JsonObject
>>;
65 public constructor() {
66 if (new.target
?.name
=== moduleName
) {
67 throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
69 super(OCPPVersion
.VERSION_16
);
70 this.responseHandlers
= new Map
<OCPP16RequestCommand
, ResponseHandler
>([
71 [OCPP16RequestCommand
.BOOT_NOTIFICATION
, this.handleResponseBootNotification
.bind(this)],
72 [OCPP16RequestCommand
.HEARTBEAT
, this.emptyResponseHandler
.bind(this)],
73 [OCPP16RequestCommand
.AUTHORIZE
, this.handleResponseAuthorize
.bind(this)],
74 [OCPP16RequestCommand
.START_TRANSACTION
, this.handleResponseStartTransaction
.bind(this)],
75 [OCPP16RequestCommand
.STOP_TRANSACTION
, this.handleResponseStopTransaction
.bind(this)],
76 [OCPP16RequestCommand
.STATUS_NOTIFICATION
, this.emptyResponseHandler
.bind(this)],
77 [OCPP16RequestCommand
.METER_VALUES
, this.emptyResponseHandler
.bind(this)],
78 [OCPP16RequestCommand
.DIAGNOSTICS_STATUS_NOTIFICATION
, this.emptyResponseHandler
.bind(this)],
79 [OCPP16RequestCommand
.DATA_TRANSFER
, this.emptyResponseHandler
.bind(this)],
80 [OCPP16RequestCommand
.FIRMWARE_STATUS_NOTIFICATION
, this.emptyResponseHandler
.bind(this)],
82 this.jsonSchemas
= new Map
<OCPP16RequestCommand
, JSONSchemaType
<JsonObject
>>([
84 OCPP16RequestCommand
.BOOT_NOTIFICATION
,
85 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16BootNotificationResponse
>(
86 '../../../assets/json-schemas/ocpp/1.6/BootNotificationResponse.json',
92 OCPP16RequestCommand
.HEARTBEAT
,
93 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16HeartbeatResponse
>(
94 '../../../assets/json-schemas/ocpp/1.6/HeartbeatResponse.json',
100 OCPP16RequestCommand
.AUTHORIZE
,
101 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16AuthorizeResponse
>(
102 '../../../assets/json-schemas/ocpp/1.6/AuthorizeResponse.json',
108 OCPP16RequestCommand
.START_TRANSACTION
,
109 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16StartTransactionResponse
>(
110 '../../../assets/json-schemas/ocpp/1.6/StartTransactionResponse.json',
116 OCPP16RequestCommand
.STOP_TRANSACTION
,
117 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16StopTransactionResponse
>(
118 '../../../assets/json-schemas/ocpp/1.6/StopTransactionResponse.json',
124 OCPP16RequestCommand
.STATUS_NOTIFICATION
,
125 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16StatusNotificationResponse
>(
126 '../../../assets/json-schemas/ocpp/1.6/StatusNotificationResponse.json',
132 OCPP16RequestCommand
.METER_VALUES
,
133 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16MeterValuesResponse
>(
134 '../../../assets/json-schemas/ocpp/1.6/MeterValuesResponse.json',
140 OCPP16RequestCommand
.DIAGNOSTICS_STATUS_NOTIFICATION
,
141 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16DiagnosticsStatusNotificationResponse
>(
142 '../../../assets/json-schemas/ocpp/1.6/DiagnosticsStatusNotificationResponse.json',
148 OCPP16RequestCommand
.DATA_TRANSFER
,
149 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16DataTransferResponse
>(
150 '../../../assets/json-schemas/ocpp/1.6/DataTransferResponse.json',
156 OCPP16RequestCommand
.FIRMWARE_STATUS_NOTIFICATION
,
157 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16FirmwareStatusNotificationResponse
>(
158 '../../../assets/json-schemas/ocpp/1.6/FirmwareStatusNotificationResponse.json',
164 this.jsonIncomingRequestResponseSchemas
= new Map([
166 OCPP16IncomingRequestCommand
.RESET
,
167 OCPP16ServiceUtils
.parseJsonSchemaFile
<GenericResponse
>(
168 '../../../assets/json-schemas/ocpp/1.6/ResetResponse.json',
174 OCPP16IncomingRequestCommand
.CLEAR_CACHE
,
175 OCPP16ServiceUtils
.parseJsonSchemaFile
<GenericResponse
>(
176 '../../../assets/json-schemas/ocpp/1.6/ClearCacheResponse.json',
182 OCPP16IncomingRequestCommand
.CHANGE_AVAILABILITY
,
183 OCPP16ServiceUtils
.parseJsonSchemaFile
<ChangeAvailabilityResponse
>(
184 '../../../assets/json-schemas/ocpp/1.6/ChangeAvailabilityResponse.json',
190 OCPP16IncomingRequestCommand
.UNLOCK_CONNECTOR
,
191 OCPP16ServiceUtils
.parseJsonSchemaFile
<UnlockConnectorResponse
>(
192 '../../../assets/json-schemas/ocpp/1.6/UnlockConnectorResponse.json',
198 OCPP16IncomingRequestCommand
.GET_CONFIGURATION
,
199 OCPP16ServiceUtils
.parseJsonSchemaFile
<GetConfigurationResponse
>(
200 '../../../assets/json-schemas/ocpp/1.6/GetConfigurationResponse.json',
206 OCPP16IncomingRequestCommand
.CHANGE_CONFIGURATION
,
207 OCPP16ServiceUtils
.parseJsonSchemaFile
<ChangeConfigurationResponse
>(
208 '../../../assets/json-schemas/ocpp/1.6/ChangeConfigurationResponse.json',
214 OCPP16IncomingRequestCommand
.SET_CHARGING_PROFILE
,
215 OCPP16ServiceUtils
.parseJsonSchemaFile
<SetChargingProfileResponse
>(
216 '../../../assets/json-schemas/ocpp/1.6/SetChargingProfileResponse.json',
222 OCPP16IncomingRequestCommand
.CLEAR_CHARGING_PROFILE
,
223 OCPP16ServiceUtils
.parseJsonSchemaFile
<ClearChargingProfileResponse
>(
224 '../../../assets/json-schemas/ocpp/1.6/ClearChargingProfileResponse.json',
230 OCPP16IncomingRequestCommand
.REMOTE_START_TRANSACTION
,
231 OCPP16ServiceUtils
.parseJsonSchemaFile
<GenericResponse
>(
232 '../../../assets/json-schemas/ocpp/1.6/RemoteStartTransactionResponse.json',
238 OCPP16IncomingRequestCommand
.REMOTE_STOP_TRANSACTION
,
239 OCPP16ServiceUtils
.parseJsonSchemaFile
<GenericResponse
>(
240 '../../../assets/json-schemas/ocpp/1.6/RemoteStopTransactionResponse.json',
246 OCPP16IncomingRequestCommand
.GET_DIAGNOSTICS
,
247 OCPP16ServiceUtils
.parseJsonSchemaFile
<GetDiagnosticsResponse
>(
248 '../../../assets/json-schemas/ocpp/1.6/GetDiagnosticsResponse.json',
254 OCPP16IncomingRequestCommand
.TRIGGER_MESSAGE
,
255 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16TriggerMessageResponse
>(
256 '../../../assets/json-schemas/ocpp/1.6/TriggerMessageResponse.json',
262 OCPP16IncomingRequestCommand
.DATA_TRANSFER
,
263 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16DataTransferResponse
>(
264 '../../../assets/json-schemas/ocpp/1.6/DataTransferResponse.json',
270 OCPP16IncomingRequestCommand
.UPDATE_FIRMWARE
,
271 OCPP16ServiceUtils
.parseJsonSchemaFile
<OCPP16UpdateFirmwareResponse
>(
272 '../../../assets/json-schemas/ocpp/1.6/UpdateFirmwareResponse.json',
278 this.validatePayload
.bind(this);
281 public async responseHandler(
282 chargingStation
: ChargingStation
,
283 commandName
: OCPP16RequestCommand
,
285 requestPayload
: JsonType
288 chargingStation
.isRegistered() === true ||
289 commandName
=== OCPP16RequestCommand
.BOOT_NOTIFICATION
292 this.responseHandlers
.has(commandName
) === true &&
293 OCPP16ServiceUtils
.isRequestCommandSupported(chargingStation
, commandName
) === true
296 this.validatePayload(chargingStation
, commandName
, payload
);
297 await this.responseHandlers
.get(commandName
)(chargingStation
, payload
, requestPayload
);
300 `${chargingStation.logPrefix()} ${moduleName}.responseHandler: Handle response error:`,
308 ErrorType
.NOT_IMPLEMENTED
,
309 `${commandName} is not implemented to handle response PDU ${JSON.stringify(
320 ErrorType
.SECURITY_ERROR
,
321 `${commandName} cannot be issued to handle response PDU ${JSON.stringify(
325 )} while the charging station is not registered on the central server.`,
332 private validatePayload(
333 chargingStation
: ChargingStation
,
334 commandName
: OCPP16RequestCommand
,
337 if (this.jsonSchemas
.has(commandName
) === true) {
338 return this.validateResponsePayload(
341 this.jsonSchemas
.get(commandName
),
346 `${chargingStation.logPrefix()} ${moduleName}.validatePayload: No JSON schema found for command '${commandName}' PDU validation`
351 private handleResponseBootNotification(
352 chargingStation
: ChargingStation
,
353 payload
: OCPP16BootNotificationResponse
355 if (payload
.status === RegistrationStatusEnumType
.ACCEPTED
) {
356 ChargingStationConfigurationUtils
.addConfigurationKey(
358 OCPP16StandardParametersKey
.HeartbeatInterval
,
359 payload
.interval
.toString(),
361 { overwrite
: true, save
: true }
363 ChargingStationConfigurationUtils
.addConfigurationKey(
365 OCPP16StandardParametersKey
.HeartBeatInterval
,
366 payload
.interval
.toString(),
368 { overwrite
: true, save
: true }
370 chargingStation
.heartbeatSetInterval
371 ? chargingStation
.restartHeartbeat()
372 : chargingStation
.startHeartbeat();
374 if (Object.values(RegistrationStatusEnumType
).includes(payload
.status)) {
375 const logMsg
= `${chargingStation.logPrefix()} Charging station in '${
377 }' state on the central server`;
378 payload
.status === RegistrationStatusEnumType
.REJECTED
379 ? logger
.warn(logMsg
)
380 : logger
.info(logMsg
);
383 `${chargingStation.logPrefix()} Charging station boot notification response received: %j with undefined registration status`,
389 private handleResponseAuthorize(
390 chargingStation
: ChargingStation
,
391 payload
: OCPP16AuthorizeResponse
,
392 requestPayload
: OCPP16AuthorizeRequest
394 let authorizeConnectorId
: number;
395 for (const connectorId
of chargingStation
.connectors
.keys()) {
398 chargingStation
.getConnectorStatus(connectorId
)?.authorizeIdTag
=== requestPayload
.idTag
400 authorizeConnectorId
= connectorId
;
404 const authorizeConnectorIdDefined
= authorizeConnectorId
!== undefined;
405 if (payload
.idTagInfo
.status === OCPP16AuthorizationStatus
.ACCEPTED
) {
406 authorizeConnectorIdDefined
&&
407 (chargingStation
.getConnectorStatus(authorizeConnectorId
).idTagAuthorized
= true);
409 `${chargingStation.logPrefix()} IdTag '${requestPayload.idTag}' accepted${
410 authorizeConnectorIdDefined ? ` on connector ${authorizeConnectorId}
` : ''
414 if (authorizeConnectorIdDefined
) {
415 chargingStation
.getConnectorStatus(authorizeConnectorId
).idTagAuthorized
= false;
416 delete chargingStation
.getConnectorStatus(authorizeConnectorId
)?.authorizeIdTag
;
419 `${chargingStation.logPrefix()} IdTag '${requestPayload.idTag}' rejected with status '${
420 payload.idTagInfo.status
421 }'${authorizeConnectorIdDefined ? ` on connector ${authorizeConnectorId}` : ''}`
426 private async handleResponseStartTransaction(
427 chargingStation: ChargingStation,
428 payload: OCPP16StartTransactionResponse,
429 requestPayload: OCPP16StartTransactionRequest
431 const connectorId = requestPayload.connectorId;
433 let transactionConnectorId: number;
434 for (const id of chargingStation.connectors.keys()) {
435 if (id > 0 && id === connectorId) {
436 transactionConnectorId = id;
440 if (Utils.isNullOrUndefined(transactionConnectorId)) {
442 `${chargingStation.logPrefix()} Trying to start a transaction on a non existing connector Id ${connectorId.toString()}
`
447 chargingStation.getConnectorStatus(connectorId)?.transactionRemoteStarted === true &&
448 chargingStation.getAuthorizeRemoteTxRequests() === true &&
449 chargingStation.getLocalAuthListEnabled() === true &&
450 chargingStation.hasAuthorizedTags() &&
451 chargingStation.getConnectorStatus(connectorId)?.idTagLocalAuthorized === false
454 `${chargingStation.logPrefix()} Trying to start a transaction
with a not local authorized idTag $
{
455 chargingStation
.getConnectorStatus(connectorId
)?.localAuthorizeIdTag
456 } on connector Id ${connectorId.toString()}
`
458 await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
462 chargingStation.getConnectorStatus(connectorId)?.transactionRemoteStarted === true &&
463 chargingStation.getAuthorizeRemoteTxRequests() === true &&
464 chargingStation.getMustAuthorizeAtRemoteStart() === true &&
465 chargingStation.getConnectorStatus(connectorId)?.idTagLocalAuthorized === false &&
466 chargingStation.getConnectorStatus(connectorId)?.idTagAuthorized === false
469 `${chargingStation.logPrefix()} Trying to start a transaction
with a not authorized idTag $
{
470 chargingStation
.getConnectorStatus(connectorId
)?.authorizeIdTag
471 } on connector Id ${connectorId.toString()}
`
473 await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
477 chargingStation.getConnectorStatus(connectorId)?.idTagAuthorized &&
478 chargingStation.getConnectorStatus(connectorId)?.authorizeIdTag !== requestPayload.idTag
481 `${chargingStation.logPrefix()} Trying to start a transaction
with an idTag $
{
483 } different from the authorize request one $
{
484 chargingStation
.getConnectorStatus(connectorId
)?.authorizeIdTag
485 } on connector Id ${connectorId.toString()}
`
487 await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
491 chargingStation.getConnectorStatus(connectorId)?.idTagLocalAuthorized &&
492 chargingStation.getConnectorStatus(connectorId)?.localAuthorizeIdTag !== requestPayload.idTag
495 `${chargingStation.logPrefix()} Trying to start a transaction
with an idTag $
{
497 } different from the local authorized one $
{
498 chargingStation
.getConnectorStatus(connectorId
)?.localAuthorizeIdTag
499 } on connector Id ${connectorId.toString()}
`
501 await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
504 if (chargingStation.getConnectorStatus(connectorId)?.transactionStarted === true) {
506 `${chargingStation.logPrefix()} Trying to start a transaction on an already used connector ${connectorId.toString()}
: %j
`,
507 chargingStation.getConnectorStatus(connectorId)
512 chargingStation.getConnectorStatus(connectorId)?.status !==
513 OCPP16ChargePointStatus.AVAILABLE &&
514 chargingStation.getConnectorStatus(connectorId)?.status !== OCPP16ChargePointStatus.PREPARING
517 `${chargingStation.logPrefix()} Trying to start a transaction on connector ${connectorId.toString()}
with status $
{
518 chargingStation
.getConnectorStatus(connectorId
)?.status
523 // if (!Number.isInteger(payload.transactionId)) {
525 // `${chargingStation.logPrefix()} Trying to start a transaction on connector ${connectorId.toString()}
with a non integer transaction Id $
{
526 // payload.transactionId
527 // }, converting to integer`
529 // payload.transactionId = Utils.convertToInt(payload.transactionId);
532 if (payload
.idTagInfo
?.status === OCPP16AuthorizationStatus
.ACCEPTED
) {
533 chargingStation
.getConnectorStatus(connectorId
).transactionStarted
= true;
534 chargingStation
.getConnectorStatus(connectorId
).transactionId
= payload
.transactionId
;
535 chargingStation
.getConnectorStatus(connectorId
).transactionIdTag
= requestPayload
.idTag
;
536 chargingStation
.getConnectorStatus(
538 ).transactionEnergyActiveImportRegisterValue
= 0;
539 chargingStation
.getConnectorStatus(connectorId
).transactionBeginMeterValue
=
540 OCPP16ServiceUtils
.buildTransactionBeginMeterValue(
543 requestPayload
.meterStart
545 chargingStation
.getBeginEndMeterValues() &&
546 (await chargingStation
.ocppRequestService
.requestHandler
<
547 OCPP16MeterValuesRequest
,
548 OCPP16MeterValuesResponse
549 >(chargingStation
, OCPP16RequestCommand
.METER_VALUES
, {
551 transactionId
: payload
.transactionId
,
552 meterValue
: [chargingStation
.getConnectorStatus(connectorId
).transactionBeginMeterValue
],
554 await chargingStation
.ocppRequestService
.requestHandler
<
555 OCPP16StatusNotificationRequest
,
556 OCPP16StatusNotificationResponse
557 >(chargingStation
, OCPP16RequestCommand
.STATUS_NOTIFICATION
, {
559 status: OCPP16ChargePointStatus
.CHARGING
,
560 errorCode
: OCPP16ChargePointErrorCode
.NO_ERROR
,
562 chargingStation
.getConnectorStatus(connectorId
).status = OCPP16ChargePointStatus
.CHARGING
;
564 `${chargingStation.logPrefix()} Transaction ${payload.transactionId.toString()} STARTED on ${
565 chargingStation.stationInfo.chargingStationId
566 }#${connectorId.toString()} for idTag '${requestPayload.idTag}'`
568 if (chargingStation
.stationInfo
.powerSharedByConnectors
) {
569 chargingStation
.powerDivider
++;
571 const configuredMeterValueSampleInterval
=
572 ChargingStationConfigurationUtils
.getConfigurationKey(
574 OCPP16StandardParametersKey
.MeterValueSampleInterval
576 chargingStation
.startMeterValues(
578 configuredMeterValueSampleInterval
579 ? Utils
.convertToInt(configuredMeterValueSampleInterval
.value
) * 1000
580 : Constants
.DEFAULT_METER_VALUES_INTERVAL
584 `${chargingStation.logPrefix()} Starting transaction id ${payload.transactionId.toString()} REJECTED with status '${
585 payload.idTagInfo?.status
586 }', idTag '${requestPayload.idTag}'`
588 await this.resetConnectorOnStartTransactionError(chargingStation
, connectorId
);
592 private async resetConnectorOnStartTransactionError(
593 chargingStation
: ChargingStation
,
596 chargingStation
.resetConnectorStatus(connectorId
);
598 chargingStation
.getConnectorStatus(connectorId
)?.status !== OCPP16ChargePointStatus
.AVAILABLE
600 await chargingStation
.ocppRequestService
.requestHandler
<
601 OCPP16StatusNotificationRequest
,
602 OCPP16StatusNotificationResponse
603 >(chargingStation
, OCPP16RequestCommand
.STATUS_NOTIFICATION
, {
605 status: OCPP16ChargePointStatus
.AVAILABLE
,
606 errorCode
: OCPP16ChargePointErrorCode
.NO_ERROR
,
608 chargingStation
.getConnectorStatus(connectorId
).status = OCPP16ChargePointStatus
.AVAILABLE
;
612 private async handleResponseStopTransaction(
613 chargingStation
: ChargingStation
,
614 payload
: OCPP16StopTransactionResponse
,
615 requestPayload
: OCPP16StopTransactionRequest
617 const transactionConnectorId
= chargingStation
.getConnectorIdByTransactionId(
618 requestPayload
.transactionId
620 if (Utils
.isNullOrUndefined(transactionConnectorId
)) {
622 `${chargingStation.logPrefix()} Trying to stop a non existing transaction ${requestPayload.transactionId.toString()}`
626 chargingStation
.getBeginEndMeterValues() === true &&
627 chargingStation
.getOcppStrictCompliance() === false &&
628 chargingStation
.getOutOfOrderEndMeterValues() === true &&
629 (await chargingStation
.ocppRequestService
.requestHandler
<
630 OCPP16MeterValuesRequest
,
631 OCPP16MeterValuesResponse
632 >(chargingStation
, OCPP16RequestCommand
.METER_VALUES
, {
633 connectorId
: transactionConnectorId
,
634 transactionId
: requestPayload
.transactionId
,
636 OCPP16ServiceUtils
.buildTransactionEndMeterValue(
638 transactionConnectorId
,
639 requestPayload
.meterStop
644 chargingStation
.isChargingStationAvailable() === false ||
645 chargingStation
.isConnectorAvailable(transactionConnectorId
) === false
647 await chargingStation
.ocppRequestService
.requestHandler
<
648 OCPP16StatusNotificationRequest
,
649 OCPP16StatusNotificationResponse
650 >(chargingStation
, OCPP16RequestCommand
.STATUS_NOTIFICATION
, {
651 connectorId
: transactionConnectorId
,
652 status: OCPP16ChargePointStatus
.UNAVAILABLE
,
653 errorCode
: OCPP16ChargePointErrorCode
.NO_ERROR
,
655 chargingStation
.getConnectorStatus(transactionConnectorId
).status =
656 OCPP16ChargePointStatus
.UNAVAILABLE
;
658 await chargingStation
.ocppRequestService
.requestHandler
<
659 OCPP16BootNotificationRequest
,
660 OCPP16BootNotificationResponse
661 >(chargingStation
, OCPP16RequestCommand
.STATUS_NOTIFICATION
, {
662 connectorId
: transactionConnectorId
,
663 status: OCPP16ChargePointStatus
.AVAILABLE
,
664 errorCode
: OCPP16ChargePointErrorCode
.NO_ERROR
,
666 chargingStation
.getConnectorStatus(transactionConnectorId
).status =
667 OCPP16ChargePointStatus
.AVAILABLE
;
669 if (chargingStation
.stationInfo
.powerSharedByConnectors
) {
670 chargingStation
.powerDivider
--;
672 chargingStation
.resetConnectorStatus(transactionConnectorId
);
673 const logMsg
= `${chargingStation.logPrefix()} Transaction ${requestPayload.transactionId.toString()} STOPPED on ${
674 chargingStation.stationInfo.chargingStationId
675 }#${transactionConnectorId?.toString()} with status '${
676 payload.idTagInfo?.status ?? 'undefined'
679 Utils
.isNullOrUndefined(payload
.idTagInfo
) ||
680 payload
.idTagInfo
?.status === OCPP16AuthorizationStatus
.ACCEPTED