Add an energy monitor

Measure a building's real load on a circuit, so charging gets the capacity the rest of the building leaves free instead of a fixed share.

4 min readEdit this page
On this page

An energy monitor measures the current actually flowing into a circuit: the chargers, and everything else the building runs on it, from lights to heat pumps. Assign one to a circuit and Flowion gives charging the capacity the rest of the building leaves free, within the circuit's rating. A busy afternoon leaves less for the cars; a quiet night leaves more.

A circuit without a monitor is planned on its rating and the chargers Flowion knows about, as before.

How Flowion uses a reading

On each line, Flowion takes the monitor's total and subtracts the charging it can match to that same moment. What remains is the rest of the building. Flowion sets that aside and lets the cars share what is left of the circuit's rating. Charging it cannot match to the reading is counted as building load, which errs on the side of the circuit.

A Main circuit and a circuit below it can each have a monitor. Then a charger under both stays within both, and the two readings are never added together.

A reading counts only if it covers every line the circuit uses, is no more than 120 seconds old, and is not dated in the future. When a monitored circuit has no reading that counts, Flowion does not guess: it directs the charging under that circuit to pause until a good reading arrives, or until you remove the monitor.

Monitors you can use

MonitorHow it connects
Easee EqualizerThrough a linked Easee site. It appears in your monitors on its own, read every 30 seconds.
Shelly Pro 3EMDirectly to Flowion over a secure connection, set up below.

A circuit accepts a monitor whose measuring point Flowion has tied to that circuit: today, an Easee Equalizer on an Easee circuit you mapped to it.

See your monitors

GET/v1/energy-monitors?projectId=$PROJECT&mode=livebash
curl "$API/energy-monitors?projectId=$PROJECT&mode=live" \
  -H "Authorization: Bearer $TOKEN"
200Response
{
  "data": [
    {
      "id": "8c1d5e7a-4b2f-4f0e-9a63-2e7b1c9d0f58",
      "name": "Main feed",
      "connectionState": "connected",
      "lastSeenAt": "2026-10-01T09:14:30Z",
      "measuredLines": ["L1", "L2", "L3"],
      "assignedCircuitId": null,
      "disabledAt": null,
      "assetRevision": 3
    }
  ],
  "nextCursor": null
}

mode must match your credential: live with a live key, sandbox with a sandbox key. A monitor stays in this list whether or not it is assigned.

Rename one with PATCH /energy-monitors/{monitorId}, sending name and the assetRevision you last read as expectedAssetRevision. A 409 monitorConflict means it changed in the meantime: read it again and retry.

Connect a Shelly Pro 3EM

Register the device and get its one-time connection settings:

POST/v1/energy-monitorsbash
curl -X POST "$API/energy-monitors" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"projectId": "'"$PROJECT"'",
       "locationId": "'"$LOCATION"'",
       "name": "Main feed",
       "deviceId": "shellypro3em-123456789abc",
       "deviceProfile": "triphase",
       "firmwareVersion": "1.4.4",
       "phaseMapping": [
         {"sourcePhase": "A", "siteLine": "L1"},
         {"sourcePhase": "B", "siteLine": "L2"},
         {"sourcePhase": "C", "siteLine": "L3"}]}'
  • deviceId is the Shelly's own device id.

  • deviceProfile is triphase, the Pro 3EM's three-phase profile, and firmwareVersion must be a 1.x version from 1.1.0 onward.

  • phaseMapping says which of the site's lines each of the Shelly's phases A, B and C measures. Map each phase to a different line, as it is actually wired; do not assume the installer kept the order.

The response holds everything the device needs: endpoint and port, username, oneTimePassword, clientId and topicPrefix, plus setup, a short list of steps to follow in the Shelly's own web interface.

Check that the device has connected:

GET/v1/energy-monitors/$MONITOR/connectionbash
curl "$API/energy-monitors/$MONITOR/connection" \
  -H "Authorization: Bearer $TOKEN"

connected turns true and state becomes connected once the device has signed in.

ToCall
Issue a new passwordPOST /energy-monitors/$MONITOR/connection/rotate
Stop the current password working at oncePOST /energy-monitors/$MONITOR/connection/revoke
Cut the device off for goodPOST /energy-monitors/$MONITOR/connection/disable

