import { DiagnosticsStatusNotificationRequest, HeartbeatRequest, OCPP16BootNotificationRequest, OCPP16IncomingRequestCommand, OCPP16RequestCommand, StatusNotificationRequest } from '../../../types/ocpp/1.6/Requests';
import { MeterValueUnit, MeterValuesRequest, OCPP16MeterValue, OCPP16MeterValueMeasurand, OCPP16MeterValuePhase } from '../../../types/ocpp/1.6/MeterValues';
+import ChargingStation from '../../ChargingStation';
import Constants from '../../../utils/Constants';
import { ErrorType } from '../../../types/ocpp/ErrorType';
+import { JsonType } from '../../../types/JsonType';
import MeasurandPerPhaseSampledValueTemplates from '../../../types/MeasurandPerPhaseSampledValueTemplates';
import MeasurandValues from '../../../types/MeasurandValues';
import { MessageType } from '../../../types/ocpp/MessageType';
import { OCPP16ChargePointStatus } from '../../../types/ocpp/1.6/ChargePointStatus';
import { OCPP16DiagnosticsStatus } from '../../../types/ocpp/1.6/DiagnosticsStatus';
import { OCPP16ServiceUtils } from './OCPP16ServiceUtils';
-import OCPPError from '../OCPPError';
+import OCPPError from '../../../exception/OCPPError';
import OCPPRequestService from '../OCPPRequestService';
+import OCPPResponseService from '../OCPPResponseService';
+import { SendParams } from '../../../types/ocpp/Requests';
import Utils from '../../../utils/Utils';
import logger from '../../../utils/Logger';
export default class OCPP16RequestService extends OCPPRequestService {
- public async sendHeartbeat(): Promise<void> {
+ public constructor(chargingStation: ChargingStation, ocppResponseService: OCPPResponseService) {
+ if (new.target?.name === 'OCPP16RequestService') {
+ throw new TypeError('Cannot construct OCPP16RequestService instances directly');
+ }
+ super(chargingStation, ocppResponseService);
+ }
+
+ public async sendHeartbeat(params?: SendParams): Promise<void> {
try {
const payload: HeartbeatRequest = {};
- await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.HEARTBEAT);
+ await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.HEARTBEAT, params);
} catch (error) {
this.handleRequestError(OCPP16RequestCommand.HEARTBEAT, error as Error);
}
}
public async sendBootNotification(chargePointModel: string, chargePointVendor: string, chargeBoxSerialNumber?: string, firmwareVersion?: string,
- chargePointSerialNumber?: string, iccid?: string, imsi?: string, meterSerialNumber?: string, meterType?: string): Promise<OCPP16BootNotificationResponse> {
+ chargePointSerialNumber?: string, iccid?: string, imsi?: string, meterSerialNumber?: string, meterType?: string,
+ params?: SendParams): Promise<OCPP16BootNotificationResponse> {
try {
const payload: OCPP16BootNotificationRequest = {
chargePointModel,
...!Utils.isUndefined(meterSerialNumber) && { meterSerialNumber },
...!Utils.isUndefined(meterType) && { meterType }
};
- return await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE, OCPP16RequestCommand.BOOT_NOTIFICATION, true) as OCPP16BootNotificationResponse;
+ return await this.sendMessage(Utils.generateUUID(), payload, MessageType.CALL_MESSAGE,
+ OCPP16RequestCommand.BOOT_NOTIFICATION, { ...params, skipBufferingOnError: true }) as OCPP16BootNotificationResponse;
} catch (error) {
this.handleRequestError(OCPP16RequestCommand.BOOT_NOTIFICATION, error as Error);
}
}
const transactionEndMeterValue = OCPP16ServiceUtils.buildTransactionEndMeterValue(this.chargingStation, connectorId, meterStop);
// FIXME: should be a callback, each OCPP commands implementation must do only one job
- (this.chargingStation.getBeginEndMeterValues() && !this.chargingStation.getOutOfOrderEndMeterValues())
+ (this.chargingStation.getBeginEndMeterValues() && this.chargingStation.getOcppStrictCompliance() && !this.chargingStation.getOutOfOrderEndMeterValues())
&& await this.sendTransactionEndMeterValues(connectorId, transactionId, transactionEndMeterValue);
const payload: StopTransactionRequest = {
transactionId,
: Utils.getRandomFloatRounded(maxEnergyRounded);
// Persist previous value on connector
if (connector && !Utils.isNullOrUndefined(connector.energyActiveImportRegisterValue) && connector.energyActiveImportRegisterValue >= 0 &&
- !Utils.isNullOrUndefined(connector.transactionEnergyActiveImportRegisterValue) && connector.transactionEnergyActiveImportRegisterValue >= 0) {
+ !Utils.isNullOrUndefined(connector.transactionEnergyActiveImportRegisterValue) && connector.transactionEnergyActiveImportRegisterValue >= 0) {
connector.energyActiveImportRegisterValue += energyValueRounded;
connector.transactionEnergyActiveImportRegisterValue += energyValueRounded;
} else {
}
}
- public async sendResult(messageId: string, resultMessageData: Record<string, unknown>, commandName: OCPP16RequestCommand | OCPP16IncomingRequestCommand): Promise<unknown> {
+ public async sendResult(messageId: string, resultMessageData: JsonType, commandName: OCPP16RequestCommand | OCPP16IncomingRequestCommand): Promise<JsonType> {
try {
// Send error
- return await this.sendMessage(messageId, resultMessageData, MessageType.CALL_RESULT_MESSAGE, commandName);
- } catch (err) {
- this.handleRequestError(commandName as OCPP16RequestCommand, err as Error);
+ return await this.sendMessage(messageId, resultMessageData, MessageType.CALL_RESULT_MESSAGE, commandName) as JsonType;
+ } catch (error) {
+ this.handleRequestError(commandName as OCPP16RequestCommand, error as Error);
}
}
- public async sendError(messageId: string, error: OCPPError, commandName: OCPP16RequestCommand | OCPP16IncomingRequestCommand): Promise<unknown> {
+ public async sendError(messageId: string, ocppError: OCPPError, commandName: OCPP16RequestCommand | OCPP16IncomingRequestCommand): Promise<JsonType> {
try {
// Send error
- return await this.sendMessage(messageId, error, MessageType.CALL_ERROR_MESSAGE, commandName);
- } catch (err) {
- this.handleRequestError(commandName as OCPP16RequestCommand, err as Error);
+ return await this.sendMessage(messageId, ocppError, MessageType.CALL_ERROR_MESSAGE, commandName) as JsonType;
+ } catch (error) {
+ this.handleRequestError(commandName as OCPP16RequestCommand, error as Error);
}
}
}