Skip to content

snmp-ups: map more xppc readings for Phoenixtec UPS cards#3492

Merged
jimklimov merged 1 commit into
networkupstools:masterfrom
vowstar:xppc-mib-runtime-readings
Jun 28, 2026
Merged

snmp-ups: map more xppc readings for Phoenixtec UPS cards#3492
jimklimov merged 1 commit into
networkupstools:masterfrom
vowstar:xppc-mib-runtime-readings

Conversation

@vowstar

@vowstar vowstar commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

What this does

The xppc subdriver (XPPC-MIB, enterprise 935) currently maps only a handful of data points. This adds five readings that the cards already answer in the same subtree but that NUT was throwing away:

  • battery.runtime from .1.3.6.1.4.1.935.1.1.1.2.2.4.0
  • battery.voltage from .1.3.6.1.4.1.935.1.1.1.2.2.2.0
  • input.frequency from .1.3.6.1.4.1.935.1.1.1.3.2.4.0
  • output.voltage.nominal from .1.3.6.1.4.1.935.1.1.1.5.2.1.0
  • ups.firmware.aux from .1.3.6.1.4.1.935.1.1.1.1.2.4.0

XPPC_MIB_VERSION is bumped to 0.41 and a NEWS.adoc entry is added.

Why

battery.runtime is the big one. Before this change upsc reported no remaining runtime for these cards even though the value is right there in the MIB. The other four round out battery voltage, line frequency, rated output voltage and the agent firmware string.

Device and evidence

The card identifies as device.description "UPS Agent", device.mfr "Tripp Lite / Phoenixtec", sysObjectID .1.3.6.1.4.1.935.1.1.1. This is the Phoenixtec XPPC-MIB that the xppc subdriver already targets. The runtime OID maps to the same structural slot (.2.2.4.0) that cyberpower-mib.c reads as battery.runtime with scale 1.0 in seconds, which matched the observed value of about 83 minutes at light load.

This is the same family of card discussed in issue #2608, where the reporter had to give up because the hardware was no longer available to test against.

Verified on real hardware

$ upsc myups
battery.charge: 100
battery.runtime: 5760
battery.voltage: 81.10
device.mfr: Tripp Lite / Phoenixtec
device.type: ups
driver.name: snmp-ups
driver.parameter.mibs: xppc
driver.parameter.snmp_version: v2c
driver.version: 2.8.4
input.frequency: 49.90
input.voltage: 217.50
output.frequency: 49.90
output.voltage: 219.70
output.voltage.nominal: 220
ups.firmware.aux: 11105200-1.44.00
ups.load: 9
ups.status: OL
ups.temperature: 32.80

The five readings this change adds are battery.runtime, battery.voltage, input.frequency, output.voltage.nominal and ups.firmware.aux. All five show up above on a live card.

How to reproduce the dump

snmpwalk -v2c -c <community> <ups-ip> .1.3.6.1.4.1.935 > xppc-snmpwalk.log

I can attach the full walk if you want it for the DDL.

Closes part of #2608.

- add battery.runtime, battery.voltage and input.frequency readings
- add output.voltage.nominal and ups.firmware.aux readings
- bump XPPC_MIB_VERSION to 0.41

Signed-off-by: Huang Rui <vowstar@gmail.com>
@github-actions

github-actions Bot commented Jun 21, 2026

Copy link
Copy Markdown

A ZIP file with standard source tarball and another tarball with pre-built docs for commit 20c732d is temporarily available: NUT-tarballs-PR-3492.zip.

@vowstar

vowstar commented Jun 21, 2026

Copy link
Copy Markdown
Contributor Author

Full snmpwalk of the enterprise 935 tree from the same card, in case it is useful for the DDL. No system group is included, so there is no host name, location or contact. The community is shown as a placeholder.

sysObjectID .1.3.6.1.2.1.1.2.0 resolves to .1.3.6.1.4.1.935.1.1.1.

