1. Sensor Overview
Model catalog
Search for these models in ThinkLink by name or ID.
| Model type | Name | id_name | Platform model ID |
|---|---|---|---|
| RPC | [CT30xLF-A0 ACT] 21308 | ct30xlfa0_action_21308 | 841830626125414403 |
| RPC | [CT30xLF-A0 GET] 21308 | ct30xlfa0_get_21308 | 841830626125414402 |
| RPC | [CT30xLF-A0 SET] 21308 | ct30xlfa0_set_21308 | 841830626125414401 |
| Template | CT30xLF-A0 | ct30xlfa0_21308 | 841830626125414404 |
| Thing Model | [CT30xLF-A0] | ct30xlfa0_21308 | 841827660052037632 |
| Thing Model | [REJEEE-21308-CT30xLF-A0资产] 区域聚合 | ct30xlfa0_asset_21308 | 119677174411063300 |
| Parameter Thing Model | [CT30xLF-A0-PARA] | ct30xlfa0_para_21308 | 841830626125414400 |
The CT30x-LF-A0 is a LoRa smart switch panel manufactured by Nanjing REJEEE Electronic Technology Co., Ltd. It uses a standard 86-type wall switch enclosure and can replace traditional mechanical switches without rewiring — simply connect in series with the fire wire for remote wireless control. The device supports 1–3 channel control (CT301 single, CT302 dual, CT303 triple), making it ideal for warehouses, server rooms, and office buildings.
In this integration solution, the device model is CT30x-LF-A0, the business code is 21308, and the template name is CT30xLF-A0.
2. Product Features
- LoRa/LoRaWAN communication with local + remote control
- Standard 86-type panel — direct drop-in replacement for mechanical switches
- Fire wire (optionally neutral wire) power, max 400W per channel
- Single, dual, and triple control variants
- Built-in antenna, easy installation
- Class C always-on — zero downlink latency
3. Application Scope
- Warehouse lighting remote control
- Server room equipment power management
- Office building centralized lighting control
- Factory floor lighting retrofit
4. Specifications
| Parameter | Value |
|---|---|
| Communication | LoRa / LoRaWAN |
| Frequency | 470–510 MHz (CN470) |
| TX Power | Max 22 dBm |
| RX Sensitivity | -141 dBm (SF12, BW125kHz) |
| Power Supply | Fire wire AC85V–265V |
| Max Load | 400W per channel |
| Standby Power | ≤0.22W |
| Dimensions | 86mm × 86mm × 34mm |
| Operating Environment | -30℃ ~ +70℃, ≤95% RH |
5. Data Acquisition
5.1 Protocol Overview
The CT30x-LF-A0 uses a custom TLV variable-length frame protocol over LoRaWAN FRMPayload. Data types are identified by a Type byte — no port-based dispatch is used.
5.2 TLV Frame Structure
| Type Range | Format | Description |
|---|---|---|
| 0x00–0x0F, 0xFF | T+V (fixed length) | Basic sensor types, no Length byte |
| 0x10+ | T+L+V (variable length) | Includes Length byte for extensibility |
5.3 Uplink Data Types
| Type | Name | Length | Description |
|---|---|---|---|
| 0x00 | Device Info | 2 bytes | version(3b) + battery_level(5b) + reserve(1B) |
| 0x09 | Switch Status | 1 byte | Bitmask per channel |
| 0x1A | Current / Voltage | 2–4 bytes | current(int16BE, mA) [+ voltage(int16BE, 0.1V)] |
| 0x1B | Power | ≥4 bytes | active power(uint32BE, W) |
5.4 Uplink Example
FRMPayload (hex): 003300 0901 1A04011D08D1 1B040000003FParsed:
- Device Info: version=1, battery_level=19
- Switch: channel 1=ON
- Current=285mA, Voltage=225.7V
- Power=63W
6. Thing Model
6.1 Basic Information
Telemetry Thing Model
- Name: [CT30xLF-A0]
- id Name: ct30xlfa0_21308
Parameter Thing Model
- Name: [CT30xLF-A0-PARA]
- id Name: ct30xlfa0_para_21308
6.2 Telemetry Parser Script
let payload = msg?.userdata?.payload;
if (!payload) return null;
let bytes = Buffer.from(payload, 'base64');
let data = {};
let i = 0;
while (i < bytes.length) {
let type = bytes[i++];
if ((type >= 0x00 && type <= 0x0F) || type === 0xFF) {
switch (type) {
case 0x00:
let info = bytes[i++];
data.version = (info >> 5) & 0x07;
data.battery_level = info & 0x1F;
data.reserve = bytes[i++];
break;
case 0x09:
let sw = bytes[i++];
data.switch_1 = (sw & 0x01) === 0x01;
data.switch_2 = (sw & 0x02) === 0x02;
data.switch_3 = (sw & 0x04) === 0x04;
data.switch_status = sw;
break;
default: i = bytes.length; break;
}
} else {
let len = bytes[i++];
let value = bytes.slice(i, i + len);
i += len;
switch (type) {
case 0x1A:
if (len >= 2) data.current = value.readInt16BE(0);
if (len >= 4) data.voltage = value.readInt16BE(2) / 10.0;
break;
case 0x1B:
if (len >= 4) data.power = value.readUInt32BE(0);
break;
}
}
}
return {
telemetry_data: data,
server_attrs: null,
shared_attrs: null
};7. Third-Party Platform Data Subscription
7.1 MQTT Topic
/v32/{Organization Account}/tkl/up/telemetry/{eui}
7.2 Example Reported Data
{
"eui": "0123456789abcdef",
"active_time": "2026-05-11T09:00:00.000Z",
"thingModelId": "21308",
"thingModelIdName": "ct30xlfa0_21308",
"telemetry_data": {
"snr": 10.5,
"rssi": -45,
"switch_1": true,
"switch_2": false,
"switch_3": true,
"switch_status": 5,
"current": 285,
"voltage": 225.7,
"power": 63,
"version": 1,
"battery_level": 19
}
}8. RPC
8.1 Parameter Configuration RPC (SET)
Report Period Configuration
- Name: [CT30xLF-A0 SET] 21308
- id Name: ct30xlfa0_set_21308
Parameters
| Parameter | Type | Description |
|---|---|---|
| period_up | number | Upload period in seconds, range 1-65535 |
RPC Script
const rpcName = "ct30xlfa0_set_21308";
let classMode = (device && device.shared_attrs && device.shared_attrs.class_mode) || "ClassC";
let dnBuffer = Buffer.alloc(4);
dnBuffer[0] = 0x02;
dnBuffer[1] = 0x11;
dnBuffer.writeUInt16BE(params.period_up, 2);
let paraDef = {
app_11: {name: "period_up", field_name: "period_up", unit: "s", type: "uint16BE"}
};
let readBuffer = Buffer.alloc(2);
readBuffer[0] = 0x01;
readBuffer[1] = 0x81;
let paraDownBuffer = Buffer.alloc(dnBuffer.length + readBuffer.length);
dnBuffer.copy(paraDownBuffer, 0);
readBuffer.copy(paraDownBuffer, dnBuffer.length);
let msgQue = Utils.makeParaSetMSG({
device: device,
classMode: classMode,
rpcName: rpcName,
params: params,
paraDownBuffer: paraDownBuffer,
});
if (msgQue.length === 0) return null;
return msgQue;Downlink payload: 0x02 0x11 + period_up(uint16BE), sent via LoRaWAN transparent downlink (port 51).
8.2 Parameter Read RPC (GET)
User Configuration Read
- Name: [CT30xLF-A0 GET] 21308
- id Name: ct30xlfa0_get_21308
No parameters. After reading, the device returns configuration data including period_up and period_read.
RPC Script
let dnBuffer = Buffer.alloc(2);
dnBuffer[0] = 0x01;
dnBuffer[1] = 0x81;
let msg = RPCHelper.makeMSG({
msgType: Utils.msgType.transParent,
device: device,
dnBuffer: dnBuffer,
sleepTime: 2000
});
return [msg];Downlink payload: 0x01 0x81, sent via LoRaWAN transparent downlink (port 51).
8.3 Switch Control RPC (ACTION)
Multi-Channel Switch Control
- Name: [CT30xLF-A0 ACT] 21308
- id Name: ct30xlfa0_action_21308
Parameters
| Parameter | Type | Description |
|---|---|---|
| switch_1 | boolean | Channel 1 on/off |
| switch_2 | boolean | Channel 2 on/off |
| switch_3 | boolean | Channel 3 on/off |
RPC Script
let mask = 0x00;
let action = 0x00;
if (params.switch_1 !== undefined) { mask |= 0x01; if (params.switch_1) action |= 0x01; }
if (params.switch_2 !== undefined) { mask |= 0x02; if (params.switch_2) action |= 0x02; }
if (params.switch_3 !== undefined) { mask |= 0x04; if (params.switch_3) action |= 0x04; }
if (mask === 0x00) return null;
let dnBuffer = Buffer.alloc(3);
dnBuffer[0] = 0x23;
dnBuffer[1] = mask;
dnBuffer[2] = action;
let msg = RPCHelper.makeMSG({
msgType: Utils.msgType.transParent,
device: device,
dnBuffer: dnBuffer,
sleepTime: 2000
});
return [msg];Downlink payload: 0x23 + mask(1B) + action(1B), sent via LoRaWAN transparent downlink (port 51).
9. Template Selection
In the ThinkLink platform, search for the template:
- CT30xLF-A0
Or search by business type:
- 21308 / LoRa Smart Switch / REJEEE Light Control Panel
Supplementary Notes
- Default device parameters can be configured via the SensorTool desktop utility (requires disassembly and power-off).
- CT301/CT302/CT303 share the same thing model; the channel count is determined by the hardware variant.
- The device is Class C (always-on) — downlink commands execute immediately with no delay.
- The neutral wire is optional — connecting it can resolve LED flicker issues in single-fire-wire installations.
- Do not wire the device while powered on.