1
驱动概览
这是什么

KNX 驱动用于接入 KNX 楼宇自动化系统。KNX 是全球领先的开放式楼宇控制标准,广泛应用于照明、遮阳、暖通、安防等场景。一个 KNX 系统由挂在总线上的各类设备(面板、传感器、执行器)组成,通过组地址相互通信。

平台通过 KNXnet/IP Tunneling(隧道模式)经 IP 接口/路由器接入 KNX 总线,订阅组地址报文获取设备状态、向组地址发送报文控制设备。

关键事实
属性值说明
驱动名称knxSPI 注册名
版本v2.0.0getDriverVersion()
接入模式EMBEDDED内嵌于平台主应用
协议库li.pitschmann:knx-core现代 KNX Java 实现
传输方式KNXnet/IP Tunneling (UDP)经 IP 接口接入总线
通信模型事件驱动(报文推送)设备状态变化主动上报
Web 接口4 个ETS 导入 + DPT 增删查
定时任务1 个每 5 秒在线检测
2
KNX 协议核心概念
总线与组地址拓扑
flowchart LR P[" 平台
KNX 驱动"] I[" KNX IP 接口
(Tunneling)"] subgraph 总线["KNX 总线"] D1["面板"] D2["光照传感器"] D3["灯具执行器"] D4["窗帘执行器"] end P -->|"UDP Tunneling"| I I --- 总线 D1 -.->|"组地址 1/1/1"| D3 D2 -.->|"组地址 3/2/1"| D3 style P fill:#e8f0fe,stroke:#007aff,stroke-width:2px,color:#1c1c1e style I fill:#f0f0f5,stroke:#5856d6,stroke-width:2px,color:#1c1c1e style D1 fill:#e8f8f0,stroke:#34c759,color:#1c1c1e
组地址(Group Address)

KNX 的核心寻址机制是组地址,采用 x/y/z 三级格式(如 1/1/3)。它代表的不是某个物理设备,而是一个功能逻辑——多个设备可以收发同一组地址。

例如:组地址 1/1/1 表示「会议室灯光开关」,墙上面板发送这个组地址,灯具执行器订阅它,于是面板一按灯就亮。解耦是 KNX 的精髓:发送方不需要知道谁在接收。

类比

组地址就像一个「广播频道」:任何设备都可以向某频道发消息,也可以订阅某频道收消息。平台订阅所有关心的频道,就能感知整个系统的状态。

物理地址(Physical Address)

与组地址(功能)相对,物理地址 x.y.z 标识总线上的具体设备(如 1.1.5 表示 1 区 1 线 5 号设备)。用于设备寻址与诊断,一个实例下的 KNXBranch(域/线)配置约束了合法的物理地址范围。

数据点类型(DPT)

KNX 数据有标准化的数据点类型(Datapoint Type),定义了值的格式与含义。例如 1.001 是开关(bool)、5.001 是百分比(0-100%)、9.001 是温度(°C)。本驱动维护一个 DPT 注册表,决定报文字节如何解析为平台值:

DPT名称平台类型示例
1.001switch 开关boolean开/关
5.001百分比int0-100%
9.001温度float22.5°C
...更多bool/int/float/text由 DPT 的 sysType 决定

DPT 注册表初始来自 init-file/pointType.txt(约 146 条),并可通过 4 个 API 在线增删改。

3
为什么事件驱动
报文推送模型

KNX 总线上的通信是事件驱动的:当某个设备状态变化(如面板被按下、传感器读数变化),它会向对应组地址发送一个报文(Telegram),总线上的所有订阅者都会收到。平台只需订阅关心的组地址,即可近实时获得变化值。

对比 Modbus

Modbus 需要平台不停轮询才能发现变化;KNX 则是变化即推送,延迟低、带宽省。代价是平台必须常连总线,且对组地址报文做实时解析。

4
整体架构
组件协作
flowchart TB subgraph 接入 A["KnxAccess
DriverAccess 实现"] end subgraph 核心 M["KnxManager
实例管理 · 校验 · 读写"] C["KnxClient
KNXnet/IP 隧道连接"] D["DPT 注册表
(KnxDataPointTypeConfigStorage)"] end subgraph 接口 API1["ImportPointApi
ETS 导入"] API2["DPT 增删查 API x3"] end subgraph 任务 T["KnxAliveTask
cron 0/5 * * * * ?"] end A --> M M --> C C -->|"订阅组地址报文"| D API1 --> M T -->|"在线检测"| M style A fill:#e8f0fe,stroke:#007aff,stroke-width:2px,color:#1c1c1e style M fill:#f0f0f5,stroke:#5856d6,stroke-width:2px,color:#1c1c1e style C fill:#fff4e8,stroke:#ff9500,color:#1c1c1e style D fill:#e8f8f0,stroke:#34c759,color:#1c1c1e
连接参数
参数值
连接模式Tunneling(隧道,单设备独占)
REQUEST_TIMEOUT1500 ms
HEARTBEAT_INTERVAL1 秒
HEARTBEAT_TIMEOUT由实例属性配置
5
ETS CSV 导入
从 ETS 工程导入点位

KNX 工程通常用 ETS(Engineering Tool Software)设计。ETS 可导出组地址列表为 CSV(UTF-16LE 编码)。本驱动的 importPointApi 接收该 CSV,自动解析并批量创建点位。

sequenceDiagram participant U as 用户 participant API as ImportPointApi participant K as KnxManager participant P as 平台 U->>API: 上传 ETS CSV (instanceId) API->>API: 解析 CSV (组地址/物理地址) API->>K: 创建点位 K->>P: 批量保存点位 K->>P: 自动创建设备巡检点 (CR----) P-->>API: 成功 API-->>U: 导入结果
设备巡检点

导入时除了用户定义的点位,还会基于 SHA-256 自动生成「设备巡检点」(通道类型 CR----),用于设备在线性监测。

ETS 操作手册

不知道 ETS 如何下载安装、设计组地址、导出 CSV?完整的 ETS5 / ETS6 图文操作指南见 KNX ETS5 / ETS6 使用指南。

6
读与写流程
读:订阅组地址报文

平台订阅关心的组地址后,当总线对应设备状态变化,报文经 KNX IP 接口推送到平台,KnxClient.parseValue 按 DPT 将报文字节转换为平台值并上报。这是被动接收,无需主动轮询。

写:向组地址发送报文

平台下发控制(issuePointValueBatch → KnxManager.writeValue)时,KnxPointService.writeKnx 向目标组地址发送报文,总线上的执行器收到后执行动作。值的读写权限由点位的 channelType(如 CR----)中的 R/W 字母决定。

flowchart LR P["平台下发值"] --> W["KnxManager.writeValue"] W --> S["KnxPointService.writeKnx"] S -->|"向组地址发报文"| BUS["KNX 总线"] BUS --> EX["执行器动作"] style P fill:#e8f0fe,stroke:#007aff,color:#1c1c1e style BUS fill:#f0f0f5,stroke:#5856d6,color:#1c1c1e
7
实例与点位属性
实例属性
属性名必填说明 / 校验
host必填KNX IP 接口/路由器 IP;IP+端口项目内唯一
port必填KNX 隧道端口;与 host 联合唯一
KNXBranch必填域/线地址,正则 ^([1-9]|1[0-5])\.([0-9]|1[0-5])(,...)*$
HEARTBEAT_TIMEOUT运行时心跳超时(连接参数)
唯一性

host + port 必须在项目内唯一,重复会触发 IP/端口冲突校验。

点位属性
属性名含义
physicalAddress设备物理地址 x.y.z
groupAddress组地址 x/y/z(功能逻辑)
dataType数据点类型 DPT(如 1.001)
channelName通道名称
channelType通道类型(如 CR----,字母决定读 R/写 W 权限)
symbol符号(r 只读 / w 只写 / rw 读写)
sysType系统类型(bool/int/float/text,由 DPT 派生)
批量校验

validateDriverPointAttrBatch 当前为 TODO 占位(2025/8/7),单点校验仍有效。

8
Web 接口与定时任务
4 个 HTTP API
映射路径用途参数 / 上传
importPointApi从 ETS CSV 导入点位CSV 文件上传(UTF-16LE)+ instanceId
searchKnxPointType查询已配置的 DPT 列表driverId
delKnxPointTypeApi按名称删除 DPTdriverId + namesToDel(JSON 数组)
saveOrUpdateKnxPointTypeApi新增/更新 DPTdriverId + saveOrUpdateList(JSON 数组)

调用路径前缀:POST /driver/api/knx/{mapping}。

定时任务
任务名Cron频率职责
KnxAliveTask0/5 * * * * ?每 5 秒初始化驱动实例并执行在线检测(initDriverInstance → onlineCheck)
9
常见问题
Q1
平台连不上 KNX 总线?
确认:① KNX IP 接口/路由器与平台网络可达;② 实例 host/port 正确;③ 接口支持 Tunneling 模式(部分设备仅支持 Routing);④ 同一 IP 接口未被其他客户端独占隧道(Tunneling 通常只允许一个客户端)。
Q2
导入 ETS CSV 报错或点位缺失?
① 确认 CSV 是 ETS 的组地址导出格式,且为 UTF-16LE 编码;② 检查 CSV 中的组地址是否符合 x/y/z 格式;③ 部分 DPT 若不在注册表中会解析失败,可先用 saveOrUpdateKnxPointTypeApi 补充 DPT。
Q3
值只读不能写?
检查点位的 channelType/symbol。若只含 R(如 CR----)则只读;含 W 才可写。传感器类设备通常只读,执行器类可读写。
Q4
报文收到了但值解析不对?
这是 DPT 配置问题。点位 dataType 必须与总线设备实际使用的 DPT 一致,否则 parseValue 会按错误类型解析。例如温度点应配 9.001 而非 5.001。