const Configuration = require('../utils/Configuration');
const logger = require('../utils/Logger');
const WebSocket = require('ws');
-const {
- OCPP_JSON_CALL_MESSAGE,
- OCPP_JSON_CALL_RESULT_MESSAGE,
- OCPP_JSON_CALL_ERROR_MESSAGE,
- OCPP_ERROR_INTERNAL_ERROR,
- OCPP_SOCKET_TIMEOUT,
- OCPP_ERROR_NOT_IMPLEMENTED,
-} = require('../utils/Constants');
+const Constants = require('../utils/Constants');
const Utils = require('../utils/Utils');
const OCPPError = require('./OcppError');
const {v4: uuid} = require('uuid');
} else {
// At first start, send Bootnotification
try {
- this.sendMessage(uuid(), this._bootNotificationMessage, OCPP_JSON_CALL_MESSAGE, 'BootNotification');
+ this.sendMessage(uuid(), this._bootNotificationMessage, Constants.OCPP_JSON_CALL_MESSAGE, 'BootNotification');
} catch (error) {
logger.error(this._basicFormatLog() + ' Send boot notification error: ' + error);
}
// Check the Type of message
switch (messageType) {
// Incoming Message
- case OCPP_JSON_CALL_MESSAGE:
+ case Constants.OCPP_JSON_CALL_MESSAGE:
// Process the call
this._statistics.addMessage(commandName);
await this.handleRequest(messageId, commandName, commandPayload);
break;
// Outcome Message
- case OCPP_JSON_CALL_RESULT_MESSAGE:
+ case Constants.OCPP_JSON_CALL_RESULT_MESSAGE:
// Respond
// eslint-disable-next-line no-case-declarations
let responseCallback; let requestPayload;
responseCallback(commandName, requestPayload);
break;
// Error Message
- case OCPP_JSON_CALL_ERROR_MESSAGE:
+ case Constants.OCPP_JSON_CALL_ERROR_MESSAGE:
if (!this._requests[messageId]) {
// Error
throw new Error(`Error for unknown message id ${messageId}`);
}
}
- send(command, messageType = OCPP_JSON_CALL_MESSAGE) {
+ send(command, messageType = Constants.OCPP_JSON_CALL_MESSAGE) {
// Send Message
return this.sendMessage(uuid(), command, messageType);
}
sendError(messageId, err) {
// Check exception: only OCPP error are accepted
- const error = (err instanceof OCPPError ? err : new OCPPError(OCPP_ERROR_INTERNAL_ERROR, err.message));
+ const error = (err instanceof OCPPError ? err : new OCPPError(Constants.OCPP_ERROR_INTERNAL_ERROR, err.message));
// Send error
- return this.sendMessage(messageId, error, OCPP_JSON_CALL_ERROR_MESSAGE);
+ return this.sendMessage(messageId, error, Constants.OCPP_JSON_CALL_ERROR_MESSAGE);
}
- sendMessage(messageId, command, messageType = OCPP_JSON_CALL_RESULT_MESSAGE, commandName = '') {
+ sendMessage(messageId, command, messageType = Constants.OCPP_JSON_CALL_RESULT_MESSAGE, commandName = '') {
// Send a message through wsConnection
const self = this;
// Create a promise
// Type of message
switch (messageType) {
// Request
- case OCPP_JSON_CALL_MESSAGE:
+ case Constants.OCPP_JSON_CALL_MESSAGE:
this._statistics.addMessage(commandName);
// Build request
this._requests[messageId] = [responseCallback, rejectCallback, command];
messageToSend = JSON.stringify([messageType, messageId, commandName, command]);
break;
// Response
- case OCPP_JSON_CALL_RESULT_MESSAGE:
+ case Constants.OCPP_JSON_CALL_RESULT_MESSAGE:
// Build response
messageToSend = JSON.stringify([messageType, messageId, command]);
break;
// Error Message
- case OCPP_JSON_CALL_ERROR_MESSAGE:
+ case Constants.OCPP_JSON_CALL_ERROR_MESSAGE:
// Build Message
// eslint-disable-next-line no-case-declarations
const {
this._messageQueue.push(messageToSend);
}
// Request?
- if (messageType !== OCPP_JSON_CALL_MESSAGE) {
+ if (messageType !== Constants.OCPP_JSON_CALL_MESSAGE) {
// Yes: send Ok
resolve();
} else if (this._wsConnection.readyState === WebSocket.OPEN) {
// Send timeout in case connection is open otherwise wait for ever
// FIXME: Handle message on timeout
- setTimeout(() => rejectCallback(`Timeout for message ${messageId}`), OCPP_SOCKET_TIMEOUT);
+ setTimeout(() => rejectCallback(`Timeout for message ${messageId}`), Constants.OCPP_SOCKET_TIMEOUT);
}
// Function that will receive the request's response
errorCode,
status,
};
- await this.sendMessage(uuid(), payload, OCPP_JSON_CALL_MESSAGE, 'StatusNotification');
+ await this.sendMessage(uuid(), payload, Constants.OCPP_JSON_CALL_MESSAGE, 'StatusNotification');
} catch (error) {
logger.error(this._basicFormatLog() + ' Send status error: ' + error);
}
const payload = {
currentTime: new Date().toISOString(),
};
- self.sendMessage(uuid(), payload, OCPP_JSON_CALL_MESSAGE, 'Heartbeat');
+ self.sendMessage(uuid(), payload, Constants.OCPP_JSON_CALL_MESSAGE, 'Heartbeat');
} catch (error) {
logger.error(self._basicFormatLog() + ' Send heartbeat error: ' + error);
}
}
} else {
// Throw Exception
- await this.sendError(messageId, new OCPPError(OCPP_ERROR_NOT_IMPLEMENTED, 'Not implemented', {}));
+ await this.sendError(messageId, new OCPPError(Constants.OCPP_ERROR_NOT_IMPLEMENTED, 'Not implemented', {}));
throw new Error(`${commandName} is not implemented ${JSON.stringify(commandPayload, null, ' ')}`);
}
// Send Response
- await this.sendMessage(messageId, result, OCPP_JSON_CALL_RESULT_MESSAGE);
+ await this.sendMessage(messageId, result, Constants.OCPP_JSON_CALL_RESULT_MESSAGE);
}
async handleGetConfiguration() {
meterStart: 0,
timestamp: new Date().toISOString(),
};
- return await this.sendMessage(uuid(), payload, OCPP_JSON_CALL_MESSAGE, 'StartTransaction');
+ return await this.sendMessage(uuid(), payload, Constants.OCPP_JSON_CALL_MESSAGE, 'StartTransaction');
} catch (error) {
logger.error(this._basicFormatLog() + ' Send start transaction error: ' + error);
this._resetTransactionOnConnector(connectorID);
meterStop: 0,
timestamp: new Date().toISOString(),
};
- await this.sendMessage(uuid(), payload, OCPP_JSON_CALL_MESSAGE, 'StopTransaction');
+ await this.sendMessage(uuid(), payload, Constants.OCPP_JSON_CALL_MESSAGE, 'StopTransaction');
logger.info(this._basicFormatLog() + ' Transaction ' + this._connectors[connectorID].transactionId + ' STOPPED on ' + this._stationInfo.name + '#' + connectorID);
this.sendStatusNotification(connectorID, 'Available');
} catch (error) {
transactionId: self._connectors[connectorID].transactionId,
meterValue: [sampledValueLcl],
};
- await self.sendMessage(uuid(), payload, OCPP_JSON_CALL_MESSAGE, 'MeterValues');
+ await self.sendMessage(uuid(), payload, Constants.OCPP_JSON_CALL_MESSAGE, 'MeterValues');
} catch (error) {
logger.error(self._basicFormatLog() + ' Send meter values error: ' + error);
}
class Constants {
- REST_RESPONSE_SUCCESS = {status = 'Success'},
+ static REST_RESPONSE_SUCCESS = {status: 'Success'};
- CONN_STATUS_AVAILABLE = 'Available',
- CONN_STATUS_OCCUPIED = 'Occupied',
+ static CONN_STATUS_AVAILABLE = 'Available';
+ static CONN_STATUS_OCCUPIED = 'Occupied';
- STATS_GROUP_BY_CONSUMPTION = 'C',
- STATS_GROUP_BY_USAGE = 'U',
+ static STATS_GROUP_BY_CONSUMPTION = 'C';
+ static STATS_GROUP_BY_USAGE = 'U';
// Statuses
- ENTITY_SITE = 'Site',
- ENTITY_SITES = 'Sites',
- ENTITY_SITE_AREA = 'SiteArea',
- ENTITY_SITE_AREAS = 'SiteAreas',
- ENTITY_COMPANY = 'Company',
- ENTITY_COMPANIES = 'Companies',
- ENTITY_CHARGING_STATION = 'ChargingStation',
- ENTITY_CHARGING_STATIONS = 'ChargingStations',
- ENTITY_TENANT = 'Tenant',
- ENTITY_TENANTS = 'Tenants',
- ENTITY_TRANSACTION = 'Transaction',
- ENTITY_TRANSACTIONS = 'Transactions',
- ENTITY_TRANSACTION_METER_VALUES = 'MeterValues',
- ENTITY_TRANSACTION_STOP = 'Stop',
- ENTITY_USER = 'User',
- ENTITY_USERS = 'Users',
- ENTITY_VEHICLE_MANUFACTURER = 'VehicleManufacturer',
- ENTITY_VEHICLE_MANUFACTURERS = 'VehicleManufacturers',
- ENTITY_VEHICLES = 'Vehicles',
- ENTITY_VEHICLE = 'Vehicle',
- ENTITY_LOGGINGS = 'Loggings',
- ENTITY_LOGGING = 'Logging',
- ENTITY_PRICING = 'Pricing',
-
- NOTIF_TYPE_CHARGING_STATION_CONFIGURATION = 'Configuration',
-
- ACTION_READ = 'Read',
- ACTION_CREATE = 'Create',
- ACTION_UPDATE = 'Update',
- ACTION_DELETE = 'Delete',
-
- NO_LIMIT = 0,
-
- CENTRAL_SERVER = 'Central Server',
-
- WITH_CONNECTORS = true,
- WITHOUT_CONNECTORS = false,
-
- WITH_CHARGING_STATIONS = true,
- WITHOUT_CHARGING_STATIONS = false,
- WITH_SITE = true,
- WITHOUT_SITE = false,
-
- VEHICLE_TYPE_CAR = 'C',
+ static ENTITY_SITE = 'Site';
+ static ENTITY_SITES = 'Sites';
+ static ENTITY_SITE_AREA = 'SiteArea';
+ static ENTITY_SITE_AREAS = 'SiteAreas';
+ static ENTITY_COMPANY = 'Company';
+ static ENTITY_COMPANIES = 'Companies';
+ static ENTITY_CHARGING_STATION = 'ChargingStation';
+ static ENTITY_CHARGING_STATIONS = 'ChargingStations';
+ static ENTITY_TENANT = 'Tenant';
+ static ENTITY_TENANTS = 'Tenants';
+ static ENTITY_TRANSACTION = 'Transaction';
+ static ENTITY_TRANSACTIONS = 'Transactions';
+ static ENTITY_TRANSACTION_METER_VALUES = 'MeterValues';
+ static ENTITY_TRANSACTION_STOP = 'Stop';
+ static ENTITY_USER = 'User';
+ static ENTITY_USERS = 'Users';
+ static ENTITY_VEHICLE_MANUFACTURER = 'VehicleManufacturer';
+ static ENTITY_VEHICLE_MANUFACTURERS = 'VehicleManufacturers';
+ static ENTITY_VEHICLES = 'Vehicles';
+ static ENTITY_VEHICLE = 'Vehicle';
+ static ENTITY_LOGGINGS = 'Loggings';
+ static ENTITY_LOGGING = 'Logging';
+ static ENTITY_PRICING = 'Pricing';
+
+ static NOTIF_TYPE_CHARGING_STATION_CONFIGURATION = 'Configuration';
+
+ static ACTION_READ = 'Read';
+ static ACTION_CREATE = 'Create';
+ static ACTION_UPDATE = 'Update';
+ static ACTION_DELETE = 'Delete';
+
+ static NO_LIMIT = 0;
+
+ static CENTRAL_SERVER = 'Central Server';
+
+ static WITH_CONNECTORS = true;
+ static WITHOUT_CONNECTORS = false;
+
+ static WITH_CHARGING_STATIONS = true;
+ static WITHOUT_CHARGING_STATIONS = false;
+ static WITH_SITE = true;
+ static WITHOUT_SITE = false;
+
+ static VEHICLE_TYPE_CAR = 'C';
// Statuses
- USER_STATUS_PENDING = 'P',
- USER_STATUS_ACTIVE = 'A',
- USER_STATUS_DELETED = 'D',
- USER_STATUS_INACTIVE = 'I',
- USER_STATUS_BLOCKED = 'B',
- USER_STATUS_LOCKED = 'L',
+ static USER_STATUS_PENDING = 'P';
+ static USER_STATUS_ACTIVE = 'A';
+ static USER_STATUS_DELETED = 'D';
+ static USER_STATUS_INACTIVE = 'I';
+ static USER_STATUS_BLOCKED = 'B';
+ static USER_STATUS_LOCKED = 'L';
// Roles
- ROLE_SUPER_ADMIN = 'S',
- ROLE_ADMIN = 'A',
- ROLE_BASIC = 'B',
- ROLE_DEMO = 'D',
- ACTION_LOGOUT = 'Logout',
- ACTION_LIST = 'List',
- ACTION_RESET = 'Reset',
- ACTION_AUTHORIZE = 'Authorize',
- ACTION_CLEAR_CACHE = 'ClearCache',
- ACTION_STOP_TRANSACTION = 'StopTransaction',
- ACTION_START_TRANSACTION = 'StartTransaction',
- ACTION_REFUND_TRANSACTION = 'RefundTransaction',
- ACTION_UNLOCK_CONNECTOR = 'UnlockConnector',
- ACTION_GET_CONFIGURATION = 'GetConfiguration',
+ static ROLE_SUPER_ADMIN = 'S';
+ static ROLE_ADMIN = 'A';
+ static ROLE_BASIC = 'B';
+ static ROLE_DEMO = 'D';
+ static ACTION_LOGOUT = 'Logout';
+ static ACTION_LIST = 'List';
+ static ACTION_RESET = 'Reset';
+ static ACTION_AUTHORIZE = 'Authorize';
+ static ACTION_CLEAR_CACHE = 'ClearCache';
+ static ACTION_STOP_TRANSACTION = 'StopTransaction';
+ static ACTION_START_TRANSACTION = 'StartTransaction';
+ static ACTION_REFUND_TRANSACTION = 'RefundTransaction';
+ static ACTION_UNLOCK_CONNECTOR = 'UnlockConnector';
+ static ACTION_GET_CONFIGURATION = 'GetConfiguration';
// Password constants
- PWD_MIN_LENGTH = 15,
- PWD_MAX_LENGTH = 20,
- PWD_UPPERCASE_MIN_COUNT = 1,
- PWD_LOWERCASE_MIN_COUNT = 1,
- PWD_NUMBER_MIN_COUNT = 1,
- PWD_SPECIAL_MIN_COUNT = 1,
+ static PWD_MIN_LENGTH = 15;
+ static PWD_MAX_LENGTH = 20;
+ static PWD_UPPERCASE_MIN_COUNT = 1;
+ static PWD_LOWERCASE_MIN_COUNT = 1;
+ static PWD_NUMBER_MIN_COUNT = 1;
+ static PWD_SPECIAL_MIN_COUNT = 1;
- PWD_UPPERCASE_RE = /([A-Z])/g,
- PWD_LOWERCASE_RE = /([a-z])/g,
- PWD_NUMBER_RE = /([\d])/g,
- PWD_SPECIAL_CHAR_RE = /([!#$%^&*.?-])/g,
+ static PWD_UPPERCASE_RE = /([A-Z])/g;
+ static PWD_LOWERCASE_RE = /([a-z])/g;
+ static PWD_NUMBER_RE = /([\d])/g;
+ static PWD_SPECIAL_CHAR_RE = /([!#$%^&*.?-])/g;
- DEFAULT_LOCALE = 'en_US',
+ static DEFAULT_LOCALE = 'en_US';
- ANONYMIZED_VALUE = '####',
+ static ANONYMIZED_VALUE = '####';
- DEFAULT_DB_LIMIT = 100,
+ static DEFAULT_DB_LIMIT = 100;
- METER_VALUE_CTX_SAMPLE_PERIODIC = 'Sample.Periodic',
- METER_VALUE_CTX_SAMPLE_CLOCK = 'Sample.Clock',
+ static METER_VALUE_CTX_SAMPLE_PERIODIC = 'Sample.Periodic';
+ static METER_VALUE_CTX_SAMPLE_CLOCK = 'Sample.Clock';
- WS_UNSUPPORTED_DATA = 1007,
+ static WS_UNSUPPORTED_DATA = 1007;
- OCPP_SOCKET_TIMEOUT = 60000, // 60 sec
- OCPP_JSON_CALL_MESSAGE = 2, // Client-to-Server
- OCPP_JSON_CALL_RESULT_MESSAGE = 3, // Server-to-Client
- OCPP_JSON_CALL_ERROR_MESSAGE = 4, // Server-to-Client
+ static OCPP_SOCKET_TIMEOUT = 60000; // 60 sec
+ static OCPP_JSON_CALL_MESSAGE = 2; // Client-to-Server
+ static OCPP_JSON_CALL_RESULT_MESSAGE = 3; // Server-to-Client
+ static OCPP_JSON_CALL_ERROR_MESSAGE = 4; // Server-to-Client
// Requested Action is not known by receiver
- OCPP_ERROR_NOT_IMPLEMENTED = 'NotImplemented',
+ static OCPP_ERROR_NOT_IMPLEMENTED = 'NotImplemented';
// Requested Action is recognized but not supported by the receiver
- OCPP_ERROR_NOT_SUPPORTED = 'NotSupported',
+ static OCPP_ERROR_NOT_SUPPORTED = 'NotSupported';
// An internal error occurred and the receiver was not able to process the requested Action successfully
- OCPP_ERROR_INTERNAL_ERROR = 'InternalError',
+ static OCPP_ERROR_INTERNAL_ERROR = 'InternalError';
// Payload for Action is incomplete
- OCPP_ERROR_PROTOCOL_ERROR = 'ProtocolError',
+ static OCPP_ERROR_PROTOCOL_ERROR = 'ProtocolError';
// During the processing of Action a security issue occurred preventing receiver from completing the Action successfully
- OCPP_ERROR_SECURITY_ERROR = 'SecurityError',
+ static OCPP_ERROR_SECURITY_ERROR = 'SecurityError';
// Payload for Action is syntactically incorrect or not conform the PDU structure for Action
- OCPP_ERROR_FORMATION_VIOLATION = 'FormationViolation',
+ static OCPP_ERROR_FORMATION_VIOLATION = 'FormationViolation';
// Payload is syntactically correct but at least one field contains an invalid value
- OCPP_ERROR_PROPERTY_RAINT_VIOLATION = 'PropertyraintViolation',
+ static OCPP_ERROR_PROPERTY_RAINT_VIOLATION = 'PropertyraintViolation';
// Payload for Action is syntactically correct but at least one of the fields violates occurence raints
- OCPP_ERROR_OCCURENCE_RAINT_VIOLATION = 'OccurenceraintViolation',
+ static OCPP_ERROR_OCCURENCE_RAINT_VIOLATION = 'OccurenceraintViolation';
// Payload for Action is syntactically correct but at least one of the fields violates data type raints (e.g. “somestring” = 12)
- OCPP_ERROR_TYPERAINT_VIOLATION = 'TyperaintViolation',
+ static OCPP_ERROR_TYPERAINT_VIOLATION = 'TyperaintViolation';
// Any other error not covered by the previous ones
- OCPP_ERROR_GENERIC_ERROR = 'GenericError',
-
- OCPP_PROTOCOL_JSON = 'json',
- OCPP_PROTOCOL_SOAP = 'soap',
- OCPP_VERSION_12 = '1.2',
- OCPP_VERSION_15 = '1.5',
- OCPP_VERSION_16 = '1.6',
- OCPP_VERSION_20 = '2.0',
-};
+ static OCPP_ERROR_GENERIC_ERROR = 'GenericError';
+
+ static OCPP_PROTOCOL_JSON = 'json';
+ static OCPP_PROTOCOL_SOAP = 'soap';
+ static OCPP_VERSION_12 = '1.2';
+ static OCPP_VERSION_15 = '1.5';
+ static OCPP_VERSION_16 = '1.6';
+ static OCPP_VERSION_20 = '2.0';
+}
module.exports = Constants;