Monoprice Blackbird 4x4 video Matrix (21905)

After searching, I was unable to locate a working solution to integrate this device. After some help and pointers from various forum threads and some very helpful community people (like @tom_l :+1:), I was able to get some functionality to the point of being able to use this device via HA

I have a basic working solution for this device - Blackbird 4x4 (21905) that I thought I would share where I’m at and what I have working in case it’s useful to anyone else.

This includes switching of all Op/In combinations as well as Powering on and Off the unit.

There is also ways to change the EUID mappings and getting the status back on what Input is currently set on each output as well as the EUID state, but this is quite a bit more complex and I have not sorted out the readback byte extraction (Also may not bother as I really don’t care about the current state that much and the EUID is set to use the detected Input mapped to the Output in the config)

Anyways, here’s the setup:

The Serial Port is /dev/ttyUSB0 - using USB to DB9 RS232 serial converter off a rPi 4 out to the serial on the Blackbird.

I’ve had a lot of luck with various USB to RS232 converters and the rPi. I do seem to have to hard reboot for them to fully functioning after initially plugging them in (could just be coincidence, just a point to make if you are having a struggle getting one to work)

Device is locked to these serial settings (may be able to Telnet and change these, but I have had no success with Telnet and this device at all, hence why I’m going with serial)

Baud: 115200
Data: 8
Pairity: None
Stop: 1
I decided to set all serial parameters, likely not necessary, but I felt that might be a good idea


  - platform: serial

    #Monoprice Blackbird 4x4 21905
    serial_port: /dev/ttyUSB0
    baudrate: 115200
    bytesize: 8
    parity: N
    stopbits: 1
    xonxoff: false
    rtscts: false
    dsrdtr: false

    matrix_op1_in1: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' > /dev/ttyUSB0"
    matrix_op2_in1: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' > /dev/ttyUSB0"
    matrix_op3_in1: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x01\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03' > /dev/ttyUSB0"
    matrix_op4_in1: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04' > /dev/ttyUSB0"
    matrix_op1_in2: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' > /dev/ttyUSB0"
    matrix_op2_in2: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x02\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03' > /dev/ttyUSB0"
    matrix_op3_in2: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x02\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04' > /dev/ttyUSB0"
    matrix_op4_in2: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05' > /dev/ttyUSB0"
    matrix_op1_in3: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x03\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03' > /dev/ttyUSB0"
    matrix_op2_in3: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04' > /dev/ttyUSB0"
    matrix_op3_in3: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x03\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05' > /dev/ttyUSB0"
    matrix_op4_in3: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x03\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06' > /dev/ttyUSB0"
    matrix_op1_in4: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04' > /dev/ttyUSB0"
    matrix_op2_in4: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x04\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05' > /dev/ttyUSB0"
    matrix_op3_in4: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x04\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06' > /dev/ttyUSB0"
    matrix_op4_in4: /bin/bash -c "echo -e '\x50\x56\x54\x02\x03\x04\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07' > /dev/ttyUSB0"
    matrix_on: /bin/bash -c "echo -e '\x50\x56\x54\x08\x0B\x0F\x00\x0F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2B' > /dev/ttyUSB0"
    matrix_off: /bin/bash -c "echo -e '\x50\x56\x54\x08\x0B\xF0\x00\xF0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xED' > /dev/ttyUSB0"

For Lovelace, I borrowed this config and just stacked the 4 buttons (correlating to the 4 inputs) and have that on a the respective room (dashboard view) where the TV (output) resides

type: button
  action: call-service
  service: shell_command.matrix_op1_in1
  service_data: {}
  target: {}
name: Bell Satellite 1
show_icon: false
icon_height: 4px
show_name: true
icon: hass:video

For reference, below is the user manual as well as the sloppy protocol guide
Protocol Guide

All messaging is HEX as well FYI

I’m still fairly new to HA and I have yet to master basically anything beyond basics. Just knowledgeable enough to break stuff, so this is likely not an elegant nor pretty solution!

Any input or ideas to better this, is always appreciated!

1 Like

The other option could be an Ethernet to serial bridge like the Global Cache IP2SL or iTach. They wouldn’t need a Home Assistant host restart to be able to be used. They’re quite a bit dearer than USB to serial adaptors though.

That’s a good option as well.

I personally try to keep the layers of complexity as simple as possible (most of my work life has been industrial automation). Using a ethernet network to transport the serial packet is less efficient and adds another thing to in the chain of break points, albeit many would prefer this due to familiarity and comfort.

This might help too:

1 Like