Crestron TSW 1060. POE HA dash for $30. Firmware

that is correct , the xx7x series panels are newer hardware (latest gen actually), but latest FW is on version 2.x (not 3.x).
ie the tss-770 or the tsw-1070 (latest FW is 2.006.0054.001)
even though the older tss-1060 / tss-760 / tsw-1060 (latest FW is 3.002.1061.001)

i forgot to include the link to the latest 1070 / 770 firmware in my post ( you can get this easily from the manifest .json file):
https://devicefiles.crestron.io/firmware/tsw-xx70_2.006.0054.001.puf

1 Like

I had similar results trying to get the screen to play an RTSP feed. It will attempt to start the stream, but never actually plays and if you look at the stats, it will tell you that it transferred 0 bytes. Tried with numerous streams of various resolutions. I found some forum posts that indicated to actually play the stream you need to pulse a digital register. I scanned for any register that would return a value, and it was in the thousands, so I donā€™t think Iā€™m going to stumble upon the correct one.

I also failed trying to get it to play sounds, except for the built in test sound, it plays that.

1 Like

@slevin22 - thanks for posting this! its great info! can you provide a bit more info please as i still cant get the led bar to light up - it still does flash during panel boot up, and then it goes off and stays off- (or it will flash red/green/red/green if i unplug and replug just the light bars usb), im testing this on 2x tsw-1060 each with its own led bar (so 2x led bars that show model num: TSW-1060-LB on the label, bc else i would assume something hardware is broken/wrong on my end ) ie:

EDIT / UPDATE: LED bar is working i was missing the command to turn on one of the 3x LEDs (ie to turn on red led): setdigitaljoin 30025 1

1- so you Definitely do have the led bar working right? (or are these just commands that should work theoretically?) - if so what model panel do you have and firmware version?

2- do you have EMS app running (ie showing your HA dashboard), while you run these commands for the LED bar? (or are they perhaps only working when you are in the panels crestron setup screen)

3- if you do have the LED bar working / on, can you please provide the output of this ssh command: ledbar (i show mine below) - i ask this as my output of ledbar never changes based on the SETANALOGJOINs , but will change if i issue command like: LEDBAR GREEN BRIGHT 40 (although none of it gets the led bar to light up)

i can get the Screen brightness command to work, ie this works instantly:
SETANALOGJOIN 17201 65535 (LCD screen goes to 100% brightness)

SETANALOGJOIN 17201 35535 (LCD screen goes to ~50% brightness)

on the led bar, the commands seem to go through, but the led bar is always off (i have rebooted and power cycled a few times, and i have tried on 2x different POE+ switches);

TSW-1060P>POEPLUS
POE+: On

GETANALOGJOIN 33354
ANALOG=90

SETANALOGJOIN 33354 100
<blank>

GETANALOGJOIN 33354
ANALOG=100

SETANALOGJOIN 33354 65535

GETANALOGJOIN 33355
ANALOG=100

TSW-1060P>ledbar
Current RED LED bar
         Brightness level: 100
         Control level: 0
         Blink time level: 0
Current GREEN LED bar
         Brightness level: 40
         Control level: 1
         Blink time level: 4
Current BLUE LED bar
         Brightness level: 100
         Control level: 0
         Blink time level: 0
-------------------

TSW-1060P>SETANALOGJOIN 33355 0

TSW-1060P>SETANALOGJOIN 33356 0

TSW-1060P>SETANALOGJOIN 33354 0

TSW-1060P>ledbar
Current RED LED bar
         Brightness level: 100
         Control level: 0
         Blink time level: 0
Current GREEN LED bar
         Brightness level: 40
         Control level: 1
         Blink time level: 4
Current BLUE LED bar
         Brightness level: 100
         Control level: 0
         Blink time level: 0


TSW-1060P>

from one of my panels:
image

thank you for your time!

Hey, Iā€™ll answer your questions later when I get some time. I think your issue may be that you still have to run the digital join commands posted earlier in the thread to actually turn the led bar on.

In other words, digital join turns the output on and off. Analog join sets the brightness.

1 Like

your exactly right- not sure how i misssed that as i read trhough the entire thread a few times!

so led bar IS working, i also tested on a TSW-1070 (with the same TSW-1060-LB) and it also works on there also (fyi).

to be clear for others, this got my led bar outputting red / working (any color works):

