Install EMS from nothing: pick a paired Admin + EMS build, find your hardware,
generate config/config.json, deploy the containers, and start EMS.
- First installation on this host.
- A deliberate clean reinstall.
Not for changing an installed system. To update a version, add a device or edit a setting, use Maintenance — it changes less and previews everything.
- Admin Console running and logged in — see First start.
- Docker available to the Admin container.
- Your inverters powered on and on the same LAN (or reachable through a broker, for MQTT).
- A grid meter (Shelly, everHome EcoTracker, Tasmota, or a Zendure meter). See Supported setups.
- Internet access once, to download the images.
Guided Setup runs as a stepper, under a header and a progress line that names the step you are on. Steps 02–05 stay dimmed and unclickable until the step before them is genuinely complete — that lock is enforced by the server, not by the browser.
01 Release → 02 Devices → 03 Config → 04 Prepare deployment → 05 Start EMS
What you see: Select System Build with four channels — Latest, Stable, Unstable, Experimental — a SYSTEM BUILD dropdown, and an Admin Server compatibility checklist.
What you select: one build. Stable is the normal choice.
What it changes: selecting downloads nothing. You can browse builds without contacting the container registry. Only Verify System Build downloads.
Expected result: after Verify System Build, the compatibility checklist turns green (Admin image available, EMS image available, revision, build ID, channel, embedded resources) and Continue opens step 02.
If it differs:
- Update Admin Server appears instead of Continue → the running Admin does not match the build you picked. Run it; the page reconnects on its own, then continue. See the reconnect overlay.
- GitHub Container Registry rate limit reached → nothing was changed. Wait, then Verify System Build again.
- You change the build afterwards → the previous verification is cleared on purpose. Verify the new one once.
Selecting is not verifying. A build marked Resources cached or prepared only means files are already on disk. That is not a verified pair.
What you see: Discovery preparation with a Discovery priority list (Local API, Local MQTT, Zendure MQTT), a Manual network scan box, detected networks, and a Detected devices list.
What you select: which sources to scan, and their order. Then Run discovery.
What it changes: nothing on your hardware and nothing in any config. This is a read-only scan. Priority affects discovery only — it never changes how EMS runs.
Expected result: your inverters and grid meter appear. One physical device found over several connections is listed once, on the highest-priority connection that can still control it.
If it differs:
- No devices found → open a source to see its status. In bridge mode, enter your LAN CIDR under Manual network scan. Check that the inverter's local API is enabled.
- Looks like duplicates → it usually is not. See Device management.
- A Zendure MQTT device is missing → add it manually in step 03; see MQTT.
Priority only moves a device on its own when the new connection keeps output control. If it cannot write, the device is not switched silently — step 03 asks you, naming both connections.
What you see: Hardware (grid meter, inverters), Features, Control & safety, Advanced / System settings, and a Config validation box.
What you enter:
- Grid meter — type and address. Only one grid meter can be active.
- Inverters — each gets a short EMS name (
INV_1,INV_2, …). This is the identifier used inconfig.json, logs and the dashboard. Edit it now if you want a different one. - Features — winter mode, energy savings, full-charge assist and so on.
- Control & safety — what EMS will be allowed to do once it starts, and the output limits it must stay inside.
What it changes: still nothing on disk. This builds a draft, and the validation box is a preview of it.
About Control & safety. These switches are on by default, so a finished setup actually controls your system — you do not have to enable anything. They exist to stop EMS: turn one off for read-only validation, or turn on Dry run while you check a setup. Read the group heading before the checkbox, because the two groups point in opposite directions:
| Group | On means |
|---|---|
| What EMS may change | allowed |
| Hold EMS back | blocked, whatever the group above allows |
The same settings are on the Maintenance Control & safety tab afterwards.
Expected result: validation shows no errors and Continue is enabled.
If it differs:
- Continue is disabled after an edit → this is intended. Any change to the draft invalidates the preview; wait for it to refresh. What you saw previewed is exactly what gets applied.
- A connection question appears naming two connections and what happens to output control → answer it. Nothing changes until you do.
- Output control is not available for a device → it follows the model and the write route, not a checkbox. See Device management.
What you see: the deployment workspace, the generated config path, Images to download and a Progress box.
What you select: Prepare deployment.
What it changes: this is the first write. The Admin Console writes
config/config.json (backing up any existing config first) and prepares the
Compose file plus the EMS image and resources. data/ and your runtime databases
are not touched.
Expected result: the generated config is saved and the deployment is prepared; step 05 unlocks.
If it differs: conflict → config/config.json changed after you generated
the draft (Maintenance, a restore or another session edited it). Nothing was
overwritten. Reopen 03 Config, review the current configuration and generate
again.
What you see: the deployment workspace, prepared config, selected release, Docker access, and a Services list.
What you select: Start EMS (or Restart EMS).
What it changes: the EMS container is created and started with your config. EMS begins reading your meter and devices.
Expected result: the service shows running, the status reads EMS is
running, and Open EMS Dashboard appears. It points at
http://<host>:8080.
If it differs: use Re-check status. If EMS does not come up, run diagnostics — see Diagnostics and recovery.
- Steps 01–03 are read-and-draft only. The first disk write is 04 Prepare deployment.
- Every apply is bound to the exact preview you saw and to the exact
config/config.jsonthat existed when the preview was made. If either moved, the apply is refused rather than guessing. - Device identity comes from the backend (trusted serial plus scoped route), never from what the browser displays.
- Discovery, verification and preparation are tracked as one server-side setup workflow. Closing the tab does not cancel it.
config/config.jsonwritten in the standard layout.docker-compose.ymlprepared with the verified EMS image.- EMS container running and the dashboard reachable on port 8080.
| Symptom | Meaning | What to do |
|---|---|---|
| No devices found | Scan could not reach them | Add your LAN CIDR under Manual network scan; check the inverter's local API; in bridge mode discovery is less reliable |
| Two entries look like the same inverter | Usually two connections, not two devices | See Device management |
| Output control unavailable | Model or write route not proven | Why a device is read-only |
| Stale device plan | Discovery found different devices since you answered | Re-answer the connection question |
| Config preview out of date | You edited the draft | Wait for the preview to refresh; Continue re-enables |
| Prepare stops with a conflict | config/config.json changed meanwhile |
Reopen 03 Config, review, generate again |
| Full-screen reconnect | The Admin is being replaced | Wait — reconnect overlay |
| Rate limit on download | GHCR throttled you | Wait, then Verify System Build again. Nothing was changed |
To stop a setup: Restart setup / Discard setup cancels the pending System Build transition and deletes the generated config and deployment marker it created. Your installed EMS, live config, data, containers and backups are left alone.
A discard is refused while an operation the setup started is still running (Admin update, resource verification, config apply, deployment, EMS start). It tells you which one; wait and discard afterwards. Nothing is half-discarded.
After a successful setup:
- Work through the first-run checklist.
- Read Safety before enabling live hardware writes.
- Open the EMS Dashboard guides.
- Use Maintenance for everything from here on.
Full behavioural reference, including every refusal and ownership rule: Admin Console: Set up a new system.




