KNX 驱动功能设计
楼宇自动化 KNX 协议接入 · 组地址报文 · 数据点类型 · ETS 工程导入
KNX 驱动用于接入 KNX 楼宇自动化系统。KNX 是全球领先的开放式楼宇控制标准,广泛应用于照明、遮阳、暖通、安防等场景。一个 KNX 系统由挂在总线上的各类设备(面板、传感器、执行器)组成,通过组地址相互通信。
平台通过 KNXnet/IP Tunneling(隧道模式)经 IP 接口/路由器接入 KNX 总线,订阅组地址报文获取设备状态、向组地址发送报文控制设备。
| 属性 | 值 | 说明 |
|---|---|---|
| 驱动名称 | knx | SPI 注册名 |
| 版本 | v2.0.0 | getDriverVersion() |
| 接入模式 | EMBEDDED | 内嵌于平台主应用 |
| 协议库 | li.pitschmann:knx-core | 现代 KNX Java 实现 |
| 传输方式 | KNXnet/IP Tunneling (UDP) | 经 IP 接口接入总线 |
| 通信模型 | 事件驱动(报文推送) | 设备状态变化主动上报 |
| Web 接口 | 4 个 | ETS 导入 + DPT 增删查 |
| 定时任务 | 1 个 | 每 5 秒在线检测 |
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
KNX 的核心寻址机制是组地址,采用 x/y/z 三级格式(如 1/1/3)。它代表的不是某个物理设备,而是一个功能逻辑——多个设备可以收发同一组地址。
例如:组地址 1/1/1 表示「会议室灯光开关」,墙上面板发送这个组地址,灯具执行器订阅它,于是面板一按灯就亮。解耦是 KNX 的精髓:发送方不需要知道谁在接收。
组地址就像一个「广播频道」:任何设备都可以向某频道发消息,也可以订阅某频道收消息。平台订阅所有关心的频道,就能感知整个系统的状态。
与组地址(功能)相对,物理地址 x.y.z 标识总线上的具体设备(如 1.1.5 表示 1 区 1 线 5 号设备)。用于设备寻址与诊断,一个实例下的 KNXBranch(域/线)配置约束了合法的物理地址范围。
KNX 数据有标准化的数据点类型(Datapoint Type),定义了值的格式与含义。例如 1.001 是开关(bool)、5.001 是百分比(0-100%)、9.001 是温度(°C)。本驱动维护一个 DPT 注册表,决定报文字节如何解析为平台值:
| DPT | 名称 | 平台类型 | 示例 |
|---|---|---|---|
1.001 | switch 开关 | boolean | 开/关 |
5.001 | 百分比 | int | 0-100% |
9.001 | 温度 | float | 22.5°C |
... | 更多 | bool/int/float/text | 由 DPT 的 sysType 决定 |
DPT 注册表初始来自 init-file/pointType.txt(约 146 条),并可通过 4 个 API 在线增删改。
KNX 总线上的通信是事件驱动的:当某个设备状态变化(如面板被按下、传感器读数变化),它会向对应组地址发送一个报文(Telegram),总线上的所有订阅者都会收到。平台只需订阅关心的组地址,即可近实时获得变化值。
Modbus 需要平台不停轮询才能发现变化;KNX 则是变化即推送,延迟低、带宽省。代价是平台必须常连总线,且对组地址报文做实时解析。
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_TIMEOUT | 1500 ms |
| HEARTBEAT_INTERVAL | 1 秒 |
| HEARTBEAT_TIMEOUT | 由实例属性配置 |
KNX 工程通常用 ETS(Engineering Tool Software)设计。ETS 可导出组地址列表为 CSV(UTF-16LE 编码)。本驱动的 importPointApi 接收该 CSV,自动解析并批量创建点位。
导入时除了用户定义的点位,还会基于 SHA-256 自动生成「设备巡检点」(通道类型 CR----),用于设备在线性监测。
不知道 ETS 如何下载安装、设计组地址、导出 CSV?完整的 ETS5 / ETS6 图文操作指南见 KNX ETS5 / ETS6 使用指南。
平台订阅关心的组地址后,当总线对应设备状态变化,报文经 KNX IP 接口推送到平台,KnxClient.parseValue 按 DPT 将报文字节转换为平台值并上报。这是被动接收,无需主动轮询。
平台下发控制(issuePointValueBatch → KnxManager.writeValue)时,KnxPointService.writeKnx 向目标组地址发送报文,总线上的执行器收到后执行动作。值的读写权限由点位的 channelType(如 CR----)中的 R/W 字母决定。
| 属性名 | 必填 | 说明 / 校验 |
|---|---|---|
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),单点校验仍有效。
| 映射路径 | 用途 | 参数 / 上传 |
|---|---|---|
importPointApi | 从 ETS CSV 导入点位 | CSV 文件上传(UTF-16LE)+ instanceId |
searchKnxPointType | 查询已配置的 DPT 列表 | driverId |
delKnxPointTypeApi | 按名称删除 DPT | driverId + namesToDel(JSON 数组) |
saveOrUpdateKnxPointTypeApi | 新增/更新 DPT | driverId + saveOrUpdateList(JSON 数组) |
调用路径前缀:POST /driver/api/knx/{mapping}。
| 任务名 | Cron | 频率 | 职责 |
|---|---|---|---|
KnxAliveTask | 0/5 * * * * ? | 每 5 秒 | 初始化驱动实例并执行在线检测(initDriverInstance → onlineCheck) |
host/port 正确;③ 接口支持 Tunneling 模式(部分设备仅支持 Routing);④ 同一 IP 接口未被其他客户端独占隧道(Tunneling 通常只允许一个客户端)。x/y/z 格式;③ 部分 DPT 若不在注册表中会解析失败,可先用 saveOrUpdateKnxPointTypeApi 补充 DPT。channelType/symbol。若只含 R(如 CR----)则只读;含 W 才可写。传感器类设备通常只读,执行器类可读写。dataType 必须与总线设备实际使用的 DPT 一致,否则 parseValue 会按错误类型解析。例如温度点应配 9.001 而非 5.001。