From 83518c88ab2ff3b01a40d5f4d227cb958096ca0b Mon Sep 17 00:00:00 2001 From: bahmcloud Date: Fri, 13 Feb 2026 14:13:31 +0100 Subject: [PATCH] Centralize DPT auto-selection --- CHANGELOG.md | 3 ++ README.md | 13 +++++++- custom_components/ha_knx_bridge/bridge.py | 31 ++++++++++++------- custom_components/ha_knx_bridge/const.py | 19 ++++++++++++ custom_components/ha_knx_bridge/manifest.json | 2 +- 5 files changed, 55 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0433ddf..c96f60a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 0.0.5 - 2026-02-13 +- Centralize DPT auto-selection for KNX event registration per address. + ## 0.0.4 - 2026-02-13 - Add per-group-address invert toggles for incoming and outgoing KNX payloads. diff --git a/README.md b/README.md index 5c79681..fe0d98a 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,17 @@ Each group address has `invert incoming` and `invert outgoing` toggles to flip K ## Notes - For DPT 1.008 (Up/Down), the bridge treats `0 = Up/Open` and `1 = Down/Close`. - For DPT 5.001, values are interpreted as 0-100 percent where 0 = closed and 100 = open. +- DPTs are auto-selected per address: +- Binary sensor `state_address`: DPT 1 +- Switch `command_address`: DPT 1 +- Switch `state_address`: DPT 1 +- Cover `move_long_address`: DPT 1.008 +- Cover `move_short_address`: DPT 1.007 +- Cover `stop_address`: DPT 1 +- Cover `position_address`: DPT 5.001 +- Cover `position_state_address`: DPT 5.001 +- Cover `angle_address`: DPT 5.001 +- Cover `angle_state_address`: DPT 5.001 ## Roadmap - Optional standalone KNX connection (without requiring the HA KNX integration). @@ -54,6 +65,6 @@ Each group address has `invert incoming` and `invert outgoing` toggles to flip K - Advanced DPT mapping options and inversion settings. ## Versioning and Releases -- Current version: 0.0.4 +- Current version: 0.0.5 - `CHANGELOG.md` lists versions with the newest entries at the top. - Release creation is manual and only done when explicitly requested. diff --git a/custom_components/ha_knx_bridge/bridge.py b/custom_components/ha_knx_bridge/bridge.py index 548fab0..56a5010 100644 --- a/custom_components/ha_knx_bridge/bridge.py +++ b/custom_components/ha_knx_bridge/bridge.py @@ -12,6 +12,7 @@ from homeassistant.helpers import event as event_helper from .const import ( CONF_ANGLE_ADDRESS, CONF_ANGLE_STATE_ADDRESS, + ADDRESS_VALUE_TYPE, CONF_COMMAND_ADDRESS, CONF_INVERT_INCOMING, CONF_INVERT_OUTGOING, @@ -227,7 +228,7 @@ class BridgeManager: continue self._remember_address_options( port.state_address, - None, + _get_value_type(CONF_STATE_ADDRESS), port.state_invert_incoming, port.state_invert_outgoing, ) @@ -242,7 +243,7 @@ class BridgeManager: continue self._remember_address_options( port.state_address, - None, + _get_value_type(CONF_STATE_ADDRESS), port.state_invert_incoming, port.state_invert_outgoing, ) @@ -258,14 +259,14 @@ class BridgeManager: if port.position_state_address: self._remember_address_options( port.position_state_address, - "percent", + _get_value_type(CONF_POSITION_STATE_ADDRESS), port.position_state_invert_incoming, port.position_state_invert_outgoing, ) if port.angle_state_address: self._remember_address_options( port.angle_state_address, - "percent", + _get_value_type(CONF_ANGLE_STATE_ADDRESS), port.angle_state_invert_incoming, port.angle_state_invert_outgoing, ) @@ -289,7 +290,7 @@ class BridgeManager: for port in cover_ports: self._register_knx_address( port.move_long_address, - None, + CONF_MOVE_LONG_ADDRESS, port.move_long_invert_incoming, port.move_long_invert_outgoing, port, @@ -297,7 +298,7 @@ class BridgeManager: ) self._register_knx_address( port.move_short_address, - None, + CONF_MOVE_SHORT_ADDRESS, port.move_short_invert_incoming, port.move_short_invert_outgoing, port, @@ -305,7 +306,7 @@ class BridgeManager: ) self._register_knx_address( port.stop_address, - None, + CONF_STOP_ADDRESS, port.stop_invert_incoming, port.stop_invert_outgoing, port, @@ -313,7 +314,7 @@ class BridgeManager: ) self._register_knx_address( port.position_address, - "percent", + CONF_POSITION_ADDRESS, port.position_invert_incoming, port.position_invert_outgoing, port, @@ -321,7 +322,7 @@ class BridgeManager: ) self._register_knx_address( port.angle_address, - "percent", + CONF_ANGLE_ADDRESS, port.angle_invert_incoming, port.angle_invert_outgoing, port, @@ -338,7 +339,7 @@ class BridgeManager: def _register_knx_address( self, address: str | None, - value_type: str | None, + address_key: str, invert_incoming: bool, invert_outgoing: bool, port: CoverPort, @@ -350,6 +351,7 @@ class BridgeManager: self._address_handlers[address] = lambda event: self._handle_cover_action( port, action, event ) + value_type = _get_value_type(address_key) self._remember_address_options( address, value_type, invert_incoming, invert_outgoing ) @@ -368,7 +370,10 @@ class BridgeManager: port, event ) self._remember_address_options( - address, None, invert_incoming, invert_outgoing + address, + _get_value_type(CONF_COMMAND_ADDRESS), + invert_incoming, + invert_outgoing, ) self._registered_addresses.append((address, None)) @@ -623,3 +628,7 @@ def _invert_in_key(address_key: str) -> str: def _invert_out_key(address_key: str) -> str: return f"{address_key}_{CONF_INVERT_OUTGOING}" + + +def _get_value_type(address_key: str) -> str | None: + return ADDRESS_VALUE_TYPE.get(address_key) diff --git a/custom_components/ha_knx_bridge/const.py b/custom_components/ha_knx_bridge/const.py index 9684ffe..c86faca 100644 --- a/custom_components/ha_knx_bridge/const.py +++ b/custom_components/ha_knx_bridge/const.py @@ -14,3 +14,22 @@ CONF_POSITION_ADDRESS = "position_address" CONF_POSITION_STATE_ADDRESS = "position_state_address" CONF_ANGLE_ADDRESS = "angle_address" CONF_ANGLE_STATE_ADDRESS = "angle_state_address" + +ADDRESS_DPT_MAP: dict[str, str] = { + CONF_STATE_ADDRESS: "1", + CONF_COMMAND_ADDRESS: "1", + CONF_MOVE_LONG_ADDRESS: "1.008", + CONF_MOVE_SHORT_ADDRESS: "1.007", + CONF_STOP_ADDRESS: "1", + CONF_POSITION_ADDRESS: "5.001", + CONF_POSITION_STATE_ADDRESS: "5.001", + CONF_ANGLE_ADDRESS: "5.001", + CONF_ANGLE_STATE_ADDRESS: "5.001", +} + +ADDRESS_VALUE_TYPE: dict[str, str] = { + CONF_POSITION_ADDRESS: "percent", + CONF_POSITION_STATE_ADDRESS: "percent", + CONF_ANGLE_ADDRESS: "percent", + CONF_ANGLE_STATE_ADDRESS: "percent", +} diff --git a/custom_components/ha_knx_bridge/manifest.json b/custom_components/ha_knx_bridge/manifest.json index 2b3ec64..1421e3a 100644 --- a/custom_components/ha_knx_bridge/manifest.json +++ b/custom_components/ha_knx_bridge/manifest.json @@ -1,7 +1,7 @@ { "domain": "ha_knx_bridge", "name": "HA KNX Bridge", - "version": "0.0.4", + "version": "0.0.5", "config_flow": true, "documentation": "https://github.com/bahmcloud/HA-KNX-Bridge", "issue_tracker": "https://github.com/bahmcloud/HA-KNX-Bridge/issues",