Send a serial command and read the response as a sensor

What command you have on your mind?

Oh, I misread the whole thing. I don’t know anything about your projector. You would have to look at their ICD.

Given you can turn it on with a write to the USB0, maybe you can read from the serial device with a command.

Then you would add that read command to your sensor instead of the write command.

Then, combine both command line things to a template switch where the on/off uses the write command and the state uses the read command.

Given it’s a ttyUSB0, you will probably have to have some thread doing a “tail -f /dev/ttyUSB0” and processing that output as it comes in.


Or, you get a smart outlet with a power meter and use the increased power to know when the projector is on.

Or, you use a light sensor in the light path to know if the projector is on.

A few different options.

The documentation of the projector has two kinds of commands you can send to it. First column sends commands to control it and return pass or fail (P or F). The second column has commands that return fail (F) or something particular to give you desired state, in case of projector being powered on, you ask, are you powered on? It returns “OK1”. This is the reason I tried to send echo as in the case of controlling it. When I tried to control it using some app for serial communication, the app shows these returns. My question is how to read them in HA. I know the projector is responding. I cannot read it by HA

That’s good. But echo isn’t going to get a reply.

You’re going to have to figure out how to read replies.

Try opening another terminal and doing tail -f /dev/ttyUSB0. Then send that command and see if the reply comes over that other terminal.

If it does, try to see if you can do a ‘cat’ and maybe the last response will be readable.

Stop the tail -f, then send another command and do a cat /dev/ttyUSB0. If that works, you can append the cat command to the end of your power on command for the response. It’s likely this wont work…but worth a shot.

One thing you could do is have a usb reader write to a file, then use a file sensor to parse that file. As long as you only get queries for the power state, it should be straight forward as you can assume the reply is always for “are you powered on?”

I am totally new to Home Assistant and have scoured every topic I could find on this and have tried various things with no success. I have a an old (but still working perfectly and suits my needs just fine) 12 channel Sonance amp that I use for whole home audio. I have 5 zones: backyard, kitchen, living room, family room and bathroom. I have this all working in another “remote control” application but I am converting to home assistant and this is the last piece I can’t get working there.

I would like to have 4 buttons for each zone, power on, power off, volume up and volume down. I have the serial commands. I can send them with the previous app I mentioned and it works. I can send them in a putty TCP session and it works. But I cannot figure out how to get a script built to send the same.

Example commands:

zone 2 power on :Z21\x0D hex version: 3a 5a 32 31 0d
zone 2 power off :Z20\x0D hex 3a 5a 32 30 0d
zone 2 volume up: :V2++\x0D hex 3a 56 32 2b 2b 0d
zone 2 volume down :V2–\x0D hex 3a 56 32 2d 2d 0d

In Putty, it only works without the carriage return, but I’m hitting enter to trigger it.

The commands are sent to a global caceh itach ip2sl device and then via serial cable to the amp.

ip address is 192.168.1.114 and port 4999.

This topic seems about the closest to what I’m doing and is the most recent.

My vision for this is to have a Card with the media player at the top and the 4 control buttons at the bottom and to be able to short press the respective button. There are freedbacks with volume that could be used for a slider, but that’s not super important to me.

Any help or a point to a method would be very helpful

Hi,
happy to help. I haven’t figured out the problem of reading the commands. It was not super important for me and HA is simply a rabbit whole you can spent rest of your life. Thanks for @jocnnor for his idea but I still need to find some time to move on.

Regarding your question. I am doing exactly what you need. I believe that the solution I found is the most straitforward. Maybe I tuned it a bit to make it even easier.

My interface is as simple as it:


The power on uses input boolean you can create in HA/configuration. If my wife uses Siri, it keeps the state of the projector. If she uses IR remote control, I need to manually change the state but that’s detail. Dynamic Black is another input boolean. All other buttons are just simple ‘custom-button’ sending a command.

The rest is probably written in my other topic. Check it out and if it is not enough for you, come back. I will check whether I modified something since then.

1 Like

I really appreciate the response. Like you said, HA is a never ending rabbit hole. It’s frustrating in that I can send successful commands using an app that already works, the testing software provided by global cache for the itach ip2sl device, and Putty via telnet, but can’t do it (YET) with HA.

I’ve added a basic card for testing that looks like this:

type: ‘custom:button-card’
name: zone2_on
tap_action:
action: call-service
service: shell_command.zone2_on

