+ private handleRequestGetCompositeSchedule(
+ chargingStation: ChargingStation,
+ commandPayload: OCPP16GetCompositeScheduleRequest
+ ): OCPP16GetCompositeScheduleResponse {
+ if (
+ OCPP16ServiceUtils.checkFeatureProfile(
+ chargingStation,
+ OCPP16SupportedFeatureProfiles.SmartCharging,
+ OCPP16IncomingRequestCommand.CLEAR_CHARGING_PROFILE
+ ) === false
+ ) {
+ return OCPPConstants.OCPP_RESPONSE_REJECTED;
+ }
+ if (chargingStation.connectors.has(commandPayload.connectorId) === false) {
+ logger.error(
+ `${chargingStation.logPrefix()} Trying to get composite schedule to a non existing connector Id ${
+ commandPayload.connectorId
+ }`
+ );
+ return OCPPConstants.OCPP_RESPONSE_REJECTED;
+ }
+ if (
+ Utils.isEmptyArray(
+ chargingStation.getConnectorStatus(commandPayload.connectorId)?.chargingProfiles
+ )
+ ) {
+ return OCPPConstants.OCPP_RESPONSE_REJECTED;
+ }
+ const startDate = new Date();
+ const endDate = new Date(startDate.getTime() + commandPayload.duration * 1000);
+ let compositeSchedule: OCPP16ChargingSchedule;
+ for (const chargingProfile of chargingStation.getConnectorStatus(commandPayload.connectorId)
+ .chargingProfiles) {
+ // FIXME: build the composite schedule including the local power limit, the stack level, the charging rate unit, etc.
+ if (
+ chargingProfile.chargingSchedule?.startSchedule >= startDate &&
+ chargingProfile.chargingSchedule?.startSchedule <= endDate
+ ) {
+ compositeSchedule = chargingProfile.chargingSchedule;
+ break;
+ }
+ }
+ return {
+ status: GenericStatus.Accepted,
+ scheduleStart: compositeSchedule?.startSchedule,
+ connectorId: commandPayload.connectorId,
+ chargingSchedule: compositeSchedule,
+ };
+ }
+