HUIZHONG SCL-61D Ultrasonic Water Meter Integration
Model catalog
Search for these models in ThinkLink by name or ID.
| Model type | Name | id_name | Platform model ID |
|---|---|---|---|
| RPC | [SCL-61D GET] 23111 | scl61d_get_23111 | 110312230444077061 |
| RPC | [SCL-61D SET] 23111 | scl61d_set_23111 | 110312286060548101 |
| Template | SCL-61D | 110312390112841733 | |
| Thing Model | [SCL-61D] | scl61d_23111 | 110311140134752261 |
| Thing Model | [HZ-23111-SCL-61D资产] 区域聚合 | scl61d_asset_23111 | 119677189950959619 |
| Parameter Thing Model | [SCL-61D-PARA] | scl61d_para_23111 | 110311197902901253 |
This document describes how to connect the HUIZHONG SCL-61D5/6 Ultrasonic Water Meter to the ThinkLink platform via a KC21 data collector using Modbus RTU + EdgeBus protocol. It covers:
- Device wiring and communication parameters
- ThinkLink platform configuration
- Data reporting and third-party subscription
- Advanced EB integration (EBHelper / Thing Model / RPC)
Part 1: User Guide
2. Sensor Information (SCL-61D Ultrasonic Water Meter)
2.1 Basic Information
| Item | Details |
|---|---|
| Brand | HUIZHONG (汇中仪表) |
| Model | SCL-61D5 / SCL-61D6 |
| Device Type | Ultrasonic Water Meter |
| Power Supply | Internal battery (self-powered, no external power required) |
2.2 Communication Parameters (RS485 / Modbus RTU)
| Parameter | Value |
|---|---|
| Protocol | Modbus RTU |
| Baud Rate | 9600 bps |
| Data Bits | 8 |
| Parity | None |
| Stop Bits | 1 |
| Device Address Range | 0x01–0xFA |
| Function Code | 0x03 (Read Holding Registers) |
2.3 Data Registers
| Register Address | Data | Unit | Bytes | Data Type |
|---|---|---|---|---|
| 0x0000–0x0001 | Instantaneous Flow | 0.001 m³/h | 4 | Float Inverse (FloatLE) |
| 0x0002–0x0003 | Positive Cumulative Flow | 0.1 m³ | 4 | Long Inverse (Uint32LE) |
| 0x0004–0x0005 | Positive Cumulative Run Time | h | 4 | Long Inverse (Uint32LE) |
| 0x0006–0x0007 | Negative Cumulative Flow | 0.1 m³ | 4 | Long Inverse signed (Int32LE) |
| 0x0008–0x0009 | Negative Cumulative Run Time | h | 4 | Long Inverse signed (Int32LE) |
| 0x000A–0x000B | Water Temperature | ℃ | 4 | Float Inverse (FloatLE) |
| 0x000C–0x000D | Pressure | 0.001 MPa | 4 | Float Inverse (FloatLE) |
| 0x000E | Meter Information / Diagnostic Code | — | 2 | Hex |
The high byte of Meter Information is fixed at 0x00; the low byte is the diagnostic code (JD). 0x00 = normal. See appendix for details.
2.4 Wiring
| KC21 Wire | Connect to Meter |
|---|---|
| Blue (RS485 A) | RS485 A |
| White (RS485 B) | RS485 B |
| Black (GND) | GND |
⚠️ Notes:
- The SCL-61D has an internal battery — do not connect the KC21 red/brown power wire to the meter
- No preamble wake-up required: SCL-61D uses standard Modbus RTU — send query commands directly
3. Collector Information (KC21)
3.1 Basic Information
| Item | Details |
|---|---|
| Model | KC21 (A1 version, 10800 mAh internal battery) |
| Power Supply | Internal battery |
| External Power Output | 15V (not used in this setup — meter is self-powered) |
3.2 KC21 Wiring
| Wire Color | Function |
|---|---|
| Red / Brown | Power + (not connected in this setup) |
| Black | Power − / GND |
| Blue | RS485 A |
| White | RS485 B |
4. ThinkLink Platform Configuration
4.1 Adding a Device
- Log in to the ThinkLink platform
- Navigate to Device Management → Add Device
- Search for and select the template
HZ-BATTERY-23111 - Complete device creation
4.2 Parameter Configuration (Poll Period & Address)
Path: Device Management → Select Device → Configuration → RPC
Select RPC: [EB SET] easy para
| Parameter | Meaning | Notes |
|---|---|---|
| period | Poll period | Unit: seconds, recommended 900 (15 min) |
| addr | Meter Modbus address | Factory default 0x01 |
Changes take effect on the device's next uplink.
4.3 Third-Party Platform Subscription
MQTT Topic
/v32/{Organization Account}/tkl/up/telemetry/{eui}Sample Payload
json
{
"eui": "6353012af10a9331",
"active_time": "2026-05-21T08:00:00.000Z",
"thingModelId": "scl61d_23111",
"thingModelIdName": "scl61d_23111",
"telemetry_data": {
"snr": 12.5,
"rssi": -55,
"battery": 3.6,
"instant_flow": -1.955,
"pos_total_flow": 155.2,
"pos_run_time": 1360,
"neg_total_flow": -13.1,
"neg_run_time": 7,
"temperature": 29.00,
"pressure": 0.9150,
"meter_info": 0,
"update_time": 1747814400000
}
}Part 2: Advanced Integration
5. Data Acquisition (EBHelper)
5.1 Protocol Details
| Item | Value |
|---|---|
| Protocol | Modbus RTU |
| Implementation | EBHelper |
| BzType | 23111 |
| Single Query Range | 0x0000–0x000E (15 registers, all data in one request) |
5.2 OTA Configuration
javascript
let otaConfig = getOtaConfig({
BaudRate: 9600,
StopBits: 1,
DataBits: 8,
Checkbit: CheckbitEnum.NONE,
Battery: true,
ConfirmDuty: 60,
BzType: 23111,
BzVersion: 1
})5.3 EB Code
typescript
import { Buffer } from "buffer";
import { buildOtaFile } from "@EBSDK/run";
import { EBModel } from "@EBSDK/EBCompiler/EBModel/EBModel";
import { EventInfoItem } from "@EBSDK/EBCompiler/plugins/EBHelper";
import type { UserConfUPItem } from "@EBSDK/EBCompiler/plugins/EBHelper";
import { CheckbitEnum, getOtaConfig } from "@EBSDK/otaConfig";
// SCL-61D5/6 超声水表,Modbus RTU,一次读取 0x0000-0x000E(15个寄存器)
// KC21 电池供电;水表自供电,KC21 不对水表供电
// 无前导码:标准 Modbus RTU,不需要 preamble
const eventInfo: UserConfUPItem[] = [
{
name: "water",
port: 22,
version: "0x83",
dataType: "0x32",
upPeriod: "10y",
upPeriodIndex: 70,
quInfo: [
{
protocol: "modbus",
addr: "0x01",
code: "0x03",
periodIndex: 70,
indexAPP: 150, indexCMD: 0, copySize: 1,
payIndex: 3, ackAddrIndex: 0,
isLast: true,
listVal: [
{ start: "0x0000", end: "0x0001" }, // 瞬时流量 FloatCDAB (FloatLE)
{ start: "0x0002", end: "0x0003" }, // 正累积流量 UintCDAB (Uint32LE)
{ start: "0x0004", end: "0x0005" }, // 正累积运行时间 UintCDAB (Uint32LE)
{ start: "0x0006", end: "0x0007" }, // 负累积流量 IntCDAB (Int32LE)
{ start: "0x0008", end: "0x0009" }, // 负累积运行时间 IntCDAB (Int32LE)
{ start: "0x000A", end: "0x000B" }, // 水温 FloatCDAB (FloatLE)
{ start: "0x000C", end: "0x000D" }, // 压力 FloatCDAB (FloatLE)
{ start: "0x000E", end: "0x000E" }, // 仪表信息/诊断码 Uint16LE
]
}
]
}
]
let otaConfig = getOtaConfig({
BaudRate: 9600,
StopBits: 1,
DataBits: 8,
Checkbit: CheckbitEnum.NONE,
Battery: true,
ConfirmDuty: 60,
BzType: 23111,
BzVersion: 1
})
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)6. Thing Model
6.1 Uplink Frame Layout
Port: 22
EBHelper standard frame (single query: 15 registers × 2 bytes = 30 bytes payload):
| Field | Offset | Length (Bytes) | Description |
|---|---|---|---|
version | 0 | 1 | Protocol version, fixed 0x83 |
dataType | 1 | 1 | Fixed 0x32 |
covStatus | 2 | 1 | Reserved |
status | 3 | 1 | Query event status |
battery | 4 | 1 | Battery level |
addr | 5 | 1 | Modbus device address |
instant_flow | 6 | 4 | Instantaneous flow, FloatCDAB |
pos_total_flow | 10 | 4 | Positive cumulative flow, UintCDAB |
pos_run_time | 14 | 4 | Positive run time, UintCDAB |
neg_total_flow | 18 | 4 | Negative cumulative flow, IntCDAB |
neg_run_time | 22 | 4 | Negative run time, IntCDAB |
temperature | 26 | 4 | Water temperature, FloatCDAB |
pressure | 30 | 4 | Pressure, FloatCDAB |
meter_info | 34 | 2 | Diagnostic code, Uint16LE |
Total frame length: 36 bytes
6.2 Thing Model Info
| Item | Value |
|---|---|
| Thing Model Name | SCL-61D |
| ThingModel ID Name | scl61d_23111 |
| Event Name | water |
6.3 Field Mapping
| Field | Meaning | Unit | Scale |
|---|---|---|---|
instant_flow | Instantaneous flow | m³/h | raw × 0.001 |
pos_total_flow | Positive cumulative flow | m³ | raw × 0.1 |
pos_run_time | Positive run time | h | — |
neg_total_flow | Negative cumulative flow | m³ | raw × 0.1 |
neg_run_time | Negative run time | h | — |
temperature | Water temperature | ℃ | — |
pressure | Pressure | MPa | raw × 0.001 |
meter_info | Diagnostic code | — | 0x00 = normal |
battery | KC21 battery level | — | — |
rssi | Signal strength | dBm | — |
snr | Signal-to-noise ratio | dB | — |
6.4 RPC Parameter Configuration
- RPC Name:
[EB SET] easy para - ID Name:
eb_set_easy_para
| Address | Meaning |
|---|---|
| app_70 | Poll period (seconds) |
| app_150 | Meter Modbus address |
Appendix: Diagnostic Code Reference (meter_info low byte JD)
| Code | Meaning |
|---|---|
| 0x00 | Normal |
| JD & 0x0F = 0x01 | Battery voltage below 3.37V — replace battery |
| JD & 0x0F = 0x02 | Empty pipe or transducer fault — no measurement signal |
| JD & 0x0F = 0x03 | Codes 01 and 02 both active |
| JD & 0x0F = 0x04 | Battery voltage below 3.3V — must replace battery immediately |
| JD & 0x0F = 0x05 | Communication fault between calculator and transducer |
| JD & 0x0F = 0x06 | E2PROM failure |
| JD & 0x10 = 0x10 | Supply temperature sensor fault or supply temperature below 2℃ |
| JD & 0x20 = 0x20 | Supply temperature exceeds 150℃ |
| JD & 0x40 = 0x40 | Return temperature sensor fault or return temperature below 2℃ |
| JD & 0x80 = 0x80 | Return temperature exceeds 150℃ |
Summary
- Complete integration path: SCL-61D → KC21 → EdgeBus → ThinkLink
- Supports: remote parameter configuration, periodic full-field data collection (8 fields), standard MQTT third-party subscription
- Thing Model:
scl61d_23111 - RPC:
eb_set_easy_para - Template:
HZ-BATTERY-23111 - Low-power, battery-operated design suitable for water metering and pipe network monitoring