Wiki

Technical reference for system integrators and engineers.

Smart Lamp Locator

Digital cap lamp devices and embeddable modules with RTLS, gas sensors, LTE-WLAN connectivity and other IoT features. Ready to be used in real-life mining environments.

Cutaway view of the cap lamp head showing the embedded module inside Complete Smart Lamp: lamp head, cable and battery pack with control buttons Battery pack digital display showing messaging and sensor values Battery pack underside compared with and without the gas sensor fitted

Embeddable RTLS-IoT Modules for Lamps

ATEX and non-ATEX modules to enable 3rd-party mining equipment with advanced RTLS and IoT features. Such modules are available in three versions:

ATEX Locator module, Wi-Fi version
ATEX Locator: Wi-Fi Version
ATEX Locator module, UWB version
ATEX Locator: UWB
Locator module, LTE version
Locator: LTE Version

Interfaces

InterfaceNotes
Offline-online RMAposition against matchpoints on the portal map
Modbus RTUmain interface to the cap lamp controller — native or third-party
Gas measurementmethane and CO, per the fitted sensor option
Gas alarmsMethaneALM, COALM
SOS/OutSos with server acknowledgement
Two-way text messaging/InSms to the lamp display, with delivery and read receipts
Environment telemetrytemperature, pressure, height
Proximity alertinggroup, beacon ID and distance
Buffered upload/BufferedData, ECO mode
Remote configurationconfig and GATT access over MQTT
Heart rate/HrsData
RFIDEm-Marine serial in the battery compartment

The table above describes the Wi-Fi variant, which is the baseline. Every variant reaches the lamp’s gas sensors, buttons and display over an internal Modbus RTU bus — the sensors belong to the cap lamp controller, and their readings arrive over that bus rather than being wired to the module. No CAN or RS-485 controller is fitted on any of them.

What differs between the three versions is the positioning radio and the uplink:

VersionPositioningServer uplink
ATEX Locator: Wi-Fi VersionOffline-online RMA over BLE — nRF52Wi-Fi — CC3100
ATEX Locator: UWBUWB TWR and UWB TDoA, plus CAS-PDSnone of its own — a 2×2 cm add-on alongside a locator
Locator: LTE VersionOffline-online RMA over BLE — nRF52LTE — nRF91

MQTT topics

The module reports about itself, publishing under its own LocatorID in the <prefix>/Locators/ tree. DeviceType is bler.

It shares /RTLS and /BufferedData with the rest of the line — see MQTT. The remaining suffixes are specific to this module and to underground mining use cases; no other device model publishes or accepts them:

TopicDirectionContent
/RTLSdevice → serverposition, gas readings, environment, battery, status
/BufferedDatadevice → serverrecords stored while offline
/OutSosdevice → serverSOS or gas alarm, with the readings that accompany it
/InSmsserver → devicealarm banner or text message for the lamp display
/InSmsAllserver → devicethe same, broadcast to every lamp — no locator segment
/OutAckdevice → serverdelivery and read receipts
/InAckserver → deviceSOS acknowledged by the operator
/ConfigReadData, /ConfigWriteDatabothremote configuration
/GattRead, /GattWritebothremote GATT characteristic access
/HrsDatadevice → serverheart rate
/Timestampbothtime synchronisation
/TLMdevice → serverbeacon telemetry

Gas measurement and alarms

Gas sensors are read over Modbus and reported in the position payload. Each gas has a measured value and a separate alarm flag, so a reading and a threshold breach are distinct facts:

KeyMeaningFormatUnit
Methanemethane concentrationdecimal, two placespercent by volume
MethaneALMmethane sensor status wordinteger
COcarbon monoxide concentrationintegerppm
COALMCO sensor status wordinteger
Pressurebarometric pressureintegerpascals
LocatorTemptemperaturedecimal, one placedegrees Celsius

The two gases are scaled differently — methane carries two decimals, CO is a whole number — and neither carries its unit in the message.

A gas reading is not always a number. When the sensor does not answer, the device emits the JSON string "-.--" where the value would be:
"Methane": 1.35     sensor answering
"Methane": "-.--"   sensor not answering
A parser that assumes a numeric type fails on exactly the messages that matter most. Check the type before converting, and treat the string form as no reading rather than as zero.

MethaneALM and COALM are the sensor's raw status word, not booleans, and they split by byte: the high byte reports sensor health, the low byte the threshold state. Test value & 1 for the alarm and read value >> 8 for health — comparing the whole word to 1 fails on a sensor that is merely warming up. Codes are on Gas Sensors.

Which keys are present depends on the fitted sensor option, recorded in the SL_CONFIG characteristic (0x8308) at manufacture:

ValueFitted sensors
0none
1methane
2CO
3methane + CO
4methane + pressure + temperature
5CO + pressure + temperature

An integration reads SL_CONFIG rather than assuming a sensor is present: an absent key and a zero reading are different facts.

SOS and message flow

Cap lamp Server SOS — raised by the wearer /OutSos   {…, "SOS":1, gas readings} position, alarm state and current readings in one message /InAck operator acknowledgement · three button presses clear the SOS Alarm or text message — sent by the server /InSms   {"ALM":"…"}   or   {"SMS":"…"} the key chooses alarm banner or plain message /OutAck   "AckALM":1   or   "AckSMS":1 reached the lamp /OutAck   "AckReadALM":1   or   "AckReadSMS":1
SOS travels upward from the wearer; alarms and text messages travel downward from the server and are receipted twice — delivered to the lamp, then seen by the wearer.

SOS

The wearer raises an SOS from the lamp button. The device publishes on /OutSos a message that combines position, the SOS flag and the gas readings current at that moment, so an operator sees where, what and how bad in one message. SOS stays 1 while the alarm is active; the wearer clears their own SOS with three presses of the button. Operator acknowledgement arrives on /InAck.

Alarms and text messages to the lamp display

Both directions of display messaging use /InSms, and the key selects the presentation:

{"ALM": "Evacuate section 4"}       alarm banner
{"SMS": "Report to the shift lead"} plain text message

The text is capped at 140 characters. If something is already on the display, the new message is queued rather than dropped or overwritten. /InSmsAll — with no locator segment in the topic — broadcasts to every lamp on the site.

Receipts

Each message is receipted twice on /OutAck: once when it reaches the lamp (AckALM or AckSMS), once when the wearer has seen it (AckReadALM or AckReadSMS). All four flags appear in every receipt and exactly one is set to 1.

A receipt cannot be matched to a specific outbound message by ID. Its MessageID is the lamp's own outgoing counter, not an echo of anything the server sent — and /InSms carries no identifier for the device to echo. Correlate by lamp, flag and time; do not send a second message to a lamp while an earlier one is unreceipted if the two must be told apart.

Position and environment payload

The /RTLS payload combines the observed beacon with device and wearer state:

KeyContent
MessageIDthe device's own outgoing counter
LocatorIDdevice identity
DeviceTypebler
BeaconID, BeaconMinorobserved beacon — BeaconID is byte-reversed
Distance, RawDistancefiltered and unfiltered distance
FilterTypefilter applied to Distance
BeaconRSSIreceived signal strength from the beacon
BeaconTemp, BeaconBatterytemperature and battery reported by the beacon
BatteryChargelamp battery state
Lamp_Statuslamp state
Methane / CO / Pressure / LocatorTempgas and environment, per SL_CONFIG
APRSSIWiFi access-point signal strength
Activ_state, Accel_state, Time_in_sleepcharging / activity state and time spent inactive
Timestampmessage time, milliseconds
The gas alarm keys are not in this payload. MethaneALM and COALM appear only on /OutSos. A position message carries the reading; the alarm state arrives with the SOS.

Proximity alerting

The module alerts on approach to a designated beacon. It is governed by three configuration parameters — they are read and written through /ConfigReadData and /ConfigWriteData, and do not appear in position messages:

ParameterContent
PROXIMITY_GROUPgroup being monitored
PROXIMITY_BEACON_IDbeacon to watch for
PROXIMITY_DISTtrigger distance

The configuration response also carries HEIGHT, EM_MARINE_SN (the RFID serial in the battery compartment), SL_CONFIG and the network, filter and blink settings — all of it configuration state rather than telemetry.

Offline operation and ECO mode

The module records position and telemetry without network coverage and uploads on /BufferedData when a connection returns — see Offline-online RMA. In ECO mode the device remains offline for a configured interval before connecting, set by the sleep-duration parameter.

GATT ranges

The module uses the 0x81xx / 0x82xx / 0x83xx vendor ranges rather than the 0x51xx UWB service:

RangeContents
0x81xxnetwork configuration — WI_FI_NAME, WI_FI_PASS, SRV_ADDR, SRV_PORT, NTP_SRV_ADDR, PREFIX, LocatorID
0x82xxstatus — FIRMWARE_VER, BLE_MAC, WIFI_MAC, IP
0x83xxRTLS configuration — SL_CONFIG, RTLS_MIN_DIST, RTLS_MAX_DIST, FILTER_TYPE, BLINK_ENABLE, BLINK_INTERVAL, SLEEP_DURATION_M, proximity settings

All of these are also reachable remotely over MQTT through /ConfigReadData and /ConfigWriteData, and individual characteristics through /GattRead and /GattWrite.