POEPLUS ON
<reboot>
setdigitaljoin 30025 1
SETANALOGJOIN 33354 90
<led is now on / red>

thanks again.
(very cool that you can mix the led colors, to make any color- like a normal addressable RGB LED)!

incase we never find a http API that allows setting analogjoin values, i made this rough bash script (with help of chatgpt) that will ssh into a panel and set R/G/B led values. ie so you can just run this command (or setup HA to call it):
./sendSSHcommandCrestron.sh -i 10.6.6.178 -r 50 -g 80 -b 40

(-i is ip of the crestron tss/tsw panel)
(you do have to hardcode you panels ssh creds into the top of the script)

note - this bash script is ā€œinsecureā€ as i use sshpass , insecure in the sense that you have to hardcode your ssh user/pass into the script as variables (this is the only way currently to auth into these panels) - In most cases such as mine this isnā€™t a big deal as everything is local anyway.

I originally had a running three separate SSH command so it took longer however this one sets all three values in one ssh connection so itā€™s quicker. (it also assumes that this has been set already - ie so the leds of the light bar are already ā€œenabledā€ )

setdigitaljoin 30025 1
setdigitaljoin 30026 1
setdigitaljoin 30027 1

(and Fingers crossed that that persists through reboots/powercycles otherwise Iā€™ll have to update the script)

3 Likes

one quick note- i powered up another tss1070 for the first time, and it had a older firmware: 1.004.0046 , and it had sliders for a LED bar that im not showing on my newer firmware TSS1070ā€™s - (ill still use my script above, but just wanted to post this data here before i update its firmware + incase others are interested in the API aspect)

here is the http POST after adjusting a few of the sliders and clicking save (note I pulled out all the cookie and auth related headers since they are redundant in this case ):

curl 'https://10.6.6.179/Device' -X POST -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0' -H 'Accept: application/json' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Content-Type: application/json'  -H 'Origin: https://10.6.6.179' -H 'Connection: keep-alive' --data-raw '{"Device":{"SchedulingPanel":{"Config":{"LedControl":{"IsColorConfigurable":true,"AvailableRedBrightness":49,"AvailableBlueBrightness":69,"ReservedBlueBrightness":33,"AvailableOccupiedRedBrightness":23,"AvailableOccupiedGreenBrightness":43}}}}}'
1 Like

Will that http request work on newer firmware?

Any tricks to actually get the screen to hold to the light bar? I was thinking command strips but that seems like an adventure

in terms of mouting, if its a 770 or 1070 , i have always used one of the official crestron mounts (via ebay).

