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.
ATEX and non-ATEX modules to enable 3rd-party mining equipment with advanced RTLS and IoT features. Such modules are available in three versions:
| Interface | Notes |
|---|---|
| Offline-online RMA | position against matchpoints on the portal map |
| Modbus RTU | main interface to the cap lamp controller — native or third-party |
| Gas measurement | methane and CO, per the fitted sensor option |
| Gas alarms | MethaneALM, COALM |
| SOS | /OutSos with server acknowledgement |
| Two-way text messaging | /InSms to the lamp display, with delivery and read receipts |
| Environment telemetry | temperature, pressure, height |
| Proximity alerting | group, beacon ID and distance |
| Buffered upload | /BufferedData, ECO mode |
| Remote configuration | config and GATT access over MQTT |
| Heart rate | /HrsData |
| RFID | Em-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:
| Version | Positioning | Server uplink |
|---|---|---|
| ATEX Locator: Wi-Fi Version | Offline-online RMA over BLE — nRF52 | Wi-Fi — CC3100 |
| ATEX Locator: UWB | UWB TWR and UWB TDoA, plus CAS-PDS | none of its own — a 2×2 cm add-on alongside a locator |
| Locator: LTE Version | Offline-online RMA over BLE — nRF52 | LTE — nRF91 |
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:
| Topic | Direction | Content |
|---|---|---|
/RTLS | device → server | position, gas readings, environment, battery, status |
/BufferedData | device → server | records stored while offline |
/OutSos | device → server | SOS or gas alarm, with the readings that accompany it |
/InSms | server → device | alarm banner or text message for the lamp display |
/InSmsAll | server → device | the same, broadcast to every lamp — no locator segment |
/OutAck | device → server | delivery and read receipts |
/InAck | server → device | SOS acknowledged by the operator |
/ConfigReadData, /ConfigWriteData | both | remote configuration |
/GattRead, /GattWrite | both | remote GATT characteristic access |
/HrsData | device → server | heart rate |
/Timestamp | both | time synchronisation |
/TLM | device → server | beacon telemetry |
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:
| Key | Meaning | Format | Unit |
|---|---|---|---|
Methane | methane concentration | decimal, two places | percent by volume |
MethaneALM | methane sensor status word | integer | — |
CO | carbon monoxide concentration | integer | ppm |
COALM | CO sensor status word | integer | — |
Pressure | barometric pressure | integer | pascals |
LocatorTemp | temperature | decimal, one place | degrees 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: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."Methane": 1.35 sensor answering "Methane": "-.--" sensor not answering
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:
| Value | Fitted sensors |
|---|---|
0 | none |
1 | methane |
2 | CO |
3 | methane + CO |
4 | methane + pressure + temperature |
5 | CO + pressure + temperature |
An integration reads SL_CONFIG rather than assuming a sensor is present: an absent key and a zero reading are different facts.
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.
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.
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. ItsMessageIDis the lamp's own outgoing counter, not an echo of anything the server sent — and/InSmscarries 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.
The /RTLS payload combines the observed beacon with device and wearer state:
| Key | Content |
|---|---|
MessageID | the device's own outgoing counter |
LocatorID | device identity |
DeviceType | bler |
BeaconID, BeaconMinor | observed beacon — BeaconID is byte-reversed |
Distance, RawDistance | filtered and unfiltered distance |
FilterType | filter applied to Distance |
BeaconRSSI | received signal strength from the beacon |
BeaconTemp, BeaconBattery | temperature and battery reported by the beacon |
BatteryCharge | lamp battery state |
Lamp_Status | lamp state |
Methane / CO / Pressure / LocatorTemp | gas and environment, per SL_CONFIG |
APRSSI | WiFi access-point signal strength |
Activ_state, Accel_state, Time_in_sleep | charging / activity state and time spent inactive |
Timestamp | message time, milliseconds |
The gas alarm keys are not in this payload.MethaneALMandCOALMappear only on/OutSos. A position message carries the reading; the alarm state arrives with the SOS.
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:
| Parameter | Content |
|---|---|
PROXIMITY_GROUP | group being monitored |
PROXIMITY_BEACON_ID | beacon to watch for |
PROXIMITY_DIST | trigger 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.
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.
The module uses the 0x81xx / 0x82xx / 0x83xx vendor ranges rather than the 0x51xx UWB service:
| Range | Contents |
|---|---|
0x81xx | network configuration — WI_FI_NAME, WI_FI_PASS, SRV_ADDR, SRV_PORT, NTP_SRV_ADDR, PREFIX, LocatorID |
0x82xx | status — FIRMWARE_VER, BLE_MAC, WIFI_MAC, IP |
0x83xx | RTLS 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.