| Developer: | Glenn's Plugins Like this plugin? Show your appreciation! |
| Category: | Energy Monitoring |
| Github: | Github Repo |
| Assistance: | Get help! Check the online documentation |
| Plugin ID: | com.GlennNZ.indigoplugin.CyberpowerUPS |
| Latest release: | v1.1.2 released on May 31, 2026 |
| Release downloaded: | 21 times |
| Requires: | Indigo v2022.1.0 or higher |
| Download release v1.1.2 |

![]()
Monitor a CyberPower UPS from Indigo home automation via the Power Panel Personal local REST API. UPS status, battery health, runtime, input/output power, hardware specs, and system warnings are all exposed as Indigo device states and update automatically.
Developed by GlennNZ
CyberPower Power Panel Personal is free software published by CyberPower Systems that runs on a computer connected to a CyberPower UPS via USB. It provides:
Power Panel Personal runs as a background service on macOS, Windows, or Linux. It does not require a CyberPower cloud account; everything operates entirely on your local network.
Supported UPS models: Most CyberPower Smart App UPS models with a USB port (CP series, PR series, OR series). Check the CyberPower website for the full compatibility list.
Download Power Panel Personal from the CyberPower website:
CyberPower Systems → Support → Software → Power Panel Personal
Choose the installer for your operating system (macOS, Windows, or Linux). Version 1.4.x and later include the REST API used by this plugin.
.dmg and run the installer package.ppbe) and the web interface.Power Panel Personal also runs on Linux, making it suitable for always-on devices like a Synology NAS, Raspberry Pi, or Ubuntu server:
# Debian/Ubuntu — install the .deb package
sudo dpkg -i powerpanel-xxx.deb
# Start the service
sudo systemctl start pwrstatd
sudo systemctl enable pwrstatd
The web interface listens on port 3052 by default.
Open a browser and navigate to:
http://<host-ip>:3052
You should see the Power Panel Personal web UI showing your UPS model, battery status, and input/output readings. If the page loads, the REST API is available.
Tip: If the UPS is connected to a Mac that also runs Indigo, the host IP is typically
127.0.0.1or the Mac's LAN IP. If Power Panel runs on a separate device (NAS, Raspberry Pi), use that device's LAN IP.
By default Power Panel ships with a default username and password. You should change these before exposing the web UI on your network:
http://<host>:3052The default REST API port is 3052. You can confirm it in Power Panel under Settings → System or by checking the URL in your browser when logged in.
Ensure the Mac running Indigo can reach the Power Panel host on port 3052:
# Quick test from the Indigo Mac terminal
curl -s http://<host-ip>:3052/local/rest/v1/ups/status
# Should return JSON (a 401 is expected before login — that confirms connectivity)
If this hangs or is refused, check: - The firewall on the Power Panel host allows inbound TCP 3052 - Both devices are on the same VLAN/subnet, or routing is in place
If Power Panel runs on the same Mac as Indigo Server, use 127.0.0.1 as the host. No firewall changes are needed.
| Requirement | Detail |
|---|---|
| Indigo version | 2025.1 or later (ServerApiVersion 3.0) |
| Python | 3.10+ (included with Indigo 2023.2+) |
| Power Panel Personal | 1.4.x or later, running locally |
| Network | Indigo Mac must reach Power Panel host on port 3052 |
| UPS connection | USB cable from UPS to the Power Panel host |
Open Plugins → Cyberpower UPS Panel → Configure… to set global options.
| Field | Default | Description |
|---|---|---|
| Poll Interval | 60 | Seconds between status polls across all UPS devices. Minimum 10. |
| Show Debug Logging | off | Logs raw API responses and all state values. Enable only when diagnosing issues. |
Credentials (host, port, username, password) are configured per device, not here. This allows the plugin to monitor multiple UPS units on different hosts.
Office UPS or Server Room UPS| Field | Example | Notes |
|---|---|---|
| Host Address | 192.168.1.209 |
IP of the Power Panel host |
| Port | 3052 |
Default Power Panel REST port |
| Username | admin |
As set in Power Panel Account settings |
| Password | yourpassword |
Plain text — sent directly to the API |
The device icon turns green when the system state is Normal, and amber if any system fault is reported.
Create one Indigo device per UPS. Each device has its own host/port/credentials and maintains an independent authentication token. The global poll interval applies to all devices.
States appear in the Indigo device detail panel and are available for triggers, conditions, and control pages. States are dynamically discovered — see section 9 for details.
Each poll cycle queries three API endpoints in sequence: /ups/status, /ups/spec, and /ups/summary.
| State | Type | Description |
|---|---|---|
communicationStatus |
Boolean | true = UPS communication available |
systemStateText |
String | Overall system status, e.g. Normal |
lastUpdate |
String | Timestamp of last successful poll |
| State | Type | Example |
|---|---|---|
inputAvailable |
Boolean | true |
inputState |
Number | 0 = Normal |
inputStateText |
String | Normal |
inputVoltage |
Number | 243.5 (V) |
inputFrequency |
Number | 50.00 (Hz) |
inputCurrent |
Number | Current draw (A) — appears when reported |
inputPowerFactor |
Number | Appears when reported |
| State | Type | Example |
|---|---|---|
outputAvailable |
Boolean | true |
outputState |
Number | 0 = Normal |
outputStateText |
String | Normal |
outputVoltage |
Number | 230.0 (V) |
outputCurrent |
Number | 4.3 (A) |
outputFrequency |
Number | 50.00 (Hz) |
outputLoadPercent |
Number | 34 (%) |
outputWatts |
Number | 790 (W) |
outputVA |
Number | 1025 (VA) |
outputNcl1StateText |
String | On — outlet bank 1 state |
outputActivePower |
Number | Appears when reported |
outputReactivePower |
Number | Appears when reported |
| State | Type | Example |
|---|---|---|
batteryAvailable |
Boolean | true |
batteryState |
Number | 0 = Normal |
batteryStateText |
String | Normal, Fully Charged |
batteryVoltage |
Number | 82.2 (V) |
batteryCapacityPercent |
Number | 100 (%) |
batteryRemainingRunTimeSecs |
Number | 900 |
batteryRemainingRunTimeFormatted |
String | 0hr. 15min. |
batteryRuntimeInsufficient |
Boolean | false |
batteryHealthIndex |
Number | 94 — BHI 0–100 |
batteryModularRuntimeZero |
Boolean | false |
batteryChargeTimeSecs |
Number | Appears while charging |
batteryChargeTimeFormatted |
String | Appears while charging |
batteryTemperatureCelsius |
Number | Appears on models with temp sensor |
batteryHighVoltage |
Number | Appears when threshold configured |
batteryLowVoltage |
Number | Appears when threshold configured |
| State | Type | Example |
|---|---|---|
bypassAvailable |
Boolean | false on most models |
bypassState |
Number | Appears when bypass active |
bypassStateText |
String | Appears when bypass active |
bypassVoltage |
Number | Appears when bypass active |
bypassFrequency |
Number | Appears when bypass active |
| State | Type | Example |
|---|---|---|
systemAvailable |
Boolean | true |
systemState |
Number | 0 = Normal |
systemStateText |
String | Normal |
systemHardwareFaultAvailable |
Boolean | true |
systemHardwareFaultCode |
String | 0x80808080808080 |
systemTemperatureCelsius |
Number | Appears on models with ambient sensor |
systemTemperatureFormatted |
String | Formatted temperature string |
Populated from /ups/spec on every poll. These values reflect the physical UPS hardware and rating data.
| State | Type | Example |
|---|---|---|
specUpsModel |
String | OLS3000ERT2UA |
specSerialNo |
String | 310049ET30000025 |
specUpsType |
String | On-Line |
specRatingPower |
String | 3000 VA / 2700 W |
specRatingVolt |
String | 208~240 V |
specRatingFreq |
String | 40~70 Hz |
specMaxCurrent |
String | 13.0 Amp |
specHardwareVersion |
String | OS02RV14 |
specUsbVersion |
String | v.01 |
specDeviceName |
String | Name given to this UPS in Power Panel |
specLocation |
String | Location field from Power Panel settings |
specContact |
String | Contact field from Power Panel settings |
specBatteryReplacedDate |
String | 2025/11/03 |
specNextReplacementDate |
String | 2029/05/03 |
specAloneOutletNumber |
Number | 1 — number of individually switched outlets |
specExternalBatteryCabinets |
Number | 0 |
specIsExpired |
Boolean | false — warranty/replacement expired |
specIsThreePhase |
Boolean | false |
specEbmSupported |
Boolean | false — external battery module |
specIndividualBankControl |
Boolean | false — per-outlet switching capability |
Populated from /ups/summary on every poll. Useful for triggering on warning conditions.
| State | Type | Example |
|---|---|---|
summaryNormalMessage |
String | The UPS is working normally. |
summaryWarningMessage |
String | Empty when healthy; populated with warning text when a fault is present |
summaryHasWarning |
Boolean | false — true when any warning message is active |
States are not pre-defined in a static list. The plugin uses Indigo's getDeviceStateList() callback to register states at runtime:
communicationStatus, systemStateText, lastUpdate)pluginProps['discoveredStates'] and stateListOrDisplayStateIdChanged() is called — Indigo re-invokes getDeviceStateList() which now includes the new statesConsequences of this design:
null do not appear until the UPS actually reports a value. For example, batteryTemperatureCelsius will not exist until the UPS hardware reports a temperature reading.pluginProps and rebuilt immediately on deviceStartComm.Actions are available under Actions → Cyberpower UPS Panel when building action groups or triggers.
Triggers the UPS audible alarm test. The UPS will sound briefly to confirm the alarm is functional. Useful for periodic scheduled tests or verifying the alarm after installation.
Access these from Plugins → Cyberpower UPS Panel in the Indigo menu bar:
| Item | Action |
|---|---|
| Force UPS Status Update | Clears all cached tokens and polls all UPS devices immediately |
| Toggle Debugging | Enables or disables verbose debug logging at runtime (no plugin restart needed) |
batteryStateText changes and is not equal to Normal, Fully ChargedbatteryRemainingRunTimeSecs falls below 300 (5 minutes)outputLoadPercent rises above 80inputStateText changes to anything other than NormalsummaryHasWarning becomes truesummaryWarningMessageAdd these states to an Indigo control page for a live UPS dashboard:
batteryCapacityPercent — battery levelbatteryRemainingRunTimeFormatted — time remainingoutputLoadPercent — current loadoutputWatts — watts being drawnsystemStateText — overall healthinputVoltage / outputVoltage — power qualitysummaryWarningMessage — active warningshttp://<host>:3052 in a browserbash
curl -s http://<host>:3052/local/rest/v1/ups/status
A 401 Unauthorized response confirms the API is reachable (authentication is just required)http://<host>:3052 directly with the same credentials to confirm they work.indigoPlugin~/Library/Application Support/Perceptive Automation/Indigo 2025.2/Plugins/
or the Plugins (Disabled)/ folder if not yet enabled| Version | Date | Notes |
|---|---|---|
| 1.1.1 | 2026-05-31 | Alarm test action; /ups/spec and /ups/summary endpoints added; spec and summary states |
| 1.0.6 | 2026-05-30 | Explicit TimeoutError handling; 403 treated as stale token → re-auth; recursion guard |
| 1.0.5 | 2026-05-30 | Truly dynamic states via getDeviceStateList() override; Devices.xml reduced to 3 anchor states |
| 1.0.4 | 2026-05-30 | Comprehensive _build_states() covering all API fields; null-skipping |
| 1.0.3 | 2026-05-30 | Debug logging of raw API response and state list |
| 1.0.2 | 2026-05-30 | Fixed double-Bearer auth bug; plain text password; logging restored |
| 1.0.1 | 2026-05-30 | Credentials moved to device level; per-device token cache; dynamic state refresh |
| 1.0.0 | 2026-05-30 | Initial release |
| Released on: | May 31, 2026 |
| Requires: | Indigo v2022.1.0+ |
| Downloaded: | 21 times |
| Download this release | |

