Read and change charger settings

Set a charger's light and cable behaviour once and let Flowion keep it there, online or offline. Read and write any other setting directly.

3 min readEdit this page
On this page

Flowion gives every charger the same settings object, whatever its make. You say what you want, and Flowion brings the charger there in the background, including a charger that is offline when you ask. For anything the settings object does not cover, you can read and write the charger's own settings directly.

See a charger's settings

GET/v1/charging-stations/$CHARGER/settingsbash
curl "$API/charging-stations/$CHARGER/settings" \
  -H "Authorization: Bearer $TOKEN"
200Response
{
  "lightIntensity": {
    "supported": true,
    "readOnly": false,
    "target": 0.4,
    "actual": 0.4,
    "syncing": false,
    "derived": false,
    "overridden": true,
    "lastSyncedAt": "2026-09-30T09:12:03Z",
    "syncError": null
  },
  "unlockOnUnplug": {
    "supported": true,
    "readOnly": false,
    "target": true,
    "actual": false,
    "syncing": true,
    "derived": false,
    "overridden": true,
    "lastSyncedAt": null,
    "syncError": null
  }
}

The real response has one entry per setting; two are shown here. It answers from what Flowion already knows, so it is instant and works while the charger is offline. Every setting carries the same fields:

FieldTells you
targetWhat the charger is being held at
actualWhat the charger last reported
syncingtrue while Flowion is still bringing the charger to target
supportedWhether this charger has the setting at all
readOnlyThe charger reports it cannot be changed
derivedFlowion sets it for you from the charger's access rules
overriddentarget was set on this charger, rather than coming from the model's default
syncErrorWhy the last attempt to apply target failed, if it did

A charger that has never connected shows supported: false everywhere. That changes once it connects and reports what it has.

Change a setting

Two settings are yours to change today:

  • lightIntensity: the brightness of the charger's own lighting, from 0.0 (off) to 1.0, in whole-percent steps.

  • unlockOnUnplug: whether the charger releases its cable lock when the driver unplugs at the car, so the cable can be taken away.

PATCH/v1/charging-stations/$CHARGER/settingsbash
curl -X PATCH "$API/charging-stations/$CHARGER/settings" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"lightIntensity": {"target": 0.25}}'

The response is the full settings object, with syncing: true on what you changed. The charger is not contacted during the request, so the call behaves the same whether it is online, offline or not yet installed. Watch syncing go back to false to know the charger has caught up.

To go back to the model's default, send {"target": null} for that setting. Changing settings takes the ocpp.settings.update permission; see Permissions and policies.

Every value is checked before anything is written, so one bad value leaves all of them unchanged:

  • An unknown setting name, a read-only one or a value of the wrong type answers 422 invalidRequest.

  • A value out of range, or between two steps (0.255), answers 422 invalidSettingValue. The message names the nearest valid value.

A charger with a fixed (tethered) cable has nothing to unlock, so it reports unlockOnUnplug as readOnly: true.

Read any other setting

Every charger has many more settings than the settings object covers. Some chargers expose them as configuration keys (a flat list of named values), others as variables grouped by the part of the charger they belong to (a connector, the meter, the controller). The API reads both. Each charger uses one of the two.

Flowion keeps a copy of whichever kind the charger has, refreshed on its own and whenever you read live:

bash
# A charger with configuration keys
curl "$API/charging-stations/$CHARGER/configuration?limit=100" \
  -H "Authorization: Bearer $TOKEN"

# A charger with variables; q filters by name
curl "$API/charging-stations/$CHARGER/device-model?q=lighting" \
  -H "Authorization: Bearer $TOKEN"

Both answer instantly and work while the charger is offline. Use them to display and audit. Ask the charger itself when you are about to act on a value:

POST/v1/charging-stations/$CHARGER/commands/get-configurationbash
curl -X POST \
  "$API/charging-stations/$CHARGER/commands/get-configuration" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keys": ["MeterValueSampleInterval"]}'
200Response
{
  "keys": [
    {
      "key": "MeterValueSampleInterval",
      "readonly": false,
      "value": "60"
    }
  ],
  "unknownKeys": []
}

Leave keys out to read every key the charger has. For a charger with variables, the same live read is POST .../commands/get-variables, with a list of {"component": {"name": ...}, "variable": {"name": ...}} pairs. Each pair comes back with its own status and value.

Change any other setting

POST/v1/charging-stations/$CHARGER/commands/change-configurationbash
curl -X POST \
  "$API/charging-stations/$CHARGER/commands/change-configuration" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"key": "MeterValueSampleInterval", "value": "60"}'

value is always a string: "60", not 60. For a charger with variables, use POST .../commands/set-variables:

POST/v1/charging-stations/$CHARGER/commands/set-variablesbash
curl -X POST \
  "$API/charging-stations/$CHARGER/commands/set-variables" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"variables": [{
        "component": {"name": "SampledDataCtrlr"},
        "variable": {"name": "TxUpdatedInterval"},
        "value": "60"}]}'

These calls wait for the charger's answer, so the charger has to be online. A 200 means the charger answered. Read its verdict in status:

statusWhat to do
AcceptedDone
RebootRequiredStored, but only takes effect after a restart
RejectedThe charger refused the value. Check the manufacturer's allowed range
NotSupportedThe charger has no such key

A variable can also come back UnknownComponent or UnknownVariable. Before sending, Flowion checks each variable against the charger's reported list and answers 422 unknownVariable without contacting the charger if it is not there. If you know the variable exists (say, after a firmware update the charger has not reported yet), add "skipDeviceModelCheck": true.

The heartbeat interval is managed by Flowion. Writing it answers 422 csmsManagedSetting.

Settings worth checking on a new charger

Setting (configuration key)Why it matters
MeterValueSampleIntervalToo long and sessions look empty between readings; too short and the charger sends more traffic than you need
MeterValuesSampledDataMust include an energy reading, or sessions record no consumption
StopTransactionOnEVSideDisconnectDecides whether unplugging at the car ends the session
MinimumStatusDurationLets the charger skip very short status changes, so a connector can go from preparing to charging with nothing in between

Chargers with variables have equivalents under their own names.

When a live call fails

CodeMeaningWhat to do
409The charger is not connectedWait for it to come online, or use the stored copy
422Not expressible on this charger, or refused before sendingRead error: unsupported means the charger uses the other kind of setting
502The charger disconnected mid-call or sent an answer Flowion could not readRetry once it is back
503The command could not be sentRetry shortly
504The charger did not answer within about 35 secondsRead the value back before you retry a write

Endpoints

Charging stations · Configuration · Commands

For how these map onto the charger protocol, see How Flowion maps onto OCPP.

In the API reference