Skip to main content

CyberPower UPS & PDU (SNMP)

The CyberPower driver manages CyberPower devices over their SNMP management card, using the CyberPower enterprise MIB (CPS-MIB, 1.3.6.1.4.1.3808). It auto-detects the device family on the first poll and behaves accordingly:

  • UPS (RMCARD205/305-class, MIB branch .1.1.1) — polls battery charge and runtime, line/output voltage and frequency, load, and power state into device and zone attributes, and exposes control verbs for self test, runtime calibration, and turning the UPS output off / rebooting / sleeping.
  • Switched PDU (ePDU, MIB branch .1.1.3) — polls per-outlet on/off state and metering, auto-creates one zone per outlet in the Power subsystem, and exposes power_on / power_off / reboot per outlet.

All traffic stays on the customer LAN.

Verified hardware

Built and verified against live hardware:

  • RMCARD205 (firmware 1.6.0) in a PR1500RTXL2UC (Smart App Sinewave PR series) — full status read-path verified end-to-end, and switchable-bank control exercised (this unit reports one always-on critical bank plus one switchable bank).
  • PDU81001 (firmware 1.3.3), 8 switched outlets — outlet naming, on/off/reboot control, and the private write community verified live (an outlet was cycled on→off→on over SNMP). Per-outlet metering (current, power, peak, energy) is read from the ePDU's status table.

Status values are read from the CyberPower MIB and mapped to attributes; control verbs issue SNMP SETs. Outlet/bank switching is offered on both families: a switched ePDU exposes one controllable outlet per port, and a UPS exposes one controllable bank per switchable outlet group. A UPS's always-on critical bank — the one that protects essential loads, e.g. bank 1 on the PR series — reports its state but cannot be switched, so no control zone is created for it.

The driver does not read the optional CyberPower environment sensor, so battery/internal temperature and humidity are not surfaced as attributes.

Prerequisites

  • A CyberPower UPS with an RMCARD205/305 (or equivalent) on the same LAN as the GEM controller, reachable on UDP/161.
  • SNMP enabled on the card. In the RMCARD web UI:
    • Network → SNMPv1 — set a read community (default public) and, for control, a write community; or
    • Network → SNMPv3 — create a user with the desired auth/priv. Control requires a user with write permission.
  • Recent firmware may ship with SNMPv1/v2c disabled in favor of SNMPv3 only — check which version is enabled before adding the device.

Setup

  1. Find the RMCARD IP from your DHCP table or the card's display. The CyberPower MAC prefix is 00:0C:15.
  2. Create the device under System → Devices (Open Devices) with driver cyberpower. Set:
    • ip — the RMCARD address (e.g., 192.168.1.8)
    • versionv2c (default) or v3
    • For v2c: community (read, default public) and write_community for control. The write community defaults to private — the CyberPower factory write community — and falls back to the read community if you clear it; set it to whatever the card uses if you changed it.
    • For v3: v3_username, v3_security_level, and the matching auth/priv protocols and keys.
  3. Verify from the Script Console:
    await gem.command({device: <device_id>, action: 'get_status'});
    After one polling cycle (~30 s) the device picks up battery_level, runtime_remaining, output_status, input_voltage, output_voltage, output_load, and the rest of the attributes below.
  4. (Optional) Add a zone in the Power subsystem for this device, with no address. The zone tracks the UPS as a whole — its state is on while the UPS is delivering power and off when the output is off/asleep, and it mirrors battery_level, battery_status, low_battery, runtime_remaining, output_load, on_battery, and output_status. This makes the UPS show up on UIs and in the "any low batteries / anything offline?" health sweep. (Leave the address blank — a zone with a numeric address is treated as an outlet/bank control zone instead, and gets its state from outlet/bank polling rather than the whole-UPS health.)

Attributes

AttributeTypeNotes
model, ups_name, firmware_version, serial_numberstringIdentity, read once per poll
battery_statusstringnormal / low / depleted / unknown
battery_levelint (%)Battery charge
battery_voltagefloat (V)
runtime_remainingint (min)Estimated runtime on battery
time_on_batteryint (s)0 when on utility
low_batteryboolTrue when status is low/depleted
battery_replace_neededboolUPS-reported battery replacement flag
input_voltagefloat (V)Utility line voltage
input_frequencyfloat (Hz)
input_statusstringnormal / over_voltage / under_voltage / frequency_failure / blackout
last_transfer_causestringReason for the most recent transfer to battery
output_statusstringonline / on_battery / on_boost / on_buck / on_bypass / off / rebooting / on_sleep
output_voltagefloat (V)
output_frequencyfloat (Hz)
output_loadint (%)Load as a percent of capacity
output_currentfloat (A)
on_batteryboolTrue while running on battery
self_test_resultstringpassed / failed / invalid / in_progress

