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 GetConfigurationResponse
,
29 GetDiagnosticsResponse
,
30 OCPP16BootNotificationResponse
,
31 OCPP16DataTransferResponse
,
32 OCPP16DiagnosticsStatusNotificationResponse
,
33 OCPP16FirmwareStatusNotificationResponse
,
34 OCPP16HeartbeatResponse
,
35 OCPP16StatusNotificationResponse
,
36 OCPP16TriggerMessageResponse
,
37 OCPP16UpdateFirmwareResponse
,
38 SetChargingProfileResponse
,
39 UnlockConnectorResponse
,
40 } from
'../../../types/ocpp/1.6/Responses';
42 OCPP16AuthorizationStatus
,
43 type OCPP16AuthorizeRequest
,
44 type OCPP16AuthorizeResponse
,
45 type OCPP16StartTransactionRequest
,
46 type OCPP16StartTransactionResponse
,
47 type OCPP16StopTransactionRequest
,
48 type OCPP16StopTransactionResponse
,
49 } from
'../../../types/ocpp/1.6/Transaction';
50 import { ErrorType
} from
'../../../types/ocpp/ErrorType';
51 import { OCPPVersion
} from
'../../../types/ocpp/OCPPVersion';
54 RegistrationStatusEnumType
,
56 } from
'../../../types/ocpp/Responses';
57 import Constants from
'../../../utils/Constants';
58 import logger from
'../../../utils/Logger';
59 import Utils from
'../../../utils/Utils';
60 import type ChargingStation from
'../../ChargingStation';
61 import { ChargingStationConfigurationUtils
} from
'../../ChargingStationConfigurationUtils';
62 import OCPPResponseService from
'../OCPPResponseService';
63 import { OCPP16ServiceUtils
} from
'./OCPP16ServiceUtils';
65 const moduleName
= 'OCPP16ResponseService';
67 export default class OCPP16ResponseService
extends OCPPResponseService
{
68 public jsonIncomingRequestResponseSchemas
: Map
<
69 OCPP16IncomingRequestCommand
,
70 JSONSchemaType
<JsonObject
>
73 private responseHandlers
: Map
<OCPP16RequestCommand
, ResponseHandler
>;
74 private jsonSchemas
: Map
<OCPP16RequestCommand
, JSONSchemaType
<JsonObject
>>;
76 public constructor() {
77 if (new.target
?.name
=== moduleName
) {
78 throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
80 super(OCPPVersion
.VERSION_16
);
81 this.responseHandlers
= new Map
<OCPP16RequestCommand
, ResponseHandler
>([
82 [OCPP16RequestCommand
.BOOT_NOTIFICATION
, this.handleResponseBootNotification
.bind(this)],
83 [OCPP16RequestCommand
.HEARTBEAT
, this.emptyResponseHandler
.bind(this)],
84 [OCPP16RequestCommand
.AUTHORIZE
, this.handleResponseAuthorize
.bind(this)],
85 [OCPP16RequestCommand
.START_TRANSACTION
, this.handleResponseStartTransaction
.bind(this)],
86 [OCPP16RequestCommand
.STOP_TRANSACTION
, this.handleResponseStopTransaction
.bind(this)],
87 [OCPP16RequestCommand
.STATUS_NOTIFICATION
, this.emptyResponseHandler
.bind(this)],
88 [OCPP16RequestCommand
.METER_VALUES
, this.emptyResponseHandler
.bind(this)],
89 [OCPP16RequestCommand
.DIAGNOSTICS_STATUS_NOTIFICATION
, this.emptyResponseHandler
.bind(this)],
90 [OCPP16RequestCommand
.DATA_TRANSFER
, this.emptyResponseHandler
.bind(this)],
91 [OCPP16RequestCommand
.FIRMWARE_STATUS_NOTIFICATION
, this.emptyResponseHandler
.bind(this)],
93 this.jsonSchemas
= new Map
<OCPP16RequestCommand
, JSONSchemaType
<JsonObject
>>([
95 OCPP16RequestCommand
.BOOT_NOTIFICATION
,
96 this.parseJsonSchemaFile
<OCPP16BootNotificationResponse
>(
97 '../../../assets/json-schemas/ocpp/1.6/BootNotificationResponse.json'
101 OCPP16RequestCommand
.HEARTBEAT
,
102 this.parseJsonSchemaFile
<OCPP16HeartbeatResponse
>(
103 '../../../assets/json-schemas/ocpp/1.6/HeartbeatResponse.json'
107 OCPP16RequestCommand
.AUTHORIZE
,
108 this.parseJsonSchemaFile
<OCPP16AuthorizeResponse
>(
109 '../../../assets/json-schemas/ocpp/1.6/AuthorizeResponse.json'
113 OCPP16RequestCommand
.START_TRANSACTION
,
114 this.parseJsonSchemaFile
<OCPP16StartTransactionResponse
>(
115 '../../../assets/json-schemas/ocpp/1.6/StartTransactionResponse.json'
119 OCPP16RequestCommand
.STOP_TRANSACTION
,
120 this.parseJsonSchemaFile
<OCPP16StopTransactionResponse
>(
121 '../../../assets/json-schemas/ocpp/1.6/StopTransactionResponse.json'
125 OCPP16RequestCommand
.STATUS_NOTIFICATION
,
126 this.parseJsonSchemaFile
<OCPP16StatusNotificationResponse
>(
127 '../../../assets/json-schemas/ocpp/1.6/StatusNotificationResponse.json'
131 OCPP16RequestCommand
.METER_VALUES
,
132 this.parseJsonSchemaFile
<OCPP16MeterValuesResponse
>(
133 '../../../assets/json-schemas/ocpp/1.6/MeterValuesResponse.json'
137 OCPP16RequestCommand
.DIAGNOSTICS_STATUS_NOTIFICATION
,
138 this.parseJsonSchemaFile
<OCPP16DiagnosticsStatusNotificationResponse
>(
139 '../../../assets/json-schemas/ocpp/1.6/DiagnosticsStatusNotificationResponse.json'
143 OCPP16RequestCommand
.DATA_TRANSFER
,
144 this.parseJsonSchemaFile
<OCPP16DataTransferResponse
>(
145 '../../../assets/json-schemas/ocpp/1.6/DataTransferResponse.json'
149 OCPP16RequestCommand
.FIRMWARE_STATUS_NOTIFICATION
,
150 this.parseJsonSchemaFile
<OCPP16FirmwareStatusNotificationResponse
>(
151 '../../../assets/json-schemas/ocpp/1.6/FirmwareStatusNotificationResponse.json'
155 this.jsonIncomingRequestResponseSchemas
= new Map([
157 OCPP16IncomingRequestCommand
.RESET
,
158 this.parseJsonSchemaFile
<DefaultResponse
>(
159 '../../../assets/json-schemas/ocpp/1.6/ResetResponse.json'
163 OCPP16IncomingRequestCommand
.CLEAR_CACHE
,
164 this.parseJsonSchemaFile
<DefaultResponse
>(
165 '../../../assets/json-schemas/ocpp/1.6/ClearCacheResponse.json'
169 OCPP16IncomingRequestCommand
.CHANGE_AVAILABILITY
,
170 this.parseJsonSchemaFile
<ChangeAvailabilityResponse
>(
171 '../../../assets/json-schemas/ocpp/1.6/ChangeAvailabilityResponse.json'
175 OCPP16IncomingRequestCommand
.UNLOCK_CONNECTOR
,
176 this.parseJsonSchemaFile
<UnlockConnectorResponse
>(
177 '../../../assets/json-schemas/ocpp/1.6/UnlockConnectorResponse.json'
181 OCPP16IncomingRequestCommand
.GET_CONFIGURATION
,
182 this.parseJsonSchemaFile
<GetConfigurationResponse
>(
183 '../../../assets/json-schemas/ocpp/1.6/GetConfigurationResponse.json'
187 OCPP16IncomingRequestCommand
.CHANGE_CONFIGURATION
,
188 this.parseJsonSchemaFile
<ChangeConfigurationResponse
>(
189 '../../../assets/json-schemas/ocpp/1.6/ChangeConfigurationResponse.json'
193 OCPP16IncomingRequestCommand
.SET_CHARGING_PROFILE
,
194 this.parseJsonSchemaFile
<SetChargingProfileResponse
>(
195 '../../../assets/json-schemas/ocpp/1.6/SetChargingProfileResponse.json'
199 OCPP16IncomingRequestCommand
.CLEAR_CHARGING_PROFILE
,
200 this.parseJsonSchemaFile
<ClearChargingProfileResponse
>(
201 '../../../assets/json-schemas/ocpp/1.6/ClearChargingProfileResponse.json'
205 OCPP16IncomingRequestCommand
.REMOTE_START_TRANSACTION
,
206 this.parseJsonSchemaFile
<DefaultResponse
>(
207 '../../../assets/json-schemas/ocpp/1.6/RemoteStartTransactionResponse.json'
211 OCPP16IncomingRequestCommand
.REMOTE_STOP_TRANSACTION
,
212 this.parseJsonSchemaFile
<DefaultResponse
>(
213 '../../../assets/json-schemas/ocpp/1.6/RemoteStopTransactionResponse.json'
217 OCPP16IncomingRequestCommand
.GET_DIAGNOSTICS
,
218 this.parseJsonSchemaFile
<GetDiagnosticsResponse
>(
219 '../../../assets/json-schemas/ocpp/1.6/GetDiagnosticsResponse.json'
223 OCPP16IncomingRequestCommand
.TRIGGER_MESSAGE
,
224 this.parseJsonSchemaFile
<OCPP16TriggerMessageResponse
>(
225 '../../../assets/json-schemas/ocpp/1.6/TriggerMessageResponse.json'
229 OCPP16IncomingRequestCommand
.DATA_TRANSFER
,
230 this.parseJsonSchemaFile
<OCPP16DataTransferResponse
>(
231 '../../../assets/json-schemas/ocpp/1.6/DataTransferResponse.json'
235 OCPP16IncomingRequestCommand
.UPDATE_FIRMWARE
,
236 this.parseJsonSchemaFile
<OCPP16UpdateFirmwareResponse
>(
237 '../../../assets/json-schemas/ocpp/1.6/UpdateFirmwareResponse.json'
241 this.validatePayload
.bind(this);
244 public async responseHandler(
245 chargingStation
: ChargingStation
,
246 commandName
: OCPP16RequestCommand
,
248 requestPayload
: JsonType
251 chargingStation
.isRegistered() === true ||
252 commandName
=== OCPP16RequestCommand
.BOOT_NOTIFICATION
255 this.responseHandlers
.has(commandName
) === true &&
256 OCPP16ServiceUtils
.isRequestCommandSupported(chargingStation
, commandName
) === true
259 this.validatePayload(chargingStation
, commandName
, payload
);
260 await this.responseHandlers
.get(commandName
)(chargingStation
, payload
, requestPayload
);
263 `${chargingStation.logPrefix()} ${moduleName}.responseHandler: Handle response error:`,
271 ErrorType
.NOT_IMPLEMENTED
,
272 `${commandName} is not implemented to handle response PDU ${JSON.stringify(
283 ErrorType
.SECURITY_ERROR
,
284 `${commandName} cannot be issued to handle response PDU ${JSON.stringify(
288 )} while the charging station is not registered on the central server.`,
295 private validatePayload(
296 chargingStation
: ChargingStation
,
297 commandName
: OCPP16RequestCommand
,
300 if (this.jsonSchemas
.has(commandName
) === true) {
301 return this.validateResponsePayload(
304 this.jsonSchemas
.get(commandName
),
309 `${chargingStation.logPrefix()} ${moduleName}.validatePayload: No JSON schema found for command '${commandName}' PDU validation`
314 private handleResponseBootNotification(
315 chargingStation
: ChargingStation
,
316 payload
: OCPP16BootNotificationResponse
318 if (payload
.status === RegistrationStatusEnumType
.ACCEPTED
) {
319 ChargingStationConfigurationUtils
.addConfigurationKey(
321 OCPP16StandardParametersKey
.HeartbeatInterval
,
322 payload
.interval
.toString(),
324 { overwrite
: true, save
: true }
326 ChargingStationConfigurationUtils
.addConfigurationKey(
328 OCPP16StandardParametersKey
.HeartBeatInterval
,
329 payload
.interval
.toString(),
331 { overwrite
: true, save
: true }
333 chargingStation
.heartbeatSetInterval
334 ? chargingStation
.restartHeartbeat()
335 : chargingStation
.startHeartbeat();
337 if (Object.values(RegistrationStatusEnumType
).includes(payload
.status)) {
338 const logMsg
= `${chargingStation.logPrefix()} Charging station in '${
340 }' state on the central server`;
341 payload
.status === RegistrationStatusEnumType
.REJECTED
342 ? logger
.warn(logMsg
)
343 : logger
.info(logMsg
);
346 chargingStation
.logPrefix() +
347 ' Charging station boot notification response received: %j with undefined registration status',
353 private handleResponseAuthorize(
354 chargingStation
: ChargingStation
,
355 payload
: OCPP16AuthorizeResponse
,
356 requestPayload
: OCPP16AuthorizeRequest
358 let authorizeConnectorId
: number;
359 for (const connectorId
of chargingStation
.connectors
.keys()) {
362 chargingStation
.getConnectorStatus(connectorId
)?.authorizeIdTag
=== requestPayload
.idTag
364 authorizeConnectorId
= connectorId
;
368 const isAuthorizeConnectorIdDefined
= authorizeConnectorId
!== undefined;
369 if (payload
.idTagInfo
.status === OCPP16AuthorizationStatus
.ACCEPTED
) {
370 isAuthorizeConnectorIdDefined
&&
371 (chargingStation
.getConnectorStatus(authorizeConnectorId
).idTagAuthorized
= true);
373 `${chargingStation.logPrefix()} IdTag '${requestPayload.idTag}' accepted${
374 isAuthorizeConnectorIdDefined ? ` on connector ${authorizeConnectorId}
` : ''
378 if (isAuthorizeConnectorIdDefined
) {
379 chargingStation
.getConnectorStatus(authorizeConnectorId
).idTagAuthorized
= false;
380 delete chargingStation
.getConnectorStatus(authorizeConnectorId
).authorizeIdTag
;
383 `${chargingStation.logPrefix()} IdTag '${requestPayload.idTag}' rejected with status '${
384 payload.idTagInfo.status
385 }'${isAuthorizeConnectorIdDefined ? ` on connector ${authorizeConnectorId}` : ''}`
390 private async handleResponseStartTransaction(
391 chargingStation: ChargingStation,
392 payload: OCPP16StartTransactionResponse,
393 requestPayload: OCPP16StartTransactionRequest
395 const connectorId = requestPayload.connectorId;
397 let transactionConnectorId: number;
398 for (const id of chargingStation.connectors.keys()) {
399 if (id > 0 && id === connectorId) {
400 transactionConnectorId = id;
404 if (!transactionConnectorId) {
406 chargingStation.logPrefix() +
407 ' Trying to start a transaction on a non existing connector Id ' +
408 connectorId.toString()
413 chargingStation.getConnectorStatus(connectorId).transactionRemoteStarted === true &&
414 chargingStation.getAuthorizeRemoteTxRequests() === true &&
415 chargingStation.getLocalAuthListEnabled() === true &&
416 chargingStation.hasAuthorizedTags() &&
417 chargingStation.getConnectorStatus(connectorId).idTagLocalAuthorized === false
420 chargingStation.logPrefix() +
421 ' Trying to start a transaction with a not local authorized idTag ' +
422 chargingStation.getConnectorStatus(connectorId).localAuthorizeIdTag +
423 ' on connector Id ' +
424 connectorId.toString()
426 await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
430 chargingStation.getConnectorStatus(connectorId).transactionRemoteStarted === true &&
431 chargingStation.getAuthorizeRemoteTxRequests() === true &&
432 chargingStation.getMustAuthorizeAtRemoteStart() === true &&
433 chargingStation.getConnectorStatus(connectorId).idTagLocalAuthorized === false &&
434 chargingStation.getConnectorStatus(connectorId).idTagAuthorized === false
437 chargingStation.logPrefix() +
438 ' Trying to start a transaction with a not authorized idTag ' +
439 chargingStation.getConnectorStatus(connectorId).authorizeIdTag +
440 ' on connector Id ' +
441 connectorId.toString()
443 await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
447 chargingStation.getConnectorStatus(connectorId).idTagAuthorized &&
448 chargingStation.getConnectorStatus(connectorId).authorizeIdTag !== requestPayload.idTag
451 chargingStation.logPrefix() +
452 ' Trying to start a transaction with an idTag ' +
453 requestPayload.idTag +
454 ' different from the authorize request one ' +
455 chargingStation.getConnectorStatus(connectorId).authorizeIdTag +
456 ' on connector Id ' +
457 connectorId.toString()
459 await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
463 chargingStation.getConnectorStatus(connectorId).idTagLocalAuthorized &&
464 chargingStation.getConnectorStatus(connectorId).localAuthorizeIdTag !== requestPayload.idTag
467 chargingStation.logPrefix() +
468 ' Trying to start a transaction with an idTag ' +
469 requestPayload.idTag +
470 ' different from the local authorized one ' +
471 chargingStation.getConnectorStatus(connectorId).localAuthorizeIdTag +
472 ' on connector Id ' +
473 connectorId.toString()
475 await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
478 if (chargingStation.getConnectorStatus(connectorId)?.transactionStarted === true) {
480 chargingStation.logPrefix() +
481 ' Trying to start a transaction on an already used connector ' +
482 connectorId.toString() +
484 chargingStation.getConnectorStatus(connectorId)
489 chargingStation.getConnectorStatus(connectorId)?.status !==
490 OCPP16ChargePointStatus.AVAILABLE &&
491 chargingStation.getConnectorStatus(connectorId)?.status !== OCPP16ChargePointStatus.PREPARING
494 `${chargingStation.logPrefix()} Trying to start a transaction on connector ${connectorId.toString()}
with status $
{
495 chargingStation
.getConnectorStatus(connectorId
)?.status
500 // if (!Number.isInteger(payload.transactionId)) {
502 // `${chargingStation.logPrefix()} Trying to start a transaction on connector ${connectorId.toString()}
with a non integer transaction Id $
{
503 // payload.transactionId
504 // }, converting to integer`
506 // payload.transactionId = Utils.convertToInt(payload.transactionId);
509 if (payload
.idTagInfo
?.status === OCPP16AuthorizationStatus
.ACCEPTED
) {
510 chargingStation
.getConnectorStatus(connectorId
).transactionStarted
= true;
511 chargingStation
.getConnectorStatus(connectorId
).transactionId
= payload
.transactionId
;
512 chargingStation
.getConnectorStatus(connectorId
).transactionIdTag
= requestPayload
.idTag
;
513 chargingStation
.getConnectorStatus(
515 ).transactionEnergyActiveImportRegisterValue
= 0;
516 chargingStation
.getConnectorStatus(connectorId
).transactionBeginMeterValue
=
517 OCPP16ServiceUtils
.buildTransactionBeginMeterValue(
520 requestPayload
.meterStart
522 chargingStation
.getBeginEndMeterValues() &&
523 (await chargingStation
.ocppRequestService
.requestHandler
<
524 OCPP16MeterValuesRequest
,
525 OCPP16MeterValuesResponse
526 >(chargingStation
, OCPP16RequestCommand
.METER_VALUES
, {
528 transactionId
: payload
.transactionId
,
529 meterValue
: [chargingStation
.getConnectorStatus(connectorId
).transactionBeginMeterValue
],
531 await chargingStation
.ocppRequestService
.requestHandler
<
532 OCPP16StatusNotificationRequest
,
533 OCPP16StatusNotificationResponse
534 >(chargingStation
, OCPP16RequestCommand
.STATUS_NOTIFICATION
, {
536 status: OCPP16ChargePointStatus
.CHARGING
,
537 errorCode
: OCPP16ChargePointErrorCode
.NO_ERROR
,
539 chargingStation
.getConnectorStatus(connectorId
).status = OCPP16ChargePointStatus
.CHARGING
;
541 chargingStation
.logPrefix() +
543 payload
.transactionId
.toString() +
545 chargingStation
.stationInfo
.chargingStationId
+
547 connectorId
.toString() +
549 requestPayload
.idTag
+
552 if (chargingStation
.stationInfo
.powerSharedByConnectors
) {
553 chargingStation
.powerDivider
++;
555 const configuredMeterValueSampleInterval
=
556 ChargingStationConfigurationUtils
.getConfigurationKey(
558 OCPP16StandardParametersKey
.MeterValueSampleInterval
560 chargingStation
.startMeterValues(
562 configuredMeterValueSampleInterval
563 ? Utils
.convertToInt(configuredMeterValueSampleInterval
.value
) * 1000
564 : Constants
.DEFAULT_METER_VALUES_INTERVAL
568 chargingStation
.logPrefix() +
569 ' Starting transaction id ' +
570 payload
.transactionId
.toString() +
571 " REJECTED with status '" +
572 payload
?.idTagInfo
?.status +
574 requestPayload
.idTag
+
577 await this.resetConnectorOnStartTransactionError(chargingStation
, connectorId
);
581 private async resetConnectorOnStartTransactionError(
582 chargingStation
: ChargingStation
,
585 chargingStation
.resetConnectorStatus(connectorId
);
587 chargingStation
.getConnectorStatus(connectorId
).status !== OCPP16ChargePointStatus
.AVAILABLE
589 await chargingStation
.ocppRequestService
.requestHandler
<
590 OCPP16StatusNotificationRequest
,
591 OCPP16StatusNotificationResponse
592 >(chargingStation
, OCPP16RequestCommand
.STATUS_NOTIFICATION
, {
594 status: OCPP16ChargePointStatus
.AVAILABLE
,
595 errorCode
: OCPP16ChargePointErrorCode
.NO_ERROR
,
597 chargingStation
.getConnectorStatus(connectorId
).status = OCPP16ChargePointStatus
.AVAILABLE
;
601 private async handleResponseStopTransaction(
602 chargingStation
: ChargingStation
,
603 payload
: OCPP16StopTransactionResponse
,
604 requestPayload
: OCPP16StopTransactionRequest
606 const transactionConnectorId
= chargingStation
.getConnectorIdByTransactionId(
607 requestPayload
.transactionId
609 if (!transactionConnectorId
) {
611 chargingStation
.logPrefix() +
612 ' Trying to stop a non existing transaction ' +
613 requestPayload
.transactionId
.toString()
617 if (payload
.idTagInfo
?.status === OCPP16AuthorizationStatus
.ACCEPTED
) {
618 chargingStation
.getBeginEndMeterValues() === true &&
619 chargingStation
.getOcppStrictCompliance() === false &&
620 chargingStation
.getOutOfOrderEndMeterValues() === true &&
621 (await chargingStation
.ocppRequestService
.requestHandler
<
622 OCPP16MeterValuesRequest
,
623 OCPP16MeterValuesResponse
624 >(chargingStation
, OCPP16RequestCommand
.METER_VALUES
, {
625 connectorId
: transactionConnectorId
,
626 transactionId
: requestPayload
.transactionId
,
628 OCPP16ServiceUtils
.buildTransactionEndMeterValue(
630 transactionConnectorId
,
631 requestPayload
.meterStop
636 chargingStation
.isChargingStationAvailable() === false ||
637 chargingStation
.isConnectorAvailable(transactionConnectorId
) === false
639 await chargingStation
.ocppRequestService
.requestHandler
<
640 OCPP16StatusNotificationRequest
,
641 OCPP16StatusNotificationResponse
642 >(chargingStation
, OCPP16RequestCommand
.STATUS_NOTIFICATION
, {
643 connectorId
: transactionConnectorId
,
644 status: OCPP16ChargePointStatus
.UNAVAILABLE
,
645 errorCode
: OCPP16ChargePointErrorCode
.NO_ERROR
,
647 chargingStation
.getConnectorStatus(transactionConnectorId
).status =
648 OCPP16ChargePointStatus
.UNAVAILABLE
;
650 await chargingStation
.ocppRequestService
.requestHandler
<
651 OCPP16BootNotificationRequest
,
652 OCPP16BootNotificationResponse
653 >(chargingStation
, OCPP16RequestCommand
.STATUS_NOTIFICATION
, {
654 connectorId
: transactionConnectorId
,
655 status: OCPP16ChargePointStatus
.AVAILABLE
,
656 errorCode
: OCPP16ChargePointErrorCode
.NO_ERROR
,
658 chargingStation
.getConnectorStatus(transactionConnectorId
).status =
659 OCPP16ChargePointStatus
.AVAILABLE
;
661 if (chargingStation
.stationInfo
.powerSharedByConnectors
) {
662 chargingStation
.powerDivider
--;
664 chargingStation
.resetConnectorStatus(transactionConnectorId
);
666 chargingStation
.logPrefix() +
668 requestPayload
.transactionId
.toString() +
670 chargingStation
.stationInfo
.chargingStationId
+
672 transactionConnectorId
.toString()
676 chargingStation
.logPrefix() +
677 ' Stopping transaction id ' +
678 requestPayload
.transactionId
.toString() +
679 " REJECTED with status '" +
680 payload
.idTagInfo
?.status +
686 private parseJsonSchemaFile
<T
extends JsonType
>(relativePath
: string): JSONSchemaType
<T
> {
689 path
.resolve(path
.dirname(fileURLToPath(import.meta
.url
)), relativePath
),
692 ) as JSONSchemaType
<T
>;