#1- my favorite is the: TSW-UMB-70
i was lucky to get 3x of them for about 60$ total on ebay. it squeezes / clamps the sheetrock , and assuming you are using a 1070 or 770, they have magnets builtinto the panels, so it snaps against it (and holds in place). i have NOT mounted any of my panels with a light bar yet though , but will be soon.
(see this great pdf quick start guide for it:
https://www.crestron.com/getmedia/183bc9b5-6927-4fc7-8138-6095ebc16a9e/mg_qs_tsw-umb-70-tsw-umb-70-pmk-tsw-umb-570p-pmk
image

#2- this other wall mount below is from the 1060/760 series, and if using a 1070 or 770 panel (which is incorrect for this bracket) - it works, but is a little tight to push the panel into - it does hold great once in though).
im not sure what its called, but it looks like this (and i position it to screw part of this bracket into a stud, through the sheetrock.
(note ive never paid this price, always around 50$ or it came included on some panels ive bought from ebay)

#3- this is the newer version of the above brakcet, but will only fit the 1070 or 770 (as it uses the magnets from this model to hold the panel to the bracket):

you can tell the difference between these 2x by the little tab parts (i learned this the hard way):

1 Like

If anyone has a 3D printer and needs to mount using the -1060 style mount, thereā€™s a fantastic, simple model someone has already made here.

Itā€™s a fairly easy print (no supports), and does a good job simulating the metal bracket for US double-gang boxes. It might not work for European boxes.

The manual for the backlight shows this mount going through the middle of it it, and screwing straight into the boxes. I donā€™t have my backlights yet (just ordered some after all this discussion), but hopefully itā€™s simple enough.

1 Like

Anybody have a TSW-1052 they could clone? My old one I got off ebay has a dead SD card and I can no longer use itā€¦

I found an older Tss-750 panel, anyone have a link for the firmware downloads?

has anyone had any luck getting the auto brightness feature (of the screen) to work as its described in the user guide? (im mainly referring to 770/1070 panels, but i think ive had the same issue on 1060 panels as well):
https://docs.crestron.com/en-us/8550/Content/Topics/Configuration/Web-Configuration.htm#DeviceDisplay

my issue is the ā€œlowā€ mode is way too low.

more detail:
i know its not the light sensors, as you can see the LUX value in the setup screen , and i use a flash light to ā€œtripā€ it between high and low (also im seeing this same behavior across several x70 panels i have - both on latest 2.06 FW and the prior 2.04 firmware )

If i turn off auto brightness, then i can manually set the screens Brightness from zero to 100% and the screen reflects this correctly. According to the manual you set to auto brightness ON and then you set a high brightness and a low brightness value and the ALS threshold controls the sensitivity to switching between the two.

it seems no matter what i set the LOW brightness to (ie even setting it to like 80% or 90%) the actual LOW brightness is closer to 10% (ie its very , very low , to the point where you cant even see whats on the screen mostly). And the HIGH brightness is around 70%

thanks

I donā€™t see any firmware links for a ā€œxx50ā€ unit at this URL, or am I able to use ā€œxx60ā€ firmware on my 750 unit?

I did place an order for a 1060 and should hopefully have it later this week, but was hoping I could use the 750 as well since I got it for free.

I havenā€™t been able to get the command to work for the backlight.

What did you find worked (Iā€™ve tried a dozen different numbers using setanalogjoin 17201 NN and nothing seems to have any effect).

What Iā€™m really hoping for is manual control of the backlight to disable it at times.

EDIT I spoke too soon, I didnā€™t realize that it was disabled if auto brightness was enabled!

BTW, the command BRIGHTNESS works just find on setting the screen brightness level.

in terms of the Auto Brightness, my issue is getting it bright enough when the roomā€™s lights are on. It seems it maxes out around 50-70% screen brightness (as compared to if i turn auto brightness OFF and set it to manual 100% brightness, then its great/Bright!).

with auto brightness on, I do see it switching between Low and High modes (and the dark / low mode is great and is dark enough), its just the high is not bright enough.
I have tried many settings for the ALS value, and those do seem to work, the problem is the " Brightness high preset" value (its too low Regardless of what I set it to).
(im testing on the 1070 and 770 panels)

this photo should help, Itā€™s pretty obvious which of these is set to 100 percent brightness (and with auto brightness off),
the one labeled 6.180- you are seeing it at ā€œBrightness high presetā€ value - which is also set to 100 %, but look how low it is.
Iā€™ve tried setting that Brightness high preset to many values (ie 80 or 99 it doesnā€™t matter) - i do reboot after each change, and issue is the same on firmware 2.04 or the current 2.06

1 Like

Iā€™ve spent some time setting up a bunch of properties using the ssh integration. It took quite some time to figure out how to get the sensors to work, given that the Crestron panel isnā€™t a real shell, so you canā€™t clean up the output. Therefore, thereā€™s a lot of key: ignored values that have to be added to the sensors list, which eats up empty space and sensors we donā€™t want.

One caveat, the commands are fairly slowā€”up to a second per sensor. I set my update interval to 300, so it only checks every 5 minutes. Also, if you donā€™t have the external LCD panel, you should remove everything related to digitaljoin or analogjoin, as itā€™ll just add a lot of time on updates.

Hereā€™s a list of what this provides:

  • Actions:
    • Standby
      • I havenā€™t figured out how to get a sensor to tell me if the screen is in standby or not I figured this out, see in the comment a couple below this.
    • Wake (HomeAssistant will reload every time)
    • Reload
  • Sensors that can be set:
    • Brightness
    • Standby Timeout (set to 0 to disable)
    • Auto Brightness Enabled
    • Auto Brightness Threshold (when to trigger it)
      • Iā€™d like to include the hi & lo values, but Crestron combines them into one line for some reason
    • R/G/B Backlight Enabled
    • R/G/B Backlight Level
  • Other sensors:
    • Hostname

Action Commands:

- command: standby
  name: Standby
  key: standby
- command: standby off
  name: Wake
  key: wake
- command: apprestart
  name: Reload
  key: reload

Sensor Commands:

- command: brightness
  sensors:
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: number
      name: Brightness
      key: brightness
      value_template: >-
        {{ value|regex_findall_index(find='Current LCD brightness level: (\d+)')
        }}
      command_set: brightness @{value}
- command: stbyto
  sensors:
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: number
      name: Standby Timeout
      key: standby_timeout
      maximum: 600
      value_template: "{{ value|regex_findall_index(find='Current standby timeout: (\\d+)') }}"
      command_set: stbyto @{value}
- command: autobrightness
  sensors:
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: binary
      name: Auto Brightness
      key: auto_brightness
      value_template: >-
        {{ value|regex_findall_index(find='LCD Auto-brightness: (\w+)') == 'ON'
        }}
      command_on: AUTOBRIGHTNESS LCDON
      command_off: AUTOBRIGHTNESS LCDOFF
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: number
      name: Auto Brightness Threshold
      key: auto_brightness_threshold
      value_template: "{{ value|regex_findall_index(find='Current LCD Threshold: (\\d+)') }}"
      command_set: AUTOBRIGHTNESS LCDTHRESH @{value}
- command: hostname
  sensors:
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: text
      name: Hostname
      key: hostname
      value_template: "{{ value|regex_findall_index(find='Host Name: (\\w+)') }}"
- command: getdigitaljoin 30025
  sensors:
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: binary
      name: Red Backlight Enabled
      key: red_enabled
      value_template: "{{ value|regex_findall_index(find='DIGITAL=(\\d)') }}"
      command_on: setdigitaljoin 30025 1
      command_off: setdigitaljoin 30025 0
- command: getdigitaljoin 30026
  sensors:
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: binary
      name: Green Backlight Enabled
      key: green_enabled
      value_template: "{{ value|regex_findall_index(find='DIGITAL=(\\d)') }}"
      command_on: setdigitaljoin 30026 1
      command_off: setdigitaljoin 30026 0
- command: getdigitaljoin 30027
  sensors:
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: binary
      name: Blue Backlight Enabled
      key: blue_enabled
      value_template: "{{ value|regex_findall_index(find='DIGITAL=(\\d)') }}"
      command_on: setdigitaljoin 30027 1
      command_off: setdigitaljoin 30027 0
- command: getanalogjoin 33354
  sensors:
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: number
      name: Red Backlight level
      key: red_level
      value_template: "{{ value|regex_findall_index(find='ANALOG=(\\d+)') }}"
      command_set: setanalogjoin 33354 @{value}
- command: getanalogjoin 33355
  sensors:
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: number
      name: Green Backlight level
      key: green_level
      value_template: "{{ value|regex_findall_index(find='ANALOG=(\\d+)') }}"
      command_set: setanalogjoin 33355 @{value}
- command: getanalogjoin 33356
  sensors:
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: number
      name: Blue Backlight level
      key: blue_level
      value_template: "{{ value|regex_findall_index(find='ANALOG=(\\d+)') }}"
      command_set: setanalogjoin 33356 @{value}

This gives you the following device interface for your screen:

4 Likes

A little more info on the LED bars. I tried to get the SSH integration to send multiple parameters (separated by newlines), but it simply wonā€™t work for me. Itā€™s very slow, and also seems to occasionally set them to a value randomly much later (minutes later).

So instead I worked on getting the shell script from above working. I had to modify it to use a key to login, rather than the password. This is safer, anyway, so hereā€™s roughly the steps I took to get this working. I canā€™t give exact step-by-step instructions, so if it seems too confusing, it probably isnā€™t worth the hassle.

  • First, generate a new key on your desktop
  • Then send the public key to the screen, for example:
    scp .ssh/crestron.pub [email protected]:/User/crestron
    
  • Now you have to add the key to your user, so SSH into the screen, and run this:
    SSHSERVER ADDUSERKEY -N:admin -K:crestron
    
    (Note: Iā€™m only 50% sure this will work without changes. If you need to move the file after uploading it, you can use DIR and CD to find it, and MOVEFILE fromfile tofile to move it.)
  • Now copy the file to HomeAssistant, using something like
    scp .ssh/crestron homeassistant.local:/config/.ssh/crestron
    
  • Finally, you can modify the script above from @UserHA8021 , mine is now similar to below. Note that I also always switch the digital values, because Iā€™ve found those can get disabled on reboot.
# Hardcoded SSH user and password (use at your own risk; consider using key-based authentication for better security)
SSH_USER="admin"

# Debug mode (set to true to only echo the commands without executing)
DEBUG=false

# Function to display usage information
usage() {
  echo "Usage: $0 -i <IP_ADDRESS> -r <RED_VALUE> -g <GREEN_VALUE> -b <BLUE_VALUE>"
  echo "Where <RED_VALUE>, <GREEN_VALUE>, and <BLUE_VALUE> are between 0 and 100."
  exit 1
}

# Parse command-line options
while [[ $# -gt 0 ]]; do
  case $1 in
    -i)
      IP_ADDRESS=$2
      shift 2
      ;;
    -r)
      RED_VALUE=$2
      shift 2
      ;;
    -g)
      GREEN_VALUE=$2
      shift 2
      ;;
    -b)
      BLUE_VALUE=$2
      shift 2
      ;;
    -d)
      DEBUG=true
      shift 1
      ;;
    *)
      usage
      ;;
  esac
