Skip to main content
PUT
Update the user's charging configuration

Authorizations

Authorization
string
header
required

The access token received from the authorization server in the OAuth 2.0 flow.

Path Parameters

org_id
string<uuid>
required

The organization ID of the user's organization

user_id
string<uuid>
required

The user whose charging configuration to update

Body

application/json

All fields optional — omitted fields are left unchanged. The mode must be in available_modes (none always is); thresholds must satisfy every device's hysteresis-band minimum (min_band_w on GET).

hems_mode fans out to the EV rows only. A raw-threshold write flips preset-mode EVs to custom (current effective values materialized, then the provided fields overlaid); combining a preset hems_mode with raw thresholds is contradictory and rejected.

smart_charging_mode
enum<string> | null

User-facing charging mode on the partner-API wire — the projection of the DesiredSteering subset {NO_STEERING, DAY_AHEAD, HEMS, DAY_AHEAD_HEMS}.

Only the Day-Ahead + HEMS nibbles are user-selectable here; Intraday and Curtailment are folded into the same projection (a Day-Ahead+Intraday device still reads spot). Use to_desired_steering / wire_mode_from_desired to cross the boundary — never compare a DesiredSteering against one of these directly.

Available options:
none,
spot,
hems,
hems_and_spot
hems_mode
enum<string> | null

How an EV's HEMS start/stop thresholds are determined (SC-137).

The preset modes derive the surplus start/stop band at session start from the household PV size (kWp) and the actuation floor — see core_app.services.smart_charging.thresholds.derive_preset_thresholds. The stored raw threshold columns on ElectricVehicle are read only in CUSTOM mode (or as fallback when no usable kWp is known).

EAGER - start on a small surplus fraction of kWp; tolerate more import. BALANCED - the default middle ground. CONSERVATIVE - start only on a large surplus; stop early on import. CUSTOM - the user/operator set the raw threshold columns explicitly.

Available options:
eager,
balanced,
conservative,
custom
hems_min_export_to_start_w
integer | null
Required range: 0 <= x <= 50000
hems_max_import_before_stopping_w
integer | null
Required range: 0 <= x <= 50000

Response

200 - application/json

OK

smart_charging_mode
enum<string>
required

User-facing charging mode on the partner-API wire — the projection of the DesiredSteering subset {NO_STEERING, DAY_AHEAD, HEMS, DAY_AHEAD_HEMS}.

Only the Day-Ahead + HEMS nibbles are user-selectable here; Intraday and Curtailment are folded into the same projection (a Day-Ahead+Intraday device still reads spot). Use to_desired_steering / wire_mode_from_desired to cross the boundary — never compare a DesiredSteering against one of these directly.

Available options:
none,
spot,
hems,
hems_and_spot
mode_conflict
boolean
required
config_divergence
boolean
required
devices
DeviceModeOutput · object[]
required
available_modes
ModeAvailabilityOutput · object[]
required
hems_eligible
boolean
required
hems_ineligible_reasons
enum<string>[]
required

Why a mode is unavailable (or HEMS ineligible). Stable wire codes the frontend maps to unlock hints — e.g. a locked HEMS row rendering "Connect an inverter".

Available options:
no_ev,
no_battery_capacity,
no_actuator,
wallbox_not_modulating,
no_inverter,
inverter_no_export_data
thresholds
ThresholdsOutput · object | null
required
health_warning
HealthWarningOutput · object | null
required
status
SmartChargingStatusOutput · object
required