A Home Assistant integration for monitoring and controlling Cummins standby generators with web interfaces.
- Generator Status - Current operational state (Stopped, Running, Starting, etc.)
- Battery Voltage - DC battery voltage with 1 decimal precision
- Output Voltage - AC output voltage
- Frequency - Output frequency in Hz
- Engine Hours - Total runtime hours
- Load Line 1 & 2 - Current load percentages
- Time Drift - Signed minutes representing the difference between the generator clock and Home Assistant's clock
- Utility Present - Utility power availability
- Utility Connected - Utility connection status
- Genset Running - Generator running state
- Standby Disabled - Standby mode status
- Action Required - Maintenance or fault indicator
- Start/Stop Genset - Manual generator control
- Enable/Disable Standby - Standby mode control
- Exercise Now - Trigger immediate exercise cycle
- Load Management - Manual/Automatic mode with individual load control
- Exercise Schedule - Configure frequency, day, and time
The integration polls the generator's web interface on a per-platform cadence:
| Platform / entity group | Interval | Endpoint |
|---|---|---|
| Sensors (status, voltages, frequency, engine hours, loads) | 30 s | /index_data.html |
| Binary sensors (utility, running, standby, action required) | 30 s | shares the sensor poll |
| Load & exercise selects | 100 s per endpoint, rotating (~5 min per endpoint) | /loads_data.html, /loads.html, /exercise.html |
| Date/time entity | 1 h | /timedate.html |
| Buttons | on demand | control endpoints only |
Requests are additionally spaced out by a configurable minimum request gap (default 2000 ms) to avoid overwhelming the generator's embedded network stack. For the reasoning — including source-level analysis of the InterNiche 2.0 TCP/IP stack — see docs/generator-network-stack.md.
- Copy the
custom_components/cummins_generatorfolder to your Home Assistantconfig/custom_components/directory - Restart Home Assistant
- Go to Settings → Devices & Services → Add Integration
- Search for "Cummins Generator"
- Enter your generator's IP address and password (default: "cummins")
The integration requires:
- Host: IP address of your Cummins generator
- Password: Web interface password (default: "cummins")
- Cummins generator with web interface
- Network connectivity to generator
- Generator switch in REMOTE position for control functions
The embedded web interface on these controllers runs an old InterNiche Technologies TCP/IP stack (version 2.0, circa 2004). The same family of stacks shows up widely in operational technology (OT) gear — PLCs, transfer switches, water and power infrastructure — and its known vulnerabilities are actively exploited. There are no firmware patches available for most of these controllers, so protecting the generator is a matter of controlling who can reach it on the network. This guidance mirrors what agencies like CISA and the Washington State Department of Health tell operators of unpatchable OT devices (see the WA DOH bulletin for a recent example).
Do not expose the generator's web interface to the public internet. Do not forward ports to it, do not put it on a DMZ, and do not rely on the built-in password as a security boundary — HTTP Basic auth over cleartext HTTP is trivially observed. If you need remote access, reach it through your Home Assistant instance over a VPN.
Isolate the generator on a segmented network. Put it on a management or IoT VLAN with firewall rules that only permit inbound traffic from your Home Assistant host on TCP/80. Block all outbound traffic from the generator; it has no business initiating connections. If your router supports client isolation on the VLAN, enable it.
Change the default password. The factory password is cummins
and is documented publicly. Set something unique, and store it in a
password manager. The integration's options flow lets you rotate it
without re-adding the integration.
Monitor for the unexpected. If you keep any kind of network telemetry (firewall logs, Home Assistant recorder for the integration's request-error entities, packet capture), watch for inbound connection attempts to the generator from anything other than your HA host, and for outbound traffic from the generator itself. Alerts on either are a strong signal something is wrong.
Keep physical controls in the loop. The generator's front-panel switch remains authoritative. Leave it in REMOTE only when you actually need the integration's control features to work; otherwise the physical position of the switch is a hard stop that no network attacker can bypass.
If you suspect the generator has been tampered with over the network, isolate it (pull the Ethernet cable) and reset it to factory settings. Operators of public infrastructure or systems tied to a federal reporting obligation should report the incident through their usual channel (e.g. CISA); for a residential install this generally isn't required, but the same isolate-then- rebuild steps still apply.
This integration works with Cummins generators that have the standard web interface with the following endpoints:
index_data.html- Status dataloads_data.html- Load statusloads.html- Load configurationexercise.html- Exercise settingswr_logical.cgi- Control commands
- The web interface may become unresponsive when modern web browsers use multiple connections or other advanced features. It's a "site best viewed in IE7" era web app. The polling from this integration works without issue, but elements may become "unavailable" if you use a browser at the same time.
- Ensure generator is accessible on the network
- Verify correct IP address and password
- Check that generator switch is in REMOTE position for controls
- Review Home Assistant logs for connection errors
This work was produced with AI, namely the Amazon Q Developer CLI
(which has subsequently been rebranded "Kiro CLI") in September
2025. JavaScript functions from the web interface was extracted into
files like read-status.js and then prompts such as
write a Home Assistant integration for a Cummins generator with a web browser interface. JavaScript to read the status of the generator has been extracted in read-status.js
Everything in this repository is predominately the output of AI tooling, except for some sections of this README.md such as this one.
As this is a machine-produced integration, I make no claims of human authorship. For any exclusive rights that are awarded to me that can be licensed with the Apache License 2.0, that is the legal instrument I elect to use to grant license to you.