Now that we have our homelab hardware sorted and Proxmox installed, it is not a bad idea to keep an eye on CPU temperature seeing as we will probably (hopefully) keep the machine powered on 24/7. And if we can put our thermal monitoring somewhere we see often, we will also be able to start gauging which virtual machines and which containers are causing thermals to rise. This way we can manage our main homelab node more easily. Yes, we can set up automated notifications when our thermals hit a specific state, but that is out of the scope for today - today we are going to set everything up and get it displayed on the main node summary page. Let's get cracking.

Screenshot and version note: These screenshots were accurate for the setup at the time of writing: Proxmox VE 8.3 and a four-core Intel Core i7-2600K. They are retained as a record of that working setup. Proxmox VE 9 uses Debian 13 (Trixie), and newer releases may have different screens and internal code. The dashboard-file changes below are a historical walkthrough, not a verified procedure for every newer version. The added compatibility and backup notes explain what to check before following it on your own machine. Check the official Proxmox version guidance for your release.


Step 1 - Getting the package installed

For us to be able to read the current thermal state, we need to first get the Linux package lm-sensors, which provides the sensors command, installed on the Proxmox main node. To do that, we will first need to access our Proxmox machine again, on the URL we set up in the previous article when we installed Proxmox, so navigate to https://<your-proxmox-ip>:8006 (for example, https://192.168.1.2:8006). Log in and expand the Datacenter node in the left pane. Select the Proxmox server node. In the middle action pane, select Shell. This will open an integrated shell terminal window you can use to run commands on your Proxmox node. Run the following command:

apt-get install lm-sensors

Follow the on-screen prompts and make sure it installs correctly. To test it, run sensors. This displays the readings available from the detected sensors; the labels and number of readings depend on your hardware. Our screenshot below shows Core 0, Core 1, Core 2 and Core 3 for the four physical CPU cores. Check your own output before continuing; if those four lines are missing, do not paste the later four-core display code unchanged.


Step 2 - Set up Proxmox Main Files

Added prerequisite note (before editing either file): The screenshots show the original sequence; the backup and compatibility checks here are extra written guidance and are not pictured. This method manually changes Proxmox's own dashboard files. It assumes the photographed VE 8.3 layout and four Intel core readings. Confirm that your files have the same surrounding code and that sensors shows all four expected core lines before proceeding. If either check differs, stop here; you can still read temperatures in the shell without changing the dashboard.

Back up both files in the Proxmox node shell, not inside a virtual machine or container, before running the edit commands below. Keep a working SSH connection or local console available so you can recover if the web interface stops loading. These copies cover the two edited files, not your whole host or virtual machines. Keep them associated with the installed package version, and use fresh backup names if the .bak files already exist:

cp /usr/share/perl5/PVE/API2/Nodes.pm ~/Nodes.pm.bak
cp /usr/share/pve-manager/js/pvemanagerlib.js ~/pvemanagerlib.js.bak

If the modification breaks the interface before any package upgrade, use a working SSH or local console to restore those copies to the same paths, then restart pveproxy using the command shown in Step 3 below. A browser refresh can clear stale JavaScript, but cannot repair a syntax error. Inspect the service log if access still fails. Keep an independent console available before editing the dashboard used to manage the host.

Now we need to make the output of sensors available to the dashboard. We will add it to the node-status response under a field called thermalstate. To do this, we edit the Perl API file Nodes.pm. Run the following commands:

cd /usr/share/perl5/PVE/API2
nano Nodes.pm

This will open the configuration file that we need to edit. We need to add specific code, but first we need to find the place where we need to add it. Press F6 (this is a search command). In the bottom of the screen, you will see the search bar open. Type $dinfo and press Enter to search. We need to add the following line just above the search result line:

$res->{thermalstate} = `sensors`;

