KNX DPT1 的开关值藏在哪:怎样分清内嵌一位与追加一字节
对本题DPT1.001组值写入子集,开关位嵌在第二个APCI字节的低位:00 81为开,00 80为关。不要为了表达True额外追加01;服务位和短数据共享控制字节,但DPT仍必须由点表声明。
适用版本与输入范围
依据 XKNX 维护者仓库固定标签 3.6.0 的下列源码,只实现本文明示的数据点或组值解析子集。它不是 KNX 规范全文,也不是设备互通认证;组地址与DPT应由项目点表明确提供。 本文所有输入均为原创合成数据,未接真实设备。
分清组值服务位与短数据位
第二字节的高两位区分组值服务,低六位可携带DPTBinary短数据。DPT1只占其中一位,故00 81里的80是GroupValueWrite服务,01才是开关值。若把整个81转成整数129再映射开关,虽然布尔转换也得到真,却丢失了服务类型,无法发现同样位型出现在Response等其他服务里的差异。本程序先核对服务,再读取数据位。
DPT1不是随便一个一字节整数
附件的显式负例00 80 01模拟把开关当作追加一字节DPTArray,程序因长度不符拒绝。另一条00 83虽仍是两字节,但短数据低六位为3,超出一位开关,不能用非零即真的规则掩盖。本解析器特意限定无额外TPCI影响的组写APCI和DPT1.001,不负责所有APDU类型。抓包进入本程序前应剥离外层cEMI、网络封装并确认起点,不可拿整份UDP数据直接比较前两字节。
长度只能指示候选,不能确定子类型
DPT1有多种一位语义:开关、上/下、打开/关闭等,不能仅凭00 81知道用户想开灯还是移动遮阳。本题显式要求dpt=1.001,switch字段才按开关解释;其他子型应有自己的命名映射。生产网关应保留组地址、DPT主次编号与服务,不用某个UI按钮名字代替这些字段。否则同一位型在不同功能上可能造成相反动作。
离线编码检查放在联调之前
输出inline_bits保留原始短值,switch给出开关解释,service说明它属于写服务。这个报告能检查发送程序是否正确组织字节,但没有发送写电报,也不证明执行器动作、总线ACK或状态反馈。实际项目仍需核对通信对象配置、组地址绑定和状态反馈地址。公开实现依据只用于解释这段可见编解码逻辑,不能扩大成KNX产品互通认证或某个中控软件已经支持全部DPT的承诺。
下载与复跑
将输入 fixture.json与独立程序 verify.py放在同一目录,用 Python 3.12 执行 python verify.py,无需安装第三方包。程序从自身目录读取输入并写入 report.json,不要求当前终端恰好位于下载目录。也可查看本次实跑报告和复跑说明。
本次实际运行通过 4 条输入断言,包括标有“显式负例”的记录;负例以JSON字段承载,不会把下载文件本身做成损坏编码。inline_bits保留短数据,switch仅适用于明示1.001;程序没有发送任何开关命令。 修改输入后应同时审查期望结果,不能只改断言数字让测试变绿。
对象或字段的基础关系可回到KNX 组地址与DPT入门核对,更多接口入口在设备协议库。若需要把已确认的数据点接入展项编排,可了解SoftControl 展厅中控;具体接入能力以项目确认和实际测试为准。
一级依据
来源核对日期:2026-10-24。离线结果只证明给定输入的解析或计算行为;现场兼容性、响应时间、硬件准确度和具体产品支持均未测量。
相关阅读
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。