Phase Switching
Phase switching (1-phase ↔ 3-phase) is a critical operation with specific timing constraints. See the detailed workflow description in the endpoint documentation, and Phase Switching for the behaviour of the function itself.
The two rules
Request a switch only while a vehicle is charging — control pilot
state C or D, with phase_switching/status reading "idle". A request
made at any other time changes the stored selection but is not reliably
carried through to the power stage.
ci/evse/phase/actual is the phase the vehicle actually gets.
salia/phase_switching/actual is the station's stored selection — what
was requested and what the web interface displays. Under normal
operation the two agree; when they disagree, the vehicle follows
ci/evse/phase/actual, and the offered currents
(ci/evse/basic/current/l1|l2|l3/offered) confirm it independently.
A station that displays one phase while charging on three has taken a switch request outside a charging session. Restart the station — after the restart the display and the actual phase agree again, and the phase can be requested afresh. Without a restart, request a phase while the vehicle is charging; which of the two triggers the real switch depends on what the station has stored internally, so try one, allow about a minute, then try the other.
Detecting whether phase switching is available
Phase switching is not supported on all hardware configurations, and may
also be disabled in the station's configuration even on capable
hardware. When unavailable, the station does not publish any of the
phase_switching/* MQTT topics at all — which means the entire
phase_switching subtree is absent from the snapshot, rather than
being present with some "disabled" marker value. There is no dedicated
"is phase switching available" flag.
The canonical detection pattern is to check the snapshot for the presence of the subtree before issuing any phase-switching call:
Code
Equivalent one-shot check against a specific sub-key:
Code
Do not confuse phase_switching/actual (current 1- or 3-phase
selection — only present if switching is available) with
ci/evse/basic/phase_count (how many phases the station is wired
for — always present, static hardware property). A station can be
wired for 3 phases but have switching disabled; in that case
phase_count is "3" and the phase_switching object is still
absent.
If phase switching is not available:
- The physical phase configuration is fixed by wiring.
setphasewrites are accepted by the REST layer but discarded internally with no effect.- Switching into
powercharge mode does not force 3-phase (the automaticsetphase=3side effect is gated on the same availability flag).
Dual-pole stations (Doppellader)
Dual-pole Salia stations ship as a Salia PLCC Master
(product 2310006) paired with a Salia PLCC Slave
(product 2310007). The two poles do not have symmetric
phase-switching capabilities out of the box:
- Slave pole — phase switching is enabled by factory
default. The
phase_switchingsubtree is present in the snapshot andsetphaseworks. - Master pole — phase switching is disabled by factory
default. The
phase_switchingsubtree is therefore absent from the snapshot, and the canonical detection check above will (correctly) report "not available". On a typical Doppellader installation, only the slave pole is intended to perform 1↔3 phase switching.
Implication for integrators: when a single physical station exposes two poles, run the canonical detection check per pole / per REST endpoint — do not assume both poles share the same capability based on one query.
As a secondary hardware-level signal you may cross-check
GET /api/device/modelname ("Salia PLCC Master" vs
"Salia PLCC Slave") or GET /api/device/product ("2310006"
vs "2310007"), but the presence of the phase_switching
subtree remains the authoritative runtime test — the field
configuration can be changed in the field and the subtree
reflects the live state, while the model / product strings
reflect only the hardware variant.
Note: this hardware "Master / Slave" distinction refers to the
two physical poles of a dual-pole station and is unrelated
to the cluster role (standalone / master / slave)
configured via salia/setmasterip — see Load Management
→ Station role. The two concepts share a name but are
orthogonal.
Sequencing rule
After triggering a phase switch, you must poll
phase_switching/status until it returns "idle" before setting
grid_current_limit or other current limits. Failing to wait will
block charging.
Trigger phase switch
Triggers a phase switch between 1-phase and 3-phase charging.
Prerequisite: Phase switching must be available on the device.
Detect this by checking for the presence of the
secc.port0.salia.phase_switching subtree in the snapshot — see the
detection pattern under the Phase Switching tag description. If
the subtree is absent, the REST layer still accepts this write and
returns {"result":"ok"}, but the station discards it and the phase
configuration is unchanged.
Valid Values
| Value | Description |
|---|---|
"1" | Switch to 1-phase charging |
"3" | Switch to 3-phase charging |
"toggle" | Toggle between 1-phase and 3-phase |
Phase Switching Workflow
Phase switching is an asynchronous operation with timing constraints.
After triggering, poll phase_switching/status to track progress.
Observable status
phase_switching/status only ever returns "idle" or "progress":
Code
- idle — No switch in flight. Ready for a new request and for
subsequent calls such as
grid_current_limit. - progress — A switch is in flight. Internally the station passes through delay/duration checks, triggers the relay, and waits for feedback (up to 60 s); externally all of that is collapsed into this one state.
Internal timing constraints that affect how long progress can last:
- Delay (30 s): blocks switching for that long after charging
starts (see
phase_switching/delay). - Duration: minimum interval between consecutive switches, taken
from the phase-switching delay configured in the web interface
(see
phase_switching/duration). The same configured value also sets the pause during the switch itself, but there the charging firmware accepts only 10-300 s and falls back to 20 s — a configured 6 s gives a 6 s interval and a 20 s pause. - Feedback timeout (60 s): if the vendor firmware does not confirm the
switch within 60 s, the previous phase is restored and status returns
to
idle. Checkci/evse/phase/actualto see whether the switch actually took effect.
Integration Pattern
Code
Step 4 reads ci/evse/phase/actual deliberately. That value is the
phase the vehicle actually charges on; phase_switching/actual is the
station's stored selection. Under normal operation the two agree — see
the note under the Phase Switching tag description for what it
means when they do not.
Constraints
- During charging (CP state C/D): Full switching process executes. This is the only state in which a switch should be requested.
- During CP state A/B/E/F (not charging): the request updates the stored selection and the web interface display, but is not reliably carried through to the power stage; whether it is applied at the next charging start is not guaranteed. Do not pre-select a phase outside a session and assume the session starts on it. In particular, do not drop the charging current to zero or pause the vehicle immediately before requesting a switch — that takes the station out of the charging state.
- Power mode auto-switch: Setting
chargemodeto"power"automatically triggers a switch to 3-phase if not already in 3-phase. - Sequencing: Never set
grid_current_limituntil phase switch completes. Calling out of sequence will block charging.
Trigger phase switch › Request Body
salia/phase_switching/setphaseTrigger phase switch › Responses
Phase switch request accepted
resultGet selected phase count
Returns the station's stored phase selection: "1" or "3". This is
the value the web interface displays, and it is what the last accepted
setphase request set. During a switch it updates only after the
operation completes.
This is not a reading of the relay state. To find out how many
phases the vehicle is actually charging on, read
GET /api/?path=secc/port0/ci/evse/phase/actual. Under normal
operation the two agree; see the Phase Switching tag description
for what it means when they do not.
Note: This endpoint (and all phase_switching/* endpoints) only
returns data when phase switching is available on the device. If it
is not, the entire phase_switching subtree is absent from the
snapshot — see the detection pattern under the Phase Switching
tag description.
Get selected phase count › Responses
Actual phase count retrieved
Get phase switching status
Returns the current state of the phase switching state machine. Poll this endpoint after triggering a phase switch to know when it completes.
See the setphase endpoint documentation for the full state machine description.
Get phase switching status › Responses
Phase switching status retrieved
Phase switching status as exposed on the phase_switching/status topic:
idle— No phase switch in progress. Ready for a new request.progress— A phase switch has been accepted and is in progress. This covers the full lifecycle from request through the physical relay operation until feedback is received (or a 60-second timeout elapses and the previous phase is restored). The status returns toidlein all terminating cases — success, timeout, or abort.
The station has a finer-grained internal state machine (request → wait
for permission → switching → feedback/timeout), but only the collapsed
idle / progress values are published to this topic. Integrators
should poll this topic and treat idle as "safe to issue the next
command" without trying to distinguish sub-states.

