isDate,
isPast,
isWithinInterval,
+ maxTime,
toDate,
} from 'date-fns';
const connectorStatus = chargingStation.getConnectorStatus(connectorId)!;
for (const chargingProfile of chargingProfiles) {
const chargingSchedule = chargingProfile.chargingSchedule;
- if (connectorStatus?.transactionStarted && isNullOrUndefined(chargingSchedule?.startSchedule)) {
+ if (isNullOrUndefined(chargingSchedule?.startSchedule) && connectorStatus?.transactionStarted) {
logger.debug(
`${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profile id ${chargingProfile.chargingProfileId} has no startSchedule defined. Trying to set it to the connector current transaction start date`,
);
// OCPP specifies that if startSchedule is not defined, it should be relative to start of the connector transaction
chargingSchedule.startSchedule = connectorStatus?.transactionStart;
}
+ if (
+ !isNullOrUndefined(chargingSchedule?.startSchedule) &&
+ isNullOrUndefined(chargingSchedule?.duration)
+ ) {
+ logger.debug(
+ `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profile id ${chargingProfile.chargingProfileId} has no duration defined and will be set to the maximum time allowed`,
+ );
+ // OCPP specifies that if duration is not defined, it should be infinite
+ chargingSchedule.duration = differenceInSeconds(maxTime, chargingSchedule.startSchedule!);
+ }
if (!isDate(chargingSchedule?.startSchedule)) {
logger.warn(
`${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profile id ${chargingProfile.chargingProfileId} startSchedule property is not a Date object. Trying to convert it to a Date object`,
);
chargingSchedule.chargingSchedulePeriod.sort(chargingSchedulePeriodCompareFn);
}
- // Check if the first schedule period start period is equal to 0
+ // Check if the first schedule period startPeriod property is equal to 0
if (chargingSchedule.chargingSchedulePeriod[0].startPeriod !== 0) {
logger.error(
`${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profile id ${chargingProfile.chargingProfileId} first schedule period start period ${chargingSchedule.chargingSchedulePeriod[0].startPeriod} is not equal to 0`,
);
return false;
}
- if (isNullOrUndefined(chargingSchedule?.duration)) {
- logger.error(
- `${logPrefix} ${moduleName}.canProceedChargingProfile: Charging profile id ${chargingProfile.chargingProfileId} has no duration defined, not yet supported`,
- );
- return false;
- }
return true;
};
const chargingProfiles: OCPP16ChargingProfile[] = [];
for (const storedChargingProfile of storedChargingProfiles) {
if (
- connectorStatus?.transactionStarted &&
- isNullOrUndefined(storedChargingProfile.chargingSchedule?.startSchedule)
+ isNullOrUndefined(storedChargingProfile.chargingSchedule?.startSchedule) &&
+ connectorStatus?.transactionStarted
) {
logger.debug(
`${chargingStation.logPrefix()} ${moduleName}.handleRequestGetCompositeSchedule: Charging profile id ${
// OCPP specifies that if startSchedule is not defined, it should be relative to start of the connector transaction
storedChargingProfile.chargingSchedule.startSchedule = connectorStatus?.transactionStart;
}
+ if (
+ !isNullOrUndefined(storedChargingProfile.chargingSchedule?.startSchedule) &&
+ isNullOrUndefined(storedChargingProfile.chargingSchedule?.duration)
+ ) {
+ logger.debug(
+ `${chargingStation.logPrefix()} ${moduleName}.getLimitFromChargingProfiles: Charging profile id ${
+ storedChargingProfile.chargingProfileId
+ } has no duration defined and will be set to the maximum time allowed`,
+ );
+ // OCPP specifies that if duration is not defined, it should be infinite
+ storedChargingProfile.chargingSchedule.duration = differenceInSeconds(
+ maxTime,
+ storedChargingProfile.chargingSchedule.startSchedule!,
+ );
+ }
if (!isDate(storedChargingProfile.chargingSchedule?.startSchedule)) {
logger.warn(
`${chargingStation.logPrefix()} ${moduleName}.handleRequestGetCompositeSchedule: Charging profile id ${
)
) {
// Remove charging schedule periods that are before the end of the active profiles interval
- // FIXME: can lead to a gap in the charging schedule: chargingProfilesInterval.end -> first matching schedulePeriod.startPeriod
storedChargingProfile.chargingSchedule.chargingSchedulePeriod =
storedChargingProfile.chargingSchedule.chargingSchedulePeriod.filter(
- (schedulePeriod) =>
- isWithinInterval(
- addSeconds(
- storedChargingProfile.chargingSchedule.startSchedule!,
- schedulePeriod.startPeriod,
- ),
- {
- start: chargingProfilesInterval.end,
- end: interval.end,
- },
- ),
+ (schedulePeriod, index) => {
+ if (
+ isWithinInterval(
+ addSeconds(
+ storedChargingProfile.chargingSchedule.startSchedule!,
+ schedulePeriod.startPeriod,
+ ),
+ {
+ start: chargingProfilesInterval.end,
+ end: interval.end,
+ },
+ )
+ ) {
+ return true;
+ }
+ if (
+ !isWithinInterval(
+ addSeconds(
+ storedChargingProfile.chargingSchedule.startSchedule!,
+ schedulePeriod.startPeriod,
+ ),
+ {
+ start: chargingProfilesInterval.end,
+ end: interval.end,
+ },
+ ) &&
+ index <
+ storedChargingProfile.chargingSchedule.chargingSchedulePeriod.length - 1 &&
+ isWithinInterval(
+ addSeconds(
+ storedChargingProfile.chargingSchedule.startSchedule!,
+ storedChargingProfile.chargingSchedule.chargingSchedulePeriod[index + 1]
+ .startPeriod,
+ ),
+ {
+ start: chargingProfilesInterval.end,
+ end: interval.end,
+ },
+ )
+ ) {
+ return true;
+ }
+ return false;
+ },
);
addChargingProfile = true;
}