Push
This commit is contained in:
168
knx_cover_with_inverted_feedback.yaml
Normal file
168
knx_cover_with_inverted_feedback.yaml
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
blueprint:
|
||||||
|
name: "KNX Cover Control + Inverted Position Feedback (%)"
|
||||||
|
description: >
|
||||||
|
Control a Home Assistant cover entity via KNX group addresses (Up/Down + Stop)
|
||||||
|
and send back an inverted position feedback in percent to KNX whenever the
|
||||||
|
cover position changes (including changes initiated from Home Assistant).
|
||||||
|
Example: HA 0% → KNX 100%, HA 100% → KNX 0%.
|
||||||
|
domain: automation
|
||||||
|
homeassistant:
|
||||||
|
min_version: "2026.1.0"
|
||||||
|
|
||||||
|
input:
|
||||||
|
cover_entity:
|
||||||
|
name: "Cover entity"
|
||||||
|
description: "Select the cover to control."
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: cover
|
||||||
|
|
||||||
|
ga_up_down:
|
||||||
|
name: "KNX group address Up/Down"
|
||||||
|
description: >
|
||||||
|
1-bit command GA for Up/Down (typical: 0 = Up/Open, 1 = Down/Close).
|
||||||
|
KNX mapping: Up/Down command object.
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
|
||||||
|
ga_stop:
|
||||||
|
name: "KNX group address Stop"
|
||||||
|
description: >
|
||||||
|
1-bit command GA for Stop/Step.
|
||||||
|
KNX mapping: Stop command object.
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
|
||||||
|
ga_position_feedback:
|
||||||
|
name: "KNX position feedback (%) group address"
|
||||||
|
description: >
|
||||||
|
GA for inverted position feedback in percent (DPT 5.001 / type 'percent').
|
||||||
|
KNX mapping: Position status feedback (0..100%).
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
|
||||||
|
invert_direction:
|
||||||
|
name: "Invert Up/Down direction"
|
||||||
|
description: >
|
||||||
|
Enable if your KNX Up/Down semantics are reversed.
|
||||||
|
default: false
|
||||||
|
selector:
|
||||||
|
boolean:
|
||||||
|
|
||||||
|
feedback_cooldown_s:
|
||||||
|
name: "Feedback cooldown (seconds)"
|
||||||
|
description: >
|
||||||
|
Minimum seconds between two KNX feedback telegrams to reduce bus traffic.
|
||||||
|
default: 1
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 0
|
||||||
|
max: 30
|
||||||
|
step: 1
|
||||||
|
mode: slider
|
||||||
|
|
||||||
|
mode: queued
|
||||||
|
max: 10
|
||||||
|
|
||||||
|
variables:
|
||||||
|
cover_entity: !input cover_entity
|
||||||
|
ga_up_down: !input ga_up_down
|
||||||
|
ga_stop: !input ga_stop
|
||||||
|
ga_position_feedback: !input ga_position_feedback
|
||||||
|
invert_direction: !input invert_direction
|
||||||
|
feedback_cooldown_s: !input feedback_cooldown_s
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
# KNX Up/Down command
|
||||||
|
- trigger: knx.telegram
|
||||||
|
destination: !input ga_up_down
|
||||||
|
incoming: true
|
||||||
|
outgoing: false
|
||||||
|
group_value_write: true
|
||||||
|
group_value_read: false
|
||||||
|
group_value_response: false
|
||||||
|
id: knx_up_down
|
||||||
|
|
||||||
|
# KNX Stop command
|
||||||
|
- trigger: knx.telegram
|
||||||
|
destination: !input ga_stop
|
||||||
|
incoming: true
|
||||||
|
outgoing: false
|
||||||
|
group_value_write: true
|
||||||
|
group_value_read: false
|
||||||
|
group_value_response: false
|
||||||
|
id: knx_stop
|
||||||
|
|
||||||
|
# HA cover position change (attribute current_position)
|
||||||
|
- trigger: state
|
||||||
|
entity_id: !input cover_entity
|
||||||
|
attribute: current_position
|
||||||
|
id: ha_position_changed
|
||||||
|
|
||||||
|
condition: []
|
||||||
|
|
||||||
|
action:
|
||||||
|
- choose:
|
||||||
|
|
||||||
|
# -------- KNX Up/Down --------
|
||||||
|
- conditions:
|
||||||
|
- condition: trigger
|
||||||
|
id: knx_up_down
|
||||||
|
sequence:
|
||||||
|
- variables:
|
||||||
|
raw: "{{ trigger.payload | int(0) }}"
|
||||||
|
# Normal semantics: 0 = Up/Open, 1 = Down/Close
|
||||||
|
is_down: >-
|
||||||
|
{% set down = (raw != 0) %}
|
||||||
|
{{ (not down) if invert_direction else down }}
|
||||||
|
- choose:
|
||||||
|
- conditions: "{{ is_down }}"
|
||||||
|
sequence:
|
||||||
|
- action: cover.close_cover
|
||||||
|
target:
|
||||||
|
entity_id: !input cover_entity
|
||||||
|
- conditions: "{{ not is_down }}"
|
||||||
|
sequence:
|
||||||
|
- action: cover.open_cover
|
||||||
|
target:
|
||||||
|
entity_id: !input cover_entity
|
||||||
|
|
||||||
|
# -------- KNX Stop --------
|
||||||
|
- conditions:
|
||||||
|
- condition: trigger
|
||||||
|
id: knx_stop
|
||||||
|
sequence:
|
||||||
|
- action: cover.stop_cover
|
||||||
|
target:
|
||||||
|
entity_id: !input cover_entity
|
||||||
|
|
||||||
|
# -------- HA → KNX Inverted Position Feedback --------
|
||||||
|
- conditions:
|
||||||
|
- condition: trigger
|
||||||
|
id: ha_position_changed
|
||||||
|
sequence:
|
||||||
|
- variables:
|
||||||
|
# HA: 0% = closed, 100% = open
|
||||||
|
# KNX inverted: 0% = open, 100% = closed
|
||||||
|
pos: >-
|
||||||
|
{% set p = state_attr(cover_entity, 'current_position') %}
|
||||||
|
{% if p is not none %}
|
||||||
|
{{ 100 - (p | int) }}
|
||||||
|
{% else %}
|
||||||
|
{{ none }}
|
||||||
|
{% endif %}
|
||||||
|
- condition: template
|
||||||
|
value_template: "{{ pos is not none }}"
|
||||||
|
- choose:
|
||||||
|
- conditions: "{{ feedback_cooldown_s | int(0) > 0 }}"
|
||||||
|
sequence:
|
||||||
|
- delay:
|
||||||
|
seconds: "{{ feedback_cooldown_s | int(0) }}"
|
||||||
|
- action: knx.send
|
||||||
|
data:
|
||||||
|
address: !input ga_position_feedback
|
||||||
|
type: percent
|
||||||
|
payload: "{{ pos }}"
|
||||||
|
response: false
|
||||||
|
|
||||||
|
default: []
|
||||||
Reference in New Issue
Block a user