Files

NUT config: PowerWalker VFI ICR IoT

Network UPS Tools setup for a PowerWalker VFI ICR IoT UPS.

  • Master: one host connected to the UPS via USB (nutdrv_qx), runs upsd + upsmon, and serves status to the network on port 3493/tcp.
  • Clients: any other Linux hosts run upsmon as network slaves and shut down gracefully when the master signals a power failure (FSD).

This avoids the undocumented Modbus TCP register map entirely. If you ever want a pure-network (no USB) setup, you would need the Modbus register map from PowerWalker support plus the nutdrv_modbus driver -- not used here.

Layout

master/etc/nut/   config for the USB-connected host
client/etc/nut/   config for each network slave
install-master.sh deploy + permissions on the master
install-client.sh deploy on a client: sudo ./install-client.sh <MASTER_IP>

Quick start

Master (USB host)

sudo ./install-master.sh
# edit /etc/nut/upsd.users   -> set monmaster / monslave passwords
# edit /etc/nut/upsmon.conf  -> set the same monmaster password
sudo nutdrv_qx -a test -DD -x port=auto   # confirm the driver reads values
sudo systemctl enable --now nut-server nut-monitor
upsc ups@localhost

If the test shows no/garbled values, retry with:

sudo nutdrv_qx -a test -DD -x port=auto -x protocol=voltronic -x novendor

and uncomment the matching lines in master/etc/nut/ups.conf.

Each client

sudo ./install-client.sh <MASTER_IP>
# edit /etc/nut/upsmon.conf -> set the monslave password
sudo systemctl enable --now nut-monitor
upsc ups@<MASTER_IP>

Notes

  • Open 3493/tcp on the master firewall for your client subnets.
  • runtimecal in ups.conf: these UPS models may not report runtime; NUT then estimates it. Format: sec_at_full,full_pct,sec_at_half,half_pct. Adjust to your battery / EBM configuration.
  • upsd.users holds plaintext credentials and is gitignored. Keep the real file off the repo; distribute it out of band (or via your secrets tooling).
  • To also cut UPS output power after the master shuts down, look into upsdrvctl shutdown / the POWERDOWNFLAG mechanism -- intentionally left out here to keep the first deployment simple.