kirby-ocpp 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +192 -88
  3. package/THIRD_PARTY_NOTICES.md +6 -2
  4. package/bin/kirby-ocpp.js +77 -0
  5. package/package.json +23 -44
  6. package/dist/cli.d.ts +0 -2
  7. package/dist/cli.js +0 -72
  8. package/dist/config.d.ts +0 -2
  9. package/dist/config.js +0 -53
  10. package/dist/ocpp/client.d.ts +0 -59
  11. package/dist/ocpp/client.js +0 -299
  12. package/dist/ocpp/schema-validator.d.ts +0 -15
  13. package/dist/ocpp/schema-validator.js +0 -75
  14. package/dist/ocpp/schemas/json/Authorize.json +0 -16
  15. package/dist/ocpp/schemas/json/AuthorizeResponse.json +0 -40
  16. package/dist/ocpp/schemas/json/BootNotification.json +0 -49
  17. package/dist/ocpp/schemas/json/BootNotificationResponse.json +0 -30
  18. package/dist/ocpp/schemas/json/CancelReservation.json +0 -15
  19. package/dist/ocpp/schemas/json/CancelReservationResponse.json +0 -20
  20. package/dist/ocpp/schemas/json/ChangeAvailability.json +0 -24
  21. package/dist/ocpp/schemas/json/ChangeAvailabilityResponse.json +0 -21
  22. package/dist/ocpp/schemas/json/ChangeConfiguration.json +0 -21
  23. package/dist/ocpp/schemas/json/ChangeConfigurationResponse.json +0 -22
  24. package/dist/ocpp/schemas/json/ClearCache.json +0 -8
  25. package/dist/ocpp/schemas/json/ClearCacheResponse.json +0 -20
  26. package/dist/ocpp/schemas/json/ClearChargingProfile.json +0 -27
  27. package/dist/ocpp/schemas/json/ClearChargingProfileResponse.json +0 -20
  28. package/dist/ocpp/schemas/json/DataTransfer.json +0 -23
  29. package/dist/ocpp/schemas/json/DataTransferResponse.json +0 -25
  30. package/dist/ocpp/schemas/json/DiagnosticsStatusNotification.json +0 -22
  31. package/dist/ocpp/schemas/json/DiagnosticsStatusNotificationResponse.json +0 -8
  32. package/dist/ocpp/schemas/json/FirmwareStatusNotification.json +0 -25
  33. package/dist/ocpp/schemas/json/FirmwareStatusNotificationResponse.json +0 -8
  34. package/dist/ocpp/schemas/json/GetCompositeSchedule.json +0 -27
  35. package/dist/ocpp/schemas/json/GetCompositeScheduleResponse.json +0 -79
  36. package/dist/ocpp/schemas/json/GetConfiguration.json +0 -16
  37. package/dist/ocpp/schemas/json/GetConfigurationResponse.json +0 -40
  38. package/dist/ocpp/schemas/json/GetDiagnostics.json +0 -30
  39. package/dist/ocpp/schemas/json/GetDiagnosticsResponse.json +0 -13
  40. package/dist/ocpp/schemas/json/GetLocalListVersion.json +0 -8
  41. package/dist/ocpp/schemas/json/GetLocalListVersionResponse.json +0 -15
  42. package/dist/ocpp/schemas/json/Heartbeat.json +0 -8
  43. package/dist/ocpp/schemas/json/HeartbeatResponse.json +0 -16
  44. package/dist/ocpp/schemas/json/MeterValues.json +0 -151
  45. package/dist/ocpp/schemas/json/MeterValuesResponse.json +0 -8
  46. package/dist/ocpp/schemas/json/RemoteStartTransaction.json +0 -127
  47. package/dist/ocpp/schemas/json/RemoteStartTransactionResponse.json +0 -20
  48. package/dist/ocpp/schemas/json/RemoteStopTransaction.json +0 -15
  49. package/dist/ocpp/schemas/json/RemoteStopTransactionResponse.json +0 -20
  50. package/dist/ocpp/schemas/json/ReserveNow.json +0 -33
  51. package/dist/ocpp/schemas/json/ReserveNowResponse.json +0 -23
  52. package/dist/ocpp/schemas/json/Reset.json +0 -20
  53. package/dist/ocpp/schemas/json/ResetResponse.json +0 -20
  54. package/dist/ocpp/schemas/json/SendLocalList.json +0 -68
  55. package/dist/ocpp/schemas/json/SendLocalListResponse.json +0 -22
  56. package/dist/ocpp/schemas/json/SetChargingProfile.json +0 -124
  57. package/dist/ocpp/schemas/json/SetChargingProfileResponse.json +0 -21
  58. package/dist/ocpp/schemas/json/StartTransaction.json +0 -32
  59. package/dist/ocpp/schemas/json/StartTransactionResponse.json +0 -44
  60. package/dist/ocpp/schemas/json/StatusNotification.json +0 -70
  61. package/dist/ocpp/schemas/json/StatusNotificationResponse.json +0 -8
  62. package/dist/ocpp/schemas/json/StopTransaction.json +0 -177
  63. package/dist/ocpp/schemas/json/StopTransactionResponse.json +0 -37
  64. package/dist/ocpp/schemas/json/TriggerMessage.json +0 -27
  65. package/dist/ocpp/schemas/json/TriggerMessageResponse.json +0 -21
  66. package/dist/ocpp/schemas/json/UnlockConnector.json +0 -15
  67. package/dist/ocpp/schemas/json/UnlockConnectorResponse.json +0 -21
  68. package/dist/ocpp/schemas/json/UpdateFirmware.json +0 -27
  69. package/dist/ocpp/schemas/json/UpdateFirmwareResponse.json +0 -8
  70. package/dist/ocpp/types.d.ts +0 -106
  71. package/dist/ocpp/types.js +0 -1
  72. package/dist/station/authorization.d.ts +0 -20
  73. package/dist/station/authorization.js +0 -78
  74. package/dist/station/charging-profile-registry.d.ts +0 -18
  75. package/dist/station/charging-profile-registry.js +0 -125
  76. package/dist/station/configuration-commands.d.ts +0 -11
  77. package/dist/station/configuration-commands.js +0 -29
  78. package/dist/station/configuration-registry.d.ts +0 -13
  79. package/dist/station/configuration-registry.js +0 -39
  80. package/dist/station/configuration.d.ts +0 -7
  81. package/dist/station/configuration.js +0 -88
  82. package/dist/station/connector-registry.d.ts +0 -25
  83. package/dist/station/connector-registry.js +0 -89
  84. package/dist/station/connector-status.d.ts +0 -7
  85. package/dist/station/connector-status.js +0 -66
  86. package/dist/station/local-auth-list.d.ts +0 -8
  87. package/dist/station/local-auth-list.js +0 -31
  88. package/dist/station/maintenance-lifecycle.d.ts +0 -25
  89. package/dist/station/maintenance-lifecycle.js +0 -110
  90. package/dist/station/meter-value-scheduler.d.ts +0 -21
  91. package/dist/station/meter-value-scheduler.js +0 -78
  92. package/dist/station/metering.d.ts +0 -15
  93. package/dist/station/metering.js +0 -138
  94. package/dist/station/ocpp-message.d.ts +0 -2
  95. package/dist/station/ocpp-message.js +0 -9
  96. package/dist/station/offline-transaction-sync.d.ts +0 -29
  97. package/dist/station/offline-transaction-sync.js +0 -99
  98. package/dist/station/payload.d.ts +0 -4
  99. package/dist/station/payload.js +0 -12
  100. package/dist/station/persistence.d.ts +0 -28
  101. package/dist/station/persistence.js +0 -206
  102. package/dist/station/reservation-rules.d.ts +0 -3
  103. package/dist/station/reservation-rules.js +0 -18
  104. package/dist/station/reservation-scheduler.d.ts +0 -11
  105. package/dist/station/reservation-scheduler.js +0 -33
  106. package/dist/station/smart-charging.d.ts +0 -45
  107. package/dist/station/smart-charging.js +0 -251
  108. package/dist/station/status-scheduler.d.ts +0 -16
  109. package/dist/station/status-scheduler.js +0 -58
  110. package/dist/station/transaction-message-retry.d.ts +0 -3
  111. package/dist/station/transaction-message-retry.js +0 -7
  112. package/dist/station/transaction-rules.d.ts +0 -7
  113. package/dist/station/transaction-rules.js +0 -34
  114. package/dist/station/trigger-message.d.ts +0 -2
  115. package/dist/station/trigger-message.js +0 -11
  116. package/dist/station-store.d.ts +0 -41
  117. package/dist/station-store.js +0 -104
  118. package/dist/station.d.ts +0 -113
  119. package/dist/station.js +0 -1204
  120. package/dist/tui.d.ts +0 -96
  121. package/dist/tui.js +0 -1656
  122. package/docs/OCPP_1.6J_CONFORMANCE.md +0 -61
