diff --git a/README.md b/README.md
index 016a87c..2586ccd 100644
--- a/README.md
+++ b/README.md
@@ -9,261 +9,8 @@ This project aims to implement dynamic export control/solar curtailment of inver
- two-way tariffs (e.g.time based) export limitation
- negative feed-in (e.g. Amber) export limitation
-![frame_generic_dark](https://github.com/user-attachments/assets/cd8e1bca-14e5-46ce-a845-917eb7744ec4)
-> [!NOTE]
-> The dashboard UI is not part of this open-source reprository and will be available as a licensed product along with a hardware package.
-
-```mermaid
-flowchart LR
- ODE(("open-dynamic-export"))
- I["Inverter(s)"]
- M["Site meter"]
-
- CSIP-AUS --> DC
- DC & F & T & NFI & MQTTL --> ODE
- Configuration --> F
- A["Amber API"] --> NFI
- R["Tariff rules"] --> T
- ODE <--> SunSpec & HTTP & Proprietary & MQTT
- Protocols <--> I & M
-
- subgraph Limiters
- DC["Dynamic exports"]
- F["Fixed/zero export"]
- T["Two-way tariffs"]
- NFI["Negative feed-in"]
- MQTTL["MQTT"]
- end
-
- subgraph Protocols
- SunSpec
- HTTP
- MQTT
- Proprietary
- end
-```
-
-## Supported inverters and site meter
-
-Inverters:
-
-| Name | `config.json` inverter type | Description | Tested models |
-| ------- | --------------------------- | ------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| SunSpec | `sunspec` | SunSpec Modbus TCP compatible inverter
Must support models 1, 101/102/103, 120, 121, 122, 123 | Fronius Primo
Fronius Symo |
-
-Site meter:
-
-| Name | `config.json` meter type | Description | Tested models |
-|-------------------|--------------------|---------------------------------------------------------------------------------|---------------------------------------------------------------------------------|
-| SunSpec | `sunspec` | SunSpec Modbus TCP compatible smart meter
Must support models 1, 201/202/203 | Fronius Smart Meter 1 phase
Fronius Smart Meter 3 phase
Catch Power Relay |
-| Tesla Powerwall 2 | `powerwall2` | | Backup Gateway 2 |
-
-> [!IMPORTANT]
-> Site meters installed in the consumption path with batteries are not supported due to the inability to measure battery power. The site meter must be installed in the feedin path.
-
-## Configuration
-
-The server uses a configuration JSON to configure how it works.
-
-### Inverters and meters
-
-To configure the inverter and meter connections, add the following property to `config.json`
-
-```js
-{
- "inverters": [ // (array) required: list of inverters
- {
- "type": "sunspec", // (string) required: the type of inverter
- "ip": "192.168.1.6", // (string) required: the IP address of the inverter
- "port": 502, // (number) required: the Modbus TCP port of the inverter
- "unitId": 1 // (number) required: the Modbus unit ID of the inverter
- }
- ],
- "inverterControl": {
- "enabled": true // (true/false) optional: whether the inverters should be controlled based on limits, turn off to simulate
- },
- "meter": {
- "type": "sunspec", // (string) required: the type of meter
- "ip": "192.168.1.6", // (string) required: the IP address of the meter
- "port": 502, // (number) required: the SunSpec Modbus TCP port of the meter
- "unitId": 240 // (number) required: the SunSpec unit ID of the meter
- "location": "feedin" // (string) optional: the location of the meter (feedin or consumption)
- }
- ...
-}
-```
-
-### Limiters
-
-All limiters are restrictive, that is a combination of multiple limiters will evaluate all limiters and enforce the most prohibitive value of each control type at any one time.
-
-Currently there are four control surfaces, mapped to the CSIP-AUS modes
-
-| 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 |
-
-#### Fixed limit
-
-To set fixed limits (such as for fixed export limits), add the following property to `config.json`
-
-```js
-{
- "limiters": {
- "fixed": {
- "connect": true, // (true/false) optional: whether the inverters should be connected to the grid
- "exportLimitWatts": 5000, // (number) optional: the maximum export limit in watts
- "generationLimitWatts": 10000 // (number) optional: the maximum generation limit in watts
- }
- }
- ...
-}
-```
-
-#### Negative feed-in
-
-To set a zero export limit based on negative feed-in, add the following property to `config.json`
-
-For Amber Electric:
-```js
-{
- "limiters": {
- "negativeFeedIn": {
- "type": "amber", // (string) required: the source of the negative feed-in data
- "apiKey": "asdf", // (string) required: the Amber API key
- "siteId": "12345" // (string) required: the Amber site ID
- }
- }
- ...
-}
-```
-
-#### Two-way tariffs
-
-To set a zero export limit based on two-way tariffs, add the following property to `config.json`
-
-For Ausgrid EA029 tariff:
-```js
-{
- "limiters": {
- "twoWayTariff": {
- "type": "ausgridEA029"
- }
- }
- ...
-}
-```
-
-For SAPN RELE2W tariff:
-```js
-{
- "limiters": {
- "twoWayTariff": {
- "type": "sapnRELE2W"
- }
- }
- ...
-}
-```
-
-#### CSIP-AUS
-
-> [!IMPORTANT]
-> This CSIP-AUS client cannot run without device certificates (and manufacturer certificates issued by the utility server which must be manually registered) and is not provided in this repository. A future version of this application will support a self-service device registration process.
-
-To use CSIP-AUS, add following property to `config.json`
-
-```js
-{
- "limiters": {
- "sep2": {
- "host": "https://sep2-test.energyq.com.au", // (string) required: the SEP2 server host
- "dcapUri": "/api/v2/dcap" // (string) required: the device capability discovery URI
- }
- }
- ...
-}
-```
-
-#### MQTT
-
-To set limits based on a MQTT topic, add the following property to `config.json`
-
-```js
-{
- "limiters": {
- "mqtt": {
- "host": "mqtt://192.168.1.123",
- "topic": "limits"
- }
- }
- ...
-}
-```
-
-The MQTT topic must contain a JSON message that meets the following schema
-
-```js
-z.object({
- opModConnect: z.boolean().optional(),
- opModEnergize: z.boolean().optional(),
- opModExpLimW: z.number().optional(),
- opModGenLimW: z.number().optional(),
-});
-```
-
-## Run server
-
-### Docker compose
-
-1. Clone repo
-
-1. Copy `.env.example` and rename it to `.env` and change the values to suit
-
-1. Create a `/config` folder and copy the [`config.example.json` file from the repo](https://github.com/longzheng/open-dynamic-export/blob/main/config/config.example.json) and rename it to `config.json`. Set it with the required values.
-
-1. Run `docker compose up -d` (or run `docker compose up -d --build`)
-
-## CSIP-AUS client
-
-The project implements a CSIP-AUS compatible client that interacts with the utility server (CSIP-AUS/SEP2 server). The initial implementation focuses on the [SA Power Networks requirements](https://www.talkingpower.com.au/71619/widgets/376925/documents/239205) and [Energy Queensland requirements](https://www.energex.com.au/__data/assets/pdf_file/0007/1072618/SEP2-Client-Handbook-13436740.pdf).
-
-```mermaid
-sequenceDiagram
- participant U as Utility
(CSIP-AUS server)
- participant SC as CSIP-AUS client
- participant C as Coordinator
- participant D as DER
-
- loop
- SC->>U: Discovery
- U->>SC: Devices, programs, DER controls
- SC->>U: Acknowledge DER controls
- end
-
- SC->>C: Control schedules
and limits
-
- loop
- D->>C: Metrics
- Note over C: Get current schedule
Calculate target power level
to meet limits
- C->>D: Inverter controls
- end
-
- loop
- SC->>U: Send DER status/capability/settings
- SC->>U: Send site and DER telemetry
- end
-
- box rgb(198,239,210) open-dynamic-export
- participant SC
- participant C
- end
-```
-
-The initial plan is to implement a direct gateway client that interacts directly with the utility server and the DER (solar inverters). The downside of a direct client approach is the registration process is manual and requires generating keys and certificates for each site/NMI. If the project is successful, a future version will allow self-service registration or a cloud-hosted aggregator proxy.
+## Documentation
+[View documentation](https://opendynamicexport.com/guide/)
## Features
@@ -288,6 +35,17 @@ The initial plan is to implement a direct gateway client that interacts directly
- [x] Software-based limit ramping (`setGradW` or `rampTms`)
- [x] Metrics logging in InfluxDB
+## Build
+### Docker compose
+
+1. Clone repo
+
+1. Copy `.env.example` and rename it to `.env` and change the values to suit
+
+1. Create a `/config` folder and copy the [`config.example.json` file from the repo](https://github.com/longzheng/open-dynamic-export/blob/main/config/config.example.json) and rename it to `config.json`. Set it with the required values.
+
+1. Run `docker compose up -d` (or run `docker compose up -d --build`)
+
## CSIP-AUS Private key and CSR
CSIP-AUS uses PKI certificates to authorise and identify clients.