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.
| Item | Value |
|---|---|
| Mechanism | Poll (pull) — GET /fsmoam/..., no auth, read-only |
| Poll interval | config :ran_monitor, :baicells, interval_ms: (default 60s) |
| InfluxDB measurement | BaicellsPerformanceMetrics |
| Cell key | eNB id / serial (config) |
| Auth/writes | none 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/):
| Module | Responsibility |
|---|---|
fsmoam.ex | Read-only client/parser for the /fsmoam/ key-value API |
collector.ex | One poll → state map + InfluxDB point maps |
scheduler.ex | Interval poll loop → Influx + stats + Ingest |
cells.ex | Config-driven cell registry |
ingest.ex | In-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 <N> metric(s),
and check the Baicells Status page.
Note: if the cell is misconfigured/not serving (e.g. invalid
phyCellIdrange →cellUnavailableAlarm), the live UE/throughput/RSSI gauges read empty and only theCELL.*status series + alarms are written — by design.
Related Documentation
- Casa PM Collection — push-based vendor (and the "adding a vendor" guide)
- Getting Started — initial deployment
- Grafana Integration — dashboards
- Operations Guide — operational overview