A read-only web dashboard for AC Infinity UIS controllers. It pulls the same live picture you get in the official app—temperature, humidity, VPD, and what’s happening on each port—and puts it in a browser tab on your computer or any device on your LAN.
The goal isn’t to replace the AC Infinity app for programming; it’s to monitor the environment you’re already controlling with their hardware. Think of the kind of at-a-glance grow-room view products like Pulse Grow offer, except here you’re not adding another sensor hub—you’re reusing the controller and cloud data you already have.
I vibe-coded this for my own use: I kept opening the phone app to sanity-check heat and VPD. I wanted that same snapshot on a big screen, running in Docker, easy to manage in Portainer, and reachable from other machines on the network without another login flow every time. The UI uses Tailwind with a dark theme and is deliberately in the spirit of AC Infinity’s app (cards, hierarchy, calm greens)—not a pixel-perfect copy, but familiar enough that it feels like the same ecosystem.
The cloud API shape and a lot of the mental model (especially around VPD and sensor scaling) lean on community work. Huge thanks to LukeEvansTech/acinfinity-exporter—that Prometheus exporter was the reference that made talking to the same HTTP API approachable. This project is a dashboard, not an exporter; same rough API family, different goal.
AC Dash needs your AC Infinity cloud email and password (the same ones as the mobile app) so it can call AC Infinity’s servers on your behalf.
After setup (default Docker layout):
- Credentials are written to a single file on disk: by default
/app/data/.envinside the container (ENV_FILE_PATHoverrides this). - That file holds
ACINFINITY_EMAILandACINFINITY_PASSWORDin standard dotenv form. - Nothing is sent to the author of this project or to any third party except AC Infinity’s own API (
acinfinityserver.com), same as the app. - Mount a volume on
/app/dataso a container recreate doesn’t wipe the file; otherwise you’ll see the setup wizard again.
Optional “headless” mode (Portainer / compose):
- Set
ACDASH_USE_ENV_CREDENTIALS=1and provideACINFINITY_EMAILandACINFINITY_PASSWORDin the container environment. - The wizard is skipped when those are present (and you’re not relying on a conflicting saved file—see
app/main.pyfor the exact precedence).
Security hygiene: don’t commit .env, don’t paste debug JSON dumps into public issues (they can include account fields, device IDs, Wi‑Fi names, etc.). This repo’s .gitignore is set up to steer clear of those.
AC Infinity does not publish a public HTTP spec for their cloud API. Everything below comes from watching real responses, comparing them to equipment we could identify port-by-port in the app, and cross-checking with the optional full debug bundle this dashboard can export.
What we figured out
- The live list endpoint (
devInfoListAll) is a snapshot: great for “right now,” not historical graphs. - On/off for a load is
loadState, not always the olderstatefield—reading the wrong one made ports look blank. loadTypeis meant to describe the class of device (fan, humidifier, light), but the list often shows0even when something is plugged in. ThegetDevSettingcall for the same controller and port usually still returns the real non-zeroloadType.portResistancebehaves like a UIS electrical / detection fingerprint: in testing we saw stable values for e.g. EC inline fans vs humidifier-class loads vs LED-class loads—with the same readings whether the load was idle or running (identity, not “motor on”). Exact numbers vary by hardware; seeAC_INFINITY_FIELDS.mdfor the values we sampled.deviceTypewasnulleverywhere in our samples, so it wasn’t useful for labeling gear.
How we matched names to numbers
We labeled ports in the app, exported JSON, and compared known device types (fan, humidifier, light, etc.) to portResistance and getDevSetting.loadType. The same patterns showed up when comparing one labeled setup to another (e.g. controller / tent A vs. controller / tent B), which suggested the mapping wasn’t a single-location quirk. Fan size (e.g. smaller vs larger inline) did not show up as different loadType values—only fan class—so friendly names still come from portName in the app.
Honest limits
We don’t have every UIS SKU on the bench. Other devices might share those numbers or use new ones. The full write-up with tables lives in AC_INFINITY_FIELDS.md; treat it as observed behavior, not a guarantee from AC Infinity. If you discover new combinations, extending that doc helps everyone.
- Docker (or any container runtime Portainer uses)
- AC Infinity cloud login (same email/password as the mobile app)
Persist the setup wizard’s saved credentials with a volume on /app/data (the app writes ACINFINITY_EMAIL / ACINFINITY_PASSWORD there after first login).
docker build -t acdash:latest .
docker run -d \
--name acdash \
-p 8080:8080 \
-v acdash_data:/app/data \
--restart unless-stopped \
acdash:latestOpen http://localhost:8080 (or http://<your-machine>:8080 from another device on the LAN). First visit runs a setup form; after that you get the dashboard.
Health: GET /health → OK
- Image: build from this repo’s
Dockerfile, or use your registry image if you push one. - Port mapping: container
8080→ host port of your choice (e.g.8080). - Volume: bind mount or named volume
/app/dataso credentials survive container recreate. - Environment (optional):
PORT— listen port inside the container (default8080).CACHE_SECONDS— how long to cache the cloud snapshot (default45).LOG_LEVEL— e.g.INFO,DEBUG.- Headless / no wizard: set
ACDASH_USE_ENV_CREDENTIALS=1and provideACINFINITY_EMAIL+ACINFINITY_PASSWORDin the stack env; leave/app/dataempty or omit the wizard file if you want env to win.
That’s enough to run it alongside the rest of your homelab and hit it from any browser on the network.
- Is: a read-only monitoring dashboard—it displays what the API returns; it doesn’t push setpoints or replace the official app for automation.
- Isn’t: official AC Infinity software, a Pulse Grow competitor hardware-wise, a Prometheus exporter, or a complete map of every device type in the wild.
Not affiliated with AC Infinity—just a project for a calm, big-screen environmental view without extra hardware in the room.
MIT — see LICENSE.
If you fork or ship this, keep the credit to acinfinity-exporter and respect AC Infinity’s terms for API use.