-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKNX - Media Player Playback Control
272 lines (256 loc) · 9.19 KB
/
KNX - Media Player Playback Control
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
blueprint:
name: KNX - Media Player Playback Control (by toben1997)
description: 'Use KNX to control playback options (previous/next track, pause/play)
of a Home Assistant media player entity with optional state feedback.
This blueprint allows you to select which media player should be controlled and
provides input fields for the KNX group addresses:
- One address for previous (0) and next track (1) control, with an option to send
double previous commands.
- One address for pause (0) and play (1) control.
- One address for state feedback, notifying the KNX system whether the media player
is playing or paused.
Each address has an option to invert the received/sent values.
**Version**: 2024.01.5
'
author: toben1997
source_url: https://github.com/toben1997/KNX-Home-Assistant/blob/main/knx-mediapayer-playback.yaml
domain: automation
input:
media_player_entity:
name: Media Player Entity
description: 'Choose the media player to control via KNX.
'
selector:
entity:
domain:
- media_player
multiple: false
knx_track_control_address:
name: KNX Track Control Group Address
description: 'Group address for controlling previous (0) and next track (1).
DPT 1.001. Example: ''1/0/2'' (leave empty if unused).
'
default: ''
knx_track_control_invert:
name: Invert KNX Track Control Address
description: 'Invert the received value for track control (1 for previous, 0
for next).
'
default: false
selector:
boolean: {}
double_previous:
name: Double Previous Command
description: 'If true, sends two previous commands when the previous track control
(0) is received.
'
default: false
selector:
boolean: {}
knx_play_pause_address:
name: KNX Play/Pause Group Address
description: 'Group address for controlling pause (0) and play (1). DPT 1.001.
Example: ''1/0/3'' (leave empty if unused).
'
default: ''
knx_play_pause_invert:
name: Invert KNX Play/Pause Address
description: 'Invert the received value for play/pause control (1 for pause,
0 for play).
'
default: false
selector:
boolean: {}
knx_play_pause_state_address:
name: KNX Play/Pause State Group Address
description: 'Group address to send feedback of the state of the media player
(pause 0, play 1). DPT 1.001. Example: ''1/4/3'' (leave empty if unused).
'
default: ''
knx_play_pause_state_invert:
name: Invert KNX Play/Pause State Address
description: 'Invert the sent value for play/pause state feedback (1 for pause,
0 for play).
'
default: false
selector:
boolean: {}
mode: parallel
max_exceeded: silent
variables:
media_player_entity: !input media_player_entity
knx_track_control_address: !input knx_track_control_address
knx_track_control_invert: !input knx_track_control_invert
double_previous: !input double_previous
knx_play_pause_address: !input knx_play_pause_address
knx_play_pause_invert: !input knx_play_pause_invert
knx_play_pause_state_address: !input knx_play_pause_state_address
knx_play_pause_state_invert: !input knx_play_pause_state_invert
last_play_pause_state: none
trigger:
- platform: homeassistant
event: start
id: initialize
- platform: event
event_type: automation_reloaded
id: initialize
- platform: event
event_type: service_registered
event_data:
domain: knx
service: event_register
id: initialize
- platform: state
entity_id: !input media_player_entity
id: media_player_entity
- platform: event
event_type: knx_event
event_data:
destination: !input knx_track_control_address
telegramtype: GroupValueWrite
direction: Incoming
id: knx_track_control_address
- platform: event
event_type: knx_event
event_data:
destination: !input knx_play_pause_address
telegramtype: GroupValueWrite
direction: Incoming
id: knx_play_pause_address
- platform: event
event_type: knx_event
event_data:
destination: !input knx_play_pause_state_address
telegramtype: GroupValueRead
direction: Incoming
id: knx_play_pause_state_address
action:
- choose:
- conditions:
- condition: trigger
id: initialize
sequence:
- choose:
- conditions:
- condition: template
value_template: '{{ knx_track_control_address != '''' }}'
sequence:
- service: knx.event_register
data:
address: '{{ knx_track_control_address }}'
- choose:
- conditions:
- condition: template
value_template: '{{ knx_play_pause_address != '''' }}'
sequence:
- service: knx.event_register
data:
address: '{{ knx_play_pause_address }}'
- choose:
- conditions:
- condition: template
value_template: '{{ knx_play_pause_state_address != '''' }}'
sequence:
- service: knx.event_register
data:
address: '{{ knx_play_pause_state_address }}'
- service: input_boolean.turn_on
data:
entity_id: '{{ media_player_entity }}'
target:
entity_id: '{{ media_player_entity }}'
- variables:
last_play_pause_state: '{{ states(media_player_entity) }}'
- conditions:
- condition: template
value_template: '{{ trigger.platform == ''event'' and trigger.event.event_type
== ''knx_event'' and trigger.event.data.direction == ''Incoming'' and trigger.event.data.destination
== knx_track_control_address }}'
sequence:
- choose:
- conditions:
- condition: template
value_template: "{% if knx_track_control_invert %}\n {{ trigger.event.data.data
| int(default=0) == 1 }}\n{% else %}\n {{ trigger.event.data.data | int(default=0)
== 0 }}\n{% endif %}\n"
sequence:
- service: media_player.media_previous_track
target:
entity_id: '{{ media_player_entity }}'
- choose:
- conditions:
- condition: template
value_template: '{{ double_previous }}'
sequence:
- delay: 00:00:01
- service: media_player.media_previous_track
target:
entity_id: '{{ media_player_entity }}'
- conditions:
- condition: template
value_template: "{% if knx_track_control_invert %}\n {{ trigger.event.data.data
| int(default=0) == 0 }}\n{% else %}\n {{ trigger.event.data.data | int(default=0)
== 1 }}\n{% endif %}\n"
sequence:
- service: media_player.media_next_track
target:
entity_id: '{{ media_player_entity }}'
- conditions:
- condition: template
value_template: '{{ trigger.platform == ''event'' and trigger.event.event_type
== ''knx_event'' and trigger.event.data.direction == ''Incoming'' and trigger.event.data.destination
== knx_play_pause_address }}'
sequence:
- choose:
- conditions:
- condition: template
value_template: "{% if knx_play_pause_invert %}\n {{ trigger.event.data.data
| int(default=0) == 1 }}\n{% else %}\n {{ trigger.event.data.data | int(default=0)
== 0 }}\n{% endif %}\n"
sequence:
- service: media_player.media_pause
target:
entity_id: '{{ media_player_entity }}'
- conditions:
- condition: template
value_template: "{% if knx_play_pause_invert %}\n {{ trigger.event.data.data
| int(default=0) == 0 }}\n{% else %}\n {{ trigger.event.data.data | int(default=0)
== 1 }}\n{% endif %}\n"
sequence:
- service: media_player.media_play
target:
entity_id: '{{ media_player_entity }}'
- conditions:
- condition: template
value_template: '{{ trigger.platform == ''state'' and trigger.entity_id == media_player_entity
and trigger.to_state.state != trigger.from_state.state }}'
sequence:
- choose:
- conditions:
- condition: template
value_template: '{{ knx_play_pause_state_address != '''' and states(media_player_entity)
!= last_play_pause_state }}'
sequence:
- choose:
- conditions:
- condition: template
value_template: '{{ is_state(media_player_entity, ''paused'') }}'
sequence:
- service: knx.send
data:
address: '{{ knx_play_pause_state_address }}'
payload: "{% if knx_play_pause_state_invert %}\n 1\n{% else %}\n
\ 0\n{% endif %}\n"
- variables:
last_play_pause_state: paused
- conditions:
- condition: template
value_template: '{{ is_state(media_player_entity, ''playing'') }}'
sequence:
- service: knx.send
data:
address: '{{ knx_play_pause_state_address }}'
payload: "{% if knx_play_pause_state_invert %}\n 0\n{% else %}\n
\ 1\n{% endif %}\n"
- variables:
last_play_pause_state: playing