That shows up in my dashboard and seems to be working.

in my config.yaml file I’ve added this:

shell_command:
zone2_on: ‘/bin/echo -e “:Z21” | netcat 192.168.0.49 4999’

I’ve tried about 5 different configurations of this for the above replacing what is in the double quotes with:

“:Z21\x0D”
“3a 5a 32 31 0d”
“\x3a\x5a\x32\x31\x0d”

I do have a USB to serial cable but have not tried the method you used for your projector of connecting the Pi4 directly to my amp. That requires some physical movement, relocating my pi to nearby the amp.

It’s baffling to me as a telnet session with putty sending just the plain text :Z21 to the ip/port triggers the zone 2 of the amp to come right on. I’d love to be able to replicate that with an HA button.

I dont follow what you wrote in the last two paragraphs. I have USB to serial cable directly connected between projector and RPi.

Btw, use three apostrophs when you write code in the discussion, it is really more readable. Like this. My configuration.yaml looks as follows:

shell_command:
  projector_on: echo -e -n '\x7E\x30\x30\x30\x30\x20\x31\x0D' > /dev/ttyUSB0
  projector_off: echo -e -n '\x7E\x30\x30\x30\x30\x20\x30\x0D' > /dev/ttyUSB0

I have the custom button configured the same way as you, that’s correct.

aah you use telnet. I cannot use it as my projector does not have RJ45 connector, so USB to serial was my only way

Ok. In my currently working setup I am using a 3rd party piece of hardware to tcp to serial communications. It’s from global cache, called itach ip2sl. I takes raw TCP commands and then communicates those to my amp via serial cable. So I can use a telnet to this device to send the commands on to my amp as well.

