import type { JSONSchemaType } from 'ajv';
+import { OCPP16ServiceUtils } from './OCPP16ServiceUtils';
import {
type ChargingStation,
ChargingStationConfigurationUtils,
ChargingStationUtils,
- MessageChannelUtils,
} from '../../../charging-station';
import { OCPPError } from '../../../exception';
import {
type SetChargingProfileResponse,
type UnlockConnectorResponse,
} from '../../../types';
-import { Constants, Utils, logger } from '../../../utils';
-import { OCPP16ServiceUtils, OCPPResponseService } from '../internal';
+import { Constants, MessageChannelUtils, Utils, logger } from '../../../utils';
+import { OCPPResponseService } from '../OCPPResponseService';
const moduleName = 'OCPP16ResponseService';
[
OCPP16RequestCommand.BOOT_NOTIFICATION,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16BootNotificationResponse>(
- '../../../assets/json-schemas/ocpp/1.6/BootNotificationResponse.json',
+ 'assets/json-schemas/ocpp/1.6/BootNotificationResponse.json',
moduleName,
'constructor'
),
[
OCPP16RequestCommand.HEARTBEAT,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16HeartbeatResponse>(
- '../../../assets/json-schemas/ocpp/1.6/HeartbeatResponse.json',
+ 'assets/json-schemas/ocpp/1.6/HeartbeatResponse.json',
moduleName,
'constructor'
),
[
OCPP16RequestCommand.AUTHORIZE,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16AuthorizeResponse>(
- '../../../assets/json-schemas/ocpp/1.6/AuthorizeResponse.json',
+ 'assets/json-schemas/ocpp/1.6/AuthorizeResponse.json',
moduleName,
'constructor'
),
[
OCPP16RequestCommand.START_TRANSACTION,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16StartTransactionResponse>(
- '../../../assets/json-schemas/ocpp/1.6/StartTransactionResponse.json',
+ 'assets/json-schemas/ocpp/1.6/StartTransactionResponse.json',
moduleName,
'constructor'
),
[
OCPP16RequestCommand.STOP_TRANSACTION,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16StopTransactionResponse>(
- '../../../assets/json-schemas/ocpp/1.6/StopTransactionResponse.json',
+ 'assets/json-schemas/ocpp/1.6/StopTransactionResponse.json',
moduleName,
'constructor'
),
[
OCPP16RequestCommand.STATUS_NOTIFICATION,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16StatusNotificationResponse>(
- '../../../assets/json-schemas/ocpp/1.6/StatusNotificationResponse.json',
+ 'assets/json-schemas/ocpp/1.6/StatusNotificationResponse.json',
moduleName,
'constructor'
),
[
OCPP16RequestCommand.METER_VALUES,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16MeterValuesResponse>(
- '../../../assets/json-schemas/ocpp/1.6/MeterValuesResponse.json',
+ 'assets/json-schemas/ocpp/1.6/MeterValuesResponse.json',
moduleName,
'constructor'
),
[
OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16DiagnosticsStatusNotificationResponse>(
- '../../../assets/json-schemas/ocpp/1.6/DiagnosticsStatusNotificationResponse.json',
+ 'assets/json-schemas/ocpp/1.6/DiagnosticsStatusNotificationResponse.json',
moduleName,
'constructor'
),
[
OCPP16RequestCommand.DATA_TRANSFER,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16DataTransferResponse>(
- '../../../assets/json-schemas/ocpp/1.6/DataTransferResponse.json',
+ 'assets/json-schemas/ocpp/1.6/DataTransferResponse.json',
moduleName,
'constructor'
),
[
OCPP16RequestCommand.FIRMWARE_STATUS_NOTIFICATION,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16FirmwareStatusNotificationResponse>(
- '../../../assets/json-schemas/ocpp/1.6/FirmwareStatusNotificationResponse.json',
+ 'assets/json-schemas/ocpp/1.6/FirmwareStatusNotificationResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.RESET,
OCPP16ServiceUtils.parseJsonSchemaFile<GenericResponse>(
- '../../../assets/json-schemas/ocpp/1.6/ResetResponse.json',
+ 'assets/json-schemas/ocpp/1.6/ResetResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.CLEAR_CACHE,
OCPP16ServiceUtils.parseJsonSchemaFile<GenericResponse>(
- '../../../assets/json-schemas/ocpp/1.6/ClearCacheResponse.json',
+ 'assets/json-schemas/ocpp/1.6/ClearCacheResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.CHANGE_AVAILABILITY,
OCPP16ServiceUtils.parseJsonSchemaFile<ChangeAvailabilityResponse>(
- '../../../assets/json-schemas/ocpp/1.6/ChangeAvailabilityResponse.json',
+ 'assets/json-schemas/ocpp/1.6/ChangeAvailabilityResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.UNLOCK_CONNECTOR,
OCPP16ServiceUtils.parseJsonSchemaFile<UnlockConnectorResponse>(
- '../../../assets/json-schemas/ocpp/1.6/UnlockConnectorResponse.json',
+ 'assets/json-schemas/ocpp/1.6/UnlockConnectorResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.GET_CONFIGURATION,
OCPP16ServiceUtils.parseJsonSchemaFile<GetConfigurationResponse>(
- '../../../assets/json-schemas/ocpp/1.6/GetConfigurationResponse.json',
+ 'assets/json-schemas/ocpp/1.6/GetConfigurationResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.CHANGE_CONFIGURATION,
OCPP16ServiceUtils.parseJsonSchemaFile<ChangeConfigurationResponse>(
- '../../../assets/json-schemas/ocpp/1.6/ChangeConfigurationResponse.json',
+ 'assets/json-schemas/ocpp/1.6/ChangeConfigurationResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.GET_COMPOSITE_SCHEDULE,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16GetCompositeScheduleResponse>(
- '../../../assets/json-schemas/ocpp/1.6/GetCompositeScheduleResponse.json',
+ 'assets/json-schemas/ocpp/1.6/GetCompositeScheduleResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.SET_CHARGING_PROFILE,
OCPP16ServiceUtils.parseJsonSchemaFile<SetChargingProfileResponse>(
- '../../../assets/json-schemas/ocpp/1.6/SetChargingProfileResponse.json',
+ 'assets/json-schemas/ocpp/1.6/SetChargingProfileResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.CLEAR_CHARGING_PROFILE,
OCPP16ServiceUtils.parseJsonSchemaFile<ClearChargingProfileResponse>(
- '../../../assets/json-schemas/ocpp/1.6/ClearChargingProfileResponse.json',
+ 'assets/json-schemas/ocpp/1.6/ClearChargingProfileResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.REMOTE_START_TRANSACTION,
OCPP16ServiceUtils.parseJsonSchemaFile<GenericResponse>(
- '../../../assets/json-schemas/ocpp/1.6/RemoteStartTransactionResponse.json',
+ 'assets/json-schemas/ocpp/1.6/RemoteStartTransactionResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.REMOTE_STOP_TRANSACTION,
OCPP16ServiceUtils.parseJsonSchemaFile<GenericResponse>(
- '../../../assets/json-schemas/ocpp/1.6/RemoteStopTransactionResponse.json',
+ 'assets/json-schemas/ocpp/1.6/RemoteStopTransactionResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.GET_DIAGNOSTICS,
OCPP16ServiceUtils.parseJsonSchemaFile<GetDiagnosticsResponse>(
- '../../../assets/json-schemas/ocpp/1.6/GetDiagnosticsResponse.json',
+ 'assets/json-schemas/ocpp/1.6/GetDiagnosticsResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.TRIGGER_MESSAGE,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16TriggerMessageResponse>(
- '../../../assets/json-schemas/ocpp/1.6/TriggerMessageResponse.json',
+ 'assets/json-schemas/ocpp/1.6/TriggerMessageResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.DATA_TRANSFER,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16DataTransferResponse>(
- '../../../assets/json-schemas/ocpp/1.6/DataTransferResponse.json',
+ 'assets/json-schemas/ocpp/1.6/DataTransferResponse.json',
moduleName,
'constructor'
),
[
OCPP16IncomingRequestCommand.UPDATE_FIRMWARE,
OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16UpdateFirmwareResponse>(
- '../../../assets/json-schemas/ocpp/1.6/UpdateFirmwareResponse.json',
+ 'assets/json-schemas/ocpp/1.6/UpdateFirmwareResponse.json',
moduleName,
'constructor'
),
requestPayload: OCPP16AuthorizeRequest
): void {
let authorizeConnectorId: number;
- for (const connectorId of chargingStation.connectors.keys()) {
- if (
- connectorId > 0 &&
- chargingStation.getConnectorStatus(connectorId)?.authorizeIdTag === requestPayload.idTag
- ) {
- authorizeConnectorId = connectorId;
- break;
+ if (chargingStation.hasEvses) {
+ for (const [evseId, evseStatus] of chargingStation.evses) {
+ if (evseId > 0) {
+ for (const [connectorId, connectorStatus] of evseStatus.connectors) {
+ if (connectorStatus?.authorizeIdTag === requestPayload.idTag) {
+ authorizeConnectorId = connectorId;
+ break;
+ }
+ }
+ }
+ }
+ } else {
+ for (const connectorId of chargingStation.connectors.keys()) {
+ if (
+ connectorId > 0 &&
+ chargingStation.getConnectorStatus(connectorId)?.authorizeIdTag === requestPayload.idTag
+ ) {
+ authorizeConnectorId = connectorId;
+ break;
+ }
}
}
const authorizeConnectorIdDefined = !Utils.isNullOrUndefined(authorizeConnectorId);
(chargingStation.getConnectorStatus(authorizeConnectorId).idTagAuthorized = true);
logger.debug(
`${chargingStation.logPrefix()} idTag '${requestPayload.idTag}' accepted${
- authorizeConnectorIdDefined ? ` on connector ${authorizeConnectorId}` : ''
+ authorizeConnectorIdDefined ? ` on connector id ${authorizeConnectorId}` : ''
}`
);
} else {
logger.debug(
`${chargingStation.logPrefix()} idTag '${requestPayload.idTag}' rejected with status '${
payload.idTagInfo.status
- }'${authorizeConnectorIdDefined ? ` on connector ${authorizeConnectorId}` : ''}`
+ }'${authorizeConnectorIdDefined ? ` on connector id ${authorizeConnectorId}` : ''}`
);
}
}
payload: OCPP16StartTransactionResponse,
requestPayload: OCPP16StartTransactionRequest
): Promise<void> {
- const connectorId = requestPayload.connectorId;
-
- let transactionConnectorId: number;
- for (const id of chargingStation.connectors.keys()) {
- if (id > 0 && id === connectorId) {
- transactionConnectorId = id;
- break;
- }
- }
- if (Utils.isNullOrUndefined(transactionConnectorId)) {
+ const transactionConnectorId = requestPayload.connectorId;
+ if (
+ transactionConnectorId === 0 ||
+ chargingStation.hasConnector(transactionConnectorId) === false
+ ) {
logger.error(
- `${chargingStation.logPrefix()} Trying to start a transaction on a non existing connector id ${connectorId.toString()}`
+ `${chargingStation.logPrefix()} Trying to start a transaction on a non existing connector id ${transactionConnectorId.toString()}`
);
return;
}
if (
- chargingStation.getConnectorStatus(connectorId)?.transactionRemoteStarted === true &&
+ chargingStation.getConnectorStatus(transactionConnectorId)?.transactionRemoteStarted ===
+ true &&
chargingStation.getAuthorizeRemoteTxRequests() === true &&
chargingStation.getLocalAuthListEnabled() === true &&
chargingStation.hasIdTags() &&
- chargingStation.getConnectorStatus(connectorId)?.idTagLocalAuthorized === false
+ chargingStation.getConnectorStatus(transactionConnectorId)?.idTagLocalAuthorized === false
) {
logger.error(
`${chargingStation.logPrefix()} Trying to start a transaction with a not local authorized idTag ${
- chargingStation.getConnectorStatus(connectorId)?.localAuthorizeIdTag
- } on connector id ${connectorId.toString()}`
+ chargingStation.getConnectorStatus(transactionConnectorId)?.localAuthorizeIdTag
+ } on connector id ${transactionConnectorId.toString()}`
);
- await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
+ await this.resetConnectorOnStartTransactionError(chargingStation, transactionConnectorId);
return;
}
if (
- chargingStation.getConnectorStatus(connectorId)?.transactionRemoteStarted === true &&
+ chargingStation.getConnectorStatus(transactionConnectorId)?.transactionRemoteStarted ===
+ true &&
chargingStation.getAuthorizeRemoteTxRequests() === true &&
chargingStation.getMustAuthorizeAtRemoteStart() === true &&
- chargingStation.getConnectorStatus(connectorId)?.idTagLocalAuthorized === false &&
- chargingStation.getConnectorStatus(connectorId)?.idTagAuthorized === false
+ chargingStation.getConnectorStatus(transactionConnectorId)?.idTagLocalAuthorized === false &&
+ chargingStation.getConnectorStatus(transactionConnectorId)?.idTagAuthorized === false
) {
logger.error(
`${chargingStation.logPrefix()} Trying to start a transaction with a not authorized idTag ${
- chargingStation.getConnectorStatus(connectorId)?.authorizeIdTag
- } on connector id ${connectorId.toString()}`
+ chargingStation.getConnectorStatus(transactionConnectorId)?.authorizeIdTag
+ } on connector id ${transactionConnectorId.toString()}`
);
- await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
+ await this.resetConnectorOnStartTransactionError(chargingStation, transactionConnectorId);
return;
}
if (
- chargingStation.getConnectorStatus(connectorId)?.idTagAuthorized &&
- chargingStation.getConnectorStatus(connectorId)?.authorizeIdTag !== requestPayload.idTag
+ chargingStation.getConnectorStatus(transactionConnectorId)?.idTagAuthorized &&
+ chargingStation.getConnectorStatus(transactionConnectorId)?.authorizeIdTag !==
+ requestPayload.idTag
) {
logger.error(
`${chargingStation.logPrefix()} Trying to start a transaction with an idTag ${
requestPayload.idTag
} different from the authorize request one ${
- chargingStation.getConnectorStatus(connectorId)?.authorizeIdTag
- } on connector id ${connectorId.toString()}`
+ chargingStation.getConnectorStatus(transactionConnectorId)?.authorizeIdTag
+ } on connector id ${transactionConnectorId.toString()}`
);
- await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
+ await this.resetConnectorOnStartTransactionError(chargingStation, transactionConnectorId);
return;
}
if (
- chargingStation.getConnectorStatus(connectorId)?.idTagLocalAuthorized &&
- chargingStation.getConnectorStatus(connectorId)?.localAuthorizeIdTag !== requestPayload.idTag
+ chargingStation.getConnectorStatus(transactionConnectorId)?.idTagLocalAuthorized &&
+ chargingStation.getConnectorStatus(transactionConnectorId)?.localAuthorizeIdTag !==
+ requestPayload.idTag
) {
logger.error(
`${chargingStation.logPrefix()} Trying to start a transaction with an idTag ${
requestPayload.idTag
} different from the local authorized one ${
- chargingStation.getConnectorStatus(connectorId)?.localAuthorizeIdTag
- } on connector id ${connectorId.toString()}`
+ chargingStation.getConnectorStatus(transactionConnectorId)?.localAuthorizeIdTag
+ } on connector id ${transactionConnectorId.toString()}`
);
- await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
+ await this.resetConnectorOnStartTransactionError(chargingStation, transactionConnectorId);
return;
}
- if (chargingStation.getConnectorStatus(connectorId)?.transactionStarted === true) {
- logger.debug(
- `${chargingStation.logPrefix()} Trying to start a transaction on an already used connector ${connectorId.toString()}: %j`,
- chargingStation.getConnectorStatus(connectorId)
+ if (chargingStation.getConnectorStatus(transactionConnectorId)?.transactionStarted === true) {
+ logger.error(
+ `${chargingStation.logPrefix()} Trying to start a transaction on an already used connector id ${transactionConnectorId.toString()}:`,
+ chargingStation.getConnectorStatus(transactionConnectorId)
);
return;
}
+ if (chargingStation.hasEvses) {
+ for (const [evseId, evseStatus] of chargingStation.evses) {
+ if (evseStatus.connectors.size > 1) {
+ for (const [connectorId, connectorStatus] of evseStatus.connectors) {
+ if (
+ transactionConnectorId !== connectorId &&
+ connectorStatus?.transactionStarted === true
+ ) {
+ logger.error(
+ `${chargingStation.logPrefix()} Trying to start a transaction on an already used evse id ${evseId.toString()}:`,
+ evseStatus
+ );
+ await this.resetConnectorOnStartTransactionError(
+ chargingStation,
+ transactionConnectorId
+ );
+ return;
+ }
+ }
+ }
+ }
+ }
if (
- chargingStation.getConnectorStatus(connectorId)?.status !==
+ chargingStation.getConnectorStatus(transactionConnectorId)?.status !==
OCPP16ChargePointStatus.Available &&
- chargingStation.getConnectorStatus(connectorId)?.status !== OCPP16ChargePointStatus.Preparing
+ chargingStation.getConnectorStatus(transactionConnectorId)?.status !==
+ OCPP16ChargePointStatus.Preparing
) {
logger.error(
- `${chargingStation.logPrefix()} Trying to start a transaction on connector ${connectorId.toString()} with status ${
- chargingStation.getConnectorStatus(connectorId)?.status
+ `${chargingStation.logPrefix()} Trying to start a transaction on connector id ${transactionConnectorId.toString()} with status ${
+ chargingStation.getConnectorStatus(transactionConnectorId)?.status
}`
);
return;
}
- // if (!Number.isInteger(payload.transactionId)) {
- // logger.warn(
- // `${chargingStation.logPrefix()} Trying to start a transaction on connector ${connectorId.toString()} with a non integer transaction Id ${
- // payload.transactionId
- // }, converting to integer`
- // );
- // payload.transactionId = Utils.convertToInt(payload.transactionId);
- // }
+ if (!Number.isInteger(payload.transactionId)) {
+ logger.warn(
+ `${chargingStation.logPrefix()} Trying to start a transaction on connector id ${transactionConnectorId.toString()} with a non integer transaction id ${
+ payload.transactionId
+ }, converting to integer`
+ );
+ payload.transactionId = Utils.convertToInt(payload.transactionId);
+ }
if (payload.idTagInfo?.status === OCPP16AuthorizationStatus.ACCEPTED) {
- chargingStation.getConnectorStatus(connectorId).transactionStarted = true;
- chargingStation.getConnectorStatus(connectorId).transactionId = payload.transactionId;
- chargingStation.getConnectorStatus(connectorId).transactionIdTag = requestPayload.idTag;
+ chargingStation.getConnectorStatus(transactionConnectorId).transactionStarted = true;
+ chargingStation.getConnectorStatus(transactionConnectorId).transactionId =
+ payload.transactionId;
+ chargingStation.getConnectorStatus(transactionConnectorId).transactionIdTag =
+ requestPayload.idTag;
chargingStation.getConnectorStatus(
- connectorId
+ transactionConnectorId
).transactionEnergyActiveImportRegisterValue = 0;
- chargingStation.getConnectorStatus(connectorId).transactionBeginMeterValue =
+ chargingStation.getConnectorStatus(transactionConnectorId).transactionBeginMeterValue =
OCPP16ServiceUtils.buildTransactionBeginMeterValue(
chargingStation,
- connectorId,
+ transactionConnectorId,
requestPayload.meterStart
);
chargingStation.getBeginEndMeterValues() &&
OCPP16MeterValuesRequest,
OCPP16MeterValuesResponse
>(chargingStation, OCPP16RequestCommand.METER_VALUES, {
- connectorId,
+ connectorId: transactionConnectorId,
transactionId: payload.transactionId,
- meterValue: [chargingStation.getConnectorStatus(connectorId).transactionBeginMeterValue],
+ meterValue: [
+ chargingStation.getConnectorStatus(transactionConnectorId).transactionBeginMeterValue,
+ ],
}));
await OCPP16ServiceUtils.sendAndSetConnectorStatus(
chargingStation,
- connectorId,
+ transactionConnectorId,
OCPP16ChargePointStatus.Charging
);
logger.info(
- `${chargingStation.logPrefix()} Transaction ${payload.transactionId.toString()} STARTED on ${
+ `${chargingStation.logPrefix()} Transaction with id ${payload.transactionId.toString()} STARTED on ${
chargingStation.stationInfo.chargingStationId
- }#${connectorId.toString()} for idTag '${requestPayload.idTag}'`
+ }#${transactionConnectorId.toString()} for idTag '${requestPayload.idTag}'`
);
if (chargingStation.stationInfo.powerSharedByConnectors) {
- chargingStation.powerDivider++;
+ ++chargingStation.powerDivider;
}
const configuredMeterValueSampleInterval =
ChargingStationConfigurationUtils.getConfigurationKey(
OCPP16StandardParametersKey.MeterValueSampleInterval
);
chargingStation.startMeterValues(
- connectorId,
+ transactionConnectorId,
configuredMeterValueSampleInterval
? Utils.convertToInt(configuredMeterValueSampleInterval.value) * 1000
: Constants.DEFAULT_METER_VALUES_INTERVAL
);
} else {
logger.warn(
- `${chargingStation.logPrefix()} Starting transaction id ${payload.transactionId.toString()} REJECTED with status '${
+ `${chargingStation.logPrefix()} Starting transaction with id ${payload.transactionId.toString()} REJECTED with status '${
payload.idTagInfo?.status
}', idTag '${requestPayload.idTag}'`
);
- await this.resetConnectorOnStartTransactionError(chargingStation, connectorId);
+ await this.resetConnectorOnStartTransactionError(chargingStation, transactionConnectorId);
}
}
);
if (Utils.isNullOrUndefined(transactionConnectorId)) {
logger.error(
- `${chargingStation.logPrefix()} Trying to stop a non existing transaction ${requestPayload.transactionId.toString()}`
+ `${chargingStation.logPrefix()} Trying to stop a non existing transaction with id ${requestPayload.transactionId.toString()}`
);
return;
}
);
chargingStation.stopMeterValues(transactionConnectorId);
parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(chargingStation));
- const logMsg = `${chargingStation.logPrefix()} Transaction ${requestPayload.transactionId.toString()} STOPPED on ${
+ const logMsg = `${chargingStation.logPrefix()} Transaction with id ${requestPayload.transactionId.toString()} STOPPED on ${
chargingStation.stationInfo.chargingStationId
}#${transactionConnectorId?.toString()} with status '${
payload.idTagInfo?.status ?? 'undefined'