Monitor CyberPower UPS plugged into Windows Machine via USB

@AixRmz Did you get the “entity not available” error figure out?

Have not been able to make it work : (

I’m not sure what problem people are having, but here’s my HA config info

  - platform: snmp
    host: 192.168.130.14
    baseoid: .1.3.6.1.4.1.3808.1.1.1.4.1.1.0
    community: xx
    port: 1161
    name: OfficeUPS Status
    scan_interval: 120
    value_template: >
      {% set vals = {'1': 'unknown', '2':'onLine', '3':'onBattery', '4':'onBoost', '5':'sleep', '6':'off', '7':'rebooting'} %}
      {{vals[value]}}

  - platform: snmp
    host: 192.168.130.14
    baseoid: .1.3.6.1.2.1.33.1.2.3.0
    community: xx
    port: 1161
    name: OfficeUPS Battery Runtime
    value_template: '{{ (value | int) * 60 }}'
    unit_of_measurement: s
    scan_interval: 120

  - platform: snmp
    host: 192.168.130.14
    baseoid: .1.3.6.1.2.1.33.1.2.4.0
    community: xx
    port: 1161
    scan_interval: 300
    name: OfficeUPS Battery Charge
    unit_of_measurement: "%"

  - platform: snmp
    host: 192.168.130.14
    baseoid:  .1.3.6.1.4.1.3808.1.1.1.2.2.2.0
    community: xx
    port: 1161
    scan_interval: 300
    name: OfficeUPS Battery Voltage
    value_template: '{{ (value | int / 10 ) }}'
    unit_of_measurement: "V"

  - platform: snmp
    host: 192.168.130.14
    baseoid: 1.3.6.1.4.1.3808.1.1.1.4.2.3.0
    community: xx
    port: 1161
    scan_interval: 300
    name: OfficeUPS Load
    unit_of_measurement: "%"

I set the Power Panel to use port 1161 instead of 161 because I use real SNMP on that same computer at port 161, you can adjust as needed. The IP address is the address of the desktop running power panel.

I have found that snmpv3 support is super buggy. YMMV of course, but I recommend that anyone using v3 and struggling switch to v2. To be honest, the security is likely “good enough”. Just don’t allow writes. There’s no sensitive data in your ups.

I also recommend using secrets and/or yaml anchors to reduce some of the config duplication overhead. I’ve had some silly mistakes due to poor copy and paste.

Finally, I recommend using snmpwalk on your Hass host to help troubleshoot. This is not perfect, because I have had issues where this tool works fine, but using the same configuration parameters in the home system giving me problems

please can you tell me where the pic file is (only bit not working)

Is that to my image? It’s in the posting. If it’s not appearing try refresh, different browser, something. I see it in the posting 2nd above.

(ups5.jpg) sorry not very good with web forums I dont understand where i should be looking for this file to download and not sure where i put it in my HA either?

not sure my even asking the right peason it might be simon bunn!!

thanks Simon, that writeup was brilliant.

I found once I had the Cyberpower software installed and set up an the SNMP gateway, it was extremely simple to just add it to NUT, and not worry about manually creating sensors or cards in Home Assistant.

fyi, NUT add-on config for the Cyberpower SNMP device:

  - name: CyberPower_VP1600ELCD
    driver: snmp-ups
    port: 192.168.0.x
    config:
      - desc = CyberPower 1600

Then just add it as a new device in the NUT Integration:

1 Like

Good Job @Simon_Bunn
Here what I have added to your idea:


inside **/homeassistant/ **
file: configuration.yaml

(...)
## 
recorder:
  purge_keep_days: 60
  auto_purge: true
  auto_repack: true
  #  include:
  #    domains:
  #      - sensor
  #      - switch
  #      - media_player
  exclude:
    entities:
      - sensor.date
    entity_globs:
      - sensor.weather_*
      - sensor.ups*_time
      - sensor.ups*_date
      - sensor.ups*_date_n_time*
      - sensor.ups*_selftest_date_temp*
      - sensor.ups*_run_time*
      - sensor.ups*_uptime*
      - sensor.system_monitor_network_throughput_*
      - sensor.system_monitor_memory_*
      - sensor.ups*_serial_number
      - sensor.ups*_serial_number
      - sensor.ups*_firmware*

(...)
sensor: !include_dir_merge_list ./entities/sensors
switch: !include_dir_merge_list ./entities/switches

inside **/homeassistant/entities/sensors/ **
file: cyberpower_ups01.yaml

###################################
# CyberPower UPS
#
# UPS on 192.168.1.11 - PC
#
# version 2025-02-12 09:23:14.524
###################################
# Inpired by:
#   https://community.home-assistant.io/t/cyberpower-ups-powerpanel-cloud/509968/7
#
# Confirmed working for model:
#    CP1500AVRLCD3 - PowerPanel Business v4.11.3 on Windows 11 (10.0.26100 64-bit)
#    CP1350AVRLCDa - PowerPanel Business v4.11.3 on Ubuntu 22.04.1 (Linux 6.8.0-52-generic 64-bit)
#
# Download location: https://www.cyberpower.com/global/en/download
#    Linux:   CyberPower_PPB_Linux+64bit_v4.11.3.sh - PowerPanel Business Local/Remote for Linux 64bit
#    Windows: CyberPower_PPB_Windows_v4.11.3        - PowerPanel Business Local/Remote for Windows
#
# unique_id: generated on: Version 1 of https://generateuuid.online/
#
#sensor:
- platform: snmp
  baseoid: .1.3.6.1.2.1.1.3.0
  name: UPS01 Uptime
  unique_id: 94840230-f0b9-11ef-1001-bdf054715aa8
  #  value_template: >
  #    {% set uptime = (value | string()) %}
  #    {% set seconds = (((uptime|string)[-2:])|int(0) % 60) %}
  #    {% set minutes = ((uptime|int(0) % 360000) // 6000)  %}
  #    {% set hours = ((uptime|int(0) % 8640000) // 360000)+0.1 %}
  #    {% set days = (uptime|int(0) // 8640000)  %}
  #    {%- if (days >= 2) %}{% set txtDay='days' %}{%- else -%}{% set txtDay='day' %}{%- endif %}
  #    {%- if (days < 1) %}{% set txtDay='' %}{% set days=0 %}{%- else -%}{% set txtDay=(txtDay+", ") %}{%- endif %}
  #    {% set seconds = '%ds ' % seconds %}
  #    {% set minutes = '%dm ' % minutes %}
  #    {% set hours = '%dh ' % hours if hours else '' %}
  #    {% set days = '%d ' % days if days else '' %}
  #    {{ days }}{{ txtDay }}{{ hours }}{{ minutes }}{{ seconds }}
  value_template: "{{ ((value | int(0) - (8640000) | int(0))/100) | int(0) | timestamp_custom('%dd %H:%M:%S', false,0) }}"
  scan_interval: 2
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.1.1.1.0
  name: UPS01 Model
  unique_id: 94840231-f0b9-11ef-0001-bdf054715aa8
  scan_interval: 60
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.1.1.2.0
  name: UPS01 Hostname
  unique_id: 94840232-f0b9-11ef-0001-bdf054715aa8
  value_template: >-
    {% set tmpData = (value | string) | upper %}
    {{ tmpData }}
  scan_interval: 60
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.1.2.1.0
  name: UPS01 FirmwareA
  unique_id: 94840233-f0b9-11ef-0001-bdf054715aa8
  scan_interval: 60
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.1.2.4.0
  name: UPS01 FirmwareB
  unique_id: 94840234-f0b9-11ef-0001-bdf054715aa8
  scan_interval: 60
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: template
  sensors:
    ups01_firmware:
      friendly_name: "UPS01 Firmware"
      unique_id: 94840235-f0b9-11ef-0001-bdf054715aa8
      value_template: "{{ states('sensor.ups01_firmwarea') }}_{{ states('sensor.ups01_firmwareb') }}"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.1.2.7.0
  name: UPS01 Power Rating
  unique_id: 94840236-f0b9-11ef-0001-bdf054715aa8
  device_class: power
  unit_of_measurement: "W"
  scan_interval: 60
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.1.2.3.0
  name: UPS01 Serial Number
  unique_id: 94840237-f0b9-11ef-0001-bdf054715aa8
  scan_interval: 60
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.2.1.1.0
  name: UPS01 Battery Status
  unique_id: 94840238-f0b9-11ef-0001-bdf054715aa8
  value_template: >
    {% set vals = {'0': 'Unknown', '1':'Unknown', '2':'Normal', '3':'Low', '4':'NotPresent'} %}
    {{vals[value]}}
  scan_interval: 5
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.2.1.3.0
  name: UPS01 Battery Installed Date temp
  unique_id: 94840239-f0b9-11ef-0001-bdf054715aa8
  value_template: >-
    {% set tmpData = strptime(value, '%m/%d/%Y', now()) | as_datetime %}
    {%- if (tmpData is defined) and (tmpData != none) -%}
      {{ (tmpData.isoformat() | string)[0:10] }}
    {%- else -%}
      {{ '2000-01-01' }}
    {%- endif -%}
  scan_interval: 60
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: template
  sensors:
    ups01_battery_installed_date:
      friendly_name: "UPS01 Battery Installed Date"
      unique_id: 9484023a-f0b9-11ef-0001-bdf054715aa8
      device_class: date
      value_template: "{{ states('sensor.ups01_battery_installed_date_temp') }}"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.2.2.1.0
  name: UPS01 Battery Capacity
  unique_id: 9484023b-f0b9-11ef-0001-bdf054715aa8
  value_template: "{{ (value | float) }}"
  device_class: BATTERY
  unit_of_measurement: "%"
  scan_interval: 30
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.2.2.2.0
  name: UPS01 Battery Voltage
  unique_id: 9484023c-f0b9-11ef-0001-bdf054715aa8
  value_template: "{{ (value | int / 10 ) }}"
  device_class: voltage
  unit_of_measurement: "V"
  scan_interval: 20
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.2.2.4.0
  name: UPS01 Run Time Remaining
  unique_id: 9484023d-f0b9-11ef-0001-bdf054715aa8
  value_template: "{{ ( (value | int) / (100 * 60) ) | round(1) }}"
  unit_of_measurement: minutes
  scan_interval: 5
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.3.2.2.0
  name: UPS01 Input Voltage
  unique_id: 9484023e-f0b9-11ef-0001-bdf054715aa8
  value_template: "{{ (value | int / 10 ) }}"
  device_class: voltage
  unit_of_measurement: "V"
  scan_interval: 30
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.3.2.6.0
  name: UPS01 Advanced Status
  unique_id: 9484023f-f0b9-11ef-0001-bdf054715aa8
  value_template: >
    {% set vals = {'1': 'Normal', '2':'Over Voltage', '3':'Under Voltage', '4':'Frequency Failure', '5':'Blackout'} %}
    {{vals[value]}}
  scan_interval: 15
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.4.1.1.0
  name: UPS01 Status
  unique_id: 94840240-f0b9-11ef-0001-bdf054715aa8
  value_template: >
    {% set vals = {'1': 'Unknown', '2':'OnLine', '3':'OnBattery', '4':'OnBoost', '5':'OnSleep', '6':'Off', '7':'Rebooting', '8':'OnECO', '9':'OnBypass', '10':'OnBuck', '11':'OnOverload'} %}
    {{vals[value]}}
  scan_interval: 5
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.4.2.1.0
  name: UPS01 Output Voltage
  unique_id: 94840241-f0b9-11ef-0001-bdf054715aa8
  value_template: "{{ (value | int / 10 ) }}"
  device_class: voltage
  unit_of_measurement: "V"
  scan_interval: 5
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
##
## note: the Output current isn't supported on model CP1350AVRLCDa
##
## use this calculation for model CP1350AVRLCDa , .1.3.6.1.4.1.3808.1.1.1.4.2.4.0 is not supported
##- platform: template
##  sensors:
##    ups01_output_current:
##      friendly_name: "UPS01 Output Current"
##      unique_id: 94840242-f0b9-11ef-0001-bdf054715aa8
##      device_class: current
##      unit_of_measurement: "A"
##      value_template: "{{ ((states('sensor.ups01_load') | float(0) * states('sensor.ups01_power_rating') | float(0) / states('sensor.ups01_output_voltage') | int ) / 100) | round(2) }} "
##
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.4.2.4.0
  name: UPS01 Output Current
  unique_id: 94840242-f0b9-11ef-0001-bdf054715aa8
  value_template: "{{ (value | int / 10 ) }}"
  unit_of_measurement: "A"
  scan_interval: 5
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: template
  sensors:
    ups01_output_power:
      friendly_name: "UPS01 Output Power"
      unique_id: 94840243-f0b9-11ef-0001-bdf054715aa8
      device_class: power
      unit_of_measurement: "W"
      value_template: "{{ (states('sensor.ups01_output_current') | float(0) * states('sensor.ups01_output_voltage') | int ) | round(1) }} "
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.4.2.3.0
  name: UPS01 Load
  unique_id: 94840244-f0b9-11ef-0001-bdf054715aa8
  value_template: "{{ (value | float) }}"
  device_class: BATTERY
  unit_of_measurement: "%"
  scan_interval: 5
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.7.2.3.0
  name: UPS01 Selftest Result
  unique_id: 94840245-f0b9-11ef-0001-bdf054715aa8
  value_template: >
    {% set vals = {'0': 'Unknown', '1':'Ok', '2':'Failed', '3':'InvalidTest', '4':'TestInProgress'} %}
    {{vals[value]}}
  scan_interval: 5
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.7.2.4.0
  name: UPS01 Selftest Date temp
  unique_id: 94840246-f0b9-11ef-0001-bdf054715aa8
  value_template: >-
    {% set tmpData = strptime(value, '%m/%d/%Y', now()) | as_datetime %}
    {%- if (tmpData is defined) and (tmpData != none) -%}
      {{ (tmpData.isoformat() | string)[0:10] }}
    {%- else -%}
      {{ '2000-01-01' }}
    {%- endif -%}
  scan_interval: 60
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: template
  sensors:
    ups01_selftest_date:
      friendly_name: "UPS01 Selftest Date"
      unique_id: 94840247-f0b9-11ef-0001-bdf054715aa8
      device_class: date
      value_template: "{{ states('sensor.ups01_selftest_date_temp') }}"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.7.2.7.0
  name: UPS01 Advance Test Estimation Results
  unique_id: 94840248-f0b9-11ef-0001-bdf054715aa8
  value_template: >
    {% set vals = {'0': 'Unknown', '1':'Ok', '2':'InvalidEstimation', '3':'EstimationInProgress'} %}
    {{vals[value]}}
  scan_interval: 15
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.7.2.8.0
  name: UPS01 Advance Test Estimation Date temp
  unique_id: 94840249-f0b9-11ef-0001-bdf054715aa8
  value_template: >-
    {%- if (states('sensor.ups01_advance_test_estimation_results') == 'Ok') -%}
      {{ as_datetime(strptime(value, '%m/%d/%Y', 0)).strftime('%Y-%m-%d') }}
    {%- else -%}
      {{ '2000-01-01' }}
    {%- endif -%}
  scan_interval: 60
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: template
  sensors:
    ups01_advance_test_estimation_date:
      friendly_name: "UPS01 Advance Test Estimation Date"
      unique_id: 9484024a-f0b9-11ef-0001-bdf054715aa8
      device_class: date
      value_template: "{{ states('sensor.ups01_advance_test_estimation_date_temp') }}"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.2.1.4.0
  name: UPS01 IP Address
  unique_id: 9484024b-f0b9-11ef-0001-bdf054715aa8
  value_template: >
    {% set x = value %}
    {% set x = x[0] | ord | string + '.' +  x[1] | ord | string + '.' + x[2] | ord | string + '.' + x[3] | ord | string %}
    {{ x }}
  scan_interval: 60
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.2.1.5.1.0
  name: UPS01 Date
  unique_id: 9484024c-f0b9-11ef-0001-bdf054715aa8
  value_template: "{{ (strptime(value, '%m/%d/%Y', '2000-01-01') | string)[0:10] }} "
  scan_interval: 2
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.2.1.5.2.0
  name: UPS01 Time
  unique_id: 9484024d-f0b9-11ef-0001-bdf054715aa8
  value_template: "{{ value }}"
  scan_interval: 2
  host: 192.168.1.11
  port: 161
  community: public
  accept_errors: "false"
- platform: template
  sensors:
    ups01_clock:
      friendly_name: "UPS01 Clock"
      unique_id: 9484024e-f0b9-11ef-0001-bdf054715aa8
#      device_class: date
#       {% set tempData = (states('sensor.ups01_date')) + " " + (states('sensor.ups01_time'))  %}
#       {% set tempData = ( (states('sensor.ups01_date'))|string + "T" + (states('sensor.ups01_time')|string)|string ) |as_datetime(0) %}
      value_template: >
        {% set tempData = (states('sensor.ups01_date')) + " " + (states('sensor.ups01_time'))  %}
        {{ tempData }}
      attribute_templates:
        varTime: "{{ states('sensor.ups01_time') }}"
        varDate: "{{ states('sensor.ups01_date') }}"

#
#
#
# .1.3.6.1.4.1.3808.1.1.1.2.1.2.0
#     The UPS wasted battery time since the UPS has transfered to backup mode
#     TIMETICKS
#
# .1.3.6.1.4.1.3808.1.1.1.5.2.10.0
#     The delay time the UPS will remain on after receiving a turn off command. The possible values are between 60 to 5940 seconds
#     TIMETICKS
#
## .1.3.6.1.4.1.3808.1.1.1.5.2.11.0
#    The delay time the UPS will enter sleep mode after receiving a sleep command. WThe possible values are between 60 to 5940 seconds.
#     TIMETICKS
#
# This one is buggy
# .1.3.6.1.4.1.3808.1.1.1.5.2.4.0
#     This value is set to handle audible alarms when power failure.
#     INTEGER {timed(1), enable(2), disable(3), mute(4)}
#
# This one is buggy
# .1.3.6.1.4.1.3808.1.1.1.6.2.5.0
#    UPS will beep and simultaneously turn on the panel lights when the variable is set to flashAndBeep(2)
#    INTEGER {noFlashAndBeep(1), flashAndBeep(2)}

# This one is buggy
# .1.3.6.1.4.1.3808.1.1.1.7.2.1.0
#   The schedule of the UPS automatic selftest.
#   INTEGER {unknown(1), biweekly(2), weekly(3), atTurnOn(4), never(5) }
#
# This one is buggy
# .1.3.6.1.4.1.3808.1.1.1.7.2.5.0
#    UPS will perform a panel indicator test when the variable
#    INTEGER {noTestIndicators(1), testIndicators(2)}
#
# .1.3.6.1.4.1.3808.1.1.1.7.2.6.0
#    UPS will discharge to calibrate the UPS runtime when the variable is set to performEstimation(2).
#    INTEGER {noPerformEstimation(1), performEstimation(2), cancelCurrentEstimation(3)}
#
# .1.3.6.1.4.1.3808.1.1.1.3.2.5
#    The reason of UPS power failure. This value is set to:
#      -noTransfer(1), if UPS is in utility mode.
#      -highLineVoltage(2), if UPS switch to battery mode by reason of input voltage over the high transfer vloltage.
#      -brownout(3), if UPS switch to battery mode by reason of input voltage under the low transfer voltage.
#      -selfTest(4), if the UPS was commanded to do a self test.
#
# .1.3.6.1.4.1.3808.1.1.1.2.2.5.0
#   This value indicates if UPS batteries need to be replaced.
#    INTEGER {noBatteryNeedsReplacing(1),batteryNeedsReplacing(2)}
#
# .1.3.6.1.4.1.3808.1.1.1.2.1.3.0
#  Write to this value: to set the Battery Date
#     The UPS batteries last replaced date in mm/dd/yyyy format.
#     This value is originally set when manufactured. If batteries replaced, administrator should reset this value.

inside **/homeassistant/entities/switches/ **
file: cyberpower_ups01.yaml

###################################
# CyberPower UPS
#
# UPS on 192.168.1.11 - PC
#
# version 2025-02-12 09:23:14.524
###################################
# Inpired by:
#   https://community.home-assistant.io/t/cyberpower-ups-powerpanel-cloud/509968/7
#
# Confirmed working for model:
#    CP1500AVRLCD3 - PowerPanel Business v4.11.3 on Windows 11 (10.0.26100 64-bit)
#    CP1350AVRLCDa - PowerPanel Business v4.11.3 on Ubuntu 22.04.1 (Linux 6.8.0-52-generic 64-bit)
#
# Download location: https://www.cyberpower.com/global/en/download
#    Linux:   CyberPower_PPB_Linux+64bit_v4.11.3.sh - PowerPanel Business Local/Remote for Linux 64bit
#    Windows: CyberPower_PPB_Windows_v4.11.3        - PowerPanel Business Local/Remote for Windows
#switch:
- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.7.2.2.0
  name: UPS01 Test Battery
  scan_interval: 60
  host: 192.168.1.11
  port: 161
  community: private
  payload_on: 2
  payload_off: 1

- platform: snmp
  baseoid: .1.3.6.1.4.1.3808.1.1.1.7.2.6.0
  name: UPS01 Calibrate Battery
  scan_interval: 60
  host: 192.168.1.11
  port: 161
  community: private
  payload_on: 2
  payload_off: 1

Here is my “graphical” modifications:

title: UPS on Host
type: entities
entities:
  - type: divider
    style:
      height: 0px
      margin-top: "-20px;"
  - entity: sensor.ups01_advanced_status
    name: UPS Status
    icon: mdi:power
  - type: divider
    style:
      height: 0px
      margin-top: "-15px;"
  - entity: sensor.ups01_run_time_remaining
    name: Run Time Remaining
    icon: mdi:av-timer
  - type: divider
    style:
      height: 0px
      margin-top: "-15px;"
  - entity: sensor.ups01_battery_capacity
    name: Battery Capacity
  - type: divider
    style:
      height: 0px
      margin-top: "-15px;"
  - entity: sensor.ups01_load
    icon: mdi:signal-cellular-3
    name: Load
  - type: divider
    style:
      height: 0px
      margin-top: "-15px;"
  - entity: sensor.ups01_input_voltage
    name: Input Voltage
  - type: divider
    style:
      height: 0px
      margin-top: "-15px;"
  - entity: sensor.ups01_output_power
    name: Output Power
    icon: mdi:lightning-bolt
  - type: divider
    style:
      height: 0px
      margin-top: "-10px;"
  - entity: sensor.ups01_battery_voltage
    name: Battery Voltage
    icon: mdi:car-battery
  - type: divider
    style:
      height: 0px
      margin-top: "-10px;"
  - entity: sensor.ups01_battery_status
    name: Battery Status
    icon: mdi:checkbox-marked-outline
    type: custom:secondaryinfo-entity-row
    secondary_info: Installed [[ sensor.ups01_battery_installed_date ]]
  - type: divider
    style:
      background-color: none
      height: 1px
      margin-top: "-5px;"
      width: 95%
      margin-left: auto
      margin-right: auto
  - type: divider
    style:
      background-color: none
      height: 0px
      margin-top: "-5px;"
      width: 95%
      margin-left: auto
      margin-right: auto
  - entity: sensor.ups01_hostname
    name: System Hostname
    type: custom:secondaryinfo-entity-row
    secondary_info: "[[ sensor.ups01_ip_address ]]"
  - type: divider
    style:
      height: 0px
      margin-top: "-5px;"
  - entity: sensor.ups01_model
    type: custom:multiple-entity-row
    name: Model
    icon: mdi:power-plug
    secondary_info:
      name: S/N
      entity: sensor.ups01_serial_number
      type: custom:multiple-entity-row
      secondary_info: sensor.ups01_serial_number
    entities:
      - entity: sensor.ups01_power_rating
        name: Rating
        styles:
          width: 100px
          text-align: center
          color: lightblue
          font-size: 12.5px
  - type: divider
    style:
      height: 0px
      margin-top: "-10px;"
  - entity: sensor.ups01_firmware
    name: Firmware
  - type: divider
    style:
      height: 0px
      margin-top: "-10px;"
  - entity: sensor.ups01_uptime
    icon: mdi:clock-outline
    name: Uptime
    type: custom:secondaryinfo-entity-row
    secondary_info: "Clock: [[ sensor.ups01_date_n_time ]]"
  - type: divider
    style:
      background-color: none
      height: 1px
      margin-top: "-5px;"
      width: 95%
      margin-left: auto
      margin-right: auto
  - type: divider
    style:
      background-color: none
      height: 0px
      margin-top: "-5px;"
      width: 95%
      margin-left: auto
      margin-right: auto
  - entity: switch.ups01_test_battery
    type: custom:multiple-entity-row
    name: Battery Selftest
    icon: mdi:battery-check
    toggle: true
    secondary_info: null
    entities:
      - entity: sensor.ups01_selftest_result
        name: Results
        styles:
          width: 60px
          text-align: center
          color: lime
          font-size: 12.5px
      - entity: sensor.ups01_selftest_date
        name: Test Date
        styles:
          width: 65px
          text-align: center
          font-size: 11px
  - type: divider
    style:
      height: 0px
      margin-top: "-5px;"
  - entity: switch.ups01_calibrate_battery
    type: custom:multiple-entity-row
    name: Battery Test Estimation
    icon: mdi:wrench-clock
    toggle: true
    secondary_info:
      name: Take ~
      entity: sensor.ups01_run_time_remaining
      type: custom:multiple-entity-row
      secondary_info: sensor.ups01_run_time_remaining
    entities:
      - entity: sensor.ups01_advance_test_estimation_results
        name: Results
        styles:
          width: 60px
          text-align: center
          color: lime
          font-size: 12.5px
      - entity: sensor.ups01_advance_test_estimation_date_temp
        name: Test Date
        styles:
          width: 65px
          text-align: center
          font-size: 11px
show_header_toggle: false
state_color: true
grid_options:
  columns: 12
  rows: auto

This is the way! Thank you!!!

@dancwilliams or @peter-mc can you elaborate further on “setup an SNMP gateway and add to NUT”? Were you using a Windows machine? Was HA running on the same machine as the UPS was connected?

I have 2 UPSes, one connected to a Linux machine and one to a Windows machine. The Linux connected one was super simple to connect to NUT and HA. However, I’ve done a fair bit of research on a Windows version of a NUT server, and although 1 or 2 options exists, they are not the easiest to setup. However, I like the idea of using the NUT integration vs manually creating sensors and cards.

It’s fairly cheap and very easy to do with a Raspberry Pi (I use a Pi 4 but I think Pi zero can do it, even cheaper).

I’m wondering if anyone managed to get the linux subsystem on windows to do it though, somehow.

In Nut you can have it output SNMP by listing all the OID’s it should respond to. I do that so I can monitor my NUT devices with Zabbix. But that is sort of the inverse of what you are looking for I think.

Hello!

On the Windows box that is connected to the CyberPower GX1500U UPS via USB I am running POwerPanel Business 4.12.0. I have PowerPanel Business configured to allow SNMP polling.

I am running Home Assistant on a different machine with the Network UPS Tools (NUT) add-on. I have the Add-On itself configured as below:

And the individual desktop configured like this:

Then, back within Home Assistant Devices I added the NUT integration and then added the NUT Addon as a device using the “user” I created within the addon:

This dropped the UPS into Home assistant as a device:

Hope this helps!