@enyo-energy/sunspec-sdk 0.0.1

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.
@@ -0,0 +1,240 @@
1
+ /**
2
+ * SunSpec block interfaces with block numbers
3
+ */
4
+ /**
5
+ * Base interface for all SunSpec blocks
6
+ */
7
+ export interface SunspecBlock {
8
+ blockNumber: number;
9
+ blockAddress?: number;
10
+ blockLength?: number;
11
+ }
12
+ /**
13
+ * Common Sunspec Model IDs
14
+ */
15
+ export declare enum SunspecModelId {
16
+ Common = 1,
17
+ Inverter3Phase = 103,
18
+ InverterSinglePhase = 101,
19
+ MPPT = 160,
20
+ Battery = 124,
21
+ BatteryBase = 802,
22
+ BatteryControl = 803,
23
+ MeterSinglePhase = 201,
24
+ Meter3Phase = 203,
25
+ MeterWye = 204,
26
+ Nameplate = 120,
27
+ Settings = 121,
28
+ Status = 122,
29
+ Controls = 123,
30
+ EndMarker = 65535
31
+ }
32
+ /**
33
+ * Model information discovered during scanning
34
+ */
35
+ export interface SunspecModel {
36
+ id: number;
37
+ address: number;
38
+ length: number;
39
+ }
40
+ /**
41
+ * Data types for Sunspec registers
42
+ */
43
+ export type RegisterValue = number | string | bigint;
44
+ /**
45
+ * Scale factor cache
46
+ */
47
+ export interface ScaleFactors {
48
+ [key: string]: number;
49
+ }
50
+ /**
51
+ * Common block (Model 1) data structure
52
+ */
53
+ export interface SunspecCommonBlock extends SunspecBlock {
54
+ blockNumber: 1;
55
+ manufacturer?: string;
56
+ model?: string;
57
+ options?: string;
58
+ version?: string;
59
+ serialNumber?: string;
60
+ deviceAddress?: number;
61
+ }
62
+ /**
63
+ * Inverter data structure based on Model 103
64
+ */
65
+ export interface SunspecInverterData extends SunspecBlock {
66
+ blockNumber: 103 | 101;
67
+ acCurrent?: number;
68
+ phaseACurrent?: number;
69
+ phaseBCurrent?: number;
70
+ phaseCCurrent?: number;
71
+ voltageAB?: number;
72
+ voltageBC?: number;
73
+ voltageCA?: number;
74
+ voltageAN?: number;
75
+ voltageBN?: number;
76
+ voltageCN?: number;
77
+ acPower?: number;
78
+ frequency?: number;
79
+ apparentPower?: number;
80
+ reactivePower?: number;
81
+ powerFactor?: number;
82
+ acEnergy?: bigint;
83
+ dcCurrent?: number;
84
+ dcVoltage?: number;
85
+ dcPower?: number;
86
+ cabinetTemperature?: number;
87
+ heatSinkTemperature?: number;
88
+ transformerTemperature?: number;
89
+ otherTemperature?: number;
90
+ operatingState?: number;
91
+ vendorState?: number;
92
+ events?: number;
93
+ events2?: number;
94
+ vendorEvents1?: number;
95
+ vendorEvents2?: number;
96
+ vendorEvents3?: number;
97
+ vendorEvents4?: number;
98
+ }
99
+ /**
100
+ * MPPT data structure based on Model 160
101
+ */
102
+ export interface SunspecMPPTData extends SunspecBlock {
103
+ blockNumber: 160;
104
+ id: number;
105
+ stringId?: string;
106
+ dcCurrent?: number;
107
+ dcCurrentSF?: number;
108
+ dcVoltage?: number;
109
+ dcVoltageSF?: number;
110
+ dcPower?: number;
111
+ dcPowerSF?: number;
112
+ dcEnergy?: bigint;
113
+ dcEnergySF?: number;
114
+ timestamp?: number;
115
+ temperature?: number;
116
+ temperatureSF?: number;
117
+ operatingState?: number;
118
+ vendorState?: number;
119
+ events?: number;
120
+ }
121
+ /**
122
+ * Battery data structure
123
+ */
124
+ export interface SunspecBatteryData extends SunspecBlock {
125
+ blockNumber: 124 | 802 | 803;
126
+ soc?: number;
127
+ soh?: number;
128
+ chargePower?: number;
129
+ dischargePower?: number;
130
+ voltage?: number;
131
+ current?: number;
132
+ temperature?: number;
133
+ status?: number;
134
+ }
135
+ /**
136
+ * Meter data structure
137
+ */
138
+ export interface SunspecMeterData extends SunspecBlock {
139
+ blockNumber: 201 | 203 | 204;
140
+ totalPower?: number;
141
+ phaseAPower?: number;
142
+ phaseBPower?: number;
143
+ phaseCPower?: number;
144
+ totalEnergy?: bigint;
145
+ exportedEnergy?: bigint;
146
+ importedEnergy?: bigint;
147
+ voltage?: number;
148
+ current?: number;
149
+ frequency?: number;
150
+ }
151
+ /**
152
+ * Block 121 - Inverter Basic Settings
153
+ * Reference: SunSpec Model 121
154
+ */
155
+ export interface SunspecInverterSettings extends SunspecBlock {
156
+ blockNumber: 121;
157
+ WMax?: number;
158
+ WMax_SF?: number;
159
+ VRef?: number;
160
+ VRef_SF?: number;
161
+ VRefOfs?: number;
162
+ VRefOfs_SF?: number;
163
+ VMax?: number;
164
+ VMin?: number;
165
+ VMinMax_SF?: number;
166
+ VAMax?: number;
167
+ VAMax_SF?: number;
168
+ VArMaxQ1?: number;
169
+ VArMaxQ2?: number;
170
+ VArMaxQ3?: number;
171
+ VArMaxQ4?: number;
172
+ VArMax_SF?: number;
173
+ WGra?: number;
174
+ WGra_SF?: number;
175
+ PFMinQ1?: number;
176
+ PFMinQ2?: number;
177
+ PFMinQ3?: number;
178
+ PFMinQ4?: number;
179
+ PFMin_SF?: number;
180
+ VArAct?: number;
181
+ ClcTotVA?: number;
182
+ MaxRmpRte?: number;
183
+ MaxRmpRte_SF?: number;
184
+ ECPNomHz?: number;
185
+ ECPNomHz_SF?: number;
186
+ ConnPh?: number;
187
+ }
188
+ /**
189
+ * Block 123 - Immediate Inverter Controls
190
+ * Reference: SunSpec Model 123
191
+ */
192
+ export interface SunspecInverterControls extends SunspecBlock {
193
+ blockNumber: 123;
194
+ Conn_WinTms?: number;
195
+ Conn_RvrtTms?: number;
196
+ Conn?: number;
197
+ WMaxLimPct?: number;
198
+ WMaxLimPct_SF?: number;
199
+ WMaxLimPct_WinTms?: number;
200
+ WMaxLimPct_RvrtTms?: number;
201
+ WMaxLimPct_RmpTms?: number;
202
+ WMaxLim_Ena?: number;
203
+ OutPFSet?: number;
204
+ OutPFSet_SF?: number;
205
+ OutPFSet_WinTms?: number;
206
+ OutPFSet_RvrtTms?: number;
207
+ OutPFSet_RmpTms?: number;
208
+ OutPFSet_Ena?: number;
209
+ VArWMaxPct?: number;
210
+ VArMaxPct?: number;
211
+ VArAvalPct?: number;
212
+ VArPct_SF?: number;
213
+ VArPct_WinTms?: number;
214
+ VArPct_RvrtTms?: number;
215
+ VArPct_RmpTms?: number;
216
+ VArPct_Mod?: number;
217
+ VArPct_Ena?: number;
218
+ }
219
+ /**
220
+ * Enum values for connection control
221
+ */
222
+ export declare enum SunspecConnectionControl {
223
+ DISCONNECT = 0,
224
+ CONNECT = 1
225
+ }
226
+ /**
227
+ * Enum values for enable/disable controls
228
+ */
229
+ export declare enum SunspecEnableControl {
230
+ DISABLED = 0,
231
+ ENABLED = 1
232
+ }
233
+ /**
234
+ * Enum values for VAR percent mode
235
+ */
236
+ export declare enum SunspecVArPctMode {
237
+ NONE = 0,
238
+ WMAX = 1,
239
+ VARMAX = 2
240
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * SunSpec block interfaces with block numbers
3
+ */
4
+ /**
5
+ * Common Sunspec Model IDs
6
+ */
7
+ export var SunspecModelId;
8
+ (function (SunspecModelId) {
9
+ SunspecModelId[SunspecModelId["Common"] = 1] = "Common";
10
+ SunspecModelId[SunspecModelId["Inverter3Phase"] = 103] = "Inverter3Phase";
11
+ SunspecModelId[SunspecModelId["InverterSinglePhase"] = 101] = "InverterSinglePhase";
12
+ SunspecModelId[SunspecModelId["MPPT"] = 160] = "MPPT";
13
+ SunspecModelId[SunspecModelId["Battery"] = 124] = "Battery";
14
+ SunspecModelId[SunspecModelId["BatteryBase"] = 802] = "BatteryBase";
15
+ SunspecModelId[SunspecModelId["BatteryControl"] = 803] = "BatteryControl";
16
+ SunspecModelId[SunspecModelId["MeterSinglePhase"] = 201] = "MeterSinglePhase";
17
+ SunspecModelId[SunspecModelId["Meter3Phase"] = 203] = "Meter3Phase";
18
+ SunspecModelId[SunspecModelId["MeterWye"] = 204] = "MeterWye";
19
+ SunspecModelId[SunspecModelId["Nameplate"] = 120] = "Nameplate";
20
+ SunspecModelId[SunspecModelId["Settings"] = 121] = "Settings";
21
+ SunspecModelId[SunspecModelId["Status"] = 122] = "Status";
22
+ SunspecModelId[SunspecModelId["Controls"] = 123] = "Controls";
23
+ SunspecModelId[SunspecModelId["EndMarker"] = 65535] = "EndMarker";
24
+ })(SunspecModelId || (SunspecModelId = {}));
25
+ /**
26
+ * Enum values for connection control
27
+ */
28
+ export var SunspecConnectionControl;
29
+ (function (SunspecConnectionControl) {
30
+ SunspecConnectionControl[SunspecConnectionControl["DISCONNECT"] = 0] = "DISCONNECT";
31
+ SunspecConnectionControl[SunspecConnectionControl["CONNECT"] = 1] = "CONNECT";
32
+ })(SunspecConnectionControl || (SunspecConnectionControl = {}));
33
+ /**
34
+ * Enum values for enable/disable controls
35
+ */
36
+ export var SunspecEnableControl;
37
+ (function (SunspecEnableControl) {
38
+ SunspecEnableControl[SunspecEnableControl["DISABLED"] = 0] = "DISABLED";
39
+ SunspecEnableControl[SunspecEnableControl["ENABLED"] = 1] = "ENABLED";
40
+ })(SunspecEnableControl || (SunspecEnableControl = {}));
41
+ /**
42
+ * Enum values for VAR percent mode
43
+ */
44
+ export var SunspecVArPctMode;
45
+ (function (SunspecVArPctMode) {
46
+ SunspecVArPctMode[SunspecVArPctMode["NONE"] = 0] = "NONE";
47
+ SunspecVArPctMode[SunspecVArPctMode["WMAX"] = 1] = "WMAX";
48
+ SunspecVArPctMode[SunspecVArPctMode["VARMAX"] = 2] = "VARMAX";
49
+ })(SunspecVArPctMode || (SunspecVArPctMode = {}));
@@ -0,0 +1,111 @@
1
+ import { type SunspecInverterControls, type SunspecInverterData, type SunspecInverterSettings, type SunspecMeterData, type SunspecModel, type SunspecMPPTData } from "./sunspec-interfaces.js";
2
+ import { IConnectionHealth } from "@enyo-energy/energy-app-sdk/dist/implementations/modbus/interfaces.js";
3
+ import { EnergyApp } from "@enyo-energy/energy-app-sdk";
4
+ export declare class SunspecModbusClient {
5
+ private energyApp;
6
+ private modbusClient;
7
+ private discoveredModels;
8
+ private scaleFactors;
9
+ private connected;
10
+ private baseAddress;
11
+ private connectionHealth;
12
+ private faultTolerantReader;
13
+ constructor(energyApp: EnergyApp);
14
+ /**
15
+ * Connect to Modbus device
16
+ */
17
+ connect(host: string, port?: number, unitId?: number): Promise<void>;
18
+ /**
19
+ * Disconnect from Modbus device
20
+ */
21
+ disconnect(): Promise<void>;
22
+ /**
23
+ * Discover all available Sunspec models
24
+ * Scans through the address space starting at 40001
25
+ */
26
+ discoverModels(): Promise<Map<number, SunspecModel>>;
27
+ /**
28
+ * Find a specific model by ID
29
+ */
30
+ findModel(modelId: number): SunspecModel | undefined;
31
+ /**
32
+ * Read a register value and apply scale factor
33
+ */
34
+ readRegisterWithScaleFactor(valueAddress: number, scaleFactorAddress?: number, quantity?: number): Promise<number>;
35
+ /**
36
+ * Convert unsigned 16-bit value to signed
37
+ */
38
+ private convertToSigned16;
39
+ /**
40
+ * Helper to clean string values by removing null characters
41
+ */
42
+ private cleanString;
43
+ /**
44
+ * Helper to read register value(s) using the fault-tolerant reader with data type conversion
45
+ */
46
+ private readRegisterValue;
47
+ /**
48
+ * Read inverter data from Model 103 (Three Phase)
49
+ */
50
+ readInverterData(): Promise<SunspecInverterData | null>;
51
+ /**
52
+ * Read single phase inverter data (Model 101)
53
+ */
54
+ private readSinglePhaseInverterData;
55
+ /**
56
+ * Read inverter scale factors
57
+ */
58
+ private readInverterScaleFactors;
59
+ /**
60
+ * Apply scale factor to a value
61
+ */
62
+ private applyScaleFactor;
63
+ /**
64
+ * Read MPPT data from Model 160
65
+ */
66
+ readMPPTData(moduleId?: number): Promise<SunspecMPPTData | null>;
67
+ /**
68
+ * Read all available MPPT strings
69
+ */
70
+ readAllMPPTData(): Promise<SunspecMPPTData[]>;
71
+ /**
72
+ * Read meter data (Model 203 for 3-phase)
73
+ */
74
+ readMeterData(): Promise<SunspecMeterData | null>;
75
+ /**
76
+ * Read common block data (Model 1)
77
+ */
78
+ readCommonBlock(): Promise<any>;
79
+ /**
80
+ * Get serial number from device
81
+ */
82
+ getSerialNumber(): Promise<string | undefined>;
83
+ /**
84
+ * Check if connected
85
+ */
86
+ isConnected(): boolean;
87
+ /**
88
+ * Check if connection is healthy
89
+ */
90
+ isHealthy(): boolean;
91
+ /**
92
+ * Get connection health details
93
+ */
94
+ getConnectionHealth(): IConnectionHealth;
95
+ /**
96
+ * Read Block 121 - Inverter Basic Settings
97
+ */
98
+ readInverterSettings(): Promise<SunspecInverterSettings | null>;
99
+ /**
100
+ * Read Block 123 - Immediate Inverter Controls
101
+ */
102
+ readInverterControls(): Promise<SunspecInverterControls | null>;
103
+ /**
104
+ * Write Block 121 - Inverter Basic Settings
105
+ */
106
+ writeInverterSettings(settings: Partial<SunspecInverterSettings>): Promise<boolean>;
107
+ /**
108
+ * Write Block 123 - Immediate Inverter Controls
109
+ */
110
+ writeInverterControls(controls: Partial<SunspecInverterControls>): Promise<boolean>;
111
+ }