Victron VEConfigure .rvms and .rvsc configuration files without VEConfigure: format, checksum, settings table, editor.
People who are already responsible for configuring the Victron systems they work on: owners, installers, technicians, and integrators who today do this job in VEConfigure. The toolkit gives that person a scriptable, diffable, reviewable way to make the same settings edits. It does not give anyone access they did not have. Every file still travels through Victron’s authenticated Remote VEConfigure path on VRM, with the same account and permissions as before.
The library never uploads. It has no network code. It reads a file, writes a file, and tells you what it changed.
What we have done repeatedly on live systems without incident:
mk2vsc edit
does.--serial only when you mean a per-inverter value.mk2vsc diagnose --fix builds its corrected file through exactly these guards, plus one more: it writes
only the findings named with --accept, never a default. A value the file cannot supply is yours to
enter; the tool proposes no chemistry numbers of its own. The change sheet it prints is the same change
for VEConfigure, so declining the file costs nothing but typing. Bit-level writes touch one qualified
flag bit (the LithiumBattery bit); docs/DIAGNOSE.md says what qualifies a bit.Settings-only uploads did not reset the VE.Bus or interrupt loads on any of our uploads.
Removing an assistant, and reinstalling one from an earlier download of the same system, work by file
(mk2vsc assistant). Both produce upload-form files, and uploading one resets the VE.Bus: the inverters
stop for the duration, the tunnel is unresponsive for about five minutes afterwards, GX-based monitoring
shows the site disconnected and stale inverter states, and the dialog can end in an error although the
device completed. None of that is specific to this toolkit: an assistant change saved from VEConfigure’s
GUI and uploaded through VRM behaves the same way. Do it only with someone able to power-cycle the
inverters, the battery well charged and the reinstall file ready before the removal.
Installing an assistant on a system that never had one (a graft of another system’s records) is unproven, and the attempts produced: clean rejection before write (harmless); accepted then a 64-byte stub written and the payload discarded; accepted, install started, failed at the grid-code step with VE.Bus error 10 for about 17 minutes; accepted and stored byte-perfectly with the inverters never starting. A device-form removal attempt left a corrupt assistant program (VE.Bus error 6): device form is a settings write and cannot remove an assistant. docs/ASSISTANTS.md has the evidence table. The settings writer refuses to change block length, and the qualifier fails any file that carries the stub.
Fields below HIGH confidence. mk2vsc edit refuses them unless you pass
--allow-unverified. If you do, you are the first person to test that offset on hardware:
do it on a system you can watch, one field at a time, with the baseline ready.
Upload-form files. The GUI’s export form has a different layout after +0x45. The writer refuses upload-form input; edit a device download instead.
Absorption and float are the first thing most people want to change and the one edit that can damage hardware. Before writing them:
00_baseline/.Victron gates the grid code (country standard, loss-of-mains behaviour, feed-in) behind a password held by the dealer or distributor. That is their credential and their responsibility. This project does not attempt to reproduce, derive, or bypass it, and will not accept contributions that do.
In the file the grid code is setting 81, a settings block 129 to 189, and three words the firmware keeps
with it: 128 and 191, which VEConfigure names GridSettingsValidCheckerA/B and which are equal on each
inverter of every GUI-authored ESS download in the corpus and unequal on every never-started graft
(tests/test_claims.py), and 190. set_settings refuses all
of them (fields.GRID_CODE_LOCKED) and there is no override flag. Observed: on 2026-09-04 a live
System A, ESS running, grid code set, took a device-form file that changed only setting 191 from
0x0101 to 0xff00 on both inverters; the file was not refused before the reset began, the dialog ran
“Resetting VE.Bus products”, and within ten seconds every data source on its GX went silent and stayed
off VRM; three other systems on the same network path were unaffected. Whether the device refused the
file at commit, and whether the word caused the outage, are Unknown until that system’s next download
is read (docs/HISTORY.md, 2026-09-04 evening). The lock does not wait for the answers.
A grid code reaches a device through VEConfigure with the password, or by file only as a complete
device-authored block: a fresh download of the same system, or mk2vsc assistant remove/reinstall,
which write 81/128/190/191 as a set exactly as the device or the GUI last wrote them. That path has
never needed the password (docs/ASSISTANTS.md §8). mk2vsc experimental graft copies 190/191 from its
template and, with --install-state, sets 81 = 1 and 128 = 1 as well; it is gated, has never started a
system, and is the one path in the package that writes these words piecemeal.
In the order we have found to work:
mk2vsc validate and mk2vsc show on your own downloads for a while, read-only. Compare
absorption, float and the AC input limit with what VEConfigure or VRM shows.mk2vsc diff. Expect “ONLY BOOKKEEPING”. If you see
anything else, stop and open an issue with both files.