Thats great to hear. I had the relay version so I used that. I got inspired by this and made temperature cards for all my devices in my rig. Wall of text incoming.
I ended up adding a few custom D-Bus temperature/status services on my Cerbo GX / Venus OS Large setup, mainly to improve thermal visibility in VRM/GX GUI.
1. MPPT internal temperature (The subject of this topic)
Service:
com.victronenergy.temperature.can_00
This one reads the internal temperature exposed by my Victron SmartSolar MPPT VE.Can charger. In my case it is a SmartSolar VE.Can 250/100 rev2.
Displayed value:
MPPT01 Temperature
actual MPPT internal charger temperature in °C
Notes:
This is a real internal temperature coming from the solar charger data. Relay control is disabled; the script is used only for monitoring.
2. Fronius powerstage temperature
Service:
com.victronenergy.temperature.fronius_powerstage
This one reads the Fronius inverter powerstage temperature using the Fronius Solar API archive endpoint:
GetArchiveData.cgi with channel Temperature_Powerstage
Displayed value:
Fronius Powerstage Temp: OK
actual Fronius powerstage temperature in °C
The script also queries realtime inverter data from:
GetInverterRealtimeData.cgi?DataCollection=CommonInverterData
and uses:
PAC
DeviceStatus.StatusCode
DeviceStatus.ErrorCode
The displayed card title changes depending on status:
Fronius Powerstage Temp: OK
Fronius Powerstage Temp: Offline
Fronius Powerstage Temp: Warning
Fronius Powerstage Temp: Critical
Logic used:
- temperature missing = Offline
- temperature 0°C and PAC 0 W = Offline
- known thermal/temperature-related Fronius error codes = Critical
- fallback warning/critical thresholds are used as a safety layer
- otherwise = OK
The temperature is real, but it comes from Fronius archive data, so the update interval is roughly the archive interval, about 5 minutes in my case.
3. Cerbo GX internal SoC/CPU temperature
Service:
com.victronenergy.temperature.cerbo_internal
This one reads the Linux thermal framework directly:
/sys/class/thermal/thermal_zone0/temp
Displayed value:
Cerbo Internal Temp: OK
actual Cerbo internal SoC/CPU temperature in °C
It also reads:
/sys/class/thermal/thermal_zone0/trip_point_*
/sys/class/thermal/cooling_device*/cur_state
/sys/class/thermal/cooling_device*/max_state
On my Cerbo GX, the exposed thermal data currently shows:
- passive trip point: 75°C
- critical trip point: 100°C
- cooling device:
cpufreq-cpu0
- cooling state:
0/6 when not throttling
The displayed card title changes depending on state:
Cerbo Internal Temp: OK
Cerbo Internal Temp: Warning
Cerbo Internal Temp: Throttling
Cerbo Internal Temp: Hot
Cerbo Internal Temp: Critical
Logic used:
- below passive trip and cooling state 0 = OK
- above passive trip = Warning
- cooling state > 0 = Throttling
- above hot/critical trip points = Hot/Critical
This is not ambient room temperature. It is the internal Cerbo SoC/CPU temperature.
4. MultiPlus-II L1/L2/L3 thermal status
Services:
com.victronenergy.temperature.multi_l1
com.victronenergy.temperature.multi_l2
com.victronenergy.temperature.multi_l3
I have a three-phase Victron system with three MultiPlus-II units, so I created one virtual card per phase/unit.
Important note:
I could not find any actual internal MultiPlus temperature in °C exposed on D-Bus. The following paths are empty on my system:
/BatterySense/Temperature
/Dc/0/Temperature
So these cards do not currently show a real internal MultiPlus temperature. Instead, they show a thermal status derived from VE.Bus flags.
Current displayed value:
Multi L1 Thermal: OK
Multi L2 Thermal: OK
Multi L3 Thermal: OK
At the moment /Temperature is used as a numeric status value:
- 0 = OK
- 1 = Warning
- 2 = Critical
The important part is the card title, which changes based on flags.
Variables used:
/Alarms/L1/HighTemperature
/Alarms/L2/HighTemperature
/Alarms/L3/HighTemperature
/Alarms/HighTemperature
/Hub4/L1/CurrentLimitedDueToHighTemp
/Hub4/L2/CurrentLimitedDueToHighTemp
/Hub4/L3/CurrentLimitedDueToHighTemp
/Devices/0/ExtendStatus/TemperatureHighForceBypass
/Devices/1/ExtendStatus/TemperatureHighForceBypass
/Devices/2/ExtendStatus/TemperatureHighForceBypass
/Devices/0/ExtendStatus/PowerPackPreOverload
/Devices/1/ExtendStatus/PowerPackPreOverload
/Devices/2/ExtendStatus/PowerPackPreOverload
/Leds/Temperature
Logic used:
- no flags active = OK
- current limited due to high temperature = Warning
- temperature high force bypass = Warning
- powerpack pre-overload = Warning
- temperature LED active = Warning
- high temperature alarm = Critical
Future plan:
I will probably add three Victron temperature sensors at the exhaust of the three MultiPlus-II units. Once those are installed, I plan to modify the virtual Multi thermal cards so that:
/Temperature = real exhaust temperature from the physical sensor
/CustomName = thermal status based on VE.Bus flags
So the final result would look like:
Multi L1 Thermal: OK
42.3 °C
or:
Multi L2 Thermal: Warning
58.1 °C
This would combine real measured exhaust temperature with the internal VE.Bus thermal/derating flags.
All scripts are stored under /data and are started as runit services via /service, with /data/rc.local recreating the service symlinks after reboot or firmware update.