This guide will help you configure FCR on your Sofar EMS to remotely control and monitor battery installations.
Before continuing, make sure your network and devices are ready by following the MQTT Setup guide.
Request the Eniris MQTT credentials used for FCR communication through the distributor. Certification and project approval are separate from credential provisioning.
NOTE: FCR overrides the original functionality of the controller.
| Device Type | Variants | Supported |
|---|---|---|
| Solar Inverters | All | ❌ |
| Storage Devices | ✅ | |
| EV Chargers | ❌ |
| Country | Supported |
|---|---|
| Belgium | ❌ |
| Netherlands | |
| Switzerland | ✅ |
Only specific installations can be set up via FCR. Please verify that the installation is certified.
Login to the commissioning interface and make sure the devices are added to the Sofar EMS.
In the settings, the grid power limits should be set correctly. Click Settings and check the highlighted setting in the image. If necessary, adjust the settings.
Make sure the address is set correctly.
The integration may not work correctly if the address is not correct!
From the commissioning interface, go to the 'External Signals' tab.
Click on 'Energy Markets'.
Select Eniris, select FCR and click 'Next'.
Frequency Containment Reserve (FCR) is the fastest automatic reserve used to keep the grid frequency close to its nominal value (50 Hz in Europe). The grid frequency is a direct measure of the balance between production and consumption: when consumption exceeds production the frequency drops below 50 Hz, and when production exceeds consumption it rises above 50 Hz. FCR reacts to these deviations within seconds to restore the balance.
As the EMS, the Sofar EMS continuously measures the grid frequency locally and charges or discharges the battery based on the frequency, following a predefined droop curve:
The droop curve defines how much power the battery delivers for a given frequency deviation. A small deadband, usually 10mHz, around 50 Hz avoids reacting to tiny fluctuations, and the response scales linearly with the deviation up to the maximum reserve power at the edge of the operating band. In the European FCR market, full activation is reached at a deviation of ±200 mHz (i.e. at 49.8 Hz and 50.2 Hz).
Because the controller measures the frequency itself and applies the droop curve autonomously, the battery responds automatically and in real time to grid frequency changes — no external setpoint is required to activate the reserve.
The grid operator controls the participation via MQTT messages (specified below). These messages determine:
FCR is driven by MQTT messages sent to the Sofar EMS. For everything related to connecting to the MQTT broker — network requirements and credentials — follow the Live MQTT Control guide first. FCR uses the same broker and connection, but its own dedicated topics described below.
FCR uses a separate set of topics from the standard remote control. Replace <Controller SN> with the serial number of the Sofar EMS you intend to control.
| Topic | Direction | Purpose |
|---|---|---|
standard1/rp_one_s/remoteFCRMetrics/<Controller SN> | To the controller | Incoming topic — used to send the FCR command (the JSON message below). |
standard1/outbound/remoteFCRMetrics/ack/<Controller SN> | From the controller | Ack topic — the controller acknowledges here that the command has been received and saved. |
standard1/outbound/remoteFCRMetrics/feedback/<Controller SN> | From the controller | Feedback topic — the controller publishes feedback here every second. |
The FCR message has the following structure:
{
"time": 1714652046,
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"fields": {
"fcr": {
"active": true,
"capacity_kW": 100.0,
"start_time": 1714652046,
"end_time": 1714655646
},
"management": {
"setpoint_W": -5000.0,
"start_time": 1714652046,
"end_time": 1714655646
},
"test": {
"mode": "frequency_injection",
"ramp": {
"f_start_Hz": 50.0,
"f_target_Hz": 49.8,
"duration_s": 30.0,
"t_start": 1714652046
}
}
}
}
_site_0 for most Sofar EMS devices.fcr, management and test blocks below. Each block is optional; only include the ones that apply.Defines the actual FCR participation. This is the main block that determines whether the reserve is active and how the droop curve is scaled.
true, the controller responds to frequency deviations following the droop curve. When false, FCR is disabled and the controller does not react to the grid frequency.Applies an explicit power setpoint on top of, or in place of, the FCR response — for example to steer the battery's state of charge back into a workable range while participating in FCR.
Used to run a qualification or verification test on the installation. Only include this block when performing a test.
"frequency_injection": Simulate a frequency deviation by ramping the frequency signal, to verify the droop response. Requires the ramp object below."usable_energy": Verify the usable energy of the battery.mode is "frequency_injection". Describes the simulated frequency ramp:
mode is "usable_energy". The target state of charge, as a value from 20 to 100, that the battery should reach during the usable-energy test. The controller charges or discharges the battery towards this state of charge, measuring the energy transferred to verify the battery's usable energy.After a command is received on the incoming topic, the Sofar EMS publishes an acknowledgement on the ack topic. The acknowledgement reports whether the command was accepted and saved, or rejected. It comes in one of the following two formats.
When the command received:
{
"requestTime": "<Unix Timestamp>",
"time": "<Unix Timestamp>",
"siteNodeId": "<Controller SN>_site_0",
"data": {
"status": "accepted" or "rejected",
"error": "<error message>"
},
"fields": {}
}
time field of the command that was sent, allowing you to correlate the acknowledgement with the request.nodeId of the site sending the acknowledgement."accepted" when the command was received and saved, or "rejected" when it could not be applied.status is "rejected". Describes why the command was rejected.While FCR is running, the Sofar EMS publishes a feedback message on the feedback topic every second. This lets you monitor the live state of the installation and the FCR response in real time.
{
"time": "<Unix Timestamp>",
"siteNodeId": "<Controller SN>_site_0",
"data": {
"fcr_active": <bool>,
"frequency_Hz": <float>,
"actualPowerTot_W": <float>,
"setpoint_W": <float>,
"fcrSetpoint_W": <float>,
"managementSetpoint_W": <float>,
"min_soc_perc": <float>,
"max_soc_perc": <float>,
"soc_perc": <float>,
"droop_perc": <float>
}
}
nodeId of the site sending the feedback.fcrSetpoint_W and managementSetpoint_W below. A positive value charges the battery, a negative value discharges it.management charge/discharge signal, applied on top of the FCR response.