@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.
- package/README.md +1 -0
- package/dist/cjs/sunspec-devices.cjs +334 -0
- package/dist/cjs/sunspec-devices.d.cts +87 -0
- package/dist/cjs/sunspec-interfaces.cjs +52 -0
- package/dist/cjs/sunspec-interfaces.d.cts +240 -0
- package/dist/cjs/sunspec-modbus-client.cjs +715 -0
- package/dist/cjs/sunspec-modbus-client.d.cts +111 -0
- package/dist/cjs/version.cjs +19 -0
- package/dist/cjs/version.d.cts +13 -0
- package/dist/sunspec-devices.d.ts +87 -0
- package/dist/sunspec-devices.js +327 -0
- package/dist/sunspec-interfaces.d.ts +240 -0
- package/dist/sunspec-interfaces.js +49 -0
- package/dist/sunspec-modbus-client.d.ts +111 -0
- package/dist/sunspec-modbus-client.js +711 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.js +15 -0
- package/package.json +45 -0
|
@@ -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
|
+
}
|