Skip to content

1. Sensor Overview

Model catalog

Search for these models in ThinkLink by name or ID.

Model typeNameid_namePlatform model ID
RPC[CT30xLF-A0 ACT] 21308ct30xlfa0_action_21308841830626125414403
RPC[CT30xLF-A0 GET] 21308ct30xlfa0_get_21308841830626125414402
RPC[CT30xLF-A0 SET] 21308ct30xlfa0_set_21308841830626125414401
TemplateCT30xLF-A0ct30xlfa0_21308841830626125414404
Thing Model[CT30xLF-A0]ct30xlfa0_21308841827660052037632
Thing Model[REJEEE-21308-CT30xLF-A0资产] 区域聚合ct30xlfa0_asset_21308119677174411063300
Parameter Thing Model[CT30xLF-A0-PARA]ct30xlfa0_para_21308841830626125414400

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

ParameterValue
CommunicationLoRa / LoRaWAN
Frequency470–510 MHz (CN470)
TX PowerMax 22 dBm
RX Sensitivity-141 dBm (SF12, BW125kHz)
Power SupplyFire wire AC85V–265V
Max Load400W per channel
Standby Power≤0.22W
Dimensions86mm × 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 RangeFormatDescription
0x00–0x0F, 0xFFT+V (fixed length)Basic sensor types, no Length byte
0x10+T+L+V (variable length)Includes Length byte for extensibility
TypeNameLengthDescription
0x00Device Info2 bytesversion(3b) + battery_level(5b) + reserve(1B)
0x09Switch Status1 byteBitmask per channel
0x1ACurrent / Voltage2–4 bytescurrent(int16BE, mA) [+ voltage(int16BE, 0.1V)]
0x1BPower≥4 bytesactive power(uint32BE, W)
FRMPayload (hex): 003300 0901 1A04011D08D1 1B040000003F

Parsed:

  • 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

javascript
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

json
{
    "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

ParameterTypeDescription
period_upnumberUpload period in seconds, range 1-65535

RPC Script

javascript
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

javascript
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

ParameterTypeDescription
switch_1booleanChannel 1 on/off
switch_2booleanChannel 2 on/off
switch_3booleanChannel 3 on/off

RPC Script

javascript
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

  1. Default device parameters can be configured via the SensorTool desktop utility (requires disassembly and power-off).
  2. CT301/CT302/CT303 share the same thing model; the channel count is determined by the hardware variant.
  3. The device is Class C (always-on) — downlink commands execute immediately with no delay.
  4. The neutral wire is optional — connecting it can resolve LED flicker issues in single-fire-wire installations.
  5. Do not wire the device while powered on.