Parse outpout of 'sensors --label-map' to customize labels - #576

Draft
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map
Draft

Parse outpout of 'sensors --label-map' to customize labels#576
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map

Conversation

@remiberthoz

@remiberthozremiberthoz commented Aug 3, 2026

Copy link
Copy Markdown

This draft PR assumes merging of another PR over at lm-sensors: lm-sensors/lm-sensors#577. The change is functional with my fork of lm-sensors: https://github.com/remiberthoz/lm-sensors/tree/reflection also it would need path adjustments for the fork on line 356 and 357.

It makes configuration of labels for temperature, fan, PWM and voltage sensors adjustable via /etc/sensors.conf, /etc/sensors3.conf or /etc/sensors.d/. It also masks sensors that are ignored by this configuration files.

image

--label-map parameter to 'sensors' is not implemented in the
official sensors program, but available at this fork:
https://github.com/remiberthoz/lm-sensors
@corecoding

Copy link
Copy Markdown
Owner

Launching a subprocess is very risky. It's why I was so slow to adopt GPU stats. It is so easy to cause system stutter. I think the right course of action here is to add /etc/sensors3.conf parsing directly into Vitals. We actually talk about it in issue #83. Hoping that Vitals has permission to read this file with no special permissions.

This would be a one time load of the file and stored in memory. I know that this file supports other things like thresholds and conversions, but for now labels would be nice. The goal is to keep the changes as minimal as possible. Please note that I've pushed some changes to both develop and main that you'll want to use.

@remiberthoz

Copy link
Copy Markdown
Author

Thank you for the feedback. I agree that issuing a subprocess command is not great. It's possible to do asynchronously, that would be better. I'll follow your lead anyway.

I have tested parsing of /etc/sensors3.conf, for labels only it's straightforward. My problem is that I don't know how to link a "chip" from that configuration file to a "device" in the hwmon sysfs tree.

I will take care of merging your commits to my branch. Thanks again.

@corecoding

Copy link
Copy Markdown
Owner

I created a branch called feature/sensors3 - unfortunately I don't have a machine with matching chipsets to try it out. Can you check it out?

@remiberthoz

Copy link
Copy Markdown
Author

Yes! I currently have issues with the version of your latest commits (ad47fdd): most entries report "No Data", but voltages labels are correctly reported alongside chip names:
image

I will attempt to identify the origin of the problem for other sensors and report here.

@remiberthoz

remiberthoz commented Aug 9, 2026

Copy link
Copy Markdown
Author

My bad. I forgot to recompile the updated schemas. I get correct readings for some but not all chips.

This snippet of configuration is parsed and reported:

chip "nct6798-*"
label temp1 "Motherboard" # SYSTIN
label temp2 "CPU Socket" # CPUTIN ; responds to cpu stress
label temp8 "CPU via PECI" # PECI Agent 0 ; mirrors CPU
label temp9 "CPU via PECI (cal)" # PECI Agent 0 ; mirrors CPU ; calibration signal (not sure of meaning)
label temp3 "VRM" # AUXTIN0 ; responds to cpu stress
label temp6 "Chipset" # AUXTIN3
ignore temp4 # AUXTIN1 ; always reports +4°C
ignore temp5 # AUXTIN2 ; always reports +127°C
ignore temp7 # AUXTIN4 ; mostly reports +127°C
ignore temp10 # PCH_CHIP_CPU_MAX_TEMP ; always reports 0°C
ignore temp11 # PCH_CHIP_TEMP ; always reports 0°C
ignore temp12 # PCH_CPU_TEMP ; always reports 0°C
image

But this one is not:

chip "nvme-pci-0200"
ignore temp1 # virtual anyway
set temp1_max 70
label temp2 "NVME SSD NAND memory cells"
set temp2_max 75
label temp3 "NVME SSD ASIC controller"
set temp3_max 65
bus "i2c-3" "SMBus I801 adapter at 0000:00:1f.4"
chip "spd5118-i2c-3-51"
label temp1 "RAM stick A2"
chip "spd5118-i2c-3-53"
label temp1 "RAM stick B2"
image

I suspect the bus specifications are the cause, I will investigate.

@remiberthoz

Copy link
Copy Markdown
Author

Well yes, the issue is due to the explicit chip "spd5118-i2c-3-51"/chip "spd5118-i2c-3-53" in my configuration. With the bus specified, chipPatternMatches will test the unspecific value spd5118-*-* against the specific pattern ^spd5118-i2c-3-51$ and they will not match.


I can unspecify the buses in the configuration by setting:

chip "spd5118-*"
label temp1 "RAM stick"

and I then get reports of RAM stick and RAM stick 2 with Vitals; but I loose mapping to the motherboard socket labels.


