truncateId,
} from '../../../utils/index.js'
import { AuthContext } from '../auth/index.js'
+import { sendAndSetConnectorStatus } from '../OCPPConnectorStatusOperations.js'
import { OCPPConstants } from '../OCPPConstants.js'
import { OCPPIncomingRequestService } from '../OCPPIncomingRequestService.js'
import { isIdTagAuthorized } from '../OCPPServiceOperations.js'
isConnectorIdValid,
isIncomingRequestCommandSupported,
isMessageTriggerSupported,
- sendAndSetConnectorStatus,
} from '../OCPPServiceUtils.js'
import { OCPP16Constants } from './OCPP16Constants.js'
import { OCPP16ServiceUtils } from './OCPP16ServiceUtils.js'
type RequestParams,
} from '../../../types/index.js'
import { generateUUID, logger } from '../../../utils/index.js'
+import { sendAndSetConnectorStatus } from '../OCPPConnectorStatusOperations.js'
import { OCPPRequestService } from '../OCPPRequestService.js'
-import {
- createPayloadValidatorMap,
- isRequestCommandSupported,
- sendAndSetConnectorStatus,
-} from '../OCPPServiceUtils.js'
+import { createPayloadValidatorMap, isRequestCommandSupported } from '../OCPPServiceUtils.js'
import { OCPP16Constants } from './OCPP16Constants.js'
import { OCPP16ServiceUtils } from './OCPP16ServiceUtils.js'
type ResponseHandler,
} from '../../../types/index.js'
import { Constants, convertToInt, logger, truncateId } from '../../../utils/index.js'
-import { OCPPResponseService } from '../OCPPResponseService.js'
import {
- createPayloadValidatorMap,
- isRequestCommandSupported,
restoreConnectorStatus,
sendAndSetConnectorStatus,
-} from '../OCPPServiceUtils.js'
+} from '../OCPPConnectorStatusOperations.js'
+import { OCPPResponseService } from '../OCPPResponseService.js'
+import { createPayloadValidatorMap, isRequestCommandSupported } from '../OCPPServiceUtils.js'
import { OCPP16ServiceUtils } from './OCPP16ServiceUtils.js'
const moduleName = 'OCPP16ResponseService'
truncateId,
} from '../../../utils/index.js'
import { mapOCPP16Status, OCPPAuthServiceFactory } from '../auth/index.js'
+import { sendAndSetConnectorStatus } from '../OCPPConnectorStatusOperations.js'
import {
buildEmptyMeterValue,
buildMeterValue,
createPayloadConfigs,
getSampledValueTemplate,
PayloadValidatorOptions,
- sendAndSetConnectorStatus,
} from '../OCPPServiceUtils.js'
import { OCPP16Constants } from './OCPP16Constants.js'
mapOCPP20TokenType,
OCPPAuthServiceFactory,
} from '../auth/index.js'
+import {
+ restoreConnectorStatus,
+ sendAndSetConnectorStatus,
+} from '../OCPPConnectorStatusOperations.js'
import { OCPPIncomingRequestService } from '../OCPPIncomingRequestService.js'
import {
buildMeterValue,
createPayloadValidatorMap,
isIncomingRequestCommandSupported,
- restoreConnectorStatus,
- sendAndSetConnectorStatus,
} from '../OCPPServiceUtils.js'
import {
type GetInstalledCertificatesResult,
type ResponseHandler,
} from '../../../types/index.js'
import { convertToDate, logger } from '../../../utils/index.js'
+import { sendAndSetConnectorStatus } from '../OCPPConnectorStatusOperations.js'
import { OCPPResponseService } from '../OCPPResponseService.js'
-import {
- createPayloadValidatorMap,
- isRequestCommandSupported,
- sendAndSetConnectorStatus,
-} from '../OCPPServiceUtils.js'
+import { createPayloadValidatorMap, isRequestCommandSupported } from '../OCPPServiceUtils.js'
import { OCPP20IncomingRequestService } from './OCPP20IncomingRequestService.js'
import { OCPP20ServiceUtils } from './OCPP20ServiceUtils.js'
const moduleName = 'OCPP20ResponseService'
mapOCPP20TokenType,
OCPPAuthServiceFactory,
} from '../auth/index.js'
+import { sendAndSetConnectorStatus } from '../OCPPConnectorStatusOperations.js'
import {
buildMeterValue,
createPayloadConfigs,
PayloadValidatorOptions,
- sendAndSetConnectorStatus,
} from '../OCPPServiceUtils.js'
import { OCPP20VariableManager } from './OCPP20VariableManager.js'
--- /dev/null
+import { type ChargingStation } from '../../charging-station/index.js'
+import { OCPPError } from '../../exception/index.js'
+import {
+ ChargingStationEvents,
+ type ConnectorStatus,
+ ConnectorStatusEnum,
+ ErrorType,
+ OCPPVersion,
+ RequestCommand,
+ type StatusNotificationRequest,
+ type StatusNotificationResponse,
+} from '../../types/index.js'
+import { logger } from '../../utils/index.js'
+import { OCPP16Constants } from './1.6/OCPP16Constants.js'
+import { OCPP20Constants } from './2.0/OCPP20Constants.js'
+
+/**
+ * Sends a StatusNotification request and updates the connector status locally.
+ * @param chargingStation - Target charging station
+ * @param commandParams - Status notification parameters including connector ID and status
+ * @param options - Optional settings to control whether the request is actually sent
+ * @param options.send - Whether to actually send the status notification
+ */
+export const sendAndSetConnectorStatus = async (
+ chargingStation: ChargingStation,
+ commandParams: StatusNotificationRequest,
+ options?: { send: boolean }
+): Promise<void> => {
+ options = { send: true, ...options }
+ const params = commandParams as Record<string, unknown>
+ const connectorId = params.connectorId as number
+ const status = (params.connectorStatus ?? params.status) as ConnectorStatusEnum
+ const connectorStatus = chargingStation.getConnectorStatus(connectorId)
+ if (connectorStatus == null) {
+ return
+ }
+ if (options.send) {
+ checkConnectorStatusTransition(chargingStation, connectorId, status)
+ await chargingStation.ocppRequestService.requestHandler<
+ StatusNotificationRequest,
+ StatusNotificationResponse
+ >(chargingStation, RequestCommand.STATUS_NOTIFICATION, commandParams)
+ }
+ connectorStatus.status = status
+ chargingStation.emitChargingStationEvent(ChargingStationEvents.connectorStatusChanged, {
+ connectorId,
+ ...connectorStatus,
+ })
+}
+
+/**
+ * Restores a connector status to Reserved or Available based on its current state.
+ * @param chargingStation - Target charging station
+ * @param connectorId - Connector ID to restore
+ * @param connectorStatus - Current connector status to evaluate
+ */
+export const restoreConnectorStatus = async (
+ chargingStation: ChargingStation,
+ connectorId: number,
+ connectorStatus: ConnectorStatus | undefined
+): Promise<void> => {
+ if (
+ connectorStatus?.reservation != null &&
+ connectorStatus.status !== ConnectorStatusEnum.Reserved
+ ) {
+ await sendAndSetConnectorStatus(chargingStation, {
+ connectorId,
+ status: ConnectorStatusEnum.Reserved,
+ } as unknown as StatusNotificationRequest)
+ } else if (connectorStatus?.status !== ConnectorStatusEnum.Available) {
+ await sendAndSetConnectorStatus(chargingStation, {
+ connectorId,
+ status: ConnectorStatusEnum.Available,
+ } as unknown as StatusNotificationRequest)
+ }
+}
+
+const checkConnectorStatusTransition = (
+ chargingStation: ChargingStation,
+ connectorId: number,
+ status: ConnectorStatusEnum
+): boolean => {
+ const fromStatus = chargingStation.getConnectorStatus(connectorId)?.status
+ let chargingStationTransitions: readonly { from?: ConnectorStatusEnum; to: ConnectorStatusEnum }[]
+ let connectorTransitions: readonly { from?: ConnectorStatusEnum; to: ConnectorStatusEnum }[]
+ switch (chargingStation.stationInfo?.ocppVersion) {
+ case OCPPVersion.VERSION_16:
+ chargingStationTransitions = OCPP16Constants.ChargePointStatusChargingStationTransitions
+ connectorTransitions = OCPP16Constants.ChargePointStatusConnectorTransitions
+ break
+ case OCPPVersion.VERSION_20:
+ case OCPPVersion.VERSION_201:
+ chargingStationTransitions = OCPP20Constants.ChargingStationStatusTransitions
+ connectorTransitions = OCPP20Constants.ConnectorStatusTransitions
+ break
+ default:
+ throw new OCPPError(
+ ErrorType.INTERNAL_ERROR,
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+ `Cannot check connector status transition: OCPP version ${chargingStation.stationInfo?.ocppVersion} not supported`,
+ RequestCommand.STATUS_NOTIFICATION
+ )
+ }
+ const transitions = connectorId === 0 ? chargingStationTransitions : connectorTransitions
+ const transitionAllowed = transitions.some(
+ transition => transition.from === fromStatus && transition.to === status
+ )
+ if (!transitionAllowed) {
+ logger.warn(
+ `${chargingStation.logPrefix()} OCPP ${
+ chargingStation.stationInfo.ocppVersion
+ } connector id ${connectorId.toString()} status transition from '${
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+ chargingStation.getConnectorStatus(connectorId)?.status
+ }' to '${status}' is not allowed`
+ )
+ }
+ return transitionAllowed
+}
import { type ChargingStation, getConfigurationKey } from '../../charging-station/index.js'
import { BaseError, OCPPError } from '../../exception/index.js'
import {
- ChargingStationEvents,
type ConfigurationKeyType,
type ConnectorStatus,
- ConnectorStatusEnum,
CurrentType,
ErrorType,
FileType,
type SampledValue,
type SampledValueTemplate,
StandardParametersKey,
- type StatusNotificationRequest,
- type StatusNotificationResponse,
} from '../../types/index.js'
import {
ACElectricUtils,
min,
roundTo,
} from '../../utils/index.js'
-import { OCPP16Constants } from './1.6/OCPP16Constants.js'
-import { OCPP20Constants } from './2.0/OCPP20Constants.js'
import { OCPPConstants } from './OCPPConstants.js'
const moduleName = 'OCPPServiceUtils'
value: number
}
-/**
- * Sends a StatusNotification request and updates the connector status locally.
- * @param chargingStation - Target charging station
- * @param commandParams - Status notification parameters including connector ID and status
- * @param options - Optional settings to control whether the request is actually sent
- * @param options.send - Whether to actually send the status notification
- */
-export const sendAndSetConnectorStatus = async (
- chargingStation: ChargingStation,
- commandParams: StatusNotificationRequest,
- options?: { send: boolean }
-): Promise<void> => {
- options = { send: true, ...options }
- const params = commandParams as Record<string, unknown>
- const connectorId = params.connectorId as number
- const status = (params.connectorStatus ?? params.status) as ConnectorStatusEnum
- const connectorStatus = chargingStation.getConnectorStatus(connectorId)
- if (connectorStatus == null) {
- return
- }
- if (options.send) {
- checkConnectorStatusTransition(chargingStation, connectorId, status)
- await chargingStation.ocppRequestService.requestHandler<
- StatusNotificationRequest,
- StatusNotificationResponse
- >(chargingStation, RequestCommand.STATUS_NOTIFICATION, commandParams)
- }
- connectorStatus.status = status
- chargingStation.emitChargingStationEvent(ChargingStationEvents.connectorStatusChanged, {
- connectorId,
- ...connectorStatus,
- })
-}
-
-/**
- * Restores a connector status to Reserved or Available based on its current state.
- * @param chargingStation - Target charging station
- * @param connectorId - Connector ID to restore
- * @param connectorStatus - Current connector status to evaluate
- */
-export const restoreConnectorStatus = async (
- chargingStation: ChargingStation,
- connectorId: number,
- connectorStatus: ConnectorStatus | undefined
-): Promise<void> => {
- if (
- connectorStatus?.reservation != null &&
- connectorStatus.status !== ConnectorStatusEnum.Reserved
- ) {
- await sendAndSetConnectorStatus(chargingStation, {
- connectorId,
- status: ConnectorStatusEnum.Reserved,
- } as unknown as StatusNotificationRequest)
- } else if (connectorStatus?.status !== ConnectorStatusEnum.Available) {
- await sendAndSetConnectorStatus(chargingStation, {
- connectorId,
- status: ConnectorStatusEnum.Available,
- } as unknown as StatusNotificationRequest)
- }
-}
-
/**
* Maps an OCPP 1.6 or generic stop transaction reason to OCPP 2.0 stopped and trigger reasons.
* @param reason - Stop transaction reason to map
}
}
-const checkConnectorStatusTransition = (
- chargingStation: ChargingStation,
- connectorId: number,
- status: ConnectorStatusEnum
-): boolean => {
- const fromStatus = chargingStation.getConnectorStatus(connectorId)?.status
- let chargingStationTransitions: readonly { from?: ConnectorStatusEnum; to: ConnectorStatusEnum }[]
- let connectorTransitions: readonly { from?: ConnectorStatusEnum; to: ConnectorStatusEnum }[]
- switch (chargingStation.stationInfo?.ocppVersion) {
- case OCPPVersion.VERSION_16:
- chargingStationTransitions = OCPP16Constants.ChargePointStatusChargingStationTransitions
- connectorTransitions = OCPP16Constants.ChargePointStatusConnectorTransitions
- break
- case OCPPVersion.VERSION_20:
- case OCPPVersion.VERSION_201:
- chargingStationTransitions = OCPP20Constants.ChargingStationStatusTransitions
- connectorTransitions = OCPP20Constants.ConnectorStatusTransitions
- break
- default:
- throw new OCPPError(
- ErrorType.INTERNAL_ERROR,
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
- `Cannot check connector status transition: OCPP version ${chargingStation.stationInfo?.ocppVersion} not supported`,
- RequestCommand.STATUS_NOTIFICATION
- )
- }
- const transitions = connectorId === 0 ? chargingStationTransitions : connectorTransitions
- const transitionAllowed = transitions.some(
- transition => transition.from === fromStatus && transition.to === status
- )
- if (!transitionAllowed) {
- logger.warn(
- `${chargingStation.logPrefix()} OCPP ${
- chargingStation.stationInfo.ocppVersion
- } connector id ${connectorId.toString()} status transition from '${
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
- chargingStation.getConnectorStatus(connectorId)?.status
- }' to '${status}' is not allowed`
- )
- }
- return transitionAllowed
-}
-
/**
* Converts Ajv validation errors to the corresponding OCPP error type.
* @param errors - Array of Ajv validation error objects
export { buildTransactionEvent, OCPP20ServiceUtils } from './2.0/OCPP20ServiceUtils.js'
export { OCPP20VariableManager } from './2.0/OCPP20VariableManager.js'
export { OCPPAuthServiceFactory } from './auth/index.js'
+export {
+ restoreConnectorStatus,
+ sendAndSetConnectorStatus,
+} from './OCPPConnectorStatusOperations.js'
export { OCPPConstants } from './OCPPConstants.js'
export { OCPPIncomingRequestService } from './OCPPIncomingRequestService.js'
export { OCPPRequestService } from './OCPPRequestService.js'
stopRunningTransactions,
stopTransactionOnConnector,
} from './OCPPServiceOperations.js'
-export { buildMeterValue, sendAndSetConnectorStatus } from './OCPPServiceUtils.js'
+export { buildMeterValue } from './OCPPServiceUtils.js'
/**
- * @file Tests for OCPPServiceUtils connector status management
+ * @file Tests for OCPPConnectorStatusOperations
* @description Verifies sendAndSetConnectorStatus and restoreConnectorStatus functions
*
* Covers:
import {
restoreConnectorStatus,
sendAndSetConnectorStatus,
-} from '../../../src/charging-station/ocpp/OCPPServiceUtils.js'
+} from '../../../src/charging-station/ocpp/OCPPConnectorStatusOperations.js'
import {
ConnectorStatusEnum,
type OCPP16StatusNotificationRequest,
return { requestHandler, station }
}
-await describe('OCPPServiceUtils — connector status management', async () => {
+await describe('OCPPConnectorStatusOperations', async () => {
afterEach(() => {
standardCleanup()
})