Skip to content

Commit

Permalink
Updated docs
Browse files Browse the repository at this point in the history
  • Loading branch information
longzheng committed Nov 18, 2024
1 parent 09ebdc0 commit db3f006
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 6 deletions.
9 changes: 9 additions & 0 deletions docs/configuration/inverter-control.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,25 @@
To help test and validate integrations, the project can be configured whether to send control commands to the inverters using the `config.json` option `inverterControl.enabled` can be used to enable or disable inverter control.

```js
{
"inverterControl": {
"enabled": true // (true/false) optional: whether the inverters should be controlled based on limits, turn off to simulate
},
...
}
```

## Data sampling

The inverter control loop will attempt to aggregate and average a window of measurements to reduce the impact of noise and fluctuations. The `config.json` option `inverterControl.sampleSize` can be used to adjust the number of samples to average.

```js
{
"inverterControl": {
"sampleSeconds": 5 // (number) optional: the number of seconds to sample for averaging
},
...
}
```

## Frequency
Expand All @@ -25,7 +31,10 @@ The inverter control loop will attempt to control the inverter with a rate limit
The rate limit will be influenced by the latency of sending commands to the inverter (e.g. over WiFi) and the inverter's response time, so the frequency configuration is a minimum and not a guaranteed rate.

```js
{
"inverterControl": {
"controlFrequencyMinimumSeconds": 5 // (number) optional: the frequency in seconds to control the inverter
},
...
}
```
14 changes: 8 additions & 6 deletions docs/configuration/limiters.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,16 @@ All limiters are restrictive, that is a combination of multiple limiters will ev

## Control modes

Currently there are four control modes, mapped to the CSIP-AUS modes
The software supports 6 control modes mapped to the CSIP-AUS Dynamic Operating Envelope (DOE) modes.

| Mode | Description | Overlap resolution | Default value |
|-----------------|----------------------------------------------------------------------------------------------|------------------------|---------------|
| opModConnect | Connection to the grid | Prioritize disconnect | Connect |
| Mode | Description | Overlap resolution | Default value |
|-----------------|------------------------------------------------------------------------------------------------|------------------------|---------------|
| opModConnect | Connection to the grid | Prioritize disconnect | Connect |
| opModEnergize | Generate or consume energy (in practice for most inverters this is the same as `opModConnect`) | Prioritize de-energize | Energized |
| opModExportLimW | Maximum export limit (in watts) | Lower limit | Unlimited |
| opModGenLimW | Maximum inverter generation limit (in watts) | Lower limit | Unlimited |
| opModExportLimW | Maximum site export limit (in watts) | Lower limit | Unlimited |
| opModGenLimW | Maximum inverter generation limit (in watts) | Lower limit | Unlimited |
| opModImpLimW | Maximum site import limit (in watts) | Lower limit | Unlimited |
| opModLoadLimW | Maximum controllable load limit (in watts) | Lower limit | Unlimited |


## CSIP-AUS dynamic connection
Expand Down
106 changes: 106 additions & 0 deletions docs/configuration/meter.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,112 @@ To configure a MQTT meter connection, add the following property to `config.json
...
}
```

The MQTT topic must contain a JSON message that meets the following schema

```js
z.object({
/**
* Positive values = site import power
*
* Negative values = site export power
*/
realPower: z.union([
// either per phase measurements
z.object({
type: z.literal('perPhaseNet'),
phaseA: z.number().nullable(),
phaseB: z.number().nullable(),
phaseC: z.number().nullable(),
net: z.number(),
}),
// or total (net across all phases) measurement
z.object({
type: z.literal('noPhase'),
net: z.number(),
}),
]),
reactivePower: z.union([
// either per phase measurements
z.object({
type: z.literal('perPhaseNet'),
phaseA: z.number().nullable(),
phaseB: z.number().nullable(),
phaseC: z.number().nullable(),
net: z.number(),
}),
// or total (net across all phases) measurement
z.object({
type: z.literal('noPhase'),
net: z.number(),
}),
]),
voltage: z.object({
// must be per phase measurements
type: z.literal('perPhaseNet'),
phaseA: z.number().nullable(),
phaseB: z.number().nullable(),
phaseC: z.number().nullable(),
net: z.number(),
}),
frequency: z.number().nullable(),
});
```

For example

```js
// three phase
{
"realPower": {
"type": "perPhaseNet",
"phaseA": -1000,
"phaseB": -2000,
"phaseC": -3000,
"net": -6000
},
"reactivePower": {
"type": "noPhase",
"net": 1500
},
"voltage": {
"type": "perPhaseNet",
"phaseA": 230,
"phaseB": 232,
"phaseC": 228,
"net": 230
},
"frequency": 50
}
```

or

```js
// single phase
{
"realPower": {
"type": "perPhaseNet",
"phaseA": -1200,
"phaseB": null,
"phaseC": null,
"net": -1200
},
"reactivePower": {
"type": "noPhase",
"net": 800
},
"voltage": {
"type": "perPhaseNet",
"phaseA": 230,
"phaseB": null,
"phaseC": null,
"net": 230
},
"frequency": 50
}
```

## SMA

SMA inverters support [SMA Modbus protocol](https://www.sma.de/en/products/product-features-interfaces/modbus-protocol-interface), however the register map differs across models.
Expand Down

0 comments on commit db3f006

Please sign in to comment.