done

# Check if all required arguments are provided and values are in range
if [ -z "$IP_ADDRESS" ] || [ -z "$RED_VALUE" ] || [ -z "$GREEN_VALUE" ] || [ -z "$BLUE_VALUE" ]; then
  usage
fi

# Validate that the values are between 0 and 100
if ((RED_VALUE < 0 || RED_VALUE > 100)) || ((GREEN_VALUE < 0 || GREEN_VALUE > 100)) || ((BLUE_VALUE < 0 || BLUE_VALUE > 100)); then
  echo "Error: The values for -r, -g, and -b must be between 0 and 100."
  exit 1
fi

# Build the SSH command using a heredoc to send multiple commands with -t flag for pseudo-terminal allocation
SSH_COMMAND="ssh -i /config/.ssh/crestron -t -t -o StrictHostKeyChecking=no \"$SSH_USER@$IP_ADDRESS\" <<EOF
setdigitaljoin 30025 1
setdigitaljoin 30026 1
setdigitaljoin 30027 1
SETANALOGJOIN 33354 $RED_VALUE
SETANALOGJOIN 33355 $GREEN_VALUE
SETANALOGJOIN 33356 $BLUE_VALUE
bye
EOF"

# If debug mode is enabled, echo the command and exit
if [ "$DEBUG" = true ]; then
  echo "Debug mode is ON. The command that would be run is:"
  echo "$SSH_COMMAND"
  exit 0
fi

# Execute the SSH command
# echo "Connecting to $IP_ADDRESS with user $SSH_USER..."
eval "$SSH_COMMAND"

Once all this is done, you will need to set up the actual shell commands within configuration.yml, which looks something like:

shell_command:
  crestron_backlight_color: /bin/bash /config/shell_commands/crestron_screen.sh -i "{{ip}}" -r "{{red}}" -g "{{green}}" -b "{{blue}}"
  crestron_kitchen_backlight_alert: /bin/bash /config/shell_commands/crestron_screen.sh -i "192.168.1.105" -r "100" -g "15" -b "0"
  crestron_kitchen_backlight_off: /bin/bash /config/shell_commands/crestron_screen.sh -i "192.168.1.105" -r "0" -g "0" -b "0"

Note that I have both a shell command I can send info to generically (for custom values), and also a few commands that target a specific screen with a specific color. You can mix-and-match hard-coded properties with dynamic ones, as you can imagine. The dynamic properties are sent using a data key, like so:

action: shell_command.crestron_backlight_color
data:
  ip: 192.168.1.105
  red: 50
  green: 50
  blue: 100

If you have any questions, I can try to help, but I basically muddled my way through this as it wasā€”and now I have to repeat this on the other 3 screens myself!

3 Likes

I found the screen/standby/power state command, so you can turn standby into a switch like this:

- command: powerstate
  sensors:
    - type: text
      key: ignored
      entity_registry_enabled_default: false
    - type: binary
      name: Standby
      key: standby
      value_template: >-
        {{ value|regex_findall_index(find='Current Power Source : (\w+)') ==
        'Standby' }}
      command_on: standby
      command_off: standby off
      icon: mdi:power-sleep

However, you might still want to retain the discrete Standby/Wake commands as well, in case the switch gets out of sync.

2 Likes