Plex light Control after Sunset Automation

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

Amazing thanks