A rotated password is shown once and must be entered within 15 minutes; the old one keeps working until the device first signs in with the new one. After a revoke, rotate to get the device back. Disabling the connection is permanent.

Assign a monitor to a circuit

Ask the circuit which monitors it accepts:

GET/v1/circuits/$CIRCUIT/energy-monitor-candidatesbash
curl "$API/circuits/$CIRCUIT/energy-monitor-candidates" \
  -H "Authorization: Bearer $TOKEN"

Each candidate has eligible and a reason:

reasonMeans
eligibleReady to assign
already_assignedIt is assigned to another circuit; remove it there first
disabledThe monitor is disabled; enable it first
disconnectedIt is not connected; get it online first
boundary_unverifiedFlowion cannot tie its measuring point to this circuit
incompatible_linesIt does not measure the lines this circuit uses

Read the circuit's current revision, then assign:

GET/v1/circuits/$CIRCUIT/energy-monitorbash
curl "$API/circuits/$CIRCUIT/energy-monitor" \
  -H "Authorization: Bearer $TOKEN"
PUT/v1/circuits/$CIRCUIT/energy-monitorbash
curl -X PUT "$API/circuits/$CIRCUIT/energy-monitor" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"monitorId": "'"$MONITOR"'",
       "expectedRevision": 0,
       "lineMapping": [
         {"sourceLine": "L1", "circuitLine": "L1"},
         {"sourceLine": "L2", "circuitLine": "L2"},
         {"sourceLine": "L3", "circuitLine": "L3"}]}'

lineMapping pairs each line the monitor measures with a line of the circuit: all three for a three-phase circuit, and the circuit's own line for a single-phase one. Assigning a monitor to a circuit that already has one replaces it. A circuit has one monitor at a time, and a monitor serves one circuit.

The new assignment starts as pending_protection and becomes active once Flowion's load balancing has taken it into account.

Read a circuit's monitor

GET/v1/circuits/$CIRCUIT/energy-monitorbash
curl "$API/circuits/$CIRCUIT/energy-monitor" \
  -H "Authorization: Bearer $TOKEN"

The answer has the assignment, the monitor, its latest reading (the current on each line and when it was measured), a quality, and the decision Flowion last made from it: how much it set aside for the rest of the building (reserveAmps), what it left for charging (chargingBudgetAmps), which circuit and line limited it, and whether it directed charging to pause (directedPause).

protectionUsable is true when the assignment, the latest reading and Flowion's latest decision all agree and are current. When it is false, quality says why:

qualityMeans
usableThe reading counts
staleThe newest reading is more than 120 seconds old, or repeats an older one
missing_phaseA line the circuit uses is missing from the reading
invalid_valueThe reading holds a value that cannot be right
future_timeThe reading is dated in the future
source_disconnectedThe monitor is not connected
disabledThe monitor is disabled
unavailableThere is no reading yet
unassignedThe circuit has no monitor
conflictFlowion's latest decision was made for an earlier assignment; the next one settles it

Disable, replace or remove a monitor

Disable a monitor to stop its readings being used, for example while it is serviced:

PUT/v1/energy-monitors/$MONITOR/disabledbash
curl -X PUT "$API/energy-monitors/$MONITOR/disabled" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"disabled": true, "expectedAssetRevision": 3}'

A disabled monitor's circuit has no reading that counts, so charging under it is directed to pause. After you enable it again, its circuit is used once a fresh reading arrives.

Replace a monitor by assigning another one to the circuit.

Remove it to return the circuit to planning on its rating alone:

DELETE/v1/circuits/$CIRCUIT/energy-monitor?expectedRevision=1 &acknowledgeProtectionLoss=truebash
curl -X DELETE \
  "$API/circuits/$CIRCUIT/energy-monitor?expectedRevision=1\
&acknowledgeProtectionLoss=true" \
  -H "Authorization: Bearer $TOKEN"

acknowledgeProtectionLoss=true is required: from then on, the rest of the building's load no longer shapes that circuit's charging. The monitor stays in your list, ready to assign again.

Reading monitors needs the asset.monitor.read permission and reading circuit status asset.circuit.read; connecting and changing monitors needs asset.monitor.manage, and assigning one to a circuit asset.circuit.manage. Every call is listed under Energy monitors in the API reference.

In the API reference