Chapter 2 · Accepted patterns · Open hardware validation
Deployment patterns
Collectors sit beside UPS hardware in a few recurring shapes. ESP32 probes are constrained; arbitrary UPS compatibility must not be implied.
Figure 3. Deployment-pattern comparison
Takeaway: Reads and powers end on the host, the load, or the probe they describe. ESP32 is not a full NUT stack.
Related: Collector · Responsibilities
The four patterns
- One UPS, one host collector — USB or local protocol on the machine that also runs workloads.
- One UPS serving several machines — a single monitoring collector reads the UPS; powers relationships record the loads.
- One collector, multiple UPS sources — USB plus network NUT/SNMP identities under a site namespace.
- Equipment-only locations — Raspberry Pi or validated ESP32-S3 probe as site witness without a full workstation.
Platform / capability matrix
| Platform | Collector | CLI | Secrets (design) | Notes |
|---|---|---|---|---|
| macOS | Host agent | sudo when elevating | Keychain | Accepted paths in contract |
| Windows | Host agent | Elevated Admin (no sudo) | DPAPI | Accepted |
| Fedora / Linux | Host agent | sudo | secrets.d 0600 | Accepted |
| Raspberry Pi | Host agent | sudo | as Linux | Common witness |
| ESP32-S3 | Firmware probe | None — setup page | On device | Open validate matrix |
NUT and protocol adapters
Accepted On host collectors, NUT ships inside MainsKeeper’s adapter layer — operators are not asked to assemble NUT themselves. Network identity is namespace | protocol | host | port | upsName (SNMP omits ups name). A host alone is never a UPS identity.
Accepted ESP32 does not run the full NUT stack. Design scope is USB-HID power-device UPSs on ESP32-S3 with USB-OTG host. Fixture flash-ring sizes and target caps are Illustrative — validated board/UPS list pending.
Technical detail — elevation and local files
Read-only status needs no elevation. Local config/secret changes follow platform policy. Logs: macOS /Library/Logs/MainsKeeper/; Linux journalctl -u mainskeeperd; Windows Event Viewer + ProgramData. ESP32: status in dashboard only.