This looks like something
I’m also interested. But I’ve moved my hue lights to zha, so I’m curious if it will work with zha also.
There seems to be a API on the Hue HDMI Sync Box. Wonder if someone more experienced could take a look at it.
There is some info about it here: https://github.com/ebaauw/homebridge-hue/issues/552#issuecomment-572256796
I’ve managed to get a rest command working to switch inputs. First you need an accesstoken to use it. For that I used a small python script.
import requests
import json
from time import sleep
url = "https://<INSERT IP OF SYNCBOX HERE>/api/v1/registrations"
data = {'appName': 'hass', 'appSecret': 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', 'instanceName': 'hass' }
headers = {'Content-type': 'application/json'}
while True:
sleep(1)
r = requests.post(url, data=json.dumps(data), headers=headers, verify=False)
if r.json().get('accessToken') != None:
print("Your accessToken is " + r.json().get('accessToken'))
break
Run the script and then hold the button on the sync box to pair. The token should print out.
Use this token in the rest command like this:
rest_command:
syncbox_input1:
url: https://<INSERT IP OF SYNCBOX HERE>/api/v1/execution
method: PUT
headers:
Authorization: "Bearer <INSERT TOKEN HERE>"
payload: '{"hdmiSource":"input1"}'
content_type: 'application/json; charset=utf-8'
verify_ssl: false
Change input1 to input2, input3 or input4 for other ports.
Hopefully this is of use for someone. If/When the API is made official maybe someone can make a nice media_player entity for it.
Thank you so much for sharing. I was able to add buttons to HA to swap input.
Can I ask you another detail? Do you know how switch on/off the box with a similar rest command?
Thank you
The HDMI Sync Box has published its API (You have to create a free dev-account to see content). The API is still in beta but you can use it to create rest-api calls. (Would be awesome if someone can integrate this in HA )
Blockquote @ste.luci “Do you know how switch on/off the box with a similar rest command?”
To do this, use this example (thanks @NoedelVreter)
rest_command:
syncbox_powersave:
url: https://<INSERT IP OF SYNCBOX HERE>/api/v1/execution
method: PUT
headers:
Authorization: "Bearer <INSERT TOKEN HERE>"
payload: '{"mode":"powersave"}'
content_type: 'application/json; charset=utf-8'
verify_ssl: false
Change powersave to “passthrough”, “video”, “game”, “music” or “ambient” to set it accordingly. If that does not turn of the TV, try this payload: {"toggleHdmiActive": false}
or {"hdmiActive":false}
GREAT!!! It works.
If anybody needs to do sth similar here is what I did:
configuration.yaml
rest_command:
syncbox_input1:
url: https:// BRIDGE IP /api/v1/execution
method: PUT
headers:
Authorization: "Bearer TOKEN "
payload: '{"hdmiSource":"input1"}'
content_type: 'application/json; charset=utf-8'
verify_ssl: false
syncbox_input2:
url: https:// BRIDGE IP /api/v1/execution
method: PUT
headers:
Authorization: "Bearer TOKEN "
payload: '{"hdmiSource":"input2"}'
content_type: 'application/json; charset=utf-8'
verify_ssl: false
syncbox_input3:
url: https:// BRIDGE IP /api/v1/execution
method: PUT
headers:
Authorization: "Bearer TOKEN "
payload: '{"hdmiSource":"input3"}'
content_type: 'application/json; charset=utf-8'
verify_ssl: false
syncbox_input4:
url: https:// BRIDGE IP /api/v1/execution
method: PUT
headers:
Authorization: "Bearer TOKEN "
payload: '{"hdmiSource":"input4"}'
content_type: 'application/json; charset=utf-8'
verify_ssl: false
syncbox_standby:
url: https:// BRIDGE IP /api/v1/execution
method: PUT
headers:
Authorization: "Bearer TOKEN "
payload: '{"mode":"powersave"}'
content_type: 'application/json; charset=utf-8'
verify_ssl: false
syncbox_passthrough:
url: https:// BRIDGE IP /api/v1/execution
method: PUT
headers:
Authorization: "Bearer TOKEN "
payload: '{"mode":"passthrough"}'
content_type: 'application/json; charset=utf-8'
verify_ssl: false
In lovelace
- cards:
- type: vertical-stack
cards:
- type: button
tap_action:
action: call-service
service: rest_command.syncbox_passthrough
hold_action:
action: none
show_icon: true
show_name: true
icon: 'mdi:power-on'
name: 'On'
- type: button
tap_action:
action: call-service
service: rest_command.syncbox_standby
hold_action:
action: none
show_icon: true
show_name: true
icon: 'mdi:power-off'
name: 'Off'
entity: switch.transmission_switch_2
- hold_action:
action: none
icon: 'mdi:set-top-box'
name: UPC
show_icon: true
show_name: true
tap_action:
action: call-service
service: rest_command.syncbox_input1
type: button
- hold_action:
action: none
icon: 'mdi:amazon'
name: Fire
show_icon: true
show_name: true
tap_action:
action: call-service
service: rest_command.syncbox_input2
type: button
- hold_action:
action: none
icon: 'mdi:google-chrome'
name: Chrome
show_icon: true
show_name: true
tap_action:
action: call-service
service: rest_command.syncbox_input3
type: button
- hold_action:
action: none
icon: 'mdi:disc-player'
name: DVD
show_icon: true
show_name: true
tap_action:
action: call-service
service: rest_command.syncbox_input4
type: button
type: horizontal-stack
Result:
P.S. I also created scripts so I can call them through vocal commands in google home.
Script example:
script_hue_sync_input_1:
alias: Hue Sync Input 1
sequence:
- service: rest_command.syncbox_input1
Nice to see!
I also tried to do the same thing with a rest sensor. When using the same endpoints with GET you will get the status. I used to reflect that back into HA, and created a dropdown input-select that also updates when the source was changed the app (with a lot of automations).
Whole thing was “houtje-touwtje”, and something broke. Had no time to fix it yet, but I’ll try to fix it and share it next weekend.
Awesome, tracking this for future updates. I tried to do it myself, but I’m not experienced enough to build a sensor to get all the states of the Hue box.
All right, here are is my setup for the Sync box. It allows me to set the box to Powersave or Video and change source. When one of those values changes, it will also be updated (with a delay due to the RestFull sensor).
Please use these components somewhere in your Lovelace, the rest is just some internal stuff.
- switch.syncbox_hdmi_active
- input_select.sync_box_source
I’m planning to do:
- Brightness control
- Convert this to a media-player (somehow)
- Change of names in source select.
Hope this is useful!
configuration.yaml
binary_sensor:
- platform: template
sensors:
syncbox_sync_active:
friendly_name: "Sync Box Sync Active"
value_template: '{{ states.sensor.sync_box.attributes.syncActive }}'
entity_id: sensor.sync_box
syncbox_hdmi_active:
friendly_name: "Sync Box HDMI Active"
value_template: '{{ states.sensor.sync_box.attributes.hdmiActive }}'
entity_id: sensor.sync_box
input_select:
sync_box_source:
name: "Sync Box Source"
icon: mdi:import
options:
- input1
- input2
- input3
- input4
rest_command:
syncbox_set_input_source:
url: 'https://<IP_ADDRESS>/api/v1/execution'
method: PUT
verify_ssl: false
payload: '{"hdmiSource":"{{ states.input_select.sync_box_source.state }}"}'
headers:
Authorization: !secret sync_box_token
syncbox_powersave:
url: 'https://<IP_ADDRESS>/api/v1/execution'
method: PUT
verify_ssl: false
payload: '{"mode":"powersave"}'
headers:
Authorization: !secret sync_box_token
syncbox_passthrough:
url: 'https://<IP_ADDRESS>/api/v1/execution'
method: PUT
verify_ssl: false
payload: '{"mode":"passthrough"}'
headers:
Authorization: !secret sync_box_token
syncbox_video:
url: 'https://<IP_ADDRESS>/api/v1/execution'
method: PUT
verify_ssl: false
payload: '{"mode":"video"}'
headers:
Authorization: !secret sync_box_token
syncbox_set_sync_active:
url: 'https://<IP_ADDRESS>/api/v1/execution'
method: PUT
verify_ssl: false
payload: '{"syncActive":true}'
headers:
Authorization: !secret sync_box_token
sensor:
- platform: rest
name: Sync Box
resource: https://<IP_ADDRESS>/api/v1/execution
method: GET
verify_ssl: false
json_attributes:
- syncActive
- hdmiActive
- hdmiSource
- brightness
value_template: '{{ value_json.mode }}'
headers:
Authorization: !secret sync_box_token
- platform: template
sensors:
syncbox_hdmi_input:
friendly_name: "Sync Box HDMI input"
value_template: '{{ states.sensor.sync_box.attributes.hdmiSource }}'
entity_id: sensor.sync_box
syncbox_brightness:
friendly_name: "Sync Box brightness"
value_template: '{{ (states.sensor.sync_box.attributes.brightness / 2) | int }}'
entity_id: sensor.sync_box
unit_of_measurement: "%"
scripts.yaml
syncbox_set_powersave:
alias: "Sync Box - Set Powersave"
sequence:
- service: rest_command.syncbox_powersave
- service: homeassistant.update_entity
entity_id: sensor.sync_box
syncbox_set_video:
alias: "Sync Box - Set Video"
sequence:
- service: rest_command.syncbox_video
- service: homeassistant.update_entity
entity_id: sensor.sync_box
automations.yaml
- alias: "Sync Box - Set Source"
trigger:
platform: state
entity_id: input_select.sync_box_source
condition:
- condition: template
value_template: "{{ states.input_select.sync_box_source.state != states.sensor.syncbox_hdmi_input.state}}"
action:
- service: rest_command.syncbox_set_input_source
- service: homeassistant.update_entity
entity_id: sensor.sync_box
- alias: "Sync Box - Update Source"
trigger:
platform: state
entity_id: sensor.syncbox_hdmi_input
action:
- service: input_select.select_option
data_template:
entity_id: input_select.sync_box_source
option: "{{ states.sensor.syncbox_hdmi_input.state }}"
Edit: Updated ip-addresses to placeholders
Edit 2: Fixed config issue
I’ll test this out on my end – to be clear though I do want to put bearer
before any token right?
Yes, so in your secrets.yaml
you need to have it like this:
sync_box_token: “Bearer <token>”
I’ve made a full write-up on how to integrate the Play HDMI Sync Box in HA with bi-directional updates (I also pull state from the Hue Sync Box to make sure HA is showing the right state) : https://www.dennusb.nl/home-assistant-control-philips-hue-hdmi-sync-box/
Hello everybody
While the input change commands work fine, when trying to call the suync rest command I get the following in the HA log:
[homeassistant.components.rest_command] Error. Url: https://SYNC BOX IP/api/v1/execution. Status code 400.
Any suggestion?
The sync box API yells at you that the request was invalid, so you have made an error somewhere.
What rest command are you using? Can you share it?
Thank you Unsigus
This is the rest command giving the error:
syncbox_startsync:
url: 'https://10.25.20.156/api/v1/execution'
method: PUT
verify_ssl: false
payload: '{"syncActive":"video"}'
headers:
Authorization: "Bearer MY TOKEN HERE"
Other commands like the following work:
syncbox_passthrough:
url: https://10.25.20.156/api/v1/execution
method: PUT
headers:
Authorization: "Bearer SAME TOKEN HERE"
payload: '{"mode":"passthrough"}'
content_type: 'application/json; charset=utf-8'
verify_ssl: false
I see, I have made an error in my config example. “syncActive” expects a boolean (true or false), not “Video”. So change your payload to:
"{syncActive": true}"
'{"syncActive": true}'
Also: I highly recommend to create a developer account at https://developers.meethue.com/. It’s free and all the information you need is there!
Edit: Fix typo in payload
Unfortunately I get the same error. I’ll try with https://developers.meethue.com/
Thank you for your help.
Sorry, made a typo in the payload…
'{"syncActive": true}'
will do.
Just tested it, this must work.
GREAT!!! Thank you
Hi everyone,
This post was very insightful. I have created a custom component that allows to control most features and also provides information from the device. You can see it on GitHub and on the Community post.