beez miniBMS, Team Guide

This is the quick team guide. The full documentation (installation, updating, every command, backup and recovery) lives at /guide/.

The portable supervision platform for beez-fm customer sites. One customer is a tenant; one building is a project (the riza1 site-id). MQTT topics carry the project slug first, {project}/{site}/{equipment}/{point}, so the platform stays fully aligned with the beez-hive convention.

Onboard a new customer in three steps

  1. 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.
  2. 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.
  3. 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.
BACnet site? After the import, the Connect a project to a bridge form is prefilled. Pick which shared bridge polls this building, confirm the target device address, Save connection, then Restart that bridge. One bridge can carry many buildings.
If the import says the project already belongs to another tenant, either select that tenant and re-import, or regroup first: 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

RoleCan
viewerSee points, trends, graphics, export CSV
operatorViewer, plus adjust writable setpoints
adminOperator, plus manage users and see the command log of their tenant
superadminEverything, 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

SymptomDo this
python is not found in a terminalUse beez or py instead; the Microsoft Store stub is shadowing the real interpreter.
Bridge will not startIts row shows the exit code; open its Log. It needs an EDE file configured and the target device reachable.
Values not arrivingStatus dot shows the broker link; check the unknown-project counter on /api/status, and that the project slug matches the topics exactly.
UI behaves oddlyThe server forbids caching, so a plain reload gets the latest version. Sign out and in if a session predates an update.