@@ -1,34 +0,0 @@
1
- export function startTransactionRejection(connector, idTag) {
2
- if (connector.transactionId) {
3
- return `Connector ${connector.id} already has transaction ${connector.transactionId}`;
4
- }
5
- if (connector.availability === "Inoperative" || connector.status === "Unavailable") {
6
- return `Connector ${connector.id} is unavailable`;
7
- }
8
- if (connector.status === "Faulted") {
9
- return `Connector ${connector.id} is faulted`;
10
- }
11
- if (connector.status === "Finishing") {
12
- return `Connector ${connector.id} is finishing; unplug before starting a new transaction`;
13
- }
14
- if (connector.reservationId && connector.reservationIdTag !== idTag) {
15
- return `Connector ${connector.id} is reserved for another idTag`;
16
- }
17
- return undefined;
18
- }
19
- export function canRemoteStart(connector) {
20
- return Boolean(connector) &&
21
- !connector?.transactionId &&
22
- connector?.availability === "Operative" &&
23
- connector.status !== "Unavailable" &&
24
- connector.status !== "Faulted" &&
25
- connector.status !== "Reserved";
26
- }
27
- export function statusAfterStopTransaction(reason, evConnected, availability) {
28
- const stillConnected = reason !== "EVDisconnected" && evConnected;
29
- const availableStatus = availability === "Inoperative" ? "Unavailable" : "Available";
30
- return {
31
- evConnected: stillConnected,
32
- status: stillConnected ? "Finishing" : availableStatus
33
- };
34
- }
@@ -1,2 +0,0 @@
1
- export declare const TRIGGERABLE_MESSAGES: string[];
2
- export declare function canTriggerMessage(requestedMessage: string): boolean;
@@ -1,11 +0,0 @@
1
- export const TRIGGERABLE_MESSAGES = [
2
- "BootNotification",
3
- "DiagnosticsStatusNotification",
4
- "FirmwareStatusNotification",
5
- "Heartbeat",
6
- "MeterValues",
7
- "StatusNotification"
8
- ];
9
- export function canTriggerMessage(requestedMessage) {
10
- return TRIGGERABLE_MESSAGES.includes(requestedMessage);
11
- }
@@ -1,41 +0,0 @@
1
- export interface PersistedStationState {
2
- version: 1;
3
- chargePointId: string;
4
- connectorCount?: number;
5
- connectorMeterValues?: Record<string, number>;
6
- connectorReservations?: Record<string, PersistedReservation>;
7
- connectorTransactions?: Record<string, PersistedConnectorTransaction>;
8
- localListVersion: number;
9
- localAuthorizationList: LocalAuthorizationEntry[];
10
- authorizationCache?: LocalAuthorizationEntry[];
11
- chargingProfiles: unknown[];
12
- configurationValues: Record<string, string>;
13
- meterWh: number;
14
- }
15
- export interface LocalAuthorizationEntry {
16
- idTag: string;
17
- idTagInfo?: Record<string, unknown>;
18
- }
19
- export interface PersistedReservation {
20
- reservationId: number;
21
- idTag: string;
22
- parentIdTag?: string;
23
- expiryDate: string;
24
- }
25
- export interface PersistedConnectorTransaction {
26
- transactionId: number;
27
- transactionStartedAt?: string;
28
- lastIdTag?: string;
29
- evConnected: boolean;
30
- status: string;
31
- stopTransactionAtWh?: number;
32
- pendingStartTransaction?: Record<string, unknown>;
33
- pendingStopTransaction?: Record<string, unknown>;
34
- }
35
- export declare class StationStore {
36
- private readonly chargePointId;
37
- private readonly filePath;
38
- constructor(chargePointId: string, stateDirectory?: string);
39
- load(): PersistedStationState | undefined;
40
- save(state: PersistedStationState): void;
41
- }
@@ -1,104 +0,0 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
- import { homedir } from "node:os";
3
- import { dirname, join } from "node:path";
4
- export class StationStore {
5
- chargePointId;
6
- filePath;
7
- constructor(chargePointId, stateDirectory = process.env.KIRBY_OCPP_STATE_DIR ?? join(homedir(), ".kirby-ocpp", "stations")) {
8
- this.chargePointId = chargePointId;
9
- this.filePath = join(stateDirectory, `${safeFileName(chargePointId)}.json`);
10
- }
11
- load() {
12
- if (!existsSync(this.filePath)) {
13
- return undefined;
14
- }
15
- const parsed = JSON.parse(readFileSync(this.filePath, "utf8"));
16
- if (parsed.version !== 1 || parsed.chargePointId !== this.chargePointId) {
17
- return undefined;
18
- }
19
- return {
20
- version: 1,
21
- chargePointId: this.chargePointId,
22
- connectorCount: readInteger(parsed.connectorCount, 1),
23
- connectorMeterValues: isRecord(parsed.connectorMeterValues) ? readNumberRecord(parsed.connectorMeterValues) : {},
24
- connectorReservations: isRecord(parsed.connectorReservations) ? readReservationRecord(parsed.connectorReservations) : {},
25
- connectorTransactions: isRecord(parsed.connectorTransactions) ? readTransactionRecord(parsed.connectorTransactions) : {},
26
- localListVersion: readInteger(parsed.localListVersion, 0),
27
- localAuthorizationList: Array.isArray(parsed.localAuthorizationList) ? parsed.localAuthorizationList : [],
28
- authorizationCache: Array.isArray(parsed.authorizationCache) ? parsed.authorizationCache : [],
29
- chargingProfiles: Array.isArray(parsed.chargingProfiles) ? parsed.chargingProfiles : [],
30
- configurationValues: isRecord(parsed.configurationValues) ? readStringRecord(parsed.configurationValues) : {},
31
- meterWh: readNumber(parsed.meterWh, 0)
32
- };
33
- }
34
- save(state) {
35
- mkdirSync(dirname(this.filePath), { recursive: true });
36
- writeFileSync(this.filePath, `${JSON.stringify(state, null, 2)}\n`, "utf8");
37
- }
38
- }
39
- function safeFileName(value) {
40
- return Buffer.from(value).toString("base64url");
41
- }
42
- function readInteger(value, fallback) {
43
- return typeof value === "number" && Number.isInteger(value) ? value : fallback;
44
- }
45
- function readNumber(value, fallback) {
46
- return typeof value === "number" && Number.isFinite(value) ? value : fallback;
47
- }
48
- function readStringRecord(value) {
49
- return Object.fromEntries(Object.entries(value).filter((entry) => typeof entry[1] === "string"));
50
- }
51
- function readNumberRecord(value) {
52
- return Object.fromEntries(Object.entries(value).filter((entry) => typeof entry[1] === "number"));
53
- }
54
- function readReservationRecord(value) {
55
- const entries = Object.entries(value).flatMap(([connectorId, reservation]) => {
56
- if (!isRecord(reservation)) {
57
- return [];
58
- }
59
- const reservationId = reservation.reservationId;
60
- const idTag = reservation.idTag;
61
- const expiryDate = reservation.expiryDate;
62
- if (typeof reservationId !== "number" || typeof idTag !== "string" || typeof expiryDate !== "string") {
63
- return [];
64
- }
65
- const parsed = { reservationId, idTag, expiryDate };
66
- if (typeof reservation.parentIdTag === "string") {
67
- parsed.parentIdTag = reservation.parentIdTag;
68
- }
69
- return [[connectorId, parsed]];
70
- });
71
- return Object.fromEntries(entries);
72
- }
73
- function readTransactionRecord(value) {
74
- const entries = Object.entries(value).flatMap(([connectorId, transaction]) => {
75
- if (!isRecord(transaction) || typeof transaction.transactionId !== "number") {
76
- return [];
77
- }
78
- const parsed = {
79
- transactionId: transaction.transactionId,
80
- evConnected: transaction.evConnected === true,
81
- status: typeof transaction.status === "string" ? transaction.status : "Charging"
82
- };
83
- if (typeof transaction.transactionStartedAt === "string") {
84
- parsed.transactionStartedAt = transaction.transactionStartedAt;
85
- }
86
- if (typeof transaction.lastIdTag === "string") {
87
- parsed.lastIdTag = transaction.lastIdTag;
88
- }
89
- if (typeof transaction.stopTransactionAtWh === "number") {
90
- parsed.stopTransactionAtWh = transaction.stopTransactionAtWh;
91
- }
92
- if (isRecord(transaction.pendingStartTransaction)) {
93
- parsed.pendingStartTransaction = transaction.pendingStartTransaction;
94
- }
95
- if (isRecord(transaction.pendingStopTransaction)) {
96
- parsed.pendingStopTransaction = transaction.pendingStopTransaction;
97
- }
98
- return [[connectorId, parsed]];
99
- });
100
- return Object.fromEntries(entries);
101
- }
102
- function isRecord(value) {
103
- return Boolean(value) && typeof value === "object" && !Array.isArray(value);
104
- }
package/dist/station.d.ts DELETED
@@ -1,113 +0,0 @@
1
- import EventEmitter from "node:events";
2
- import { OcppClient } from "./ocpp/client.js";
3
- import { type AuthorizationDecision } from "./station/authorization.js";
4
- import { type DiagnosticsOutcome, type FirmwareOutcome } from "./station/maintenance-lifecycle.js";
5
- import type { ChargePointErrorCode, ConnectorStatus, DiagnosticsStatus, FirmwareStatus, LogEntry, StationConfig, StationState, StopReason } from "./ocpp/types.js";
6
- interface StationEvents {
7
- state: [state: StationState];
8
- log: [entry: LogEntry];
9
- }
10
- export declare interface Station {
11
- on<K extends keyof StationEvents>(event: K, listener: (...args: StationEvents[K]) => void): this;
12
- emit<K extends keyof StationEvents>(event: K, ...args: StationEvents[K]): boolean;
13
- }
14
- export declare class Station extends EventEmitter {
15
- readonly config: StationConfig;
16
- readonly client: OcppClient;
17
- readonly state: StationState;
18
- private heartbeatTimer?;
19
- private resetTimer?;
20
- private bootRetryTimer?;
21
- private reconnectTimer?;
22
- private reconnectAttempts;
23
- private manuallyDisconnected;
24
- private readonly store?;
25
- private readonly configuration;
26
- private readonly localAuthorizationList;
27
- private readonly authorizationCache;
28
- private readonly connectors;
29
- private readonly statusScheduler;
30
- private readonly meterValueScheduler;
31
- private readonly reservationScheduler;
32
- private readonly maintenance;
33
- private readonly chargingProfiles;
34
- private readonly offlineTransactions;
35
- constructor(config: StationConfig);
36
- connect(): void;
37
- disconnect(): void;
38
- reconnect(): void;
39
- boot(options?: {
40
- scheduleRetry?: boolean;
41
- }): Promise<void>;
42
- heartbeat(): Promise<void>;
43
- statusNotification(connectorId?: number, status?: ConnectorStatus, force?: boolean): Promise<void>;
44
- private sendStatusNotification;
45
- authorize(idTag?: string): Promise<AuthorizationDecision>;
46
- toggleTransaction(connectorId?: number, idTag?: string): Promise<void>;
47
- startTransaction(connectorId?: number, idTag?: string): Promise<number | undefined>;
48
- stopTransaction(connectorId?: number, reason?: StopReason, idTag?: string): Promise<void>;
49
- plugIn(connectorId?: number): Promise<void>;
50
- unplug(connectorId?: number): Promise<void>;
51
- setFault(connectorId?: number, errorCode?: ChargePointErrorCode, info?: string, vendorErrorCode?: string): Promise<void>;
52
- clearFault(connectorId?: number): Promise<void>;
53
- meterValues(connectorId?: number, deltaWh?: number, sampledData?: string): Promise<void>;
54
- dataTransfer(payload?: Record<string, unknown>): Promise<void>;
55
- firmwareStatusNotification(status?: FirmwareStatus): Promise<void>;
56
- diagnosticsStatusNotification(status?: DiagnosticsStatus): Promise<void>;
57
- setDiagnosticsOutcome(outcome: DiagnosticsOutcome): void;
58
- setFirmwareOutcome(outcome: FirmwareOutcome): void;
59
- cycleStatus(connectorId?: number): Promise<void>;
60
- setStatus(connectorId: number | undefined, status: ConnectorStatus): Promise<void>;
61
- addConnector(): number;
62
- private bindClientEvents;
63
- private handleCentralSystemCall;
64
- private handleCancelReservation;
65
- private handleChangeAvailability;
66
- private handleChangeConfiguration;
67
- private handleDataTransfer;
68
- private handleGetConfiguration;
69
- private handleSetChargingProfile;
70
- private handleClearChargingProfile;
71
- private handleGetCompositeSchedule;
72
- private handleSendLocalList;
73
- private handleRemoteStartTransaction;
74
- private handleRemoteStopTransaction;
75
- private handleReserveNow;
76
- private handleReset;
77
- private handleTriggerMessage;
78
- private handleUnlockConnector;
79
- private triggerMessage;
80
- private canTriggerMessageForPayload;
81
- private triggerConnectorId;
82
- private canAcceptRemoteStartChargingProfile;
83
- private applyRemoteStartChargingProfile;
84
- private send;
85
- private sendTransactionMessage;
86
- private sendMeterValues;
87
- private buildStopTransactionData;
88
- private authorizeLocally;
89
- private rememberAuthorization;
90
- private readIdTagInfo;
91
- private stopTransactionsForInvalidIdTag;
92
- private stopTransactionIfInvalidEnergyLimitReached;
93
- private refreshConnectorSnapshot;
94
- private clearReservation;
95
- private sendClockAlignedMeterValues;
96
- private expireReservation;
97
- private loadPersistedState;
98
- private savePersistedState;
99
- private startHeartbeatTimer;
100
- private stopHeartbeatTimer;
101
- private performReset;
102
- private bootAfterReset;
103
- private clearResetTimer;
104
- private scheduleBootRetry;
105
- private clearBootRetryTimer;
106
- private scheduleReconnect;
107
- private reconnectDelayMs;
108
- private clearReconnectTimer;
109
- private patchState;
110
- private log;
111
- private runSafely;
112
- }
113
- export {};