![]()
Monitor a CyberPower UPS from Indigo home automation via the Power Panel Personal local REST API. UPS status, battery health, runtime, input/output power, hardware specs, and system warnings are all exposed as Indigo device states and update automatically.
Developed by GlennNZ
CyberPower Power Panel Personal is free software published by CyberPower Systems that runs on a computer connected to a CyberPower UPS via USB. It provides:
Power Panel Personal runs as a background service on macOS, Windows, or Linux. It does not require a CyberPower cloud account; everything operates entirely on your local network.
Supported UPS models: Most CyberPower Smart App UPS models with a USB port (CP series, PR series, OR series). Check the CyberPower website for the full compatibility list.
Download Power Panel Personal from the CyberPower website:
CyberPower Systems → Support → Software → Power Panel Personal
Choose the installer for your operating system (macOS, Windows, or Linux). Version 1.4.x and later include the REST API used by this plugin.
.dmg and run the installer package.ppbe) and the web interface.Power Panel Personal also runs on Linux, making it suitable for always-on devices like a Synology NAS, Raspberry Pi, or Ubuntu server:
# Debian/Ubuntu — install the .deb package
sudo dpkg -i powerpanel-xxx.deb
# Start the service
sudo systemctl start pwrstatd
sudo systemctl enable pwrstatd
The web interface listens on port 3052 by default.
Open a browser and navigate to:
http://<host-ip>:3052
You should see the Power Panel Personal web UI showing your UPS model, battery status, and input/output readings. If the page loads, the REST API is available.
Tip: If the UPS is connected to a Mac that also runs Indigo, the host IP is typically
127.0.0.1or the Mac's LAN IP. If Power Panel runs on a separate device (NAS, Raspberry Pi), use that device's LAN IP.
By default Power Panel ships with a default username and password. You should change these before exposing the web UI on your network:
http://<host>:3052The default REST API port is 3052. You can confirm it in Power Panel under Settings → System or by checking the URL in your browser when logged in.
Ensure the Mac running Indigo can reach the Power Panel host on port 3052:
# Quick test from the Indigo Mac terminal
curl -s http://<host-ip>:3052/local/rest/v1/ups/status
# Should return JSON (a 401 is expected before login — that confirms connectivity)
If this hangs or is refused, check: - The firewall on the Power Panel host allows inbound TCP 3052 - Both devices are on the same VLAN/subnet, or routing is in place
If Power Panel runs on the same Mac as Indigo Server, use 127.0.0.1 as the host. No firewall changes are needed.
| Requirement | Detail |
|---|---|
| Indigo version | 2025.1 or later (ServerApiVersion 3.0) |
| Python | 3.10+ (included with Indigo 2023.2+) |
| Power Panel Personal | 1.4.x or later, running locally |
| Network | Indigo Mac must reach Power Panel host on port 3052 |
| UPS connection | USB cable from UPS to the Power Panel host |
Open Plugins → Cyberpower UPS Panel → Configure… to set global options.
| Field | Default | Description |
|---|---|---|
| Poll Interval | 60 | Seconds between status polls across all UPS devices. Minimum 10. |
| Show Debug Logging | off | Logs raw API responses and all state values. Enable only when diagnosing issues. |
Credentials (host, port, username, password) are configured per device, not here. This allows the plugin to monitor multiple UPS units on different hosts.
Office UPS or Server Room UPS| Field | Example | Notes |
|---|---|---|
| Host Address | 192.168.1.209 |
IP of the Power Panel host |
| Port | 3052 |
Default Power Panel REST port |
| Username | admin |
As set in Power Panel Account settings |
| Password | yourpassword |
Plain text — sent directly to the API |
The device icon turns green when the system state is Normal, and amber if any system fault is reported.
Create one Indigo device per UPS. Each device has its own host/port/credentials and maintains an independent authentication token. The global poll interval applies to all devices.
States appear in the Indigo device detail panel and are available for triggers, conditions, and control pages. States are dynamically discovered — see section 9 for details.
Each poll cycle queries three API endpoints in sequence: /ups/status, /ups/spec, and /ups/summary.
| State | Type | Description |
|---|---|---|
communicationStatus |
Boolean | true = UPS communication available |
systemStateText |
String | Overall system status, e.g. Normal |
lastUpdate |
String | Timestamp of last successful poll |
| State | Type | Example |
|---|---|---|
inputAvailable |
Boolean | true |
inputState |
Number | 0 = Normal |
inputStateText |
String | Normal |
inputVoltage |
Number | 243.5 (V) |
inputFrequency |
Number | 50.00 (Hz) |
inputCurrent |
Number | Current draw (A) — appears when reported |
inputPowerFactor |
Number | Appears when reported |
| State | Type | Example |
|---|---|---|
outputAvailable |
Boolean | true |
outputState |
Number | 0 = Normal |
outputStateText |
String | Normal |
outputVoltage |
Number | 230.0 (V) |
outputCurrent |
Number | 4.3 (A) |
outputFrequency |
Number | 50.00 (Hz) |
outputLoadPercent |
Number | 34 (%) |
outputWatts |
Number | 790 (W) |
outputVA |
Number | 1025 (VA) |
outputNcl1StateText |
String | On — outlet bank 1 state |
outputActivePower |
Number | Appears when reported |
outputReactivePower |
Number | Appears when reported |
| State | Type | Example |
|---|---|---|
batteryAvailable |
Boolean | true |
batteryState |
Number | 0 = Normal |
batteryStateText |
String | Normal, Fully Charged |
batteryVoltage |
Number | 82.2 (V) |
batteryCapacityPercent |
Number | 100 (%) |
batteryRemainingRunTimeSecs |
Number | 900 |
batteryRemainingRunTimeFormatted |
String | 0hr. 15min. |
batteryRuntimeInsufficient |
Boolean | false |
batteryHealthIndex |
Number | 94 — BHI 0–100 |
batteryModularRuntimeZero |
Boolean | false |
batteryChargeTimeSecs |
Number | Appears while charging |
batteryChargeTimeFormatted |
String | Appears while charging |
batteryTemperatureCelsius |
Number | Appears on models with temp sensor |
batteryHighVoltage |
Number | Appears when threshold configured |
batteryLowVoltage |
Number | Appears when threshold configured |
| State | Type | Example |
|---|---|---|
bypassAvailable |
Boolean | false on most models |
bypassState |
Number | Appears when bypass active |
bypassStateText |
String | Appears when bypass active |
bypassVoltage |
Number | Appears when bypass active |
bypassFrequency |
Number | Appears when bypass active |
| State | Type | Example |
|---|---|---|
systemAvailable |
Boolean | true |
systemState |
Number | 0 = Normal |
systemStateText |
String | Normal |
systemHardwareFaultAvailable |
Boolean | true |
systemHardwareFaultCode |
String | 0x80808080808080 |
systemTemperatureCelsius |
Number | Appears on models with ambient sensor |
systemTemperatureFormatted |
String | Formatted temperature string |
Populated from /ups/spec on every poll. These values reflect the physical UPS hardware and rating data.
| State | Type | Example |
|---|---|---|
specUpsModel |
String | OLS3000ERT2UA |
specSerialNo |
String | 310049ET30000025 |
specUpsType |
String | On-Line |
specRatingPower |
String | 3000 VA / 2700 W |
specRatingVolt |
String | 208~240 V |
specRatingFreq |
String | 40~70 Hz |
specMaxCurrent |
String | 13.0 Amp |
specHardwareVersion |
String | OS02RV14 |
specUsbVersion |
String | v.01 |
specDeviceName |
String | Name given to this UPS in Power Panel |
specLocation |
String | Location field from Power Panel settings |
specContact |
String | Contact field from Power Panel settings |
specBatteryReplacedDate |
String | 2025/11/03 |
specNextReplacementDate |
String | 2029/05/03 |
specAloneOutletNumber |
Number | 1 — number of individually switched outlets |
specExternalBatteryCabinets |
Number | 0 |
specIsExpired |
Boolean | false — warranty/replacement expired |
specIsThreePhase |
Boolean | false |
specEbmSupported |
Boolean | false — external battery module |
specIndividualBankControl |
Boolean | false — per-outlet switching capability |
Populated from /ups/summary on every poll. Useful for triggering on warning conditions.
| State | Type | Example |
|---|---|---|
summaryNormalMessage |
String | The UPS is working normally. |
summaryWarningMessage |
String | Empty when healthy; populated with warning text when a fault is present |
summaryHasWarning |
Boolean | false — true when any warning message is active |
States are not pre-defined in a static list. The plugin uses Indigo's getDeviceStateList() callback to register states at runtime:
communicationStatus, systemStateText, lastUpdate)pluginProps['discoveredStates'] and stateListOrDisplayStateIdChanged() is called — Indigo re-invokes getDeviceStateList() which now includes the new statesConsequences of this design:
null do not appear until the UPS actually reports a value. For example, batteryTemperatureCelsius will not exist until the UPS hardware reports a temperature reading.pluginProps and rebuilt immediately on deviceStartComm.Actions are available under Actions → Cyberpower UPS Panel when building action groups or triggers.
Triggers the UPS audible alarm test. The UPS will sound briefly to confirm the alarm is functional. Useful for periodic scheduled tests or verifying the alarm after installation.
Access these from Plugins → Cyberpower UPS Panel in the Indigo menu bar:
| Item | Action |
|---|---|
| Force UPS Status Update | Clears all cached tokens and polls all UPS devices immediately |
| Toggle Debugging | Enables or disables verbose debug logging at runtime (no plugin restart needed) |
batteryStateText changes and is not equal to Normal, Fully ChargedbatteryRemainingRunTimeSecs falls below 300 (5 minutes)outputLoadPercent rises above 80inputStateText changes to anything other than NormalsummaryHasWarning becomes truesummaryWarningMessageAdd these states to an Indigo control page for a live UPS dashboard:
batteryCapacityPercent — battery levelbatteryRemainingRunTimeFormatted — time remainingoutputLoadPercent — current loadoutputWatts — watts being drawnsystemStateText — overall healthinputVoltage / outputVoltage — power qualitysummaryWarningMessage — active warningshttp://<host>:3052 in a browserbash
curl -s http://<host>:3052/local/rest/v1/ups/status
A 401 Unauthorized response confirms the API is reachable (authentication is just required)http://<host>:3052 directly with the same credentials to confirm they work.indigoPlugin~/Library/Application Support/Perceptive Automation/Indigo 2025.2/Plugins/
or the Plugins (Disabled)/ folder if not yet enabled| Version | Date | Notes |
|---|---|---|
| 1.1.1 | 2026-05-31 | Alarm test action; /ups/spec and /ups/summary endpoints added; spec and summary states |
| 1.0.6 | 2026-05-30 | Explicit TimeoutError handling; 403 treated as stale token → re-auth; recursion guard |
| 1.0.5 | 2026-05-30 | Truly dynamic states via getDeviceStateList() override; Devices.xml reduced to 3 anchor states |
| 1.0.4 | 2026-05-30 | Comprehensive _build_states() covering all API fields; null-skipping |
| 1.0.3 | 2026-05-30 | Debug logging of raw API response and state list |
| 1.0.2 | 2026-05-30 | Fixed double-Bearer auth bug; plain text password; logging restored |
| 1.0.1 | 2026-05-30 | Credentials moved to device level; per-device token cache; dynamic state refresh |
| 1.0.0 | 2026-05-30 | Initial release |