Skip to content

1) 设备地址

驱动将“表类型(T)”与“地址域(A0..A6)”拆分为两个字段(与 CJ/T 188-2018 帧结构一致):

  • meterType:表类型(T,1 字节,0..=255)
  • address:地址域(A0..A6,7 字节)

meterType(T)

类型码用于区分水/热/燃气/自定义等。

2018 仪表类型及代码 (CJ/T 188-2018):

仪表类型范围代码 (T)仪表说明
10H ~ 19H10H冷水水表
11H生活热水水表
12H直饮水水表
13H中水水表
20H ~ 29H20H热量表(计热量)
21H热量表(计冷量)
22H热量表(计热量和冷量)
30H ~ 39H30H燃气表
40H ~ 49H自定义仪表

2004 仪表类型及代码 (CJ/T 188-2004):

仪表类型范围代码 (T)仪表说明
10H ~ 19H10H冷水水表
11H生活热水水表
12H直饮水水表
13H中水水表
20H ~ 29H20H热量表(计热量)
21H热量表(计冷量)
30H ~ 39H30H燃气表
40H ~ 49H40H自定义仪表

address

地址域由 7 个字节组成(A0..A6),每字节通常为 2 位 BCD

  • 驱动配置格式address 使用 14 位 hex 字符串,表示 A6..A0 字节(高位在前),例如:00000000EE0001

备注

规约定义“低地址在前,高地址在后”是指 在线路上的 A0..A6 字节顺序;驱动会在协议编解码阶段自动完成 A6..A0(配置)↔ A0..A6(线序) 的转换。

2) DI

驱动 UI 以 4 位 hex(2 字节)表达 DI(例如 901F)。

DI 字节序差异:

  • 2018 版: 小端(Little-Endian)。901F 发送为 1F 90
  • 2004 版: 大端(Big-Endian)。901F 发送为 90 1F

驱动会根据通道配置中的协议版本(Version)自动处理字节序。

实践建议:

  • 以厂家手册/主站工具为准
  • 如读不到值,优先确认:
    • 该 DI 在 2004/2018 版本下是否有效
    • 设备是否需要 SER/SEQ(2018)以及链路层参数是否一致

3) field_key 与 Schema 驱动解析

3.1 一个 DI ≠ 一个点位

CJ/T 188 的 一个 DI(数据标识)通常代表一组字段(例如 901F 同时包含“累积量/时间/状态”等)。本驱动采用 DI Schema 驱动解析

  • 驱动按 Device.meterType 归类为 Water/Heat/Gas/Custom(表具族)
  • 再按 (DI, 表具族) 选择内置 schema
  • 把该 DI 的响应解析为一组 field_key -> NGValue
  • 每个 Point 通过 field_key 从 DI 数据组里“挑出”一个字段上报

因此:

  • 同一个 DI 多字段采集:建多个 Point,di 相同、field_key 不同
  • 性能:驱动会按 DI 分组读取;同一设备同一 DI 只发起一次请求,然后分发给多个 Point

3.2 field_key 必须来自内置 schema

field_key 不是任意字符串,它必须匹配驱动内置 schema 里的字段键:

  • 如果 field_key 不存在或不属于该 DI/表具族:该点位会被跳过,并在日志中提示该点位未产出值(你需要按本文的 DI/field_key 列表修正)
  • 如果 (DI, meterType family) 找不到 schema:该 DI 解析失败,并在日志里提示(你需要换 DI 或确认 meterType

4) DI / field_key

4.1 Water / Gas

DI(hex)含义(Schema 语义)可用 field_key(全部)
901F水/燃气:综合读数(当前累积、结算日、时间、状态)current_flow, settlement_flow, datetime, status
D120..D12B上 1..12 月:结算日累积流量settlement_flow
D200..D2FF上 1..256 月:结算日累积流量settlement_flow
D300..D3FF上 1..256 次:定时冻结数据freeze_datetime, cumulative_flow, flow_rate, temperature, pressure
D400..D4FF上 1..256 次:瞬时冻结数据freeze_datetime, cumulative_flow, flow_rate, temperature, pressure

字段解释(Water/Gas)

field_key含义推荐 DataType备注
current_flow当前累积流量Float64BCDWithUnit(4 + unit),单位码不会上报;建议 Point.unit 写
settlement_flow结算日/历史结算日累积流量Float64BCDWithUnit(4 + unit)
datetime实时时间TimestampUnix epoch ms(UTC)
status状态位UInt16实际语义为 u16 小端;按位解析(见下文)
freeze_datetime冻结时刻(上 N 次)Timestamp7 字节 DateTime → epoch ms(UTC)
cumulative_flow冻结时刻累积流量Float64
flow_rate冻结时刻瞬时流量Float64BCDWithUnit(4 + unit),schema 内置 decimals=4
temperature温度Float64BCD(decimals=2)
pressure压力Float64BCD(decimals=2)

4.2 Heat

DI(hex)含义(Schema 语义)可用 field_key(全部)
901F热量表:综合读数(热量/功率/流量/温度/工时/时间/状态)settlement_heat, current_heat, heat_power, flow_rate, cumulative_flow, supply_temp, return_temp, working_hours, datetime, status
911F热+冷:综合读数(含冷量、供回水压力)settlement_heat, settlement_cooling, current_heat, current_cooling, heat_power, flow_rate, cumulative_flow, supply_temp, return_temp, supply_pressure, return_pressure, working_hours, datetime, status
D120..D12B上 1..12 月:结算日热量settlement_heat
D200..D2FF上 1..256 月:结算日热量/冷量/流量settlement_heat, settlement_cooling, settlement_flow

字段解释(Heat)

field_key含义推荐 DataType备注
settlement_heat结算日热量 / 历史结算日热量Float64BCDWithUnit
current_heat当前热量Float64BCDWithUnit
settlement_cooling结算日冷量(仅 911F/D200..D2FFFloat64BCDWithUnit
current_cooling当前冷量(仅 911FFloat64BCDWithUnit
heat_power热功率Float64BCDWithUnit(3 + unit)
flow_rate瞬时流量Float64BCDWithUnit(3 + unit)(schema 内置 decimals=3/4)
cumulative_flow累积流量Float64BCDWithUnit
supply_temp供水温度Float64BCD(decimals=2)
return_temp回水温度Float64BCD(decimals=2)
supply_pressure供水压力(仅 911FFloat64BCD(decimals=2)
return_pressure回水压力(仅 911FFloat64BCD(decimals=2)
working_hours累积工作时间Int64BCDInteger
datetime实时时间TimestampUnix epoch ms(UTC)
status状态位UInt16u16 小端
settlement_flow历史结算日累积流量(仅 D200..D2FFFloat64BCDWithUnit

4.3 Common(所有表具族通用)

DI(hex)含义(Schema 语义)可用 field_key(全部)
907F实时时间datetime
8102价格表(3 档)price_1, volume_1, price_2, volume_2, price_3
8103结算日(day)settlement_day
8104抄表日(day)reading_day
8105购入金额(含状态)purchase_seq, this_purchase, total_purchase, remaining, status

5) 状态位(status)字段

status 字段在 schema 解析后语义上是 u16 小端位图。建议 Point 配置为 data_type=UInt16,便于下游按位解析。基础位定义见驱动代码注释:

  • D0:阀门开关(0=开,1=关)
  • D1:阀门状态(0=正常,1=异常)
  • D2:电池电压(0=正常,1=欠压)
  • D3..D15:厂商定义

建议做法:

  • status 建模为一个 Point(field_key=status
  • 在北向或规则引擎里按位解析(或二次映射为多个布尔属性)

基于 MIT 许可发布.