$ snmpwalk -v2c -c <community> -On <ups-ip> .1.3.6.1.4.1.935
.1.3.6.1.4.1.935.1.1.1.1.1.1.0 = ""
.1.3.6.1.4.1.935.1.1.1.1.1.2.0 = ""
.1.3.6.1.4.1.935.1.1.1.1.2.1.0 = ""
.1.3.6.1.4.1.935.1.1.1.1.2.2.0 = STRING: "0"
.1.3.6.1.4.1.935.1.1.1.1.2.3.0 = STRING: "0"
.1.3.6.1.4.1.935.1.1.1.1.2.4.0 = STRING: "11105200-1.44.00"
.1.3.6.1.4.1.935.1.1.1.2.1.1.0 = INTEGER: 2
.1.3.6.1.4.1.935.1.1.1.2.1.2.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.2.1.3.0 = STRING: "2000/01/01"
.1.3.6.1.4.1.935.1.1.1.2.1.4.0 = STRING: "1000"
.1.3.6.1.4.1.935.1.1.1.2.2.1.0 = INTEGER: 100
.1.3.6.1.4.1.935.1.1.1.2.2.2.0 = INTEGER: 811
.1.3.6.1.4.1.935.1.1.1.2.2.3.0 = INTEGER: 328
.1.3.6.1.4.1.935.1.1.1.2.2.4.0 = INTEGER: 4980
.1.3.6.1.4.1.935.1.1.1.2.2.5.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.2.2.6.0 = INTEGER: 138
.1.3.6.1.4.1.935.1.1.1.2.2.7.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.2.2.8.0 = INTEGER: 4980
.1.3.6.1.4.1.935.1.1.1.3.1.1.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.3.2.1.0 = INTEGER: 2190
.1.3.6.1.4.1.935.1.1.1.3.2.2.0 = INTEGER: 2190
.1.3.6.1.4.1.935.1.1.1.3.2.3.0 = INTEGER: 2190
.1.3.6.1.4.1.935.1.1.1.3.2.4.0 = INTEGER: 500
.1.3.6.1.4.1.935.1.1.1.3.2.5.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.3.2.6.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.4.1.1.0 = INTEGER: 2
.1.3.6.1.4.1.935.1.1.1.4.1.2.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.4.2.1.0 = INTEGER: 2198
.1.3.6.1.4.1.935.1.1.1.4.2.2.0 = INTEGER: 499
.1.3.6.1.4.1.935.1.1.1.4.2.3.0 = INTEGER: 10
.1.3.6.1.4.1.935.1.1.1.4.2.4.0 = INTEGER: 30
.1.3.6.1.4.1.935.1.1.1.4.2.5.0 = INTEGER: 20
.1.3.6.1.4.1.935.1.1.1.4.2.6.0 = INTEGER: 15
.1.3.6.1.4.1.935.1.1.1.5.1.1.0 = INTEGER: 4
.1.3.6.1.4.1.935.1.1.1.5.2.1.0 = INTEGER: 2200
.1.3.6.1.4.1.935.1.1.1.5.2.2.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.5.2.3.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.5.2.4.0 = INTEGER: 3
.1.3.6.1.4.1.935.1.1.1.5.2.5.0 = INTEGER: 2147483647
.1.3.6.1.4.1.935.1.1.1.5.2.6.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.5.2.7.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.5.2.8.0 = INTEGER: 120
.1.3.6.1.4.1.935.1.1.1.5.2.9.0 = INTEGER: 60
.1.3.6.1.4.1.935.1.1.1.5.2.10.0 = INTEGER: 120
.1.3.6.1.4.1.935.1.1.1.5.2.11.0 = INTEGER: 2
.1.3.6.1.4.1.935.1.1.1.5.2.12.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.6.1.1.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.6.2.1.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.6.2.2.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.6.2.3.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.6.2.4.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.6.2.5.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.6.2.6.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.7.2.1.0 = INTEGER: 4
.1.3.6.1.4.1.935.1.1.1.7.2.2.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.7.2.3.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.7.2.4.0 = STRING: "2019/5/5"
.1.3.6.1.4.1.935.1.1.1.7.2.5.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.7.2.6.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.7.2.7.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.7.2.8.0 = STRING: "2019/5/5"
.1.3.6.1.4.1.935.1.1.1.8.1.1.0 = INTEGER: 81
.1.3.6.1.4.1.935.1.1.1.8.1.2.0 = INTEGER: 100
.1.3.6.1.4.1.935.1.1.1.8.1.3.0 = INTEGER: 4980
.1.3.6.1.4.1.935.1.1.1.8.1.4.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.1.5.0 = INTEGER: 328
.1.3.6.1.4.1.935.1.1.1.8.2.1.0 = INTEGER: 500
.1.3.6.1.4.1.935.1.1.1.8.2.2.0 = INTEGER: 2190
.1.3.6.1.4.1.935.1.1.1.8.2.3.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.2.4.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.2.5.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.2.6.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.2.7.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.3.1.0 = INTEGER: 499
.1.3.6.1.4.1.935.1.1.1.8.3.2.0 = INTEGER: 2196
.1.3.6.1.4.1.935.1.1.1.8.3.3.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.3.4.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.3.5.0 = INTEGER: 80
.1.3.6.1.4.1.935.1.1.1.8.3.6.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.3.7.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.3.8.0 = INTEGER: 10
.1.3.6.1.4.1.935.1.1.1.8.3.9.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.3.10.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.3.11.0 = INTEGER: 20
.1.3.6.1.4.1.935.1.1.1.8.3.12.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.3.13.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.3.14.0 = INTEGER: 20
.1.3.6.1.4.1.935.1.1.1.8.3.15.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.3.16.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.4.1.0 = INTEGER: 500
.1.3.6.1.4.1.935.1.1.1.8.4.2.0 = INTEGER: 2181
.1.3.6.1.4.1.935.1.1.1.8.4.3.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.4.4.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.4.5.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.4.6.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.4.7.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.5.1.0 = INTEGER: 16
.1.3.6.1.4.1.935.1.1.1.8.5.2.0 = INTEGER: 16
.1.3.6.1.4.1.935.1.1.1.8.5.3.0 = INTEGER: 16
.1.3.6.1.4.1.935.1.1.1.8.5.4.0 = INTEGER: 2
.1.3.6.1.4.1.935.1.1.1.8.5.5.0 = INTEGER: 5
.1.3.6.1.4.1.935.1.1.1.8.5.6.0 = INTEGER: 7
.1.3.6.1.4.1.935.1.1.1.8.5.7.0 = INTEGER: 16
.1.3.6.1.4.1.935.1.1.1.8.6.1.0 = INTEGER: 16
.1.3.6.1.4.1.935.1.1.1.8.6.2.0 = INTEGER: 9
.1.3.6.1.4.1.935.1.1.1.8.6.3.0 = INTEGER: 10
.1.3.6.1.4.1.935.1.1.1.8.6.4.0 = INTEGER: 12
.1.3.6.1.4.1.935.1.1.1.8.6.5.0 = INTEGER: 14
.1.3.6.1.4.1.935.1.1.1.8.7.1.0 = INTEGER: 16
.1.3.6.1.4.1.935.1.1.1.8.7.2.0 = INTEGER: 16
.1.3.6.1.4.1.935.1.1.1.8.7.3.0 = INTEGER: 16
.1.3.6.1.4.1.935.1.1.1.8.7.4.0 = INTEGER: 16
.1.3.6.1.4.1.935.1.1.1.8.7.5.0 = INTEGER: 16
.1.3.6.1.4.1.935.1.1.1.8.7.6.0 = INTEGER: 16
.1.3.6.1.4.1.935.1.1.1.8.7.7.0 = INTEGER: 16
.1.3.6.1.4.1.935.1.1.1.8.8.1.0 = STRING: "220"
.1.3.6.1.4.1.935.1.1.1.8.8.2.0 = INTEGER: 50
.1.3.6.1.4.1.935.1.1.1.8.8.3.0 = STRING: "220"
.1.3.6.1.4.1.935.1.1.1.8.8.4.0 = INTEGER: 50
.1.3.6.1.4.1.935.1.1.1.8.8.5.0 = STRING: "220"
.1.3.6.1.4.1.935.1.1.1.8.8.6.0 = INTEGER: 50
.1.3.6.1.4.1.935.1.1.1.8.8.7.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.8.8.8.0 = STRING: "0"
.1.3.6.1.4.1.935.1.1.1.9.1.1.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.9.1.2.0 = INTEGER: 0
.1.3.6.1.4.1.935.1.1.1.9.1.3.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.9.1.4.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.9.1.5.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.9.1.6.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.9.1.7.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.9.1.8.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.9.1.9.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.9.1.10.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.9.1.11.0 = INTEGER: 1
.1.3.6.1.4.1.935.1.1.1.9.2.1.0 = INTEGER: 500
.1.3.6.1.4.1.935.1.1.1.9.2.2.0 = INTEGER: 200
.1.3.6.1.4.1.935.1.1.1.9.2.3.0 = INTEGER: 900
.1.3.6.1.4.1.935.1.1.1.9.2.4.0 = INTEGER: 200
.1.3.6.1.4.1.935.2.1.1.0 = INTEGER: 0

