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.
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 (default 30 s): blocks switching for N seconds after charging
starts (see
phase_switching/delay). - Duration (default 10 s): minimum interval between consecutive
switches (see
phase_switching/duration). - 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. Checkphase_switching/actualto see whether the switch actually took effect.
Integration Pattern
Code
Constraints
- During CP state A/B/E/F (not charging): Phase switch is accepted in the UI but physical switching does not occur until charging starts.
- During charging (CP state C/D): Full switching process executes.
- 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 actual phase count
Returns the current physical phase count: "1" or "3".
This reflects the actual relay state, not the requested/target phase. During a switch, this value updates only after the physical operation completes.
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 actual 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.

