How to create GUIv2 UI Plugins - victronenergy/gui-v2 GitHub Wiki
NOTE: THIS IS NOT OFFICIALLY RELEASED FUNCTIONALITY; ITS PART OF A BIGGER PROJECT AND API MIGHT CHANGE.
This guide explains how to add custom GUIv2 QML pages to the GUIv2. Currently UI Plugins load only on the local GX display; WASM/browser support is planned.
- Add a GUIv2 UI Plugin by creating a small JSON file and QML pages inside your app folder on the device.
- Supported targets today:
- Settings -> Integrations (settings pages)
- Settings -> Devices -> (devicelist pages tied to a device ID)
- Venus OS v3.70~45 or newer.
- Venus OS root access
- Put your app in
/data/apps/available/<your-app>. - Create a subfolder
gui-v2in the app folder to hold the generated JSON file. - Put your QML pages anywhere under the app (commonly a folder like
gui-v2-source). - Use the helper script
gui-v2-plugin-compiler.py(on the device and in the GUIv2 repository) to generate the JSON file. - Copy the generated JSON into the
gui-v2folder and enable the app (symlink into/data/apps/enabled).
-
Folder layout on the GX device
- Example app name:
my-app - App root:
/data/apps/available/my-app - UI plugin file:
/data/apps/available/my-app/gui-v2 - QML source files (example):
/data/apps/available/my-app/gui-v2-source
- Example app name:
-
Create your QML pages
-
Generate the UI plugin JSON
-
SSH to the GX device and cd into your QML source folder:
cd /data/apps/available/my-app/gui-v2-source -
Run the plugin compiler script located in
/opt/victronenergy/gui-v2. -
Examples:
For device-list pages (pages shown for a specific device ID)
python3 /opt/victronenergy/gui-v2/gui-v2-plugin-compiler.py \ --name my-app \ --min-required-version v1.2.13 \ --devicelist 0x106 DeviceListExample_CellVoltages.qml 'Cell Voltages' \ --devicelist 0x106 DeviceListExample_CellTemperatures.qml 'Cell Temperatures' \ --devicelist 0x106 DeviceListExample_ComponentError.qml 'Invalid Customisation'
For settings pages (shown under
Settings -> Integrations)python3 /opt/victronenergy/gui-v2/gui-v2-plugin-compiler.py \ --name my-app \ --min-required-version v1.2.13 \ --settings SimpleExample_PageSettingsSimple.qml
-
The script outputs a JSON file named
<your-app>.json(e.g.my-app.json).
-
-
Install the UI plugin file
-
Copy the generated JSON to the
gui-v2folder:cp -f my-app.json /data/apps/available/my-app/gui-v2
-
-
Enable the app (make it visible to the system)
-
Create a symlink under
/data/apps/enabledthat points to/data/apps/available/<your-app>:ln -s /data/apps/available/my-app /data/apps/enabled/my-app
-
-
Check the GUI
- Settings -> Integrations shows the integration entry (if you added settings pages).
- Settings -> Devices -> will show any devicelist pages for the device ID(s) you registered.
- Note: If you only added devicelist pages, the integration navigation item may not be clickable — open pages under the matching device instead.
-
To disable the app again
-
Remove the symlink
rm /data/apps/enabled/my-app
-
- Use the correct device ID (hex) for devicelist pages (e.g.
0x106) - Set a sensible --min-required-version to prevent loading on incompatible GUI versions
- Test pages on the GX display (WASM/browser loading support is not yet available)
- Translatable strings are now also possible, check the example pages for more detailed information
- QML page examples: https://github.com/victronenergy/gui-v2/tree/main/examples
- QML item examples: https://github.com/victronenergy/gui-v2/blob/main/pages/settings/debug/PageSettingsDemo.qml