RESPA Monitoring System
Project Documentation — Build Record
NB Industries Pty Ltd
Version 2.0 — 2 March 2026
Confidential — Internal Use Only
1. System Overview
The RESPA Monitoring System provides real-time environmental monitoring of heavy mining equipment cab pressurisation systems. It integrates Sy-Klone RESPA Advisor+ units with Senquip IoT telemetry devices, transmitting data via MQTT to a Sorba edge computing platform for processing, storage, and visualisation through Grafana dashboards.
1.1 System Architecture
RESPA Advisor+ (Sy-Klone) → CAN Bus J1939 → Senquip ORB3 (RR2EW78BF) → MQTT (TLS 8883) → Mosquitto Broker → Sorba Edge Platform → Redis (real-time cache) + InfluxDB (time-series storage) → Grafana (multi-tenant dashboards)
1.2 Data Pipeline
The RESPA Advisor+ broadcasts two J1939 CAN messages every 1000ms: PGN 63648 (Time & System Information) containing real-time air quality data, alarm states, and valve positions; and PGN 63649 (Filter Information) containing filter type, media, model, and remaining hours. The Senquip device captures PGN 63648 via CAN bus and also reads onboard sensors (GPS, accelerometer, cellular, temperature, voltage). All data is packaged into an MQTT payload and transmitted to the Sorba platform.
On the Sorba platform, an MQTT broker (Mosquitto) receives data on the topic 'Sorba/RR2EW78BF/data'. The Sorba Workspace processes incoming tags, stores real-time values in Redis, and logs historical data to InfluxDB based on configured intervals. A custom alarm decoder script reads alarm code tags from Redis, decodes them to human-readable states, and writes the results to InfluxDB. A CAN bus decoder script reads the raw J1939 hex frame from Redis, decodes all 16 fields from PGN 63648, and writes granular data to InfluxDB.
1.3 Hardware Stack
RESPA Advisor+: Sy-Klone SmartCab OEM — cab pressurisation monitoring unit
Senquip ORB3: Device ID RR2EW78BF — IoT telemetry gateway with CAN bus, GPS, cellular, accelerometer
Sorba Edge Platform: Ubuntu 24 server — Serial 1762318931158 (trial licence)
CAN Bus: J1939, 250 kbit/s, extended 29-bit frames, CAN FD
1.4 Software Stack
Mosquitto: MQTT broker — Port 1883 (internal), Port 8883 (TLS with client certs)
Redis: Real-time tag cache — Port 6379
InfluxDB: Time-series database — Port 8086, database: sorba_sde
Grafana: Dashboard platform — Port 443 (reverse proxy), multi-tenant with org isolation
Sorba Workspace: Tag configuration, data logging, alarm scripting, flow processing
Custom Scripts: alarm_sync.sh (alarm decoder), can_decoder.sh (J1939 PGN 63648), alarm_sync_loop.sh (10-second execution loop)
2. Multi-Tenant Architecture
The system uses Grafana organisations to isolate customer data and dashboards. Each BMA mine site operates as an independent tenant with its own users, dashboards, and home page. NBI administrators have cross-org access for fleet-wide monitoring.
2.1 Organisation Structure
| Org | Name | Customer Viewer Login | Purpose |
| 1 | Main Org | sorba_admin (system only) | System admin |
| 2 | NBI | nbi_viewer | NBI test fleet + device detail dashboards |
| 3 | BMA | bma_viewer | Placeholder — legacy org |
| 4 | Glencore | glencore_viewer | Placeholder — spare org |
| 5 | Goonyella Riverside | goonyella_user | BMA Goonyella Riverside mine |
| 6 | Peak Downs | peakdowns_user | BMA Peak Downs mine |
| 7 | Caval Ridge | cavalridge_user | BMA Caval Ridge mine |
| 8 | Saraji | saraji_user | BMA Saraji mine |
| 9 | Hay Point | haypoint_user | BMA Hay Point coal terminal |
Note: All orgs are managed via the single Grafana admin login. Customer viewers are restricted to their org only.
2.2 Dashboard Inventory
| Dashboard | UID | Org | Description |
| NBI Master Operations | nbi-master-ops | NBI (2) | Admin overview — all devices, all sites, summary alarms, map |
| NBI Fleet Overview | nbi-fleet-overview | NBI (2) | NBI fleet table with alarms, measurements, RSSI, GPS, tamper |
| DRE01 - Dragline 1 | respa-rr2ew78bf | NBI (2) | Device detail — CAN alarms, measurements, trends, GPS, health |
| Goonyella Fleet | goonyella-fleet | Goonyella (5) | Placeholder — NBI logo + awaiting devices |
| Peak Downs Fleet | peakdowns-fleet | Peak Downs (6) | Placeholder — NBI logo + awaiting devices |
| Caval Ridge Fleet | cavalridge-fleet | Caval Ridge (7) | Placeholder — NBI logo + awaiting devices |
| Saraji Fleet | saraji-fleet | Saraji (8) | Placeholder — NBI logo + awaiting devices |
| Hay Point Fleet | haypoint-fleet | Hay Point (9) | Placeholder — NBI logo + awaiting devices |
3. CAN Bus J1939 Decoding
The RESPA Advisor+ communicates via SAE J1939-22 CAN bus protocol. Two Parameter Group Numbers (PGNs) are defined.
3.1 PGN 63648 (0xF8A0) — Time & System Information (TSI)
Transmission Rate: 1000 ms
Data Length: 32 bytes (27 used)
CAN ID: 0x0CF8A00A (decimal 217620490)
Status: ACTIVE — fully decoded and writing to InfluxDB
| Bytes | SPN | Description | InfluxDB Field | Current Value |
| 1-4 | 001 | Epoch Time (Unix seconds) | CAN.epoch | Active |
| 5-6 | 002 | Differential Pressure (Pa) | CAN.diff_pressure | 0 Pa (static — office) |
| 7-8 | 003 | CO2 Concentration (ppm) | CAN.co2_ppm | ~430 ppm |
| 9-10 | 004 | Dust Concentration (ug/m3) | CAN.dust_ugm3 | ~2-4 ug/m3 |
| 11-12 | 005 | Low Pressure Threshold (Pa) | CAN.low_press_threshold | 20 Pa |
| 13-14 | 006 | High Pressure Threshold (Pa) | CAN.high_press_threshold | 200 Pa |
| 15-16 | 007 | High CO2 Threshold (ppm) | CAN.high_co2_threshold | 1000 ppm |
| 17-18 | 008 | High Dust Threshold (ug/m3) | CAN.high_dust_threshold | 50 ug/m3 |
| 19 | 009 | Inlet Valve Position (0-100/255) | CAN.inlet_valve | 255 (not connected) |
| 20 | 010 | Outlet Valve Position (0-100/255) | CAN.outlet_valve | 255 (not connected) |
| 21 | 011 | Pressure Alarm (0-4) | CAN.pressure_alarm | 2 (Low Alarm) |
| 22 | 012 | CO2 Alarm (0-3) | CAN.co2_alarm | 0 (Normal) |
| 23 | 013 | Dust Alarm (0-2) | CAN.dust_alarm | 0 (Normal) |
| 24 | 014 | PFX Status (0-1) | CAN.pfx_status | 1 (Opened) |
| 25-26 | 015 | Target Pressure (Pa) | CAN.target_pressure | 50 Pa |
| 27 | 016 | Pressure Units (1=Pa, 2=H2O) | CAN.pressure_units | 1 (Pascals) |
3.1.1 Enhanced Alarm States (CAN vs Senquip)
The CAN bus provides more granular alarm states than the Senquip tag decoding:
| Alarm | CAN Levels (PGN 63648) | Senquip Levels (cp tags) |
| Pressure | 0=Normal, 1=Low Warning, 2=Low Alarm, 3=High Warning, 4=High Alarm | 0=Normal, 1=Low, 2=High |
| CO2 | 0=Normal, 1=Warning, 2=High (L1), 3=Extreme (L2) | 0=Normal, 1=High |
| Dust | 0=Normal, 1=Warning, 2=High | 0=Normal, 1=High |
3.2 PGN 63649 (0xF8A1) — Filter Information (FI)
Transmission Rate: 1000 ms
Data Length: 32 bytes (26 used)
CAN ID: 0x0CF8A10A (decimal 217620746)
Status: PENDING — Senquip decodes internally but does not include in MQTT payload. Email sent to Senquip supplier requesting mJS script or configuration to forward widget/filter fields via MQTT.
| Bytes | SPN | Description | Notes |
| 1 | 017 | Filter Index | 0-3 = FID (factory), 4-7 = Manual (field) |
| 2 | 018 | Client ID | 0 for manual/virtual filters |
| 3-12 | 019 | Media (10 bytes ASCII) | HEPA, EPA, MERV8, MERV16 etc |
| 13-22 | 020 | Model (10 bytes ASCII) | Filter model string |
| 23-26 | 021 | Filter Hours (4 bytes ASCII) | Remaining filter life in hours |
4. Data Logging & Tag Inventory
The Sorba Workspace stores 49 tags in Redis. Tags with Data Logging enabled write to InfluxDB. The alarm sync loop script supplements this by reading Redis values and writing directly to InfluxDB every 10 seconds.
4.1 InfluxDB Schema
Database: sorba_sde
Measurement: Respa.RR2EW78BF.data
Retention Policy: Default (infinite)
4.2 Core Measurement Tags (Data Logging: Raw Time, 10 sec)
| InfluxDB Field | Source | Unit | Logging |
| DAS_Tag_Group.cp1 | Senquip cp1 | Pa | 10 sec (static 0) |
| DAS_Tag_Group.cp2 | Senquip cp2 | ppm | 10 sec |
| DAS_Tag_Group.cp3 | Senquip cp3 | ug/m3 | 10 sec |
| DAS_Tag_Group.vin | Senquip | V | 10 sec |
| DAS_Tag_Group.ambient | Senquip | °C | 10 sec |
| DAS_Tag_Group.gps_lat/lon/speed/alt/cog | Senquip GPS | Various | 10 sec |
4.3 New Tags Added (Day 2)
| InfluxDB Field | Source | Unit | Logging |
| DAS_Tag_Group.gsm_rssi | Alarm sync | dBm | 10 sec (script) |
| DAS_Tag_Group.light | Alarm sync | lux | 10 sec (script) |
| DAS_Tag_Group.gps_fix | Alarm sync | 0-3 | 10 sec (script) |
| DAS_Tag_Group.gps_nsat | Alarm sync | count | 10 sec (script) |
| DAS_Tag_Group.gps_hdop | Alarm sync | ratio | 10 sec (script) |
| DAS_Tag_Group.state | Alarm sync | code | 10 sec (script) |
| DAS_Tag_Group.cp4-cp7, cp14 | Alarm sync | Various | 10 sec (script) |
4.4 CAN Bus Decoded Fields (Day 2)
| InfluxDB Field | Source | Unit | Description |
| CAN.epoch | PGN 63648 | seconds | RESPA epoch time |
| CAN.diff_pressure | PGN 63648 | Pa | Differential pressure |
| CAN.co2_ppm | PGN 63648 | ppm | CO2 from CAN |
| CAN.dust_ugm3 | PGN 63648 | ug/m3 | Dust from CAN |
| CAN.pressure_alarm | PGN 63648 | 0-4 | 5-level pressure alarm |
| CAN.co2_alarm | PGN 63648 | 0-3 | 4-level CO2 alarm |
| CAN.dust_alarm | PGN 63648 | 0-2 | 3-level dust alarm |
| CAN.pfx_status | PGN 63648 | 0-1 | PFX open/closed |
| CAN.inlet_valve | PGN 63648 | 0-255 | Valve position/status |
| CAN.outlet_valve | PGN 63648 | 0-255 | Valve position/status |
| CAN.target_pressure | PGN 63648 | Pa | Target pressure |
| CAN.pressure_units | PGN 63648 | 1-2 | 1=Pa, 2=H2O |
5. Chronological Build Record
5.1 Day 1 — 27 February to 1 March 2026
MQTT & Sorba Integration
Configured Mosquitto broker with TLS on port 8883. Set up Senquip MQTT endpoint to transmit on topic 'Sorba/RR2EW78BF/data'. Created Sorba instance 'Respa' with asset RR2EW78BF. Configured DAS_Tag_Group with tag aliases mapping cp1-cp14 to sensor readings. Enabled Data Logging (Raw Time, 10 sec) for core measurement tags.
Alarm Decoder
Built RESPA_Alarm_Decoder script in Sorba Workspace to decode cp8-cp13 alarm code tags from string values to numeric codes. Discovered data-auto-sync service does not write _code suffix tags reliably. Created alarm_sync.sh workaround script running in a 10-second loop to read Redis values and write directly to InfluxDB via HTTP API.
Multi-Tenant Grafana
Created 3 initial organisations: NBI (org 2), BMA (org 3), Spare (org 4). Each with InfluxDB datasource, admin user, and viewer user. Built NBI Fleet Overview dashboard with table (device name, alarm states, measurements) and geomap. Built DRE01 Device Detail dashboard with alarm status, live gauges, trend charts, GPS tracking, and vehicle orientation panels. Set home dashboards for each org.
ISO 23875 Thresholds
Implemented ISO 23875 compliant thresholds: CO2 warning at 800 ppm, alarm at 1000 ppm; Dust warning at 25 ug/m3, alarm at 50 ug/m3.
5.2 Day 2 — 2 March 2026
Data Logging Expansion
Enabled Data Logging in Sorba Workspace for additional tags: gsm_rssi, light, gps_fix, gps_nsat, gps_hdop, state, motion, angle, pitch, roll (60 sec interval), and threshold tags cp4-cp7, cp14 (300 sec interval). Tags configured as 'On change' in Sorba didn't write reliably, so all new tags were added to the alarm_sync.sh script for direct Redis-to-InfluxDB writing.
Device Health Dashboard Row
Added '📡 Device Health' row to device detail dashboard with: Cellular Signal gauge (RSSI, -110 to -40 dBm with red/orange/yellow/green thresholds), Tamper Alert (light sensor, OK/WARN/TAMPER), GPS Fix status (No Fix/GPS/2D/3D), Satellite count, GPS Accuracy (HDOP), System Voltage gauge, RSSI trend chart, and Light Level trend chart.
BMA Site Organisations
Created 5 new Grafana organisations for BMA mine sites: Goonyella Riverside (org 5), Peak Downs (org 6), Caval Ridge (org 7), Saraji (org 8), Hay Point (org 9). Each configured with InfluxDB datasource, NBI admin user (Admin role), and customer user (Viewer role). Placeholder fleet overview dashboards created for each site with NBI branding. All passwords set to unique, non-derivable values.
NBI Branding
Deployed NB Industries logo to Grafana static assets at /usr/share/grafana/public/img/nbi_logo.png. Added branded header panels to all fleet overview dashboards and device detail dashboard. Logo on right side, site name and tagline on left.
NBI Master Operations Dashboard
Created admin-level 'NBI Master Operations' dashboard in NBI org showing all devices across all sites on one screen. Includes summary alarm indicators (Total Devices, Pressure/CO2/Dust/Tamper/Comms status), master fleet table with all measurements and status columns, and all-sites geomap.
Fleet Overview Enhancement
Added RSSI, GPS Fix, Satellites, and Tamper columns to NBI Fleet Overview table. Combined into single query for proper table rendering. Colour-coded with thresholds matching device detail dashboard.
CAN Bus J1939 Decoding
Built can_decoder.sh script to decode PGN 63648 (TSI) hex frame from Redis. Decodes all 16 SPN fields with little-endian byte parsing. Writes decoded values to InfluxDB as CAN.* fields. Added to alarm_sync_loop.sh for 10-second execution. Verified all decoded values match Senquip portal readings.
Added '🔧 RESPA Advisor+ — CAN Bus Alarms (J1939)' row to device detail dashboard at top position (replacing old alarm row). Includes 5-level pressure alarm, 4-level CO2 alarm, 3-level dust alarm, PFX status, inlet/outlet valve gauges, CAN bus live indicator, and differential pressure/CO2/dust trend charts from CAN data.
PGN 63649 Filter Information
Identified that Senquip decodes PGN 63649 internally (visible as widget1-8 on Senquip portal) but does not include in MQTT payload. Filter decoder script prepared. Email sent to Senquip supplier requesting method to include filter data in MQTT payload via mJS scripting or configuration change.
Credentials & Security
Updated all Grafana user passwords to unique, non-derivable values. Fixed user roles — NBI admin accounts set to Admin role in their respective orgs. Created RESPA_Credentials.xlsx with full login details, URLs, and server access information.
6. Known Issues & Pending Items
| # | Issue | Priority | Status / Notes |
| 1 | Sorba trial licence | HIGH | Services restart every 2 hours. Licence to be resolved this week. |
| 2 | data-auto-sync _code tags | MEDIUM | Workaround in place (alarm_sync.sh). Root cause: Sorba doesn't write _code suffix tags reliably. |
| 3 | cp1 differential pressure static | LOW | Reading 0.0 Pa. Expected — device in office, no pressurisation. Will resolve on install. |
| 4 | PGN 63649 not in MQTT | MEDIUM | Senquip decodes internally but doesn't forward. Email sent to supplier. |
| 5 | Filter data unconfigured | LOW | All filters showing ??? — RESPA unit needs filter programming on install. |
| 6 | Alerting not configured | MEDIUM | Grafana alerting (email/SMS) deferred until deployment. SMTP config needed. |
| 7 | GPG key warning | LOW | apt GPG key deprecation warning on server. Cosmetic only. |
7. Server Access Reference
| Service | Details |
| Public Grafana URL | https://43.245.171.129:8080/dashboard/login |
| LAN Grafana URL | https://192.168.1.206/dashboard/login |
| Grafana System Admin | sorba_admin / sbrQp10. |
| SSH Access | bradley@192.168.1.206 |
| InfluxDB | localhost:8086 — admin / sbrQp10. — DB: sorba_sde |
| Redis | localhost:6379 (no auth required) |
| MQTT Broker | Port 1883 (internal) / 8883 (TLS) — User: sorba_sde / sbrQp10. |
| Sorba Workspace | https://192.168.1.206/ (Sorba web UI) |
| Sorba Serial | 1762318931158 (trial licence) |
| NBI Logo Path | /usr/share/grafana/public/img/nbi_logo.png |
7.1 Key Scripts on Server
| Script | Purpose |
| /home/bradley/alarm_sync.sh | Reads alarm codes + device health tags from Redis, writes to InfluxDB |
| /home/bradley/can_decoder.sh | Decodes PGN 63648 J1939 hex frame from Redis, writes CAN.* fields to InfluxDB |
| /home/bradley/alarm_sync_loop.sh | Runs alarm_sync.sh + can_decoder.sh every 10 seconds (nohup background) |
To restart the sync loop after a server reboot:
nohup /home/bradley/alarm_sync_loop.sh > /dev/null 2>&1 &