Skip to main content

Baicells Collection

Live state + KPI collection for Baicells eNBs (poll-based)

Baicells eNBs are supported in RAN Monitor alongside Nokia AirScale and Casa. Unlike those two — which push PM to RAN Monitor — Baicells QAFA firmware has no PM-file export, so RAN Monitor polls each cell's local web API on a timer. This guide covers how that works and how to configure, deploy and verify it.


Overview

Baicells Nova-series eNBs (e.g. pBS4200, firmware BaiBS_QAFA_*) expose a tiny, unauthenticated text key/value API at https://<cell>/fsmoam/ that the Gargoyle web UI is built on. There is no local statistics/PM page and no file push — the available data is live gauges (instantaneous), not historical 32.435 counters.

RAN Monitor's Baicells.Scheduler polls every configured cell on an interval, reads device/RF/sync/WAN/UE/throughput/alarm fields over /fsmoam/, and writes them to InfluxDB. Status fields (cell up, synced, GPS, OMC, WAN) are always emitted as 0/1 series so dashboards show continuous health even when the cell isn't serving.

ItemValue
MechanismPoll (pull) — GET /fsmoam/..., no auth, read-only
Poll intervalconfig :ran_monitor, :baicells, interval_ms: (default 60s)
InfluxDB measurementBaicellsPerformanceMetrics
Cell keyeNB id / serial (config)
Auth/writesnone used — collector never issues set.* calls

Only TCP 443 is open on these units; reads need no credentials (wrong creds also return data). The collector is strictly read-only.


Architecture

RanMonitor.Baicells.Scheduler         (GenServer, polls every interval_ms)
└─ for each configured cell:
RanMonitor.Baicells.Collector.poll/3
├─ RanMonitor.Baicells.Fsmoam GET /fsmoam/get.<oid>?... (no auth)
├─ build state map (up/sync/GPS/OMC/WAN/RF/alarms)
└─ build InfluxDB points (BaicellsPerformanceMetrics)
→ RanMonitor.EnhancedInfluxDbConnection.write
→ RanMonitor.Database.InfluxDbStats.record_write
→ RanMonitor.Baicells.Ingest (last-poll state for the status page)

Module reference (lib/ran_monitor/baicells/):

ModuleResponsibility
fsmoam.exRead-only client/parser for the /fsmoam/ key-value API
collector.exOne poll → state map + InfluxDB point maps
scheduler.exInterval poll loop → Influx + stats + Ingest
cells.exConfig-driven cell registry
ingest.exIn-memory last-poll state per cell (for the status page)
web/live/baicells_status_live.ex"Baicells Status" page

Metrics

Each poll emits these points (counter names reuse the Casa/Nokia style so the data is dashboard-compatible):

Always (status, 0/1 or count): CELL.OpStateUp, CELL.Synced, CELL.GpsInPosition, CELL.OmcConnected, CELL.WanLinkUp, FM.ActiveAlarms

When the cell is serving (live gauges): RRC.ConnMean (active UEs), DRB.PdcpSduBitrateDl / DRB.PdcpSduBitrateUl (kbps), RRU.RssiUl, RRU.MaxTxPowerDbm, CARR.EarfcnDl, CARR.PhyCellId

Point shape (measurement BaicellsPerformanceMetrics): counterValue field, tags metricCounter, enbName, enbId, site, host, metricMcc, metricMnc, vendor="Baicells", recordType.


Configuration

config :ran_monitor, :baicells,
interval_ms: 60_000,
cells: [
%{
name: "baicells-nova-pbs4200",
enb_id: "1202000091183FP0178", # serial / eNB id (enbId tag + status key)
site: "Apex Lifestyle Lab",
host: "10.7.15.70",
scheme: "https" # default https
}
]

Network: RAN Monitor → Baicells cell outbound TCP 443. No inbound ports are needed (poll model).


Web UI

Baicells Status (/baicells/status) — one card per cell with reachability, cell up/down, sync (DISP = synced), GPS, OMC/ACS, WAN, active UEs, DL/UL throughput, UL RSSI, EARFCN/PCI, max TX power, points written, and a list of any active alarms (with severity). Auto-refreshes every 5s.

There is no counter-filter page for Baicells — it emits ~13 fixed metrics, so there is nothing to prune (contrast with Casa's ~1065 counters).


Verification

# Direct fsmoam read (what the collector does) — no auth:
curl -sk "https://10.7.15.70/fsmoam/get.0x08010005.0?ModuleType:+SoftwareVersion:+SerialNumber"

# Data in InfluxDB:
influx -database 'nokia-monitor' \
-execute 'SELECT last("counterValue") FROM "BaicellsPerformanceMetrics" GROUP BY "metricCounter"'

Or watch the logs: [Baicells.Scheduler] <name> (<host>): up=<bool> ue=<n> wrote &lt;N> metric(s), and check the Baicells Status page.

Note: if the cell is misconfigured/not serving (e.g. invalid phyCellId range → cellUnavailableAlarm), the live UE/throughput/RSSI gauges read empty and only the CELL.* status series + alarms are written — by design.