I have a usb to serial cable available so I have now moved my pi close to my amp and connected them. I see the serial info in the system hardware:

      /dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller_D-if00-port0
    attributes:
      DEVLINKS: >-
        /dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller_D-if00-port0
        /dev/serial/by-path/platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.1:1.0-port0
      DEVNAME: /dev/ttyUSB0
      DEVPATH: >-
        /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1:1.0/ttyUSB0/tty/ttyUSB0
      ID_BUS: usb
      ID_MODEL: USB-Serial_Controller_D
      ID_MODEL_ENC: USB-Serial\x20Controller\x20D
      ID_MODEL_ID: '2303'
      ID_PATH: 'platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.1:1.0'
      ID_PATH_TAG: platform-fd500000_pcie-pci-0000_01_00_0-usb-0_1_1_1_0
      ID_REVISION: '0400'
      ID_SERIAL: Prolific_Technology_Inc._USB-Serial_Controller_D
      ID_TYPE: generic
      ID_USB_DRIVER: pl2303
      ID_USB_INTERFACES: ':ff0000:'
      ID_USB_INTERFACE_NUM: '00'
      ID_VENDOR: Prolific_Technology_Inc.
      ID_VENDOR_ENC: Prolific\x20Technology\x20Inc.\x20
      ID_VENDOR_ID: 067b
      MAJOR: '188'
      MINOR: '0'
      SUBSYSTEM: tty
      USEC_INITIALIZED: '579463183924'  ```

I've updated my config.yaml with this:

``` shell_command:
   zone2_on: echo -e -n '3a 5a 32 31 0d' > /dev/ttyUSB0 ```

also tried:

``` shell_command:
   zone2_on: echo -e -n ':Z21\x0D' > /dev/ttyUSB0 ```

``` shell_command:
   zone2_on: echo -e -n ':\x3a\x5a\x32\x31\x0d' > /dev/ttyUSB0 ```

```shell_command:
   zone2_on: echo -e -n ':Z21' > /dev/ttyUSB0 ```

Ugh, sorry to anyone reading that above. I made a real mess of the text coding.

Have you been successful? When it comes to the proper syntax of the command, I was more successful in looking on general forums related to the topic rather than to forums of HA. Then, Roger, the guy who developed the software I used for testing (I am mentioning him in the other topic where I discussed the solution) was also very helpful but finally his software learnt me how to properly write the syntax

No success so far. I’m at a loss of how to trouble shoot further. Frustrating as I’m not seeing where the breakdown is. My only thinking is that the usb to serial connection requires some setup for baud rate, parity, etc. I’m not sure of a way to configure that.

I’ve continued to tinker with using telnet with netcat but will see if I can do some more tinkering with the direct connection.

I spent some hours to figure out the problem in the title of this topic: send command, read response. No success. There is definitely a way to have a sensor reading the device on the address but that should be able to read even success when I am sending commands to DLP projector when I am turning it on, which works. Sensor does not read that.

In your case. I did not set anything on the baud rate etc., I kept the defaults and it works. However, the telnet solution must be easy. What about some firewall on your router? Keep these barriers in mind as well

Hi SeldomSeen31 and for anyone else with a DAB1 - Sonance that they do not want to throw away :slight_smile:
For me, my DAB1 is using 19200 baud rate, so I just needed to set the port speed (defaults to 9600) using
stty -F /dev/ttyUSB1 19200

Then it would respond to my commands

[core-ssh ~]$ echo -e ":Z30\x0D" > /dev/ttyUSB1
[core-ssh ~]$ echo -e ":Z31\x0D" > /dev/ttyUSB1

First command is zone 3 off and second zone 3 on.

configuration.yaml

shell_command:
  zone3_off: echo -e ':Z30\x0D' > /dev/ttyUSB1
  zone3_on: echo -e ':Z31\x0D' > /dev/ttyUSB1

custom button


type: horizontal-stack
cards:
  - type: custom:button-card
    name: Study ON (zone3)
    tap_action:
      action: call-service
      service: shell_command.zone3_on
  - type: custom:button-card
    name: Study OFF (Zone3)
    tap_action:
      action: call-service
      service: shell_command.zone3_off

image

When I read your code, I don’t get where you receive the response from your device back to HA

The above does not read a response - just send a command ie. it’s one way.

Sorry, it’s not going to help you, but for completeness here is what I have done.
I have an arduino that I made a while back to decode IR and supply codes into the serial on the DAB (as the DAB1 IR would only control zone 1 - so stupid!).

The arduino plays a message broker/forwarder role - it takes in commands on the various serial and IR connections and sends them where they need to go. I made this in 2016 when i was using Domotiga, then moved to homeseer and now HA.

IR codes gets decoded by the arduino into DAB1 commands and sent to the DAB1 via Serial1
Commands from the PC come in on arduino Serial port 2 and are “forwarded” to the DAB1 serial port (Serial1)
Responses from the DAB1 come in on Serial1 and are sent out on the Arduino USB port

So I get “real time” status in HA regardless of using HA, remote, wall controller…and also get full IR control :slight_smile: of all zones from my all in one remote.

More than one way to skin an automation. A plugin would be better - but this does the job for me.

ok, please, could you be more specific how you read responses from your DAB over serial as sensors? Thank you.

Sure. here is my node red flow which handles the responses from the DAB1 one - only response comes in to this flow/serial port.

[{"id":"6ce4b00e8d09afee","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"b211fe56e25b7c93","type":"group","z":"6ce4b00e8d09afee","style":{"stroke":"#2e333a","stroke-opacity":"1","fill":"#383c45","fill-opacity":"0.5","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["01bcc466fa23b3e0","d59c48e33e54f45d","e94c72bbe197029f","46d72bba39130ac2"],"x":554,"y":319,"w":732,"h":82},{"id":"01bcc466fa23b3e0","type":"serial in","z":"6ce4b00e8d09afee","g":"b211fe56e25b7c93","name":"DAB1","serial":"e8a148f5faaa14e4","x":630,"y":360,"wires":[["d59c48e33e54f45d"]]},{"id":"d59c48e33e54f45d","type":"function","z":"6ce4b00e8d09afee","g":"b211fe56e25b7c93","name":"Process return Code","func":"var r = msg.payload.toString()\nvar parts = r.split(\"+\"); // Response is preceded by a + symbol\nvar response = parts[1];  // This is the text after the + symbol\n\nmsg.topic  = \"\";\nmsg.payload = \"\";\nmsg.valid = \"no\";\n// use the second element:\nif(response.length >0){\n  var command = response.substr(0,1).trim();\n  var param1  = response.substr(1, 1).trim();\n  var param2;\n    \n  switch(command) {\n    case \"Z\": // Zone On/Off\n      if(response.length ==2){\n        msg.topic = \"DAB1/Power\";\n        msg.payload = param1;\n        msg.valid = \"yes\";\n      }\n      else {\n        param2 = response.substr(2, response.length-3).trim();\n        msg.topic = \"DAB1/PowerZone\" + param1;\n        msg.payload = param2;\n        msg.valid = \"yes\";\n      }\n    break;\n    case \"S\": //Source\n      param2    = response.substr(2, 1);\n      msg.topic  = \"DAB1/SourceZone\" + param1;\n      msg.payload = param2;\n      msg.valid = \"yes\";\n      break;\n    case \"R\": // Tuner Memory. Note this can be 0 to 12\n      param1 = response.substr(1, response.length-2).trim();\n      msg.topic  = \"DAB1/Station\";\n      msg.payload = param1;\n      msg.valid = \"yes\";\n      break;    \n    case \"N\": // Tuner Band\n      msg.topic= \"DAB1/Band\";\n      msg.payload = param1;\n      msg.valid = \"yes\";\n      break;  \n    case \"V\": // Volume\n      param2 = response.substr(2, response.length-3).trim();\n      msg.topic= \"DAB1/VolumeZone\" + param1;\n      msg.payload = param2;\n      msg.valid = \"yes\";\n      break;    \n    case \"G\": // Page Volume\n      param2 = response.substr(2, response.length-3).trim();\n      msg.topic= \"DAB1/PageVolumeZone\" + param1;\n      msg.payload = param2;\n      msg.valid = \"yes\";\n      break;\n    case \"M\": // Mute\n      param2 = response.substr(2, 1).trim();\n      msg.topic  = \"MuteZone\" + param1;\n      msg.payload = param2;\n      msg.valid = \"yes\";\n      break;\n    case \"B\": // Balance Note: Param 2 can be -10 to +10\n      param2 = response.substr(2, response.length-3).trim();\n      msg.topic  = \"BalanceZone\" + param1;\n      msg.payload = param2;\n      msg.valid = \"yes\";\n      break;\n    case \"L\": // Bass\n      param2 = response.substr(2, response.length-3).trim();\n      msg.topic  = \"DAB1/BassZone\" + param1;\n      msg.payload = param2;\n      msg.valid = \"yes\";\n      break;\n    case \"T\": // Trebble\n      param2 = response.substr(2, response.length-3).trim();\n      msg.topic  = \"DAB1/TrebbleZone\" + param1;\n      msg.payload = param2;\n      msg.valid = \"yes\";\n      break;\n    default:\n      msg.topic  = \"DAB1/Failed\";\n  }\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":820,"y":360,"wires":[["e94c72bbe197029f"]]},{"id":"e94c72bbe197029f","type":"switch","z":"6ce4b00e8d09afee","g":"b211fe56e25b7c93","name":"","property":"valid","propertyType":"msg","rules":[{"t":"eq","v":"yes","vt":"str"},{"t":"neq","v":"yes","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1010,"y":360,"wires":[["46d72bba39130ac2"],[]]},{"id":"46d72bba39130ac2","type":"mqtt out","z":"6ce4b00e8d09afee","g":"b211fe56e25b7c93","name":"","topic":"","qos":"1","retain":"false","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"6b0783991fc336c8","x":1210,"y":360,"wires":[]},{"id":"e8a148f5faaa14e4","type":"serial-port","serialport":"/dev/serial/by-id/usb-Arduino__www.arduino.cc__0042_75439333535351306111-if00","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","waitfor":"","dtr":"none","rts":"none","cts":"none","dsr":"none","newline":"\\n","bin":"false","out":"char","addchar":"","responsetimeout":"10000"},{"id":"6b0783991fc336c8","type":"mqtt-broker","name":"HA MQTT","broker":"192.168.0.11","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""}]

And that feeds into MQTT sensors defined in the configuration.yaml ie…

 - platform: mqtt
    name: "DAB1_PowerZone3"
    state_topic: "DAB1/PowerZone3"

 - platform: mqtt
    name: "DAB1_VolumeZone3"
    state_topic: "DAB1/VolumeZone3"

Though - as I said - unless you have my setup (or similar splitting of the inbound and outbound serial traffic) it’s not much use. I also once did similar for a Tivo using Python so as I said, lots of ways to skin the home automation problem.

FWIW - here are my set of shell commands for the 3 zones I currently use. Ugly solution huh - but whatever - it works.

shell_command:
  set_19200_baud: stty -F /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0 19200
  dab1_am: echo -e ':N0\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_fm: echo -e ':N1\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_off_all: echo -e ':Z0\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_on_all: echo -e ':Z1\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_preset_1: echo -e ':R1\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_preset_2: echo -e ':R2\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_preset_3: echo -e ':R3\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_preset_4: echo -e ':R4\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_preset_5: echo -e ':R5\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_preset_6: echo -e ':R6\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_preset_7: echo -e ':R7\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_preset_8: echo -e ':R8\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_preset_9: echo -e ':R9\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_preset_10: echo -e ':R10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_preset_11: echo -e ':R11\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_preset_12: echo -e ':R12\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_balancedown: echo -e ':B1--\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_balanceup: echo -e ':B1++\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_balanceup10: echo -e ':B1+10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_balance0: echo -e ':B1-0\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_balancedown10: echo -e ':B1-10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_trebledown: echo -e ':H1--\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_trebleup: echo -e ':H1++\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_trebleup10: echo -e ':H1+10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_treble0: echo -e ':H1-0\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_trebledown10: echo -e ':H1-10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_bassdown: echo -e ':L1--\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_bassup: echo -e ':L1++\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_bassup10: echo -e ':L1+10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_bass0: echo -e ':L1-0\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_bassdown10: echo -e ':L1-10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_mute_off: echo -e ':M10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_mute_on: echo -e ':M11\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_mute_toggle: echo -e ':P1114\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_source1: echo -e ':S11\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_source2: echo -e ':S12\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_source3: echo -e ':S13\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_source4: echo -e ':S14\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_voldown: echo -e ':V1--\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_volup: echo -e ':V1++\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_vol10: echo -e ':V110\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_vol20: echo -e ':V120\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_vol30: echo -e ':V130\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_vol40: echo -e ':V140\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_off: echo -e ':Z10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone1_on: echo -e ':Z11\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_balancedown: echo -e ':B2--\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_balanceup: echo -e ':B2++\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_balanceup10: echo -e ':B2+10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_balance0: echo -e ':B2-0\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_balancedown10: echo -e ':B2-10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_trebledown: echo -e ':H2--\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_trebleup: echo -e ':H2++\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_trebleup10: echo -e ':H2+10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_treble0: echo -e ':H2-0\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_trebledown10: echo -e ':H2-10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_bassdown: echo -e ':L2--\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_bassup: echo -e ':L2++\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_bassup10: echo -e ':L2+10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_bass0: echo -e ':L2-0\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_bassdown10: echo -e ':L2-10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_mute_off: echo -e ':M20\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_mute_on: echo -e ':M21\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_mute_toggle: echo -e ':P2114\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_source1: echo -e ':S21\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_source2: echo -e ':S22\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_source3: echo -e ':S23\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_source4: echo -e ':S24\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_voldown: echo -e ':V2--\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_volup: echo -e ':V2++\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_vol10: echo -e ':V210\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_vol20: echo -e ':V220\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_vol30: echo -e ':V230\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_vol40: echo -e ':V240\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_off: echo -e ':Z20\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone2_on: echo -e ':Z21\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_balancedown: echo -e ':B3--\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_balanceup: echo -e ':B3++\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_balanceup10: echo -e ':B3+10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_balance0: echo -e ':B3-0\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_balancedown10: echo -e ':B3-10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_trebledown: echo -e ':H3--\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_trebleup: echo -e ':H3++\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_trebleup10: echo -e ':H3+10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_treble0: echo -e ':H3-0\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_trebledown10: echo -e ':H3-10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_bassdown: echo -e ':L3--\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_bassup: echo -e ':L3++\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_bassup10: echo -e ':L3+10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_bass0: echo -e ':L3-0\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_bassdown10: echo -e ':L3-10\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_mute_off: echo -e ':M30\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_mute_on: echo -e ':M31\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_mute_toggle: echo -e ':P3114\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_source1: echo -e ':S31\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_source2: echo -e ':S32\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_source3: echo -e ':S33\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_source4: echo -e ':S34\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_voldown: echo -e ':V3--\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_volup: echo -e ':V3++\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_vol10: echo -e ':V310\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_vol20: echo -e ':V320\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_vol30: echo -e ':V330\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_vol40: echo -e ':V340\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_off: echo -e ':Z30\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0
  dab1_zone3_on: echo -e ':Z31\x0D' > /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9014HGD-if00-port0

Getting there :slight_smile:

1 Like