Please note, the character is not the normal single quote (') but rather the backtick (`) character. In Perl, backticks execute sensors and capture its output; ordinary single quotes would produce the literal word instead of the sensor readings. See below screenshot as to how the file should look:

To save the changes, press Ctrl+S, and to exit, press Ctrl+X. When in doubt, check the shortcut keys at the bottom of the window for reference. You should now be back in the original terminal window where we can run more commands. Don't navigate away yet as we still have one more thing to do before we can enjoy the thermal information.


Step 3 - Add a display to the main summary screen

Now that we have a new variable called thermalstate that contains the output of running the sensors command, we can add this information to our main home screen for the node. For this we need to edit the Summary layout page template. So again we need to navigate to a directory where this config file is, and then edit the relevant file. Run the following two commands:

cd /usr/share/pve-manager/js/
nano pvemanagerlib.js

Firstly we need to give ourselves some space to add the information, so press F6 and search for widget.pveNodeStatus . We need to change the height to 360 and the bodyPadding to 20 15 20 15. See screenshot below:

Don't close yet, we again need to get to a specific part of the document, so press F6 again and search for itemId: 'version' (note that those are normal single quotes, we are searching for the item with the literal name version). This will bring us to the section of code before which we need to add our new item. This is what you will get:

//INSERT OUR NEW CODE HERE
{
       itemId: 'version',
       colspan: 2,
       printBar: false,
       title: gettext('Manager Version'),
       textField: 'pveversion',
       value: '',
},

Compatibility note for the original display code: The block below keeps the four-core Intel example shown in the VE 8.3 walkthrough. It expects a text value containing all four core labels and their temperatures. If a reading is absent, the matching code can fail and prevent this dashboard item from rendering. An AMD CPU, a different number of cores or a newer Proxmox layout needs a separately adapted and tested version; simply changing the visible labels is not enough. A newer version should handle missing readings by displaying an unavailable message instead of causing an error. Such a replacement would need testing on the target CPU and Proxmox version, with matching new screenshots, before being presented as an installation procedure here. The original screenshots remain accurate documentation of the original setup.

Everything between the opening { and closing } defines one item to display on the summary page. Add the following block before the item shown above:

{
       itemId: 'thermal',
       colspan: 2,
       printBar: false,
       title: gettext('CPU Thermal State'),
       textField: 'thermalstate',
       renderer:function(value){
           const c0 = value.match(/Core 0.*?\+([\d\.]+)/)[1];
           const c1 = value.match(/Core 1.*?\+([\d\.]+)/)[1];
           const c2 = value.match(/Core 2.*?\+([\d\.]+)/)[1];
           const c3 = value.match(/Core 3.*?\+([\d\.]+)/)[1];
           return `Core 0: ${c0} | Core 1: ${c1} | Core 2: ${c2} | Core 3: ${c3}`;
       }
},

Code and screenshot difference: The original screenshot includes an  character in the temperature-matching expressions. It records the setup at the time of writing. The written code above already omits that text-encoding artefact: it extracts the number after the plus sign on the Intel Core 0 through Core 3 lines and stops before the degree symbol.  is not a required control character. Keep this difference in mind when comparing the text with the photograph; the written example still requires all four core readings.

Note also the return line has backtick characters again instead of single quotes. If you use normal single quotes, you will see the literal text ${c0} instead of the actual temperature.

Once done, again press Ctrl+S and then Ctrl+X. To refresh the display we need to run the following command:

systemctl restart pveproxy

You can now safely navigate to the Summary node again in the middle navigation pane. If you do not see the new text, close your browser and log in again, or just press Ctrl+F5.

You should see the new display on your summary page:

Proxmox with Temperature Sensor

After the Walkthrough: Updates and Sensor Compatibility

The backup and recovery instructions are now before Step 2 so you can prepare before making changes. The original screenshots are unchanged. The following notes explain the ongoing maintenance this manual dashboard change needs.

Package updates can replace these files. After an update, inspect the new files and repeat the comparison rather than copying an old complete file over a new package version. Exporter-based monitoring in Parts 13 and 14 avoids editing this particular UI, but it still needs maintenance and compatible metrics. It is not an update-proof promise.

AMD and storage-device temperatures need their own labels and a renderer that handles absent readings. The photographed Intel values are preserved here; they are not universal alarm thresholds. Check the CPU/device specifications and compare idle and loaded readings on your own system before deciding when to investigate cooling.

Further reading: Linux coretemp driver and the Debian manual for the sensors command.

Conclusion

In summary, CPU temperature monitoring in Proxmox can help you spot cooling problems while managing your homelab. It does not by itself ensure optimal hardware operation. By installing the necessary package, modifying system files, and integrating thermal data into the summary page, you can easily keep an eye on temperature fluctuations. This allows for better resource management and proactive maintenance. While automation for alerts is beyond today's scope, this setup provides a solid foundation for monitoring your system in real-time. Now, you can stay informed about your homelab’s thermal state at a glance!