Releasing constraints on the mapping performed by chipPatternMatches (i.e. stripping bus specifications on the chip name patterns spd5118-i2c-3-51 => spd5118-*-* by using an advanced version of

if (!block.patterns.some(p => chipPatternMatches(p.split("-")[0], chipName))) {
^^^^^^^^^^^^^

on line 142) leads to a similar result, while allowing users to preserve details in their configuration.

The issue would only really appear when very different sensors share a same name: I don't really mind two RAM sticks being indistinguishable, but problems appear if that was two GPUs, two NVMes, or even devices of different kinds.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@remiberthoz@corecoding
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Parse outpout of 'sensors --label-map' to customize labels - #576

Draft
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map
Draft

Parse outpout of 'sensors --label-map' to customize labels#576
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map

Conversation

@remiberthoz

@remiberthozremiberthoz commented Aug 3, 2026

Copy link
Copy Markdown

This draft PR assumes merging of another PR over at lm-sensors: lm-sensors/lm-sensors#577. The change is functional with my fork of lm-sensors: https://github.com/remiberthoz/lm-sensors/tree/reflection also it would need path adjustments for the fork on line 356 and 357.

It makes configuration of labels for temperature, fan, PWM and voltage sensors adjustable via /etc/sensors.conf, /etc/sensors3.conf or /etc/sensors.d/. It also masks sensors that are ignored by this configuration files.

image

--label-map parameter to 'sensors' is not implemented in the
official sensors program, but available at this fork:
https://github.com/remiberthoz/lm-sensors
@corecoding

Copy link
Copy Markdown
Owner

Launching a subprocess is very risky. It's why I was so slow to adopt GPU stats. It is so easy to cause system stutter. I think the right course of action here is to add /etc/sensors3.conf parsing directly into Vitals. We actually talk about it in issue #83. Hoping that Vitals has permission to read this file with no special permissions.

This would be a one time load of the file and stored in memory. I know that this file supports other things like thresholds and conversions, but for now labels would be nice. The goal is to keep the changes as minimal as possible. Please note that I've pushed some changes to both develop and main that you'll want to use.

@remiberthoz

Copy link
Copy Markdown
Author

Thank you for the feedback. I agree that issuing a subprocess command is not great. It's possible to do asynchronously, that would be better. I'll follow your lead anyway.

I have tested parsing of /etc/sensors3.conf, for labels only it's straightforward. My problem is that I don't know how to link a "chip" from that configuration file to a "device" in the hwmon sysfs tree.

I will take care of merging your commits to my branch. Thanks again.

@corecoding

Copy link
Copy Markdown
Owner

I created a branch called feature/sensors3 - unfortunately I don't have a machine with matching chipsets to try it out. Can you check it out?

@remiberthoz

Copy link
Copy Markdown
Author

Yes! I currently have issues with the version of your latest commits (ad47fdd): most entries report "No Data", but voltages labels are correctly reported alongside chip names:
image

I will attempt to identify the origin of the problem for other sensors and report here.

@remiberthoz

remiberthoz commented Aug 9, 2026

Copy link
Copy Markdown
Author

My bad. I forgot to recompile the updated schemas. I get correct readings for some but not all chips.

This snippet of configuration is parsed and reported:

chip "nct6798-*"
label temp1 "Motherboard" # SYSTIN
label temp2 "CPU Socket" # CPUTIN ; responds to cpu stress
label temp8 "CPU via PECI" # PECI Agent 0 ; mirrors CPU
label temp9 "CPU via PECI (cal)" # PECI Agent 0 ; mirrors CPU ; calibration signal (not sure of meaning)
label temp3 "VRM" # AUXTIN0 ; responds to cpu stress
label temp6 "Chipset" # AUXTIN3
ignore temp4 # AUXTIN1 ; always reports +4°C
ignore temp5 # AUXTIN2 ; always reports +127°C
ignore temp7 # AUXTIN4 ; mostly reports +127°C
ignore temp10 # PCH_CHIP_CPU_MAX_TEMP ; always reports 0°C
ignore temp11 # PCH_CHIP_TEMP ; always reports 0°C
ignore temp12 # PCH_CPU_TEMP ; always reports 0°C
image

But this one is not:

chip "nvme-pci-0200"
ignore temp1 # virtual anyway
set temp1_max 70
label temp2 "NVME SSD NAND memory cells"
set temp2_max 75
label temp3 "NVME SSD ASIC controller"
set temp3_max 65
bus "i2c-3" "SMBus I801 adapter at 0000:00:1f.4"
chip "spd5118-i2c-3-51"
label temp1 "RAM stick A2"
chip "spd5118-i2c-3-53"
label temp1 "RAM stick B2"
image

I suspect the bus specifications are the cause, I will investigate.

@remiberthoz

Copy link
Copy Markdown
Author

Well yes, the issue is due to the explicit chip "spd5118-i2c-3-51"/chip "spd5118-i2c-3-53" in my configuration. With the bus specified, chipPatternMatches will test the unspecific value spd5118-*-* against the specific pattern ^spd5118-i2c-3-51$ and they will not match.


I can unspecify the buses in the configuration by setting:

chip "spd5118-*"
label temp1 "RAM stick"

and I then get reports of RAM stick and RAM stick 2 with Vitals; but I loose mapping to the motherboard socket labels.


Releasing constraints on the mapping performed by chipPatternMatches (i.e. stripping bus specifications on the chip name patterns spd5118-i2c-3-51 => spd5118-*-* by using an advanced version of

if (!block.patterns.some(p => chipPatternMatches(p.split("-")[0], chipName))) {
^^^^^^^^^^^^^

on line 142) leads to a similar result, while allowing users to preserve details in their configuration.

The issue would only really appear when very different sensors share a same name: I don't really mind two RAM sticks being indistinguishable, but problems appear if that was two GPUs, two NVMes, or even devices of different kinds.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@remiberthoz@corecoding
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Parse outpout of 'sensors --label-map' to customize labels - #576

Draft
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map
Draft

Parse outpout of 'sensors --label-map' to customize labels#576
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map

Conversation

@remiberthoz

@remiberthozremiberthoz commented Aug 3, 2026

Copy link
Copy Markdown

This draft PR assumes merging of another PR over at lm-sensors: lm-sensors/lm-sensors#577. The change is functional with my fork of lm-sensors: https://github.com/remiberthoz/lm-sensors/tree/reflection also it would need path adjustments for the fork on line 356 and 357.

It makes configuration of labels for temperature, fan, PWM and voltage sensors adjustable via /etc/sensors.conf, /etc/sensors3.conf or /etc/sensors.d/. It also masks sensors that are ignored by this configuration files.

image

--label-map parameter to 'sensors' is not implemented in the
official sensors program, but available at this fork:
https://github.com/remiberthoz/lm-sensors
@corecoding

Copy link
Copy Markdown
Owner

Launching a subprocess is very risky. It's why I was so slow to adopt GPU stats. It is so easy to cause system stutter. I think the right course of action here is to add /etc/sensors3.conf parsing directly into Vitals. We actually talk about it in issue #83. Hoping that Vitals has permission to read this file with no special permissions.

This would be a one time load of the file and stored in memory. I know that this file supports other things like thresholds and conversions, but for now labels would be nice. The goal is to keep the changes as minimal as possible. Please note that I've pushed some changes to both develop and main that you'll want to use.

@remiberthoz

Copy link
Copy Markdown
Author

Thank you for the feedback. I agree that issuing a subprocess command is not great. It's possible to do asynchronously, that would be better. I'll follow your lead anyway.

I have tested parsing of /etc/sensors3.conf, for labels only it's straightforward. My problem is that I don't know how to link a "chip" from that configuration file to a "device" in the hwmon sysfs tree.

I will take care of merging your commits to my branch. Thanks again.

@corecoding

Copy link
Copy Markdown
Owner

I created a branch called feature/sensors3 - unfortunately I don't have a machine with matching chipsets to try it out. Can you check it out?

@remiberthoz

Copy link
Copy Markdown
Author

Yes! I currently have issues with the version of your latest commits (ad47fdd): most entries report "No Data", but voltages labels are correctly reported alongside chip names:
image

I will attempt to identify the origin of the problem for other sensors and report here.

@remiberthoz

remiberthoz commented Aug 9, 2026

Copy link
Copy Markdown
Author

My bad. I forgot to recompile the updated schemas. I get correct readings for some but not all chips.

This snippet of configuration is parsed and reported:

chip "nct6798-*"
label temp1 "Motherboard" # SYSTIN
label temp2 "CPU Socket" # CPUTIN ; responds to cpu stress
label temp8 "CPU via PECI" # PECI Agent 0 ; mirrors CPU
label temp9 "CPU via PECI (cal)" # PECI Agent 0 ; mirrors CPU ; calibration signal (not sure of meaning)
label temp3 "VRM" # AUXTIN0 ; responds to cpu stress
label temp6 "Chipset" # AUXTIN3
ignore temp4 # AUXTIN1 ; always reports +4°C
ignore temp5 # AUXTIN2 ; always reports +127°C
ignore temp7 # AUXTIN4 ; mostly reports +127°C
ignore temp10 # PCH_CHIP_CPU_MAX_TEMP ; always reports 0°C
ignore temp11 # PCH_CHIP_TEMP ; always reports 0°C
ignore temp12 # PCH_CPU_TEMP ; always reports 0°C
image

But this one is not:

chip "nvme-pci-0200"
ignore temp1 # virtual anyway
set temp1_max 70
label temp2 "NVME SSD NAND memory cells"
set temp2_max 75
label temp3 "NVME SSD ASIC controller"
set temp3_max 65
bus "i2c-3" "SMBus I801 adapter at 0000:00:1f.4"
chip "spd5118-i2c-3-51"
label temp1 "RAM stick A2"
chip "spd5118-i2c-3-53"
label temp1 "RAM stick B2"
image

I suspect the bus specifications are the cause, I will investigate.

@remiberthoz

Copy link
Copy Markdown
Author

Well yes, the issue is due to the explicit chip "spd5118-i2c-3-51"/chip "spd5118-i2c-3-53" in my configuration. With the bus specified, chipPatternMatches will test the unspecific value spd5118-*-* against the specific pattern ^spd5118-i2c-3-51$ and they will not match.


I can unspecify the buses in the configuration by setting:

chip "spd5118-*"
label temp1 "RAM stick"

and I then get reports of RAM stick and RAM stick 2 with Vitals; but I loose mapping to the motherboard socket labels.


Releasing constraints on the mapping performed by chipPatternMatches (i.e. stripping bus specifications on the chip name patterns spd5118-i2c-3-51 => spd5118-*-* by using an advanced version of

if (!block.patterns.some(p => chipPatternMatches(p.split("-")[0], chipName))) {
^^^^^^^^^^^^^

on line 142) leads to a similar result, while allowing users to preserve details in their configuration.

The issue would only really appear when very different sensors share a same name: I don't really mind two RAM sticks being indistinguishable, but problems appear if that was two GPUs, two NVMes, or even devices of different kinds.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@remiberthoz@corecoding
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Parse outpout of 'sensors --label-map' to customize labels - #576

Draft
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map
Draft

Parse outpout of 'sensors --label-map' to customize labels#576
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map

Conversation

@remiberthoz

@remiberthozremiberthoz commented Aug 3, 2026

Copy link
Copy Markdown

This draft PR assumes merging of another PR over at lm-sensors: lm-sensors/lm-sensors#577. The change is functional with my fork of lm-sensors: https://github.com/remiberthoz/lm-sensors/tree/reflection also it would need path adjustments for the fork on line 356 and 357.

It makes configuration of labels for temperature, fan, PWM and voltage sensors adjustable via /etc/sensors.conf, /etc/sensors3.conf or /etc/sensors.d/. It also masks sensors that are ignored by this configuration files.

image

--label-map parameter to 'sensors' is not implemented in the
official sensors program, but available at this fork:
https://github.com/remiberthoz/lm-sensors
@corecoding

Copy link
Copy Markdown
Owner

Launching a subprocess is very risky. It's why I was so slow to adopt GPU stats. It is so easy to cause system stutter. I think the right course of action here is to add /etc/sensors3.conf parsing directly into Vitals. We actually talk about it in issue #83. Hoping that Vitals has permission to read this file with no special permissions.

This would be a one time load of the file and stored in memory. I know that this file supports other things like thresholds and conversions, but for now labels would be nice. The goal is to keep the changes as minimal as possible. Please note that I've pushed some changes to both develop and main that you'll want to use.

@remiberthoz

Copy link
Copy Markdown
Author

Thank you for the feedback. I agree that issuing a subprocess command is not great. It's possible to do asynchronously, that would be better. I'll follow your lead anyway.

I have tested parsing of /etc/sensors3.conf, for labels only it's straightforward. My problem is that I don't know how to link a "chip" from that configuration file to a "device" in the hwmon sysfs tree.

I will take care of merging your commits to my branch. Thanks again.

@corecoding

Copy link
Copy Markdown
Owner

I created a branch called feature/sensors3 - unfortunately I don't have a machine with matching chipsets to try it out. Can you check it out?

@remiberthoz

Copy link
Copy Markdown
Author

Yes! I currently have issues with the version of your latest commits (ad47fdd): most entries report "No Data", but voltages labels are correctly reported alongside chip names:
image

I will attempt to identify the origin of the problem for other sensors and report here.

@remiberthoz

remiberthoz commented Aug 9, 2026

Copy link
Copy Markdown
Author

My bad. I forgot to recompile the updated schemas. I get correct readings for some but not all chips.

This snippet of configuration is parsed and reported:

chip "nct6798-*"
label temp1 "Motherboard" # SYSTIN
label temp2 "CPU Socket" # CPUTIN ; responds to cpu stress
label temp8 "CPU via PECI" # PECI Agent 0 ; mirrors CPU
label temp9 "CPU via PECI (cal)" # PECI Agent 0 ; mirrors CPU ; calibration signal (not sure of meaning)
label temp3 "VRM" # AUXTIN0 ; responds to cpu stress
label temp6 "Chipset" # AUXTIN3
ignore temp4 # AUXTIN1 ; always reports +4°C
ignore temp5 # AUXTIN2 ; always reports +127°C
ignore temp7 # AUXTIN4 ; mostly reports +127°C
ignore temp10 # PCH_CHIP_CPU_MAX_TEMP ; always reports 0°C
ignore temp11 # PCH_CHIP_TEMP ; always reports 0°C
ignore temp12 # PCH_CPU_TEMP ; always reports 0°C
image

But this one is not:

chip "nvme-pci-0200"
ignore temp1 # virtual anyway
set temp1_max 70
label temp2 "NVME SSD NAND memory cells"
set temp2_max 75
label temp3 "NVME SSD ASIC controller"
set temp3_max 65
bus "i2c-3" "SMBus I801 adapter at 0000:00:1f.4"
chip "spd5118-i2c-3-51"
label temp1 "RAM stick A2"
chip "spd5118-i2c-3-53"
label temp1 "RAM stick B2"
image

I suspect the bus specifications are the cause, I will investigate.

@remiberthoz

Copy link
Copy Markdown
Author

Well yes, the issue is due to the explicit chip "spd5118-i2c-3-51"/chip "spd5118-i2c-3-53" in my configuration. With the bus specified, chipPatternMatches will test the unspecific value spd5118-*-* against the specific pattern ^spd5118-i2c-3-51$ and they will not match.


I can unspecify the buses in the configuration by setting:

chip "spd5118-*"
label temp1 "RAM stick"

and I then get reports of RAM stick and RAM stick 2 with Vitals; but I loose mapping to the motherboard socket labels.


Releasing constraints on the mapping performed by chipPatternMatches (i.e. stripping bus specifications on the chip name patterns spd5118-i2c-3-51 => spd5118-*-* by using an advanced version of

if (!block.patterns.some(p => chipPatternMatches(p.split("-")[0], chipName))) {
^^^^^^^^^^^^^

on line 142) leads to a similar result, while allowing users to preserve details in their configuration.

The issue would only really appear when very different sensors share a same name: I don't really mind two RAM sticks being indistinguishable, but problems appear if that was two GPUs, two NVMes, or even devices of different kinds.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@remiberthoz@corecoding
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Parse outpout of 'sensors --label-map' to customize labels - #576

Draft
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map
Draft

Parse outpout of 'sensors --label-map' to customize labels#576
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map

Conversation

@remiberthoz

@remiberthozremiberthoz commented Aug 3, 2026

Copy link
Copy Markdown

This draft PR assumes merging of another PR over at lm-sensors: lm-sensors/lm-sensors#577. The change is functional with my fork of lm-sensors: https://github.com/remiberthoz/lm-sensors/tree/reflection also it would need path adjustments for the fork on line 356 and 357.

It makes configuration of labels for temperature, fan, PWM and voltage sensors adjustable via /etc/sensors.conf, /etc/sensors3.conf or /etc/sensors.d/. It also masks sensors that are ignored by this configuration files.

image

--label-map parameter to 'sensors' is not implemented in the
official sensors program, but available at this fork:
https://github.com/remiberthoz/lm-sensors
@corecoding

Copy link
Copy Markdown
Owner

Launching a subprocess is very risky. It's why I was so slow to adopt GPU stats. It is so easy to cause system stutter. I think the right course of action here is to add /etc/sensors3.conf parsing directly into Vitals. We actually talk about it in issue #83. Hoping that Vitals has permission to read this file with no special permissions.

This would be a one time load of the file and stored in memory. I know that this file supports other things like thresholds and conversions, but for now labels would be nice. The goal is to keep the changes as minimal as possible. Please note that I've pushed some changes to both develop and main that you'll want to use.

@remiberthoz

Copy link
Copy Markdown
Author

Thank you for the feedback. I agree that issuing a subprocess command is not great. It's possible to do asynchronously, that would be better. I'll follow your lead anyway.

I have tested parsing of /etc/sensors3.conf, for labels only it's straightforward. My problem is that I don't know how to link a "chip" from that configuration file to a "device" in the hwmon sysfs tree.

I will take care of merging your commits to my branch. Thanks again.

@corecoding

Copy link
Copy Markdown
Owner

I created a branch called feature/sensors3 - unfortunately I don't have a machine with matching chipsets to try it out. Can you check it out?

@remiberthoz

Copy link
Copy Markdown
Author

Yes! I currently have issues with the version of your latest commits (ad47fdd): most entries report "No Data", but voltages labels are correctly reported alongside chip names:
image

I will attempt to identify the origin of the problem for other sensors and report here.

@remiberthoz

remiberthoz commented Aug 9, 2026

Copy link
Copy Markdown
Author

My bad. I forgot to recompile the updated schemas. I get correct readings for some but not all chips.

This snippet of configuration is parsed and reported:

chip "nct6798-*"
label temp1 "Motherboard" # SYSTIN
label temp2 "CPU Socket" # CPUTIN ; responds to cpu stress
label temp8 "CPU via PECI" # PECI Agent 0 ; mirrors CPU
label temp9 "CPU via PECI (cal)" # PECI Agent 0 ; mirrors CPU ; calibration signal (not sure of meaning)
label temp3 "VRM" # AUXTIN0 ; responds to cpu stress
label temp6 "Chipset" # AUXTIN3
ignore temp4 # AUXTIN1 ; always reports +4°C
ignore temp5 # AUXTIN2 ; always reports +127°C
ignore temp7 # AUXTIN4 ; mostly reports +127°C
ignore temp10 # PCH_CHIP_CPU_MAX_TEMP ; always reports 0°C
ignore temp11 # PCH_CHIP_TEMP ; always reports 0°C
ignore temp12 # PCH_CPU_TEMP ; always reports 0°C
image

But this one is not:

chip "nvme-pci-0200"
ignore temp1 # virtual anyway
set temp1_max 70
label temp2 "NVME SSD NAND memory cells"
set temp2_max 75
label temp3 "NVME SSD ASIC controller"
set temp3_max 65
bus "i2c-3" "SMBus I801 adapter at 0000:00:1f.4"
chip "spd5118-i2c-3-51"
label temp1 "RAM stick A2"
chip "spd5118-i2c-3-53"
label temp1 "RAM stick B2"
image

I suspect the bus specifications are the cause, I will investigate.

@remiberthoz

Copy link
Copy Markdown
Author

Well yes, the issue is due to the explicit chip "spd5118-i2c-3-51"/chip "spd5118-i2c-3-53" in my configuration. With the bus specified, chipPatternMatches will test the unspecific value spd5118-*-* against the specific pattern ^spd5118-i2c-3-51$ and they will not match.


I can unspecify the buses in the configuration by setting:

chip "spd5118-*"
label temp1 "RAM stick"

and I then get reports of RAM stick and RAM stick 2 with Vitals; but I loose mapping to the motherboard socket labels.


Releasing constraints on the mapping performed by chipPatternMatches (i.e. stripping bus specifications on the chip name patterns spd5118-i2c-3-51 => spd5118-*-* by using an advanced version of

if (!block.patterns.some(p => chipPatternMatches(p.split("-")[0], chipName))) {
^^^^^^^^^^^^^

on line 142) leads to a similar result, while allowing users to preserve details in their configuration.

The issue would only really appear when very different sensors share a same name: I don't really mind two RAM sticks being indistinguishable, but problems appear if that was two GPUs, two NVMes, or even devices of different kinds.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@remiberthoz@corecoding
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Parse outpout of 'sensors --label-map' to customize labels - #576

Draft
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map
Draft

Parse outpout of 'sensors --label-map' to customize labels#576
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map

Conversation

@remiberthoz

@remiberthozremiberthoz commented Aug 3, 2026

Copy link
Copy Markdown

This draft PR assumes merging of another PR over at lm-sensors: lm-sensors/lm-sensors#577. The change is functional with my fork of lm-sensors: https://github.com/remiberthoz/lm-sensors/tree/reflection also it would need path adjustments for the fork on line 356 and 357.

It makes configuration of labels for temperature, fan, PWM and voltage sensors adjustable via /etc/sensors.conf, /etc/sensors3.conf or /etc/sensors.d/. It also masks sensors that are ignored by this configuration files.

image

--label-map parameter to 'sensors' is not implemented in the
official sensors program, but available at this fork:
https://github.com/remiberthoz/lm-sensors
@corecoding

Copy link
Copy Markdown
Owner

Launching a subprocess is very risky. It's why I was so slow to adopt GPU stats. It is so easy to cause system stutter. I think the right course of action here is to add /etc/sensors3.conf parsing directly into Vitals. We actually talk about it in issue #83. Hoping that Vitals has permission to read this file with no special permissions.

This would be a one time load of the file and stored in memory. I know that this file supports other things like thresholds and conversions, but for now labels would be nice. The goal is to keep the changes as minimal as possible. Please note that I've pushed some changes to both develop and main that you'll want to use.

@remiberthoz

Copy link
Copy Markdown
Author

Thank you for the feedback. I agree that issuing a subprocess command is not great. It's possible to do asynchronously, that would be better. I'll follow your lead anyway.

I have tested parsing of /etc/sensors3.conf, for labels only it's straightforward. My problem is that I don't know how to link a "chip" from that configuration file to a "device" in the hwmon sysfs tree.

I will take care of merging your commits to my branch. Thanks again.

@corecoding

Copy link
Copy Markdown
Owner

I created a branch called feature/sensors3 - unfortunately I don't have a machine with matching chipsets to try it out. Can you check it out?

@remiberthoz

Copy link
Copy Markdown
Author

Yes! I currently have issues with the version of your latest commits (ad47fdd): most entries report "No Data", but voltages labels are correctly reported alongside chip names:
image

I will attempt to identify the origin of the problem for other sensors and report here.

@remiberthoz

remiberthoz commented Aug 9, 2026

Copy link
Copy Markdown
Author

My bad. I forgot to recompile the updated schemas. I get correct readings for some but not all chips.

This snippet of configuration is parsed and reported:

chip "nct6798-*"
label temp1 "Motherboard" # SYSTIN
label temp2 "CPU Socket" # CPUTIN ; responds to cpu stress
label temp8 "CPU via PECI" # PECI Agent 0 ; mirrors CPU
label temp9 "CPU via PECI (cal)" # PECI Agent 0 ; mirrors CPU ; calibration signal (not sure of meaning)
label temp3 "VRM" # AUXTIN0 ; responds to cpu stress
label temp6 "Chipset" # AUXTIN3
ignore temp4 # AUXTIN1 ; always reports +4°C
ignore temp5 # AUXTIN2 ; always reports +127°C
ignore temp7 # AUXTIN4 ; mostly reports +127°C
ignore temp10 # PCH_CHIP_CPU_MAX_TEMP ; always reports 0°C
ignore temp11 # PCH_CHIP_TEMP ; always reports 0°C
ignore temp12 # PCH_CPU_TEMP ; always reports 0°C
image

But this one is not:

chip "nvme-pci-0200"
ignore temp1 # virtual anyway
set temp1_max 70
label temp2 "NVME SSD NAND memory cells"
set temp2_max 75
label temp3 "NVME SSD ASIC controller"
set temp3_max 65
bus "i2c-3" "SMBus I801 adapter at 0000:00:1f.4"
chip "spd5118-i2c-3-51"
label temp1 "RAM stick A2"
chip "spd5118-i2c-3-53"
label temp1 "RAM stick B2"
image

I suspect the bus specifications are the cause, I will investigate.

@remiberthoz

Copy link
Copy Markdown
Author

Well yes, the issue is due to the explicit chip "spd5118-i2c-3-51"/chip "spd5118-i2c-3-53" in my configuration. With the bus specified, chipPatternMatches will test the unspecific value spd5118-*-* against the specific pattern ^spd5118-i2c-3-51$ and they will not match.


I can unspecify the buses in the configuration by setting:

chip "spd5118-*"
label temp1 "RAM stick"

and I then get reports of RAM stick and RAM stick 2 with Vitals; but I loose mapping to the motherboard socket labels.


Releasing constraints on the mapping performed by chipPatternMatches (i.e. stripping bus specifications on the chip name patterns spd5118-i2c-3-51 => spd5118-*-* by using an advanced version of

if (!block.patterns.some(p => chipPatternMatches(p.split("-")[0], chipName))) {
^^^^^^^^^^^^^

on line 142) leads to a similar result, while allowing users to preserve details in their configuration.

The issue would only really appear when very different sensors share a same name: I don't really mind two RAM sticks being indistinguishable, but problems appear if that was two GPUs, two NVMes, or even devices of different kinds.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@remiberthoz@corecoding
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Parse outpout of 'sensors --label-map' to customize labels - #576

Draft
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map
Draft

Parse outpout of 'sensors --label-map' to customize labels#576
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map

Conversation

@remiberthoz

@remiberthozremiberthoz commented Aug 3, 2026

Copy link
Copy Markdown

This draft PR assumes merging of another PR over at lm-sensors: lm-sensors/lm-sensors#577. The change is functional with my fork of lm-sensors: https://github.com/remiberthoz/lm-sensors/tree/reflection also it would need path adjustments for the fork on line 356 and 357.

It makes configuration of labels for temperature, fan, PWM and voltage sensors adjustable via /etc/sensors.conf, /etc/sensors3.conf or /etc/sensors.d/. It also masks sensors that are ignored by this configuration files.

image

--label-map parameter to 'sensors' is not implemented in the
official sensors program, but available at this fork:
https://github.com/remiberthoz/lm-sensors
@corecoding

Copy link
Copy Markdown
Owner

Launching a subprocess is very risky. It's why I was so slow to adopt GPU stats. It is so easy to cause system stutter. I think the right course of action here is to add /etc/sensors3.conf parsing directly into Vitals. We actually talk about it in issue #83. Hoping that Vitals has permission to read this file with no special permissions.

This would be a one time load of the file and stored in memory. I know that this file supports other things like thresholds and conversions, but for now labels would be nice. The goal is to keep the changes as minimal as possible. Please note that I've pushed some changes to both develop and main that you'll want to use.

@remiberthoz

Copy link
Copy Markdown
Author

Thank you for the feedback. I agree that issuing a subprocess command is not great. It's possible to do asynchronously, that would be better. I'll follow your lead anyway.

I have tested parsing of /etc/sensors3.conf, for labels only it's straightforward. My problem is that I don't know how to link a "chip" from that configuration file to a "device" in the hwmon sysfs tree.

I will take care of merging your commits to my branch. Thanks again.

@corecoding

Copy link
Copy Markdown
Owner

I created a branch called feature/sensors3 - unfortunately I don't have a machine with matching chipsets to try it out. Can you check it out?

@remiberthoz

Copy link
Copy Markdown
Author

Yes! I currently have issues with the version of your latest commits (ad47fdd): most entries report "No Data", but voltages labels are correctly reported alongside chip names:
image

I will attempt to identify the origin of the problem for other sensors and report here.

@remiberthoz

remiberthoz commented Aug 9, 2026

Copy link
Copy Markdown
Author

My bad. I forgot to recompile the updated schemas. I get correct readings for some but not all chips.

This snippet of configuration is parsed and reported:

chip "nct6798-*"
label temp1 "Motherboard" # SYSTIN
label temp2 "CPU Socket" # CPUTIN ; responds to cpu stress
label temp8 "CPU via PECI" # PECI Agent 0 ; mirrors CPU
label temp9 "CPU via PECI (cal)" # PECI Agent 0 ; mirrors CPU ; calibration signal (not sure of meaning)
label temp3 "VRM" # AUXTIN0 ; responds to cpu stress
label temp6 "Chipset" # AUXTIN3
ignore temp4 # AUXTIN1 ; always reports +4°C
ignore temp5 # AUXTIN2 ; always reports +127°C
ignore temp7 # AUXTIN4 ; mostly reports +127°C
ignore temp10 # PCH_CHIP_CPU_MAX_TEMP ; always reports 0°C
ignore temp11 # PCH_CHIP_TEMP ; always reports 0°C
ignore temp12 # PCH_CPU_TEMP ; always reports 0°C
image

But this one is not:

chip "nvme-pci-0200"
ignore temp1 # virtual anyway
set temp1_max 70
label temp2 "NVME SSD NAND memory cells"
set temp2_max 75
label temp3 "NVME SSD ASIC controller"
set temp3_max 65
bus "i2c-3" "SMBus I801 adapter at 0000:00:1f.4"
chip "spd5118-i2c-3-51"
label temp1 "RAM stick A2"
chip "spd5118-i2c-3-53"
label temp1 "RAM stick B2"
image

I suspect the bus specifications are the cause, I will investigate.

@remiberthoz

Copy link
Copy Markdown
Author

Well yes, the issue is due to the explicit chip "spd5118-i2c-3-51"/chip "spd5118-i2c-3-53" in my configuration. With the bus specified, chipPatternMatches will test the unspecific value spd5118-*-* against the specific pattern ^spd5118-i2c-3-51$ and they will not match.


I can unspecify the buses in the configuration by setting:

chip "spd5118-*"
label temp1 "RAM stick"

and I then get reports of RAM stick and RAM stick 2 with Vitals; but I loose mapping to the motherboard socket labels.


Releasing constraints on the mapping performed by chipPatternMatches (i.e. stripping bus specifications on the chip name patterns spd5118-i2c-3-51 => spd5118-*-* by using an advanced version of

if (!block.patterns.some(p => chipPatternMatches(p.split("-")[0], chipName))) {
^^^^^^^^^^^^^

on line 142) leads to a similar result, while allowing users to preserve details in their configuration.

The issue would only really appear when very different sensors share a same name: I don't really mind two RAM sticks being indistinguishable, but problems appear if that was two GPUs, two NVMes, or even devices of different kinds.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@remiberthoz@corecoding
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Parse outpout of 'sensors --label-map' to customize labels - #576

Draft
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map
Draft

Parse outpout of 'sensors --label-map' to customize labels#576
remiberthoz wants to merge 3 commits into
corecoding:mainfrom
remiberthoz:label-map

Conversation

@remiberthoz

@remiberthozremiberthoz commented Aug 3, 2026

Copy link
Copy Markdown

This draft PR assumes merging of another PR over at lm-sensors: lm-sensors/lm-sensors#577. The change is functional with my fork of lm-sensors: https://github.com/remiberthoz/lm-sensors/tree/reflection also it would need path adjustments for the fork on line 356 and 357.

It makes configuration of labels for temperature, fan, PWM and voltage sensors adjustable via /etc/sensors.conf, /etc/sensors3.conf or /etc/sensors.d/. It also masks sensors that are ignored by this configuration files.

image

--label-map parameter to 'sensors' is not implemented in the
official sensors program, but available at this fork:
https://github.com/remiberthoz/lm-sensors
@corecoding

Copy link
Copy Markdown
Owner

Launching a subprocess is very risky. It's why I was so slow to adopt GPU stats. It is so easy to cause system stutter. I think the right course of action here is to add /etc/sensors3.conf parsing directly into Vitals. We actually talk about it in issue #83. Hoping that Vitals has permission to read this file with no special permissions.

This would be a one time load of the file and stored in memory. I know that this file supports other things like thresholds and conversions, but for now labels would be nice. The goal is to keep the changes as minimal as possible. Please note that I've pushed some changes to both develop and main that you'll want to use.

@remiberthoz

Copy link
Copy Markdown
Author

Thank you for the feedback. I agree that issuing a subprocess command is not great. It's possible to do asynchronously, that would be better. I'll follow your lead anyway.

I have tested parsing of /etc/sensors3.conf, for labels only it's straightforward. My problem is that I don't know how to link a "chip" from that configuration file to a "device" in the hwmon sysfs tree.

I will take care of merging your commits to my branch. Thanks again.

@corecoding

Copy link
Copy Markdown
Owner

I created a branch called feature/sensors3 - unfortunately I don't have a machine with matching chipsets to try it out. Can you check it out?

@remiberthoz

Copy link
Copy Markdown
Author

Yes! I currently have issues with the version of your latest commits (ad47fdd): most entries report "No Data", but voltages labels are correctly reported alongside chip names:
image

I will attempt to identify the origin of the problem for other sensors and report here.

@remiberthoz

remiberthoz commented Aug 9, 2026

Copy link
Copy Markdown
Author

My bad. I forgot to recompile the updated schemas. I get correct readings for some but not all chips.

This snippet of configuration is parsed and reported:

chip "nct6798-*"
label temp1 "Motherboard" # SYSTIN
label temp2 "CPU Socket" # CPUTIN ; responds to cpu stress
label temp8 "CPU via PECI" # PECI Agent 0 ; mirrors CPU
label temp9 "CPU via PECI (cal)" # PECI Agent 0 ; mirrors CPU ; calibration signal (not sure of meaning)
label temp3 "VRM" # AUXTIN0 ; responds to cpu stress
label temp6 "Chipset" # AUXTIN3
ignore temp4 # AUXTIN1 ; always reports +4°C
ignore temp5 # AUXTIN2 ; always reports +127°C
ignore temp7 # AUXTIN4 ; mostly reports +127°C
ignore temp10 # PCH_CHIP_CPU_MAX_TEMP ; always reports 0°C
ignore temp11 # PCH_CHIP_TEMP ; always reports 0°C
ignore temp12 # PCH_CPU_TEMP ; always reports 0°C
image

But this one is not:

chip "nvme-pci-0200"
ignore temp1 # virtual anyway
set temp1_max 70
label temp2 "NVME SSD NAND memory cells"
set temp2_max 75
label temp3 "NVME SSD ASIC controller"
set temp3_max 65
bus "i2c-3" "SMBus I801 adapter at 0000:00:1f.4"
chip "spd5118-i2c-3-51"
label temp1 "RAM stick A2"
chip "spd5118-i2c-3-53"
label temp1 "RAM stick B2"
image

I suspect the bus specifications are the cause, I will investigate.

@remiberthoz

Copy link
Copy Markdown
Author

Well yes, the issue is due to the explicit chip "spd5118-i2c-3-51"/chip "spd5118-i2c-3-53" in my configuration. With the bus specified, chipPatternMatches will test the unspecific value spd5118-*-* against the specific pattern ^spd5118-i2c-3-51$ and they will not match.


I can unspecify the buses in the configuration by setting:

chip "spd5118-*"
label temp1 "RAM stick"

and I then get reports of RAM stick and RAM stick 2 with Vitals; but I loose mapping to the motherboard socket labels.


Releasing constraints on the mapping performed by chipPatternMatches (i.e. stripping bus specifications on the chip name patterns spd5118-i2c-3-51 => spd5118-*-* by using an advanced version of

if (!block.patterns.some(p => chipPatternMatches(p.split("-")[0], chipName))) {
^^^^^^^^^^^^^

on line 142) leads to a similar result, while allowing users to preserve details in their configuration.

The issue would only really appear when very different sensors share a same name: I don't really mind two RAM sticks being indistinguishable, but problems appear if that was two GPUs, two NVMes, or even devices of different kinds.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@remiberthoz@corecoding