I was working one some “cool” automations with webhooks an decided the two second to use my phone to dim the lights for movies was just unbearable.
Any time after sunset when media is started on plex it will dim the lights in my living room.
alias: Plex Local Dimming
description: ""
triggers:
- trigger: webhook
allowed_methods:
- POST
- PUT
local_only: true
webhook_id: "-Plex-205"
conditions:
- condition: sun
after: sunset
enabled: true
- condition: template
value_template: >-
{{ 'YOUR_PLAYER_UUID_HERE' in trigger.data.payload | string
}}
enabled: true
- condition: template
value_template: "{{ 'media.play' in trigger.data.payload | string }}"
enabled: true
actions:
- action: light.turn_off
metadata: {}
data:
transition: 3
brightness_pct: 100
target:
area_id: living_room
mode: single
Then flip it for stopping media playback.
alias: Plex Local Brigttening
description: ""
triggers:
- trigger: webhook
allowed_methods:
- POST
- PUT
local_only: true
webhook_id: "-Plex-205"
conditions:
- condition: sun
after: sunset
enabled: true
- condition: template
value_template: >-
{{ 'YOUR_PLAYER_UUID_HERE' in trigger.data.payload | string
}}
enabled: true
- condition: template
value_template: "{{ 'media.stop' in trigger.data.payload | string }}"
enabled: true
actions:
- action: light.turn_on
metadata: {}
data:
transition: 3
brightness_pct: 100
target:
area_id: living_room
mode: single
I would take any suggestions to properly parse the webhook package into json. As far as I can tell Plex does not flag a content type so home assistant just treat it like a wod of data. But this works for how and it pretty cool.
1 Like
This is my plex code.
It captures Player, Media Type (movie / music (track) / tv (episode)) and then the event play, pause, stop. I use scenes to set the lighting in the room.
I just duplicate player/room depending on what I am trying to achieve in which room.
description: ""
mode: restart
triggers:
- trigger: webhook
allowed_methods:
- POST
- PUT
local_only: true
webhook_id: super_secret_plex_webhook
conditions: []
actions:
- alias: Description of Player / Room
if:
- alias: Name of Your Player
condition: template
value_template: >-
{% set payload = trigger.data['payload'].decode('utf-8') | from_json
%}
{{ payload.Player['title'] == 'NAME OF YOUR PLAYER'}}
enabled: true
then:
- choose:
- conditions:
- condition: template
value_template: >-
{% set payload = trigger.data['payload'].decode('utf-8') |
from_json %}
{{ payload.Metadata['type'] == 'movie'}}
sequence:
- choose:
- conditions:
- condition: template
value_template: >-
{% set payload =
trigger.data['payload'].decode('utf-8') | from_json %}
{{ payload.event == 'media.play' or payload.event == 'media.resume'}}
sequence: []
alias: Play / Resume
- conditions:
- condition: template
value_template: >-
{% set payload =
trigger.data['payload'].decode('utf-8') | from_json %}
{{ payload.event == 'media.pause'}}
sequence: []
alias: Pause
- conditions:
- condition: template
value_template: >-
{% set payload =
trigger.data['payload'].decode('utf-8') | from_json %}
{{ payload.event == 'media.stop'}}
sequence: []
alias: Stop
alias: Item Playing is a Movie
- conditions:
- condition: template
value_template: >-
{% set payload = trigger.data['payload'].decode('utf-8') |
from_json %}
{{ payload.Metadata['type'] == 'track'}}
sequence:
- choose:
- conditions:
- condition: template
value_template: >-
{% set payload =
trigger.data['payload'].decode('utf-8') | from_json %}
{{ payload.event == 'media.play' or payload.event ==
'media.resume'}}
sequence: []
alias: Play / Resume
- conditions:
- condition: template
value_template: >-
{% set payload =
trigger.data['payload'].decode('utf-8') | from_json %}
{{ payload.event == 'media.pause'}}
sequence: []
alias: Pause
- conditions:
- condition: template
value_template: >-
{% set payload =
trigger.data['payload'].decode('utf-8') | from_json %}
{{ payload.event == 'media.stop'}}
sequence: []
alias: Stop
alias: Item Playing is Music (track)
- conditions:
- condition: template
value_template: >-
{% set payload = trigger.data['payload'].decode('utf-8') |
from_json %}
{{ payload.Metadata['type'] == 'episode'}}
sequence:
- choose:
- conditions:
- condition: template
value_template: >-
{% set payload =
trigger.data['payload'].decode('utf-8') | from_json %}
{{ payload.event == 'media.play' or payload.event == 'media.resume'}}
sequence: []
alias: Play / Resume
- conditions:
- condition: template
value_template: >-
{% set payload =
trigger.data['payload'].decode('utf-8') | from_json %}
{{ payload.event == 'media.pause'}}
sequence: []
alias: Pause
- conditions:
- condition: template
value_template: >-
{% set payload =
trigger.data['payload'].decode('utf-8') | from_json %}
{{ payload.event == 'media.stop'}}
sequence: []
alias: Stop
enabled: true
alias: Item Playing is TV Show (episode)
enabled: true
trace:
stored_traces: 20
You got me inspired to go back over my code again.
I did keep on meaning to go back to refine my code instead of parsing the json for every template to do it just the once, making it more efficient.
Have also placed an error entry within the Home Assistant Core Log, if content is played on a plex client that is not within the automation:
"Plex webhook received for an unknown player: "
alias: HOUSE (Plex Webhooks Events v2)
description: ""
mode: restart
triggers:
- trigger: webhook
allowed_methods:
- POST
- PUT
local_only: true
webhook_id: super_secret_plex_webhook
conditions: []
actions:
- alias: Handle Plex Webhook
variables:
payload: "{{ trigger.data['payload'].decode('utf-8') | from_json }}"
player_title: "{{ payload.Player.title | default(None) }}"
- choose:
- conditions:
- condition: template
value_template: "{{ player_title in ['Your Player 1 Name Here'] }}"
sequence:
- choose:
- conditions:
- condition: template
alias: Item Playing is a Movie
value_template: "{{ payload.Metadata.type == 'movie' }}"
sequence:
- choose:
- conditions:
- condition: template
value_template: >-
{{ payload.event in ['media.play', 'media.resume']
}}
sequence: []
alias: Play/Resume
- conditions:
- condition: template
value_template: "{{ payload.event == 'media.pause' }}"
sequence: []
alias: Pause
- conditions:
- condition: template
value_template: "{{ payload.event == 'media.stop' }}"
sequence: []
alias: Stop
- conditions:
- condition: template
alias: Item Playing is Music (track)
value_template: "{{ payload.Metadata.type == 'track' }}"
sequence:
- choose:
- conditions:
- condition: template
value_template: >-
{{ payload.event in ['media.play', 'media.resume']
}}
sequence: []
alias: Play/Resume
- conditions:
- condition: template
value_template: "{{ payload.event == 'media.pause' }}"
sequence: []
alias: Pause
- conditions:
- condition: template
value_template: "{{ payload.event == 'media.stop' }}"
sequence: []
alias: Stop
- conditions:
- condition: template
alias: Item Playing is TV Show (episode)
value_template: "{{ payload.Metadata.type == 'episode' }}"
sequence:
- choose:
- conditions:
- condition: template
value_template: >-
{{ payload.event in ['media.play', 'media.resume']
}}
sequence: []
alias: Play/Resume
- conditions:
- condition: template
value_template: "{{ payload.event == 'media.pause' }}"
sequence: []
alias: Pause
- conditions:
- condition: template
value_template: "{{ payload.event == 'media.stop' }}"
sequence: []
alias: Stop
alias: Player 1
- conditions:
- condition: template
value_template: "{{ player_title in ['Your Player 2 Name Here'] }}"
sequence:
- choose:
- conditions:
- condition: template
alias: Item Playing is a Movie
value_template: "{{ payload.Metadata.type == 'movie' }}"
sequence:
- choose:
- conditions:
- condition: template
value_template: >-
{{ payload.event in ['media.play', 'media.resume']
}}
sequence: []
alias: Play/Resume
- conditions:
- condition: template
value_template: "{{ payload.event == 'media.pause' }}"
sequence: []
alias: Pause
- conditions:
- condition: template
value_template: "{{ payload.event == 'media.stop' }}"
sequence: []
alias: Stop
- conditions:
- condition: template
alias: Item Playing is Music (track)
value_template: "{{ payload.Metadata.type == 'track' }}"
sequence:
- choose:
- conditions:
- condition: template
value_template: >-
{{ payload.event in ['media.play', 'media.resume']
}}
sequence: []
alias: Play/Resume
- conditions:
- condition: template
value_template: "{{ payload.event == 'media.pause' }}"
sequence: []
alias: Pause
- conditions:
- condition: template
value_template: "{{ payload.event == 'media.stop' }}"
sequence: []
alias: Stop
- conditions:
- condition: template
alias: Item Playing is TV Show (episode)
value_template: "{{ payload.Metadata.type == 'episode' }}"
sequence:
- choose:
- conditions:
- condition: template
value_template: >-
{{ payload.event in ['media.play', 'media.resume']
}}
sequence: []
alias: Play/Resume
- conditions:
- condition: template
value_template: "{{ payload.event == 'media.pause' }}"
sequence: []
alias: Pause
- conditions:
- condition: template
value_template: "{{ payload.event == 'media.stop' }}"
sequence: []
alias: Stop
alias: Player 2
default:
- action: system_log.write
metadata: {}
data:
level: error
message: "Plex webhook received for an unknown player: {{ player_title }}"
trace:
stored_traces: 20
hey @thenextbutton Where do I find my super_secret_plex_webhook id?
Hi @DigitalElise,
You need to create one. How I do it is that I go to an online guid generator (guidgenerator.com for example) and generate a guid (you can just use a word or a phrase if you want). You do want to make it as secure and random as possible if you are going to un-check local only option.
Go to your plex server, in to settings and near the top of the menu you will see webhooks, add a webhook. Point in to toward your home assistant server for example:
http://<home_assistant_ip>/api/webhook/{GUID}
i.e.
http://10.0.1.2:8123/api/webhook/e9ee051d-31cd-464a-b3c4-034992a96be0
then in the automation under the webhook ID put in the {GUID}
Hope that helps.
1 Like