The table above is what a UPS reports on the device itself. A PDU reports a smaller device identity set — model, firmware_version, serial_number, plus pdu_name, hardware_version, and outlet_count — and puts its real-time per-outlet data (state, load_amps, power_watts, peak_watts, energy_kwh) on each outlet zone rather than the device (see Switchable outlets below). For a UPS, each switchable/critical outlet bank's state also appears on the device as bank_<n>_state (on / off / critical / absent).

Commands

CommandFamilyEffect
get_statusbothPoll the device now and refresh all attributes
power_on (on)PDU / UPSTurn on. address = outlet number (PDU) or bank index (UPS)
power_off (off)PDU / UPSTurn off. address = outlet number (PDU) or bank index (UPS)
rebootPDU / UPSPower-cycle (off then on). PDU = native; UPS bank = emulated off→delay→on
self_testUPSStart a battery self test (brief, non-disruptive); result lands in self_test_result
runtime_calibrationUPSStart a runtime calibration — the UPS runs on battery to recalibrate its estimate
ups_rebootUPSPower-cycle the whole UPS output (protected load off then back on) — disruptive
ups_power_offUPSTurn the whole output off, cutting power to the load — disruptive
ups_sleepUPSPut the UPS to sleep until utility power returns — disruptive
get / set / walkbothRaw SNMP access (advanced)

Control commands issue SNMP SETs and therefore require write access (a v2c write_community or a v3 user with write permission). The outlet commands take address = the outlet number; on a UI they bind to [@zone.address] so a zone picker is offered. ups_power_off, ups_reboot, and ups_sleep cut power to the protected load and are intended for deliberate operator use, not routine automation.

Switchable outlets (PDU) and outlet banks (UPS)

Both families auto-create one power_default zone per controllable output in the Power subsystem (which is one of the default subsystems; the driver creates it automatically if it has been removed); a zone's standard on/off maps straight through, and reboot / power_on / power_off can also be invoked directly with {address: <n>}.

The split follows the device's own model — PDU per-outlet values live on the outlet zone; UPS values live on the device:

  • PDU — one zone per outlet (address = 1-based outlet number, label from the PDU's outlet name). Each poll refreshes the zone's state plus per-outlet metering attributes from ePDUOutletStatusTable: load_amps (.7, ÷10), power_watts (.8), peak_watts (.10), energy_kwh (.13, ÷10). Control OID …1.1.3.3.3.1.1.4.<n> (ePDUOutletControlOutletCommand), write 1=on / 2=off / 3=reboot.
  • UPS — one zone per switchable bank (address = bank index). Control OID …1.1.1.8.1.1.1.2.<n> (upsBankControlOutletCommand), write 1=on / 2=off. Critical banks (the always-on bank that protects essential loads) report bank_<n>_state = critical and reject control — no zone is created for them, matching the RMCARD's "N/A" on/off in its Bank Control page. UPS banks have no native reboot, so reboot is emulated as off → reboot_delay → on.

Automation ideas

  • Power-loss notification. An attribute trigger on on_battery becoming true (or output_status = on_battery) can fire a notification macro and start a graceful-shutdown sequence.
  • Low-runtime guard. Trigger on runtime_remaining dropping below a threshold to shed non-critical loads or shut down equipment before the battery is exhausted.
  • Battery health. low_battery and battery_replace_needed surface in the health sweep; battery_level history charts charge over time.

Troubleshooting

SymptomCheck
Attributes stay empty / device disconnectedConfirm the SNMP version enabled on the card matches the driver, the source IP is permitted, and UDP/161 is reachable (firewall/VLAN).
Polling works but control returns an errorControl needs write access — set a v2c write_community (default private) or use a v3 user with write permission.
power_off / power_on on a UPS bank returns an errorThat bank is the always-on critical bank (its bank_<n>_state reads critical). Only switchable banks can be controlled, and no control zone is created for a critical bank — this matches the RMCARD showing it as "N/A" on its Bank Control page.
No outlet/bank zones appear after the first pollOutlet zones (PDU) and bank zones (UPS) are created on the first successful poll. Confirm the device detected its family (a UPS answers on the .1.1.1 MIB branch, a switched PDU on .1.1.3) and that polling is succeeding; a UPS with no switchable banks (only an always-on critical bank) will not create any control zone.
Runtime looks unexpectedly shortExpected during a self test or calibration; runtime_remaining reflects the card's live estimate.