Onboard a new customer in three steps
- Get the project bundle. Open the beez-fm Site Onboarding Claude Project, send it the site's EDE export (or point list), and it returns one zip: points, graphics, and the historical logging selection, verified.
- Import it. Sign in as a platform admin, Admin tab, Import project bundle. Pick the customer tenant, or choose Create a new tenant. Upload the zip. The project, its folder, every point and every mimic are created in one pass. Re-importing the same bundle is safe and idempotent.
- Create the customer account. Create user card: choose the role, the tenant, and the project scope for a single-site login. The password is shown once; store it in the vault.
beez tools\manage.py move-project --project <slug> --to-tenant <customer>,
then restart the platform.No web access? The wizard does the same job
Double click onboard-customer.bat on the server, answer four questions,
drag the EDE file into the window. Wherever documentation says python,
type beez instead; it always finds the right interpreter.
Roles and visibility
| Role | Can |
|---|---|
| viewer | See points, trends, graphics, export CSV |
| operator | Viewer, plus adjust writable setpoints |
| admin | Operator, plus manage users and see the command log of their tenant |
| superadmin | Everything, every tenant, bridges, imports, MQTT info |
Tenant users (project scope left on "whole tenant") see every project of their customer. Project users see exactly one building. Everyone can change their own password with the Password button in the header.
BACnet bridges
A bridge is one shared BACnet client: a local network interface and its own UDP port (47809 leaves 47808 free for beez-BACnetBrowser on the same machine; the editor assigns the next free port automatically). What a bridge polls is defined by the projects connected to it: each project brings its own EDE and its own target device and interval, so one bridge serves many buildings at once, for example one VPN-facing bridge reading every site's SAFRAN-Cloud server. Connect and disconnect projects in Connect a project to a bridge; changes apply on the bridge's next restart. Each row shows its connected projects and has Start, Stop, Restart, and its own log.
MQTT devices and gateways
Admin tab, MQTT connection info: the exact broker address, port, authentication
mode, topic contract, and a copyable example publish for any device that should send
data. Points auto-provision from retained /meta messages once the project
exists; values on unknown project slugs are dropped and counted on the status line.
Graphics
Every project owns its mimics in tenants\<tenant>\<project>\graphics\,
served with per-project authorization. Overview mimics bind values with
data-path="site/equipment/point"; per-equipment mimics use
data-point="<point-id>". Equipment without a mimic gets a live generic
panel automatically, showing name, value, and the last update in local time. Mimics
can show update times too: add a text element with
data-path-ts="site/equipment/point" (overviews) or
data-point-ts="point" (equipment mimics) and the platform fills it with
the local date and time. Bundles carry the graphics, so normally you never touch this folder.
History, storage, and calculated power
Every point flagged for logging historizes into the project's own
history.db, and every received value is stored. Data
rates are governed at the source: the covIncrement values set on the site's local
BACnet server objects (defined in the building onboarding project's fleet table)
decide how often values change hands, so configure them there. For special
deployments, per-unit throttles and deadbands remain available in config.json under
storage_policies (empty by default).
Where an equipment (or its project) exposes a current (A) and a matching voltage (V), the platform provisions a calculated power point automatically: P = V x I x PF (PF 1.0 by default, config key power_factor). These are estimates, clearly labelled "(calc)", never metered values.
Sites tab: communication health per building
Every bridged project with its live link state straight from the bridge: COV or polling mode, notification and read counters, last data time, last error, and a 200-entry communication log per site. Pause removes one site from its bridge while you fix its VPN or hardware, without disturbing the other buildings; Resume puts it back. Bridges use COV by default with an automatic heartbeat and subscription renewal after link loss; switch any bridge to classic polling in the bridges editor.
Analytics workbench (Trends tab)
Pick points in the object tree (tenant, project, system, equipment, point, with the clear names from the EDE), filtered by name or by unit; each selected point gains its own chart type choice (auto, line, bars, volumes), so mixed charts are one click. Choose the default chart (line, bars, volumes, or an energy pie), the aggregation (raw, hourly, daily, weekly, monthly, yearly) with average, minimum, maximum, or energy in kWh, and set the period manually or with the quick buttons. Power points integrate to kWh per bucket; cumulative meters report counter deltas. The pie shows each point's energy share and snaps the period to whole buckets (pick days and it uses entire days). Tick Compare two periods to overlay the same point across two time ranges. Export CSV honours the selected period.
Updating without losing anything
Updates are one action: run update.bat with the new
beez-minibms.zip (or place the zip next to it and double click), press a key, done.
It stops every running miniBMS process automatically (server and BACnet bridges,
even instances left in old folders), applies the package, updates dependencies,
checks the MQTT broker service, and restarts the platform in its own window. It
replaces only the platform code; data\, tenants\ and
config.json are never touched, so every project, user, setting and
history sample survives, and schema migrations run automatically on start. It elevates itself
(one UAC prompt), so background instances in the services session and registered
miniBMS services are found and stopped too, and the platform restarts the same way
it was running: services are started again, otherwise a console window opens. If a
foreign application holds port 8000 it aborts before changing anything and shows
the process and its path; it never stops software that is not the miniBMS.
Recovering data from a previous installation
The easiest path is in the Admin tab: Import history from a previous
installation. Paste the old folder's path, press Scan, and every project in
it is listed with slugs, point counts, sample counts and date ranges; pick the
target project here (preselected when the slug matches) and press Import. Points
match by site, equipment and point, duplicates are ignored, and the platform keeps
running throughout. The same works from the command line: Full restore (this installation's data
is backed up first, then replaced):
beez tools\manage.py restore --from C:\path\to\old-install.
Merge only the history into the projects already here, matched by project, site,
equipment and point, duplicates ignored, safe while the platform runs:
beez tools\manage.py import-history --from C:\path\to\old-install
(add --project <slug> to limit it). Run restore first if the new
installation is empty; use import-history to merge several old installations'
histories into one.
Backing up a project is copying its folder. For a hot copy while the
platform runs: sqlite3 history.db ".backup backup.db". A nightly copy of
the whole tenants\ folder plus data\minibms.db is a complete
platform backup.
Quick troubleshooting
| Symptom | Do this |
|---|---|
| python is not found in a terminal | Use beez or py instead; the Microsoft Store stub is shadowing the real interpreter. |
| Bridge will not start | Its row shows the exit code; open its Log. It needs an EDE file configured and the target device reachable. |
| Values not arriving | Status dot shows the broker link; check the unknown-project counter on /api/status, and that the project slug matches the topics exactly. |
| UI behaves oddly | The server forbids caching, so a plain reload gets the latest version. Sign out and in if a session predates an update. |