23108-DLT64507-1P Integration Guide
Sensor Overview
DLT64507-1P is integrated with ThinkLink through dlt645 in edgebus-dtu mode. This guide documents the current deployable artifacts and their source-traceable versions.
| Item | Value |
|---|---|
| Project | MT-23108-DLT64507-1P |
| Vendor | MT |
| Model | DLT64507-1P |
| Business Code | 23108 |
| Integration Mode | edgebus-dtu |
| Protocol | dlt645 |
Model catalog
Search for these models in ThinkLink by name or ID.
| Model type | Name | id_name | Platform model ID |
|---|---|---|---|
| RPC | [DLT64507-1P GET] para | dlt64507_1p_get_23108 | 101062552481435653 |
| RPC | [DLT64507-1P SET] para | dlt64507_1p_set_23108 | 101062392342908933 |
| Template | DLT64507-1P | 101062927179583493 | |
| Thing Model | [DLT64507-1P] | dlt64507_1p_23108 | 101059204525068293 |
| Thing Model | [MT-23108-DLT64507-1P资产] 区域聚合 | dlt64507_1p_asset_23108 | 119677189950959622 |
| Parameter Thing Model | [DLT64507-1P-PARA] | dlt64507_1p_para_23108 | 101058843898810373 |
Features and Application Scope
This project covers DLT64507-1P through dlt645. Its capability boundary, fields, and deployable models follow the current descriptor, requirements, and model sources.
Deployment and Data Acquisition
| DTU | KC11 | | Power | ac | | LoRaWAN Class | C | | Interface | RS-485 | | Baud Rate | 9600 |
Telemetry and Register Definitions
| Field | Name | Type | Unit | Address/Source | Description |
|---|---|---|---|---|---|
| energy_import_total | energy_import_total | bcdLE4 | kWh | DLT645 DI3 | Source field: energy_import_total |
| energy_export_total | energy_export_total | bcdLE4 | kWh | DLT645 DI3 | Source field: energy_export_total |
| voltage | voltage | bcdLE2 | V | DLT645 DI3 | Source field: voltage |
| current | current | bcdLE3 | A | DLT645 DI3 | Source field: current |
| active_power | active_power | bcdLE3 | kW | DLT645 DI3 | Source field: active_power |
| reactive_power | reactive_power | bcdLE3 | kvar | DLT645 DI3 | Source field: reactive_power |
| power_factor | power_factor | bcdLE2 | DLT645 DI3 | Source field: power_factor | |
| frequency | frequency | bcdLE2 | Hz | DLT645 DI3 | Source field: frequency |
Parameter Definitions
| Parameter | Name | Type | Default | Range | Unit | Description |
|---|---|---|---|---|---|---|
| app_38 | pwron_delay | uint16LE | — | 0-65535 | ms | Source parameter: app_38 |
| app_70 | period_up | uint32LE | — | 0-4294967295 | s | Source parameter: app_70 |
| app_74 | period_read | uint32LE | — | 0-4294967295 | s | Source parameter: app_74 |
| app_150 | addr_modbus | uint8 | 1 | 1-247 | Source parameter: app_150 |
Requirements Evidence
The following key facts were extracted from the requirements source; line references support verification.
| Category | Source Fact | Source |
|---|---|---|
| Protocol/Data | > input/ .md + descriptor.yaml / | requirement/requirements.md:4 |
| Deployment | DTU Power Mode AC 85–270V KC11 | requirement/requirements.md:22 |
| Deployment | LoRaWAN Class Class C eb/23108-DLT64507-1P.ts otaConfig 「 Class C 」 Battery:false | requirement/requirements.md:23 |
| Deployment | > KC11 Class C not applicable KB-37 「 / 」 | requirement/requirements.md:26 |
| Protocol/Data | - DL/T645-2007 — | requirement/requirements.md:39 |
| Protocol/Data | - supports RS-485 — subDevice | requirement/requirements.md:41 |
| Unresolved | Voltage AC DTU KC11 AC 85–270V descriptor.yaml / TODO / | requirement/requirements.md:56 |
| Unresolved | Power Consumption TODO — TODO | requirement/requirements.md:57 |
| Deployment | Power-on to Stable Working 1s 1 | requirement/requirements.md:63 |
| Protocol/Data | Interface Type RS-485 UART / | requirement/requirements.md:69 |
| Deployment | Baud Rate 2400bps ⚠️ eb/23108-DLT64507-1P.ts otaConfig 9600bps §11 | requirement/requirements.md:70 |
| Deployment | UART(GND/RX/TX/12V) ── | requirement/requirements.md:79 |
| Deployment | KC11 AC L/N ──────── 85–270V KC11 | requirement/requirements.md:80 |
| Deployment | AC L/N KC11 DTU —— | requirement/requirements.md:88 |
| Deployment | DTU-specific wiring notes: | requirement/requirements.md:90 |
| Deployment | - KC11 AC L/N DTU 85–270V RS-485A/485B 120Ω 485A | requirement/requirements.md:92 |
| Protocol/Data | Protocol Type dlt645 DL/T645-2007 | requirement/requirements.md:100 |
| Protocol/Data | Device Default Address 「 」 0x13 6 BCD subDevice | requirement/requirements.md:101 |
| Protocol/Data | Frame Format 68 < 6B, BCD > 68 < 1B> < 1B> < ( )> < 1B> 16 FE FE FE FE | requirement/requirements.md:102 |
| Protocol/Data | > DL/T645-2007 §5.2/§9 EB/ | requirement/requirements.md:105 |
| Deployment | eb/23108-DLT64507-1P.ts quInfo + thinklink/thingModel/dlt64507_1p_23108.js payload_parser | requirement/requirements.md:109 |
| Protocol/Data | (energy_import_total) 00010000 bcdle4 4 0.01 R EPI_T | requirement/requirements.md:113 |
| Protocol/Data | (energy_export_total) 00020000 bcdle4 4 0.01 R EPO_T | requirement/requirements.md:114 |
| Deployment | (active_power) 02030000 bcdle3 3 0.0001 R P | requirement/requirements.md:117 |
EdgeBus Code
The following is the current EdgeBus business code.
import { Buffer } from "buffer";
import { buildOtaFile } from "@EBSDK/run";
import {
ActionAfertExpr, CalcData,
CrcMode,
CvtRule,
EBBuffer,
EBModel,
ExprCondition,
LoraUpEvent,
QueryEvent, SetUpCovDataType,UserConfUPItem,EventInfoItem
} from "@EBSDK/EBCompiler/all_variable";
import { CheckbitEnum, getOtaConfig, HwTypeEnum, UpgrdTypeEnum } from "@EBSDK/otaConfig";
////////////////////////////////////////////////////////////////////////////////////////
const eventInfo: UserConfUPItem[] = [
{
name: "DLT64507_1P", port: 22, version: "0x87", dataType: "0x08",
upPeriodIndex: 70, indexAddr: 5, addrSize: 6,
quInfo: [
// 正向有功总电能,listVal[0] = EPI_T,DI: 00010000
{
protocol: "DLT64507", periodIndex: 74,
indexAPP: 150, indexCMD: 1, copySize: 6, preamble: 4,
cmd: "0x68 22 01 13 07 11 25 68 11 04 33 33 34 33 25 16",
ack: "0x68 22 01 13 07 11 25 68 91 08 33 33 34 33 33 33 33 33 75 16",
listVal: [{ start: "14", end: "17" }]
},
// 反向有功总电能,listVal[0] = EPO_T,DI: 00020000
{
protocol: "DLT64507", periodIndex: 74,
indexAPP: 150, indexCMD: 1, copySize: 6, preamble: 4,
cmd: "0x68 22 01 13 07 11 25 68 11 04 33 33 35 33 26 16",
ack: "0x68 22 01 13 07 11 25 68 91 08 33 33 35 33 33 33 33 33 76 16",
listVal: [
{ start: "14", end: "17" }
]
},
// 电压,listVal[0] = U,DI: 02010100
{
protocol: "DLT64507", periodIndex: 74,
indexAPP: 150, indexCMD: 1, copySize: 6, preamble: 4,
cmd: "0x68 22 01 13 07 11 25 68 11 04 33 34 34 35 28 16",
ack: "0x68 22 01 13 07 11 25 68 91 06 33 34 34 35 33 33 10 16",
listVal: [
{ start: "14", end: "15" }
]
},
// 电流,listVal[0] = I,DI: 02020100
{
protocol: "DLT64507", periodIndex: 74,
indexAPP: 150, indexCMD: 1, copySize: 6, preamble: 4,
cmd: "0x68 22 01 13 07 11 25 68 11 04 33 34 35 35 29 16",
ack: "0x68 22 01 13 07 11 25 68 91 07 33 34 35 35 33 33 33 45 16",
listVal: [
{ start: "14", end: "16" }
]
},
// 有功功率,listVal[0] = P,DI: 02030000
{
protocol: "DLT64507", periodIndex: 74,
indexAPP: 150, indexCMD: 1, copySize: 6, preamble: 4,
cmd: "0x68 22 01 13 07 11 25 68 11 04 33 33 36 35 29 16",
ack: "0x68 22 01 13 07 11 25 68 91 07 33 33 36 35 33 33 33 45 16",
listVal: [
{ start: "14", end: "16" }
]
},
// 无功功率,listVal[0] = Q,DI: 02040000
{
protocol: "DLT64507", periodIndex: 74,
indexAPP: 150, indexCMD: 1, copySize: 6, preamble: 4,
cmd: "0x68 22 01 13 07 11 25 68 11 04 33 33 37 35 2A 16",
ack: "0x68 22 01 13 07 11 25 68 91 07 33 33 37 35 33 33 33 46 16",
listVal: [
{ start: "14", end: "16" }
]
},
// 功率因数,listVal[0] = PF,DI: 02060000
{
protocol: "DLT64507", periodIndex: 74,
indexAPP: 150, indexCMD: 1, copySize: 6, preamble: 4,
cmd: "0x68 22 01 13 07 11 25 68 11 04 33 33 39 35 2C 16",
ack: "0x68 22 01 13 07 11 25 68 91 06 33 33 39 35 33 33 14 16",
listVal: [
{ start: "14", end: "15" }
]
},
// 电网频率,listVal[0] = FREQ,DI: 02800000
{
protocol: "DLT64507", periodIndex: 74,
indexAPP: 150, indexCMD: 1, copySize: 6, preamble: 4,
cmd: "0x68 22 01 13 07 11 25 68 11 04 33 33 B3 35 A6 16",
ack: "0x68 22 01 13 07 11 25 68 91 06 33 33 B3 35 33 33 8E 16",
listVal: [
{ start: "14", end: "15" }
]
}
]
}
]
let otaConfig = getOtaConfig({
BaudRate: 9600,
StopBits: 1,
DataBits: 8,
Checkbit: CheckbitEnum.EVEN,
Battery: false, // 非电池供电,Class C模式
ConfirmDuty: 60,
BzType: 23108,
BzVersion: 11
})
const MODBUS_TT = (ebModel: EBModel) => {
for (let i=0; i<eventInfo.length; i++){
let event=new EventInfoItem(eventInfo[i]);
event.upEventSetup()
event.eventInstall()
}
return JSON.stringify(ebModel, null, 2)
}
buildOtaFile(import.meta.url, otaConfig, MODBUS_TT)Thing Model and RPC Code
RPC: [DLT64507-1P GET] para
id_name: dlt64507_1p_get_23108 · ID: 101062552481435653
import {RPCHelper, Utils} from '#tklHelper';
function rpc_script({ device, params, alarms, logger, org_params }) {
let paraDef= {
app_70: {name: "period_up", field_name: "period_up", unit: "s", type: "uint32LE"},
app_74: {name: "period_read", field_name: "period_read", unit: "s", type: "uint32LE"},
app_150: {name: "addr_645", field_name: "addr_645", unit: "", type: "hexBE6"}
}
let frames=RPCHelper.buildFrame({
paraDef:paraDef,
params:params});
let msg=RPCHelper.makeMSG({
msgType:Utils.msgType.paras,
device:device,
dnBuffer:frames.readBuffer,
sleepTime:0,
})
return [msg]
}
rpc_script({
device: { server_attrs: {}, shared_attrs: {} },
params: {},
alarms: [],
logger: console,
org_params: {}
})RPC: [DLT64507-1P SET] para
id_name: dlt64507_1p_set_23108 · ID: 101062392342908933
import {RPCHelper, Utils} from '#tklHelper';
import {Buffer} from "buffer";
function rpc_script({ device, params, alarms, logger, org_params }) {
let classMode = (device && device.shared_attrs && device.shared_attrs.class_mode) || "ClassA";
const rpcName="dlt64507_1p_para_23108"
let paraDef= {
app_70: {name: "period_up", field_name: "period_up", unit: "s", type: "uint32LE"},
app_74: {name: "period_read", field_name: "period_read", unit: "s", type: "uint32LE"},
app_150: {name: "addr_645", field_name: "addr_645", unit: "", type: "hexBE6"}
}
logger.info("set paras")
let frames=RPCHelper.buildFrame({
paraDef:paraDef,
params:params});
let redoBuffer=RPCHelper.redo()
let dnBuffer=Buffer.alloc(frames.writeBuffer.length+frames.readBuffer.length);
frames.writeBuffer.copy(dnBuffer,0)
frames.readBuffer.copy(dnBuffer,frames.writeBuffer.length)
let msgQue=Utils.makeParaSetMSG({
device:device,
classMode:classMode,
rpcName:rpcName,
params:params,
paraDownBuffer:dnBuffer,
extraAppBuffer:redoBuffer
})
if (msgQue.length==0) return null
return msgQue
}
rpc_script({
device: { server_attrs: {}, shared_attrs: {} },
params: {},
alarms: [],
logger: console,
org_params: {}
})Thing Model: [DLT64507-1P]
id_name: dlt64507_1p_23108 · ID: 101059204525068293
import {BufferTKL, RPCHelper} from '#tklHelper';
import {Buffer} from "buffer";
function payload_parser(device, msg, thingModelId, noticeAttrs, org_params) {
let frameInfo = {
port: 22, dataLen: 34, rssi: true,
subDevice: { index: 5, type: "hexBE6" },
tagList: [
{ index: 0, tag: 0x87 },
{ index: 1, tag: 0x08 }
]
};
if (msg?.userdata?.payload === undefined) return null;
if (msg?.userdata?.payload === "") return null;
/**
* DLT645 采用余三码:
* EB 上行中 appData 保存的是表计原始回复数据,
* 即每个数据字节仍然是 +0x33 后的值。
*
* 因此在进入 PayParser 前,需要把应用数据区逐字节 -0x33。
*
* 注意:
* 0-10 字节为 EB 上行头 + 表地址,不处理。
* 11 字节开始为 DLT645 数据区,需要处理余三码。
*/
let payload = Buffer.from(msg.userdata.payload, "base64");
// 从 offset 11 开始是 appData,全部做 DLT645 余三码还原
for (let i = 11; i < payload.length; i++) {
payload[i] = (payload[i] - 0x33 + 0x100) & 0xff;
}
// 将处理后的 payload 写回 msg,供 PayParser 使用
msg = JSON.parse(JSON.stringify(msg));
msg.userdata.payload = payload.toString("base64");
let appInfo = [
// 正向 / 反向有功总电能
{name: "正向有功总电能", unit: "kWh", field_name: "energy_import_total", index: 11, dataType: "bcdle4", coefficient: 0.01, decimal: 2},
{name: "反向有功总电能", unit: "kWh", field_name: "energy_export_total", index: 15, dataType: "bcdle4", coefficient: 0.01, decimal: 2},
// 单相电压 / 电流
{name: "电压", unit: "V", field_name: "voltage", index: 19, dataType: "bcdle2", coefficient: 0.1, decimal: 1},
{name: "电流", unit: "A", field_name: "current", index: 21, dataType: "bcdle3", coefficient: 0.001, decimal: 3},
// 有功 / 无功功率
{name: "有功功率", unit: "kW", field_name: "active_power",index: 24, dataType: "bcdle3", coefficient: 0.0001, decimal: 4},
{name: "无功功率", unit: "kvar", field_name: "reactive_power", index: 27, dataType: "bcdle3", coefficient: 0.0001, decimal: 4},
// 功率因数
{name: "功率因数", unit: "", field_name: "power_factor", index: 30, dataType: "bcdle2", coefficient: 0.001, decimal: 3},
// 电网频率
{name: "电网频率", unit: "Hz", field_name: "frequency", index: 32, dataType: "bcdle2", coefficient: 0.01, decimal: 2}
];
let payParser = new PayParser({
device: device,
msg: msg,
frameInfo: frameInfo,
appInfo: appInfo
});
let tdata = payParser.telemetry();
if ((tdata?.status & 0x02) === 0x02) {
// timeout,只更新 status,保留原来的遥测数据
const status = tdata.status;
tdata = {
...(device.telemetry_data?.[thingModelId] ?? {})
};
tdata.status = status;
}
let result = {
sub_device: tdata?.addr === undefined ? null : tdata.addr,
telemetry_data: tdata,
server_attrs: null,
shared_attrs: {
class_mode: msg?.userdata?.class
}
};
// ── rpcHook (设备对接通用规则) ──
if (typeof RPCHelper.buildRpcHookAction === "function") {
const __a = RPCHelper.buildRpcHookAction({ device, msg, thingModelId, idName: "dlt64507_1p_23108", name: "[DLT64507-1P]", parsed: { telemetry_data: result.telemetry_data, server_attrs: result.server_attrs, shared_attrs: result.shared_attrs } });
if (__a) { result.actions = result.actions || []; result.actions.push(__a); }
}
return result;
}
console.log(payload_parser(
{ telemetry_data: {} },
{ userdata: { port: 11, payload: "" } },
"1",
{ telemetry_data: true },
{}
))Thing Model: dlt64507_1p_asset_23108
id_name: dlt64507_1p_asset_23108 · ID: 119677189950959622
import {PayloadParser, RPCHelper} from '#tklHelper';
// 资产(VIRTUAL)聚合物模型 — 通用 agg_spec 驱动聚合器,见 docs/references/workflow/asset-aggregation-model.md
// device=资产, msg=源设备快照, thingModelId=本物模型ID, noticeAttrs=变更标记。
// 聚合规格在资产 server_attrs.agg_spec:min_snr=取最小(snr);min_rssi=取最小(rssi);zone_current_sum=时点累加(current);zone_voltage_avg=空间均值(voltage);zone_frequency_avg=空间均值(frequency);zone_active_power_sum=时点累加(active_power);zone_power_factor_avg=空间均值(power_factor);zone_reactive_power_sum=时点累加(reactive_power);zone_energy_export_total_sum=谨慎累加(energy_export_total);zone_energy_import_total_sum=谨慎累加(energy_import_total);online_count=在线数(—)
function payload_parser(device, msg, thingModelId, noticeAttrs) {
if (!noticeAttrs || !noticeAttrs.telemetry_data) {
return { telemetry_data: null, server_attrs: null, shared_attrs: null };
}
const sa = device?.server_attrs || {};
const spec = sa.agg_spec || {};
const members = { ...(sa.members || {}) };
const staleMs = sa.stale_ms != null ? sa.stale_ms : 600000;
const now = (typeof Date !== "undefined" && Date.now) ? Date.now() : null;
// 合并源设备各物模型的最新快照为一个扁平对象
const srcTd = {};
const all = msg?.telemetry_data || {};
for (const k in all) { Object.assign(srcTd, all[k]); }
// 收集 spec 引用到的全部源字段,把本帧带到的值并进该成员快照
const want = {};
for (const out in spec) { if (spec[out].src) want[spec[out].src] = true; }
const got = {}; let touched = false;
for (const f in want) { if (srcTd[f] !== undefined && srcTd[f] !== null) { got[f] = srcTd[f]; touched = true; } }
if (touched && msg && msg.eui) {
const prev = (members[msg.eui] && members[msg.eui].v) || {};
const seq = (members[msg.eui] && members[msg.eui].ts) || 0;
members[msg.eui] = { v: Object.assign({}, prev, got), ts: now != null ? now : seq + 1 };
}
const euis = Object.keys(members);
const fresh = euis.filter(function (e) {
if (now == null || staleMs <= 0) return true;
const ts = members[e].ts;
return ts != null && ts <= now && (now - ts) <= staleMs;
});
const num = function (x) { return (x != null && !isNaN(x)) ? Number(x) : null; };
const out = {};
for (const field in spec) {
const op = spec[field].op, src = spec[field].src;
if (op === "count_online") { out[field] = fresh.length; continue; }
const pool = (op === "sum_cumul") ? euis : fresh;
const vals = pool.map(function (e) { return num(members[e].v && members[e].v[src]); }).filter(function (x) { return x != null; });
if (op === "avg") out[field] = vals.length ? Number((vals.reduce(function (a, b) { return a + b; }, 0) / vals.length).toFixed(2)) : null;
else if (op === "sum_snap" || op === "sum_cumul") out[field] = vals.length ? Number(vals.reduce(function (a, b) { return a + b; }, 0).toFixed(3)) : null;
else if (op === "max") out[field] = vals.length ? Math.max.apply(null, vals) : null;
else if (op === "min") out[field] = vals.length ? Math.min.apply(null, vals) : null;
else if (op === "or") out[field] = pool.some(function (e) { const x = members[e].v && members[e].v[src]; return x != null && x != 0; }) ? 1 : 0;
else if (op === "count_on") out[field] = pool.filter(function (e) { const x = members[e].v && members[e].v[src]; return x != null && x != 0; }).length;
else out[field] = null;
}
let result = { telemetry_data: out, server_attrs: { members: members }, shared_attrs: null };
// ── rpcHook (设备对接通用规则) ──
if (typeof RPCHelper.buildRpcHookAction === "function") {
const __a = RPCHelper.buildRpcHookAction({ device, msg, thingModelId, idName: "dlt64507_1p_asset_23108", name: "[MT-23108-DLT64507-1P资产] 区域聚合", parsed: { telemetry_data: result.telemetry_data, server_attrs: result.server_attrs, shared_attrs: result.shared_attrs } });
if (__a) { result.actions = result.actions || []; result.actions.push(__a); }
}
return result;
}
// --- local debug ---(两台成员先后上报;平台会把返回的 members 持久化回 device,这里手动模拟)
const agg_spec = {
"min_snr": {
"op": "min",
"src": "snr"
},
"min_rssi": {
"op": "min",
"src": "rssi"
},
"zone_current_sum": {
"op": "sum_snap",
"src": "current"
},
"zone_voltage_avg": {
"op": "avg",
"src": "voltage"
},
"zone_frequency_avg": {
"op": "avg",
"src": "frequency"
},
"zone_active_power_sum": {
"op": "sum_snap",
"src": "active_power"
},
"zone_power_factor_avg": {
"op": "avg",
"src": "power_factor"
},
"zone_reactive_power_sum": {
"op": "sum_snap",
"src": "reactive_power"
},
"zone_energy_export_total_sum": {
"op": "sum_cumul",
"src": "energy_export_total"
},
"zone_energy_import_total_sum": {
"op": "sum_cumul",
"src": "energy_import_total"
},
"online_count": {
"op": "count_online",
"src": ""
}
};
const device = { name: "MT-23108-DLT64507-1P资产-1", server_attrs: { agg_spec, stale_ms: 1800000, members: {} } };
const r1 = payload_parser(device, { eui: "MEMBER_A", telemetry_data: { m1: {"snr":1,"rssi":1,"current":1,"voltage":1,"frequency":1,"active_power":1,"power_factor":1,"reactive_power":1,"energy_export_total":1,"energy_import_total":1} } }, "tmid", { telemetry_data: true });
device.server_attrs.members = r1.server_attrs.members; // 平台持久化
console.log("成员A上报后:", JSON.stringify(r1.telemetry_data));
const r2 = payload_parser(device, { eui: "MEMBER_B", telemetry_data: { m1: {"snr":2,"rssi":2,"current":2,"voltage":2,"frequency":2,"active_power":2,"power_factor":2,"reactive_power":2,"energy_export_total":2,"energy_import_total":2} } }, "tmid", { telemetry_data: true });
device.server_attrs.members = r2.server_attrs.members;
console.log("成员B上报后(2台聚合):", JSON.stringify(r2.telemetry_data));
void PayloadParser;Parameter Thing Model: [DLT64507-1P-PARA]
id_name: dlt64507_1p_para_23108 · ID: 101058843898810373
import {PayloadParser, RPCHelper, Utils} from '#tklHelper';
function payload_parser(device, msg, thingModelId, noticeAttrs, org_params) {
let port=msg?.userdata?.port || null;
const rpcName="dlt64507_1p_para_23108"
let paraDef= {
app_70: {name: "period_up", field_name: "period_up", unit: "s", type: "uint32LE"},
app_74: {name: "period_read", field_name: "period_read", unit: "s", type: "uint32LE"},
app_150: {name: "addr_645", field_name: "addr_645", unit: "", type: "hexBE6"}
}
if (port!==214) {
let checkData=Utils.paraCheck(rpcName,device.server_attrs,device.shared_attrs)
return {
server_attrs: checkData.sdata,
actions:checkData.actions,
}
}
let pdata=(new PayloadParser({
device:device,
msg:msg,
paraInfo:paraDef,
})).paras()
let checkData= Utils.paraCheck(rpcName,device.server_attrs,pdata)
let result = {
telemetry_data: pdata,
server_attrs: checkData.sdata,
shared_attrs: pdata,
actions: checkData.actions,
};
// ── rpcHook (设备对接通用规则) ──
if (typeof RPCHelper.buildRpcHookAction === "function") {
const __a = RPCHelper.buildRpcHookAction({ device, msg, thingModelId, idName: "dlt64507_1p_para_23108", name: "[DLT64507-1P-PARA]", parsed: { telemetry_data: result.telemetry_data, server_attrs: result.server_attrs, shared_attrs: result.shared_attrs } });
if (__a) { result.actions = result.actions || []; result.actions.push(__a); }
}
return result;
}
console.log(payload_parser(
{ telemetry_data: {} },
{ userdata: { port: 11, payload: "" } },
"1",
{ telemetry_data: true },
{}
))Thing Model Field Definitions
| Thing Model | Field | Type | Unit | Name |
|---|---|---|---|---|
| dlt64507_1p_23108 | snr | number | dB | SNR |
| dlt64507_1p_23108 | rssi | number | dBm | RSSI |
| dlt64507_1p_23108 | current | number | A | Current |
| dlt64507_1p_23108 | voltage | number | V | Voltage |
| dlt64507_1p_23108 | frequency | number | Hz | Grid Frequency |
| dlt64507_1p_23108 | active_power | number | kW | Total Active Power |
| dlt64507_1p_23108 | power_factor | number | Power Factor | |
| dlt64507_1p_23108 | reactive_power | number | kvar | Reactive Power |
| dlt64507_1p_23108 | energy_export_total | number | kWh | Total Export Active Energy |
| dlt64507_1p_23108 | energy_import_total | number | kWh | Total Import Active Energy |
| dlt64507_1p_asset_23108 | min_snr | number | dB | Zone SNR |
| dlt64507_1p_asset_23108 | min_rssi | number | dBm | Zone RSSI |
| dlt64507_1p_asset_23108 | zone_current_sum | number | A | Zone Current |
| dlt64507_1p_asset_23108 | zone_voltage_avg | number | V | Zone Voltage |
| dlt64507_1p_asset_23108 | zone_frequency_avg | number | Hz | Zone Grid Frequency |
| dlt64507_1p_asset_23108 | zone_active_power_sum | number | kW | Zone Total Active Power |
| dlt64507_1p_asset_23108 | zone_power_factor_avg | number | Zone Power Factor | |
| dlt64507_1p_asset_23108 | zone_reactive_power_sum | number | kvar | Zone Reactive Power |
| dlt64507_1p_asset_23108 | zone_energy_export_total_sum | number | kWh | Zone Total Export Active Energy |
| dlt64507_1p_asset_23108 | zone_energy_import_total_sum | number | kWh | Zone Total Import Active Energy |
| dlt64507_1p_asset_23108 | online_count | number | Zone Online Count | |
| dlt64507_1p_para_23108 | addr_645 | string | DL/T 645 Address | |
| dlt64507_1p_para_23108 | period_up | number | s | Upload Period |
| dlt64507_1p_para_23108 | period_read | number | s | Collect Period |
RPC Parameter Definitions
| RPC | Parameter | Type | Description | Default | Unit |
|---|---|---|---|---|---|
| dlt64507_1p_set_23108 | addr_645 | string | DL/T 645 Address | — | hex |
| dlt64507_1p_set_23108 | period_up | number | Upload Period (s) | — | s |
| dlt64507_1p_set_23108 | period_read | number | Collect Period (s) | — | s |
Trigger Definitions
No project-specific triggers are defined.
Third-Party Platform Subscription
MQTT Topic: /v32/{Organization Account}/tkl/up/telemetry/{eui}
{
"eui": "6353012af10a9331",
"active_time": "2026-07-13T08:35:48.000Z",
"thingModelId": "Use the platform model ID from the model inventory",
"thingModelIdName": "Use the current telemetry model id_name",
"telemetry_data": {
"snr": 13.5,
"rssi": -51,
"battery": 3.37,
"energy_import_total": 1.25,
"energy_export_total": 2.5,
"voltage": 3.75,
"current": 5,
"active_power": 6.25,
"reactive_power": 7.5,
"power_factor": 8.75,
"frequency": 10
}
}Template Selection and Verification
Search ThinkLink by project name, business code, or the id_name and ID values in the model inventory. After deployment, use real uplinks to verify fields, units, RPCs, and trigger behavior.
Supplementary Notes
Requirements and decisions: requirement/requirements.md.