RESPA Project Documentation
← Admin ⬇ Download

RESPA Project Documentation

Project scope, architecture and technical decisions  ·  NB Industries · March 2026

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

OrgNameCustomer Viewer LoginPurpose
1Main Orgsorba_admin (system only)System admin
2NBInbi_viewerNBI test fleet + device detail dashboards
3BMAbma_viewerPlaceholder — legacy org
4Glencoreglencore_viewerPlaceholder — spare org
5Goonyella Riversidegoonyella_userBMA Goonyella Riverside mine
6Peak Downspeakdowns_userBMA Peak Downs mine
7Caval Ridgecavalridge_userBMA Caval Ridge mine
8Sarajisaraji_userBMA Saraji mine
9Hay Pointhaypoint_userBMA 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 &