@vowstar
vowstar force-pushed the xppc-mib-runtime-readings branch from 9d1b9a9 to 20c732d Compare June 21, 2026 09:38
@AppVeyorBot

Copy link
Copy Markdown

@AppVeyorBot

Copy link
Copy Markdown

@jimklimov

jimklimov commented Jun 21, 2026

Copy link
Copy Markdown
Member

Thanks! The DDL-ready upsc et al data dump (or PR there https://github.com/networkupstools/nut-ddl/) would be most welcome too.

PR looks good, waiting for CI to not complain about anything :)

@jimklimov jimklimov added enhancement SNMP Phoenixtec (USB 0x06DA/0xFFFF) This USB chip VID/PID is used in many devices, some with different protocols - detection may be hard Incorrect or missing readings On some devices driver-reported values are systemically off (e.g. x10, x0.1, const+Value, etc.) labels Jun 21, 2026
@jimklimov jimklimov added this to the 2.8.6 milestone Jun 21, 2026
@AppVeyorBot

Copy link
Copy Markdown

Build nut 2.8.5.4848-master completed (commit c6b0c6847f by @vowstar)

@AppVeyorBot

Copy link
Copy Markdown

@jimklimov jimklimov added the ready / gonna merge The PR is in final cycles leading to merge unless someone logs an objection before we hit the button label Jun 21, 2026
@vowstar

vowstar commented Jun 21, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the pointer. Posted it as networkupstools/nut-ddl#62, with IP, community, host name and location stripped. Can add the full enterprise-935 snmpwalk there too if it is useful.

@jimklimov

Copy link
Copy Markdown
Member

Maybe that would make sense. I don't think there's precedent about publishing SNMP walks though, so they probably can go as a structured DDL file comment block for now.

@vowstar

vowstar commented Jun 21, 2026

Copy link
Copy Markdown
Contributor Author

Makes sense. Folded the enterprise-935 walk into the .dev as a DEVICE:COMMENT-BLOCK rather than a separate file, so nut-ddl#62 now carries both the upsc data and the raw OIDs in one place for cross-checking the mappings.

@jimklimov
jimklimov merged commit 138c70c into networkupstools:master Jun 28, 2026
107 of 114 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement Incorrect or missing readings On some devices driver-reported values are systemically off (e.g. x10, x0.1, const+Value, etc.) Phoenixtec (USB 0x06DA/0xFFFF) This USB chip VID/PID is used in many devices, some with different protocols - detection may be hard ready / gonna merge The PR is in final cycles leading to merge unless someone logs an objection before we hit the button SNMP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants