I have a Cherry 142 key keyboard, connected via USB to Raspberry PI, running ‘node-red’, from which I can send OSC commands or ATEM commands via the network. The keyboard is very low-cost compared to the large X-Keys keyboard. Each key is not lit like on the X-Keys product, but, did I mention that it’s very low cost compared to the X-Keys?
The cost is typically less than $120.
Cherry keyboard is this one: https://www.neweggbusiness.com/Product/Product.aspx?Item=9SIV1DSD5E1004
I also have it monitoring output data from the ATEM video switch, so that it can get the names of the macros, and in the node-red side, have the ability to use the macro names instead of macro slot ID’s to identify them.
Another possibility is to expose a set of OSC commands, and use software like open stage control, and create a web browser based button UI, which means you can now have a push button interface that’s usable from any tablet, and the UI can be responsive in terms of labels and color changes etc, and, can be accessed via network too.
Potentially, you can create something that lets people do pre-programmed things, and only do those things. eg: you can create a panel that gives not only ATEM and CasparCG control, but other things too, such as PTZ camera memorized location recalling etc, so that other people can use it without having access to the actual equipment.
Could ‘companion’ take the place of ‘node-red’? Perhaps.
The main problem with using the USB keyboard is that on a PC, the keyboard is meant to provide input to the active application, like any other USB keyboard. I did not want to have to sit in one program all day, and be unable to do other things, so I use a raspberry PI to have the node-red and keyboard, and let that just do keyboard and node-red, so does not tie up an entire computer. Raspberry PI can run headless, with nothing but network and keyboard connected.
I had to get a bit ‘creative’ to pull key presses from the USB keyboard into node-red as a source of messages (python to read via usb library and emit key press data via stdout).
Perhaps companion would have other ways to do that too. But, the utility of being able to write custom javascript code within node-red and do things like collect names and IDs of macros from the ATEM switch is also quite useful, and may let you do other things that Companion might not. I suppose it’s also possible to do this sort of thing in companion if you work at it enough.