Tank A / Brine / Tank B reads more clearly as which side brine is flowing
into than the previous Brine / A / B order. Flow chevrons now point away
from the brine tank toward whichever resin tank is regenerating.
The regenerating tank is the one NOT currently in service — on an
alternating twin-tank softener, service switches to the other tank the
moment one depletes, and the just-depleted tank regenerates offline. Was
previously showing regen on the in-service tank. Also splits the flow
indicator so it visually tracks whichever tank is actually regenerating.
Per-asset diagram_config (JSONB) maps live MQTT field_keys to brine/resin
tank roles, editable on the Assets page with dropdowns populated from that
asset's actual telemetry. Dashboard renders brine + 1-2 resin tanks with
color-coded fill levels, an "in service" tank indicator, and an animated
flow/regen indicator when regeneration is active.
Was reading the shared central mqtt integration, which meant plant
silently authenticated as whichever app's credentials were pasted
there (no plant/# ACL on any of them, so no telemetry ever arrived).
Now reads mqtt_plant instead, its own dedicated slug.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Read-only monitoring/alerting for boilers, water softener, calorifiers
and pumps via a generic MQTT-topic-prefix asset model, so new
equipment can be onboarded without new ingestion code. Threshold and
stale-data alert rules with email + in-app notification.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>