{"id":50937958,"url":"https://github.com/nugget/schneider-ups-nmc","last_synced_at":"2026-06-17T11:03:28.015Z","repository":{"id":360150067,"uuid":"1248889353","full_name":"nugget/schneider-ups-nmc","owner":"nugget","description":"Home Assistant integration for APC by Schneider Electric UPS Network Management Cards.","archived":false,"fork":false,"pushed_at":"2026-05-25T20:06:16.000Z","size":430,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-25T21:28:40.076Z","etag":null,"topics":["apc","custom-integration","hacs","home-assistant","home-assistant-integration","network-management-card","nmc","power-monitoring","schneider-electric","snmp","syslog","ups"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nugget.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-25T06:33:29.000Z","updated_at":"2026-05-25T20:04:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nugget/schneider-ups-nmc","commit_stats":null,"previous_names":["nugget/schneider-ups-nmc3","nugget/schneider-ups-nmc"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/nugget/schneider-ups-nmc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nugget%2Fschneider-ups-nmc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nugget%2Fschneider-ups-nmc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nugget%2Fschneider-ups-nmc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nugget%2Fschneider-ups-nmc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nugget","download_url":"https://codeload.github.com/nugget/schneider-ups-nmc/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nugget%2Fschneider-ups-nmc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34445186,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apc","custom-integration","hacs","home-assistant","home-assistant-integration","network-management-card","nmc","power-monitoring","schneider-electric","snmp","syslog","ups"],"created_at":"2026-06-17T11:03:16.151Z","updated_at":"2026-06-17T11:03:28.006Z","avatar_url":"https://github.com/nugget.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# APC UPS NMC\n\n[![HACS Custom](https://img.shields.io/badge/HACS-Custom-41BDF5.svg?style=flat-square)](https://www.hacs.xyz/)\n[![CI](https://img.shields.io/github/actions/workflow/status/nugget/schneider-ups-nmc/ci.yml?branch=main\u0026style=flat-square\u0026label=ci)](https://github.com/nugget/schneider-ups-nmc/actions/workflows/ci.yml)\n[![Manifest version](https://img.shields.io/badge/dynamic/json?style=flat-square\u0026label=manifest\u0026query=%24.version\u0026url=https%3A%2F%2Fraw.githubusercontent.com%2Fnugget%2Fschneider-ups-nmc%2Fmain%2Fcustom_components%2Fschneider_ups_nmc%2Fmanifest.json)](https://github.com/nugget/schneider-ups-nmc/blob/main/custom_components/schneider_ups_nmc/manifest.json)\n[![Release](https://img.shields.io/github/v/release/nugget/schneider-ups-nmc?style=flat-square\u0026label=release)](https://github.com/nugget/schneider-ups-nmc/releases)\n[![License](https://img.shields.io/github/license/nugget/schneider-ups-nmc?style=flat-square)](https://github.com/nugget/schneider-ups-nmc/blob/main/LICENSE)\n\nAPC UPS NMC is a local-first Home Assistant custom integration for APC by\nSchneider Electric UPS units with Network Management Cards.\n\nThe integration uses SNMP polling as the source of truth for UPS telemetry and\ncan optionally listen for local syslog push events from one or more NMC cards.\nCurrent support is developed and tested against NMC3 hardware while the\nrepository and Home Assistant domain leave room for additional Schneider\nElectric/APC Network Management Card generations.\n\nThe integration is read-only. It exposes UPS identity, battery, input, output,\nload, energy, self-test, replacement, alarm, and syslog event data from the\nRFC1628 UPS-MIB plus Schneider Electric APC PowerNet MIB fields where useful.\n\n## Supported Devices\n\nKnown supported hardware:\n\n- APC by Schneider Electric UPS units with an NMC3 card and SNMP enabled.\n\nExpected but not yet validated:\n\n- Other APC by Schneider Electric NMC generations that expose the same RFC1628\n  and PowerNet MIB values.\n\nNot currently supported:\n\n- UPS devices that only expose USB, Modbus, cloud APIs, or serial protocols.\n- Multi-phase or multi-output modeling beyond the first input/output table row.\n\nThe first telemetry pass queries line index `1` for input and output table\nvalues. That matches common single-phase UPS deployments. Multi-phase and\nmulti-output UPS support should grow from real NMC walks so the entity model\nmatches what the card actually reports.\n\n## Requirements\n\n- Home Assistant with HACS installed.\n- An APC by Schneider Electric UPS with a supported Network Management Card.\n- SNMP enabled on the NMC web or CLI interface.\n- Either SNMPv2c read-only community access or SNMPv3 credentials.\n\nSNMPv3 is preferred. If you use SNMPv2c, use a read-only community and restrict\nthe NMC access control list to your Home Assistant host.\n\n## Installation\n\n1. Add this repository as a custom integration repository in HACS.\n2. Install **APC UPS NMC**.\n3. Restart Home Assistant.\n4. Go to **Settings \u003e Devices \u0026 services \u003e Add integration**.\n5. Search for **APC UPS NMC**.\n6. Enter the NMC host, SNMP port, SNMP version, scan interval, and optional web\n   UI URL.\n7. Enter the SNMP credentials on the next setup page.\n\nThe setup flow validates the SNMP settings before creating an entry. SNMP\ncommunity strings and SNMPv3 passphrases are entered as password fields in Home\nAssistant, and diagnostics redact stored SNMP secrets before they are exposed\nfor support.\n\nEach UPS/NMC card should be added as its own integration entry with its own\nhost or IP address. The integration uses the UPS identity learned from SNMP to\navoid duplicate entries and to protect reconfiguration from accidentally\npointing an existing Home Assistant device at a different UPS.\n\n## Configuration\n\nSetup fields:\n\n- **Host**: DNS name or IP address of the NMC SNMP interface.\n- **Port**: SNMP UDP port. The default is `161`.\n- **SNMP version**: `SNMPv2c` or `SNMPv3`.\n- **Scan interval**: polling interval in seconds. The default is `60`.\n- **Web UI URL**: optional hostname or HTTP(S) URL used for the Home Assistant\n  device configuration link. Bare hostnames are treated as HTTPS. Paths, query\n  strings, and path parameters are allowed for NMC deep links; URL fragments\n  and embedded credentials are rejected.\n\nSNMPv2c credential fields:\n\n- **Community**: read-only SNMP community string.\n\nSNMPv3 credential fields:\n\n- **Username**\n- **Authentication protocol**: SHA, MD5, or no authentication.\n- **Authentication passphrase**\n- **Privacy protocol**: AES, DES, or no privacy.\n- **Privacy passphrase**\n\nSNMPv3 privacy requires authentication. The setup flow reports a field error if\nthe selected protocol combination is invalid.\n\nAfter setup, use **Reconfigure** from the integration entry to change the NMC\nhost, SNMP port, SNMP version, SNMP credentials, scan interval, or web UI URL\nwithout deleting and re-adding the device.\n\nOptions fields:\n\n- **Scan interval**\n- **Enable syslog listener**\n- **Syslog bind address**\n- **Syslog UDP port**\n- **Web UI URL**\n\nThe polling interval and syslog listener settings can be adjusted from options\nwithout replacing the SNMP connection identity stored in the config entry.\n\n## Data Updates\n\nSNMP polling is the source of truth for all telemetry entities. Every poll\nbuilds one coherent UPS snapshot through Home Assistant's data update\ncoordinator, and entities report unavailable when their backing value is absent\nor the NMC cannot be reached.\n\nSyslog is an optional local push companion. When a configured NMC sends a\nsupported syslog event, Home Assistant fires the integration's syslog event\nentity and immediately requests a fresh SNMP poll. The syslog event itself is\nuseful for automations and troubleshooting, but it does not replace SNMP as the\nauthoritative state source.\n\nThe syslog parser accepts the RFC5424-style format emitted by NMC3 test/events\nand a legacy RFC3164-style format. RFC3164 messages do not include a timezone,\nso the integration stores them using the current year and UTC.\n\n## Entities\n\nSensor entities:\n\n- **Battery status**: enum such as `normal`, `low`, `depleted`, `fault`, or\n  `no_battery_present`.\n- **UPS status**: enum such as `online`, `on_battery`, `eco_mode`, `self_test`,\n  and other PowerNet UPS states.\n- **Battery charge**, **Estimated runtime**, **Seconds on battery**.\n- **Battery voltage**, **Battery current**, **Battery temperature**.\n- **Battery replacement status**, **Battery pack count**, **Battery SKUs**,\n  **Battery last replaced**, and **Battery recommended replacement**.\n- **Input voltage**, **Input frequency**, **Input current**, **Input power**,\n  **Input line faults**, and **Last input transfer reason**.\n- **Output source**, **Output voltage**, **Output frequency**,\n  **Output current**, **Output power**, **Output apparent power**,\n  **Output power factor**, **Output load**, **Output efficiency**, and\n  **Output energy**.\n- **Environmental probe temperature** for AP9335T/AP9335TH sensors attached to\n  NMC universal I/O ports, plus **Environmental probe humidity** when the probe\n  reports humidity.\n- **Self-test result** and **Last self-test**.\n- **Alarm count**.\n\nBinary sensor entities:\n\n- **On battery**\n- **Battery low**\n- **Battery needs replacing**\n- **Alarm present**\n\nEvent entities:\n\n- **Syslog event**: event type is the syslog severity. Event data includes the\n  NMC message, category when available, facility, timestamp, and packet source.\n\nSeveral diagnostic or low-use entities are disabled by default to keep the\nentity registry focused. Entities whose backing OID is not exposed by a\nparticular UPS model or firmware report unavailable rather than presenting a\nfresh but ambiguous unknown value.\n\n## Actions\n\nThis integration does not currently register Home Assistant service actions. It\nis read-only and reports UPS/NMC state for dashboards, automations, diagnostics,\nand energy monitoring.\n\n## Example Use Cases\n\nNotify when protected equipment is running on battery:\n\n```yaml\nautomation:\n  - alias: UPS on battery\n    triggers:\n      - trigger: state\n        entity_id: binary_sensor.rack_ups_on_battery\n        to: \"on\"\n    actions:\n      - action: notify.mobile_app_phone\n        data:\n          message: Rack UPS is running on battery.\n```\n\nReact to a pushed NMC syslog event:\n\n```yaml\nautomation:\n  - alias: UPS warning syslog event\n    triggers:\n      - trigger: state\n        entity_id: event.rack_ups_syslog_event\n    conditions:\n      - condition: template\n        value_template: \"{{ trigger.to_state.attributes.event_type == 'warning' }}\"\n    actions:\n      - action: persistent_notification.create\n        data:\n          title: UPS warning\n          message: \"{{ trigger.to_state.attributes.message }}\"\n```\n\n## Energy Dashboard\n\nThe **Output energy** sensor is reported in `kWh` with Home Assistant's energy\ndevice class and `total_increasing` state class. When your NMC exposes that\ncounter, Home Assistant can use it in the Energy dashboard as an individual\ndevice energy sensor.\n\nTreat this value as protected-load energy measured at the UPS output. If you\nalso monitor the upstream circuit that feeds the UPS, add the UPS output energy\nas an individual device under that upstream device in Home Assistant's energy\nconfiguration so the same consumption is not counted twice.\n\nSome UPS/NMC firmware may not expose the output energy counter. In that case\nthe **Output energy** sensor will be unavailable, but the **Output power** sensor\ncan still be used with Home Assistant's Integration helper to estimate energy\nfrom sampled power readings.\n\n## Syslog Push Events\n\nThe integration opens a shared UDP syslog listener on port `1514` by default.\nConfigure one or more NMC cards to send syslog events to the Home Assistant host\non that port. Events are routed to configured UPS entries by packet source IP.\nIf Home Assistant listens on IPv6 and the OS reports an IPv4 sender as an\nIPv4-mapped IPv6 address, the integration still routes the event to the matching\nIPv4 NMC entry.\n\nBecause Home Assistant only needs one local syslog socket for all configured UPS\nentries, every syslog-enabled entry should use the same listener settings. The\nlistener can be disabled or moved to another bind address and UDP port from the\nintegration options.\n\nIf the listener cannot bind its configured address and port, if two\nsyslog-enabled entries request different listener settings, or if a configured\nNMC sends syslog messages that cannot be parsed, the integration raises a Home\nAssistant Repair issue with the settings or source that need attention.\n\n## Device Registry\n\nWhen the NMC exposes a physical network interface through IF-MIB, the\nintegration registers the NMC MAC address as a Home Assistant device\nconnection. That helps Home Assistant coalesce the UPS device with discovery or\nfuture integrations that identify the same network card by MAC address.\n\nThe Home Assistant device registry entry also includes the NMC web\nconfiguration URL derived from the configured SNMP host, plus manufacturer,\nmodel, serial number, and firmware details when the NMC exposes them.\n\n## Diagnostics\n\nDiagnostics include redacted config entry data, current device identity, update\nsuccess state, available telemetry keys, the latest routed syslog event while it\nis fresh, and syslog parse-failure counts. SNMP community strings and SNMPv3\ncredential fields are redacted before diagnostics are returned to Home\nAssistant.\n\nThe latest syslog event in diagnostics is retained for 24 hours. It is intended\nas a troubleshooting hint, not a durable event log.\n\n## Troubleshooting\n\n**The setup flow says it cannot connect.**\nVerify the NMC host, SNMP port, SNMP version, credentials, NMC access control\nlist, and network path from Home Assistant to the NMC. Setup validates the SNMP\nconnection before it stores the config entry.\n\n**An entity is unavailable.**\nThe NMC may not expose that OID for your UPS model or firmware, or the most\nrecent SNMP refresh may have failed. Check diagnostics and Home Assistant logs\nfor the integration.\n\n**A battery or self-test date looks wrong.**\nSome NMC firmware returns display-locale date strings over SNMP. Ambiguous slash\ndates such as `01/02/2026` are interpreted US-first as January 2, 2026.\nYear-first dates such as `2026-05-25` and `2026/05/25`, plus unambiguous\nday-first dates such as `13/04/2026`, parse correctly.\n\n**The syslog listener cannot start.**\nAnother process may already be using the configured UDP port, or multiple UPS\nentries may have different syslog listener settings. Use the Repair issue or\nthe integration options to align the bind address and UDP port.\n\n**Syslog messages could not be parsed.**\nCheck that the NMC is configured to send syslog in English and is using a\nsupported format. The integration currently accepts the NMC3 RFC5424-style\nformat and a legacy RFC3164-style format.\n\n**Output energy is unavailable.**\nSome UPS/NMC firmware does not expose the PowerNet output energy counter. Use\nthe **Output power** sensor with Home Assistant's Integration helper if you want\nestimated energy from sampled power readings.\n\n## Removal\n\n1. In Home Assistant, go to **Settings \u003e Devices \u0026 services**.\n2. Open **APC UPS NMC**.\n3. Delete each config entry you no longer want.\n4. Remove or disable the matching syslog destination on the NMC if you enabled\n   syslog push events.\n5. Optionally uninstall the integration from HACS and restart Home Assistant.\n\n## Release Engineering\n\n`just release \u003cversion\u003e` is the canonical release path. It updates release\nmetadata, runs the full local gate, creates a signed `v`-prefixed tag, pushes\nthe branch and tag, and creates a GitHub Release for HACS.\n\nAfter the release exists on GitHub, replace the generated release notes with a\nnarrative release summary before announcing it. Start with a single top-level\n`#` heading that describes the scope and spirit of the release rather than\nrepeating the tag. Let that heading set the tone; personality is welcome when it\nhelps the release feel written by humans. Explain why the release matters to\nHome Assistant users, group changes by user impact, and keep PR links or the\nfull changelog as supporting detail rather than the whole story.\n\n## License\n\nAPC UPS NMC is released under the [Apache License 2.0](LICENSE), matching Home\nAssistant's source license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnugget%2Fschneider-ups-nmc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnugget%2Fschneider-ups-nmc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnugget%2Fschneider-ups-nmc/lists"}