Fronius Symo / Primo GEN24 Plus
Status: Vendor Confirmed · Register points: 216 · Transports: Modbus TCP, Modbus RTU
A curated ModDef profile for the Fronius Symo / Primo GEN24 Plus. Import it as
fronius.gen24 or load the .moddef.yaml directly.
Connect to one over Web Serial and watch its values live in the device dashboard.
Usage
Load the profile, bind a transport, and read a point by name. The runtime applies the offset, scaling, byte order, and sentinels from the definition.
- Go
- TypeScript
- Rust
- Python
- C
- C++
doc, _ := moddef.Load("fronius-gen24.moddef.yaml")
dev, _ := client.New(doc, "fronius-gen24", transport) // your modbus.Transport
v, _ := dev.ReadPoint(ctx, "ac_current_total")
fmt.Println(v)
import {Device} from '@moddef/core';
import {loadDocument} from '@moddef/core/node';
const doc = await loadDocument('fronius-gen24.moddef.yaml');
const dev = Device.create(doc, 'fronius-gen24', transport);
console.log(await dev.readPoint('ac_current_total'));
let doc = moddef_core::load("fronius-gen24.moddef.yaml")?;
let mut dev = Device::new(&doc, Some("fronius-gen24"), transport)?;
let v = dev.read_point("ac_current_total").await?;
from moddef import Device, load
from moddef.pymodbus import Options, PymodbusTransport
doc = load("fronius-gen24.moddef.yaml")
transport = await PymodbusTransport.tcp("192.168.1.50", options=Options())
dev = Device.create(doc, "fronius-gen24", transport)
print(await dev.read_point("ac_current_total"))
md_doc_t doc;
md_doc_init(&doc, flash_ptr, flash_len); /* zero-copy view */
md_dev_t dev;
md_dev_init(&dev, &doc, MD_STR("fronius-gen24"), &transport);
md_value_t v;
md_dev_read(&dev, MD_STR("ac_current_total"), &v);
auto doc = moddef::Document::view(flash_bytes).value(); // zero-copy over flash
auto dev = moddef::Device::open(doc, "fronius-gen24", transport).value();
if (auto v = dev->read("ac_current_total"); v)
std::cout << v->to_string() << '\n';
Commands
Multi-step register procedures (spec §11.7)
this profile defines — write params, arm a trigger, poll for completion, then
read the result. Run one with your language's command executor (RunCommand,
runCommand, run_command, or md_cmd_begin/md_cmd_tick in C/C++).
set_power_limit — Start Active Power Limiting
Limit the inverter's active output power to a percentage of nominal and start the mode, following the numbered procedure in the operating instructions: write WMaxLimPct, optionally set the timing registers, then write 1 to WMaxLim_Ena. Re-running this command while the mode is already active is how you change the limit; the document says a new value only takes effect once WMaxLim_Ena is set to 1 again. limit_pct_raw is the raw register value, so apply WMaxLimPct_SF yourself (e.g. 3000 for 30 % at SF -2). Set win_tms and rvrt_tms to 0 for a change that applies immediately and stays until you stop it. The document marks them optional (step 2 of its procedure) but a command's steps are linear, so both are required here; 0 is the documented default.
Params
| Field | Type | Required |
|---|---|---|
limit_pct_raw | UINT32 | yes |
win_tms | UINT32 | yes |
rvrt_tms | UINT32 | yes |
Results
| Field | Type |
|---|---|
applied | DECIMAL |
enabled | UINT32 |
stop_power_limit — Stop Active Power Limiting
End active power limiting by writing 0 to WMaxLim_Ena. The inverter falls back to the next priority, e.g. dynamic power reduction.
Results
| Field | Type |
|---|---|
enabled | UINT32 |
set_power_factor — Start Constant Power Factor
Hold a constant output power factor and start the mode: write OutPFSet, optionally set the timing registers, then write 1 to OutPFSet_Ena. power_factor_raw is the raw register value, so apply OutPFSet_SF yourself. Set win_tms and rvrt_tms to 0 for a change that applies immediately and stays until you stop it. The document marks them optional (step 2 of its procedure) but a command's steps are linear, so both are required here; 0 is the documented default.
Params
| Field | Type | Required |
|---|---|---|
power_factor_raw | UINT32 | yes |
win_tms | UINT32 | yes |
rvrt_tms | UINT32 | yes |
Results
| Field | Type |
|---|---|
applied | DECIMAL |
enabled | UINT32 |
stop_power_factor — Stop Constant Power Factor
End constant power factor mode by writing 0 to OutPFSet_Ena.
Results
| Field | Type |
|---|---|
enabled | UINT32 |
set_reactive_power_limit — Start Constant Reactive Power
Hold a constant reactive power as a percentage and start the mode: write VArMaxPct, optionally set the timing registers, then write 1 to VArPct_Ena. var_pct_raw is the raw register value, so apply VArPct_SF yourself. Reactive power output is bounded by the inverter's maximum apparent power and its operating reactive-power limit, so the active power may be curtailed to make room. Set win_tms and rvrt_tms to 0 for a change that applies immediately and stays until you stop it. The document marks them optional (step 2 of its procedure) but a command's steps are linear, so both are required here; 0 is the documented default.
Params
| Field | Type | Required |
|---|---|---|
var_pct_raw | UINT32 | yes |
win_tms | UINT32 | yes |
rvrt_tms | UINT32 | yes |
Results
| Field | Type |
|---|---|
applied | DECIMAL |
enabled | UINT32 |
stop_reactive_power_limit — Stop Constant Reactive Power
End constant reactive power mode by writing 0 to VArPct_Ena.
Results
| Field | Type |
|---|---|
enabled | UINT32 |
connect — Connect (Resume Feed-In)
Bring the inverter out of standby into feeding operation. Sets the connect timing registers, then writes 1 to Conn. Set win_tms and rvrt_tms to 0 for a change that applies immediately and stays until you stop it. The document marks them optional (step 2 of its procedure) but a command's steps are linear, so both are required here; 0 is the documented default.
Params
| Field | Type | Required |
|---|---|---|
win_tms | UINT32 | yes |
rvrt_tms | UINT32 | yes |
Results
| Field | Type |
|---|---|
connected | UINT32 |
disconnect — Disconnect (Standby)
Put the inverter into standby so it stops feeding in. Sets the connect timing registers, then writes 0 to Conn. Set rvrt_tms to a non-zero number of seconds if you want the inverter to resume feeding in on its own; 0 means it stays in standby until you connect it again. Set win_tms and rvrt_tms to 0 for a change that applies immediately and stays until you stop it. The document marks them optional (step 2 of its procedure) but a command's steps are linear, so both are required here; 0 is the documented default.
Params
| Field | Type | Required |
|---|---|---|
win_tms | UINT32 | yes |
rvrt_tms | UINT32 | yes |
Results
| Field | Type |
|---|---|
connected | UINT32 |
Measurands
The 22 semantic quantities this device reports, each linked to the measurand catalog. Query a device by measurand instead of a raw point when you want portable code.
| Base quantity | Name | Unit | Description |
|---|---|---|---|
current | Current | A | RMS current; qualify with phase_ref / direction |
voltage | Voltage | V | RMS voltage; qualify with phase_ref (L1_N, L1_L2, ...) |
active_power | Active Power | W | Instantaneous real power |
apparent_power | Apparent Power | VA | Instantaneous apparent power |
reactive_power | Reactive Power | var | Instantaneous reactive power |
power_factor | Power Factor | 1 (ratio) | Ratio of real to apparent power (dimensionless) |
frequency | Frequency | Hz | Grid frequency |
energy_active | Active Energy | Wh | Cumulative active energy register |
energy_apparent | Apparent Energy | VAh | Cumulative apparent energy register |
energy_reactive | Reactive Energy | varh | Cumulative reactive energy register |
pv_current | PV Current | A | PV array / string current |
pv_voltage | PV Voltage | V | PV array / string voltage |
pv_power | PV Power | W | PV array / string power |
battery_voltage | Battery Voltage | V | Battery terminal voltage |
state_of_charge | State of Charge | % | Battery charge level |
charge_limit | Charge Limit | W | Maximum allowed charge power |
discharge_limit | Discharge Limit | W | Maximum allowed discharge power |
inverter_temperature | Inverter Temperature | degC | Inverter internal temperature |
temperature | Temperature | degC | Temperature; qualify with location (INTERNAL, EXTERNAL, ...) |
inverter_status | Inverter Status | undefined | Inverter operating state (enum) |
device_status | Device Status | undefined | Overall device operating status (enum) |
alarm_status | Alarm Status | undefined | Alarm state (enum or flag set) |
Source
- Profile:
solar-inverter/fronius-gen24/fronius-gen24.moddef.yaml - Register map: vendor documentation