Adding custom udp device

Trying to add Emotiva xpa-2 codes (the xmc1 codes work but mute doesn’t work, and feedback doesn’t seem to work so I figured I’d give it a go and learn something). Have bbedit in mac os and can edit and save the file, the issue seems to be that bbedit does not like the formatting of tags that Emotiva specifies. I can save the file if I remove the actual key code, but if i try to save it as-is I get a bbedit error 20022 malformed binary file.

Not sure if I should have the text after formatted with quotes or something to escape it? Any clues?

<key>codes</key>
<array>
	<dict>
		<key>brand</key>
		<string>Emotiva</string>
		<key>cat</key>
		<string>XMC-2 Zone 1</string>
		<key>type</key>
		<integer>16</integer>
		<key>codes</key>
		<dict>
			<key>.POWER STATUS</key><string><?xml version="1.0" encoding="utf-8"?>
				<emotivaUpdate>
				<power />
				</emotivaUpdate></string>
		</dict>
		<key>method</key>
		<string>udp</string>
	</dict>
</array>

You need to put that in a CDATA.

<string>
    <![CDATA[
        <emotivaUpdate>
            <power />
        </emotivaUpdate>
    ]]>
</string>

You can include or exclude the prolog line (?<xml line). It is not strictly required.

Awesome thank you! That works. I saw a reference to cdata but didn’t know if it would be interpreted correctly in the database etc and hadn’t had time to test so your comment was very helpful. I’ll build out the rest of the commands and see how it goes. Appreciate it!

Mute is working now and added most of the commands in the xmc-1 device. I’m hoping to get feedback working and thinking that when it works maybe Roomie will use the volume dial and show the mode etc? The emotiva has a subscription model for feedback, not sure if I’m doing it right or if that’s even the reason the volume dial isn’t showing up rather than the volume +/- keys.

Tried adding .status with a subscription to all the feedbacks I’m expecting and then having the update commands request an update rather than a subscription. Also tried changing ack to yes on the various commands.

Tried adding the subscription to the status command as well:

			<key>.VOLUME STATUS</key>
			<string>
				<![CDATA[
					<emotivaSubscription>
						<volume />
					</emotivaSubscription>
					<emotivaUpdate>
						<volume />
					</emotivaUpdate>
				]]>
			</string>			

The overall command set, this was before changing ack to yes:

		<key>brand</key>
		<string>Emotiva</string>
		<key>cat</key>
		<string>XMC-2 Zone 1</string>
		<key>type</key>
		<integer>16</integer>
		<key>codes</key>
		<dict>
			<key>.STATUS</key>
			<string>
				<![CDATA[
					<emotivaSubscription>
						<power />
						<volume />
						<zone2_power />
						<source />
						<mode />
					</emotivaSubscription>
				]]>
			</string>			
			<key>.POWER STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<power />
					</emotivaUpdate>
				]]>
			</string>			
			<key>.VOLUME STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<volume />
					</emotivaUpdate>
				]]>
			</string>			
			<key>.INPUT STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<source />
					</emotivaUpdate>
				]]>
			</string>			
			<key>.MODE STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<audio_bitstream />
					</emotivaUpdate>
				]]>
			</string>			
			<key>.VOLUME FORMAT</key>
			<string>1</string>			
			<key>.INPUT STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<input />
					</emotivaUpdate>
				]]>
			</string>			
			<key>POWER OFF</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<power_off value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>POWER ON</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<power_on value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>VOLUME UP</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<volume value="+1" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>VOLUME DOWN</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<volume value="-1" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>MUTE OFF</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<mute_off value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>MUTE ON</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<mute_on value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>MUTE TOGGLE</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<mute value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>CENTER VOLUME UP</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<center value="+1" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>CENTER VOLUME DOWN</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<center value="-1" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>SURROUND VOLUME UP</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<surround value="+1" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>SURROUND VOLUME DOWN</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<surround value="-1" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>BACK VOLUME UP</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<back value="+1" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>BACK VOLUME DOWN</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<back value="-1" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>SUBWOOFER VOLUME UP</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<subwoofer value="+1" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>SUBWOOFER VOLUME DOWN</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<subwoofer value="-1" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>CURSOR UP</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<up value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>CURSOR RIGHT</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<right value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>CURSOR DOWN</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<down value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>CURSOR LEFT</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<left value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>CURSOR ENTER</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<enter value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>MENU</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<menu value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>INFO</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<info value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>MODE UP</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<mode value="+1" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>MODE DOWN</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<mode value="-1" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>MODE MOVIE</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<movie value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>MODE MUSIC</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<music value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>MODE REFERENCE STEREO</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<reference_stereo value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>BAND</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<zone1_band value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>INPUT 1</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<source_1 value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>INPUT 2</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<source_2 value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>INPUT 3</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<source_3 value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>INPUT 4</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<source_4 value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>INPUT 5</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<source_5 value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>INPUT 6</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<source_6 value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>INPUT 7</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<source_7 value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
			<key>INPUT 8</key>
			<string>
				<![CDATA[
					<emotivaControl>
						<source_8 value="0" ack="no" />
					</emotivaControl>
				]]>
			</string>
		</dict>
		<key>method</key>
		<string>udp</string>
	</dict>
</array>

Okay did some testing with packetsender. It appears a subscription is not necessary to get updates, so I think this code is better:

			<key>.STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<power />
						<volume />
						<source />
						<mode />
					</emotivaUpdate>
				]]>
			</string>			
			<key>.POWER STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<power />
					</emotivaUpdate>
				]]>
			</string>			
			<key>.VOLUME STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<volume />
					</emotivaUpdate>
				]]>
			</string>			
			<key>.INPUT STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<source />
					</emotivaUpdate>
				]]>
			</string>			
			<key>.MODE STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<audio_bitstream />
					</emotivaUpdate>
				]]>
			<key>.VOLUME FORMAT</key>
			<string>1</string>			
			<key>.INPUT STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<input />
					</emotivaUpdate>
				]]>
			</string>			

If I send just the volume update in packetsender like this

			<key>.VOLUME STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<volume />
					</emotivaUpdate>
				]]>
			</string>		

I get back the volume

\àÅ~TìùÚòE@@¶.À¨iÀ¨|ZZuòØ<?xml version="1.0"?>
<emotivaUpdate>
  <volume value="-26.0" visible="true" status="ack"/>
</emotivaUpdate>

Sending the overall .status code (I’m guessing this is sent when Roomie starts communicating initially maybe?)

			<key>.STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<power />
						<volume />
						<source />
						<mode />
					</emotivaUpdate>
				]]>



\àÅ~TìùÚòE0@@µÀ¨iÀ¨|ZZï<?xml version="1.0"?>
<emotivaUpdate>
  <power value="Off" visible="true" status="ack"/>
  <volume value="-26.0" visible="true" status="ack"/>
  <source value="HDMI 1" visible="true" status="ack"/>
  <mode value="Dolby Surround" visible="true" status="ack"/>
</emotivaUpdate>

One potential issue I see is that the sample pioneer code has mute status and it doesn’t look like the emotiva has it, it’s not documented and sending a mute status request gets back a nack.

From the ddk example,

		<key>.STATUS</key><string>?P\r?V\r?F\r?L\r?M</string>

This is asking for power ?P, volume ?V, input ?F, mode ?L, mute ?M, not sure if the order matters or if possibly since mute status isn’t included it won’t work?

The volume format 1 appears to be correct per the ddk. Wondering if there is some trick to getting the volume dial to show up?

There is an existing “XMC-1 Zone 1” codeset that seems to do everything you’re trying to do, but was likely created speculatively many years ago so may have issues. Developing your own codeset is unlikely to be the best solution here as feedback parsing does exist. However, in this rare case, you may be able to fix it in your own codeset because the internal parsing already exists… The .STATUS we use is:

<key>.STATUS</key><string>&lt;emotivaUpdate&gt;&lt;volume /&gt;&lt;/emotivaUpdate&gt;</string>

The CDATA stuff is another way of writing that, but easier to just use Xcode encoding per above and forget the whole thing.

The MUTE command simply looks mis-named in the internal codeset. It should be “MUTE TOGGLE” with whatever value is correct for that. Or it should be 2 commands ON and OFF.

To get the volume dial, in this very rare case where the parsing already exists, you would need to add this block to the top level keys:

	    <key>codeSetMetadata</key>
		<dict>
			<key>deviceConfigurationC</key>
			<dict>
				<key>volume</key><true/>
			</dict>
		</dict>

Thanks. Trying that and didn’t get the dial. When you say parsing already exists do you mean that you have to internally write the parsing per device such as Emotiva, Denon, etc have their own format? Tried removing the last capital C in deviceConfigurationC as well thinking it was maybe a typo but did not work for me.

		<key>brand</key>
		<string>Emotiva</string>
		<key>cat</key>
		<string>XMC-2 Zone 1</string>
		<key>type</key>
		<integer>16</integer>
		<key>codeSetMetadata</key>
		<dict>
			<key>deviceConfigurationC</key>
			<dict>
				<key>volume</key><true/>
			</dict>
		</dict>				
		<key>codes</key>
		<dict>
			<key>.STATUS</key>
			<string>
				<![CDATA[
					<emotivaUpdate>
						<power />
						<volume />
						<source />
						<mode />
					</emotivaUpdate>
				]]>
			</string>

Based on what you posted above, you’re missing a .VOLUME SET command which is required for a dial.

Cool thanks Will. Okay yes that makes perfect sense. Now have dial but not feedback. Sorry to keep bugging you but do you think the .STATUS lines look correct? Am I missing a config to get the device to expect to need to parse responses?

Use my .STATUS command not yours.

Then switch the metadata block to this:

		<key>codeSetMetadata</key>
		<dict>
			<key>deviceConfiguration</key>
			<dict>
				<key>volume</key><true/>
				<key>fbs</key>
				<array>
					<dict><key>device</key><string>i</string><key>fbType</key><integer>0</integer><key>freq</key><integer>1</integer><key>notMain</key><true/></dict>
				</array>
			</dict>
		</dict>

It must have been when I did a codeset update, Roomie took out the cdata tags and put xcode, so I went through and cleaned up and took out tabs etc, it’s a lot more concise now. Not getting feedback still though. Thanks again.

		<key>brand</key>
		<string>Emotiva</string>
		<key>cat</key>
		<string>XMC-2 Zone 1</string>
		<key>codeSetMetadata</key>
		<dict>
			<key>deviceConfiguration</key>
			<dict>
				<key>volume</key><true/>
				<key>fbs</key>
				<array>
					<dict><key>device</key><string>i</string><key>fbType</key><integer>0</integer><key>freq</key><integer>1</integer><key>notMain</key><true/></dict>
				</array>
			</dict>
		</dict>	
		<key>codes</key>
		<dict>
			<key>.STATUS</key><string>&lt;emotivaUpdate&gt;&lt;volume /&gt;&lt;/emotivaUpdate&gt;</string>
			<key>.INPUT STATUS</key><string>&lt;emotivaUpdate&gt;&lt;input /&gt;&lt;/emotivaUpdate&gt;</string>
			<key>.MODE STATUS</key><string>&lt;emotivaUpdate&gt;&lt;audio_bitstream /&gt;&lt;/emotivaUpdate&gt;</string>
			<key>.POWER STATUS</key><string>&lt;emotivaUpdate&gt;&lt;power /&gt;&lt;/emotivaUpdate&gt;</string>
			<key>.INPUT STATUS</key><string>&lt;emotivaUpdate&gt;&lt;input /&gt;&lt;/emotivaUpdate&gt;</string>
			<key>.VOLUME FORMAT</key><string>1</string>
			<key>.VOLUME SET</key><string>&lt;emotivaControl&gt;&lt;set_volume value="##" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>.VOLUME STATUS</key><string>&lt;emotivaUpdate&gt;&lt;volume /&gt;&lt;/emotivaUpdate&gt;</string>
			<key>BACK VOLUME DOWN</key><string>&lt;emotivaControl&gt;&lt;back value="-1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>BACK VOLUME UP</key><string>&lt;emotivaControl&gt;&lt;back value="+1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>BAND</key><string>&lt;emotivaControl&gt;&lt;zone1_band value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>CENTER VOLUME DOWN</key><string>&lt;emotivaControl&gt;&lt;center value="-1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>CENTER VOLUME UP</key><string>&lt;emotivaControl&gt;&lt;center value="+1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>CURSOR ENTER</key><string>&lt;emotivaControl&gt;&lt;enter value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>CURSOR UP</key><string>&lt;emotivaControl&gt;&lt;up value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>CURSOR RIGHT</key><string>&lt;emotivaControl&gt;&lt;right value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>CURSOR DOWN</key><string>&lt;emotivaControl&gt;&lt;down value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>CURSOR LEFT</key><string>&lt;emotivaControl&gt;&lt;left value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>DIM</key><string>&lt;emotivaControl&gt;&lt;dim value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>INFO</key><string>&lt;emotivaControl&gt;&lt;info value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>INPUT 1</key><string>&lt;emotivaControl&gt;&lt;source_1 value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>INPUT 2</key><string>&lt;emotivaControl&gt;&lt;source_2 value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>INPUT 3</key><string>&lt;emotivaControl&gt;&lt;source_3 value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>INPUT 4</key><string>&lt;emotivaControl&gt;&lt;source_4 value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>INPUT 5</key><string>&lt;emotivaControl&gt;&lt;source_5 value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>INPUT 6</key><string>&lt;emotivaControl&gt;&lt;source_6 value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>INPUT 7</key><string>&lt;emotivaControl&gt;&lt;source_7 value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>INPUT 8</key><string>&lt;emotivaControl&gt;&lt;source_8 value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>MENU</key><string>&lt;emotivaControl&gt;&lt;menu value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>MODE DOWN</key><string>&lt;emotivaControl&gt;&lt;mode value="-1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>MODE UP</key><string>&lt;emotivaControl&gt;&lt;mode value="+1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>MODE MOVIE</key><string>&lt;emotivaControl&gt;&lt;movie value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>MODE MUSIC</key><string>&lt;emotivaControl&gt;&lt;music value="0'"ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>MODE REFERENCE STEREO</key><string>&lt;emotivaControl&gt;&lt;reference_stereo value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>MODE MUTE ON</key><string>&lt;emotivaControl&gt;&lt;mute_on value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>MODE MUTE OFF</key><string>&lt;emotivaControl&gt;&lt;mute_off value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>MUTE TOGGLE</key><string>&lt;emotivaControl&gt;&lt;mute value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>POWER ON</key><string>&lt;emotivaControl&gt;&lt;power_on value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>POWER OFF</key><string>&lt;emotivaControl&gt;&lt;power_off value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>SPEAKER PRESET</key><string>&lt;emotivaControl&gt;&lt;speaker_preset value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>SUBWOOFER VOLUME DOWN</key><string>&lt;emotivaControl&gt;&lt;subwoofer value="-1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>SUBWOOFER VOLUME UP</key><string>&lt;emotivaControl&gt;&lt;subwoofer value="+1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>SURROUND VOLUME DOWN</key><string>&lt;emotivaControl&gt;&lt;surround value="-1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>SURROUND VOLUME UP</key><string>&lt;emotivaControl&gt;&lt;surround value="+1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>SUBWOOFER VOLUME DOWN</key><string>&lt;emotivaControl&gt;&lt;subwoofer value="-1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>SUBWOOFER VOLUME UP</key><string>&lt;emotivaControl&gt;&lt;subwoofer value="+1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>TUNER PRESET 1</key><string>&lt;emotivaControl&gt;&lt;channel_1 value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>TUNER PRESET 2</key><string>&lt;emotivaControl&gt;&lt;channel_2 value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>TUNER PRESET 3</key><string>&lt;emotivaControl&gt;&lt;channel_3 value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>TUNER PRESET 4</key><string>&lt;emotivaControl&gt;&lt;channel_4 value="0" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>TUNER PRESET DOWN</key><string>&lt;emotivaControl&gt;&lt;channel value="-1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>TUNER PRESET UP</key><string>&lt;emotivaControl&gt;&lt;channel value="+1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>TUNER SEEK DOWN</key><string>&lt;emotivaControl&gt;&lt;seek value="-1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>TUNER SEEK UP</key><string>&lt;emotivaControl&gt;&lt;seek value="+1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>TUNER TUNE DOWN</key><string>&lt;emotivaControl&gt;&lt;frequency value="-1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>TUNER TUNE UP</key><string>&lt;emotivaControl&gt;&lt;frequency value="+1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>VOLUME DOWN</key><string>&lt;emotivaControl&gt;&lt;volume value="-1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
			<key>VOLUME UP</key><string>&lt;emotivaControl&gt;&lt;volume value="+1" ack="yes" /&gt;&lt;/emotivaControl&gt;</string>
		</dict>
		<key>method</key>
		<string>udp</string>
		<key>type</key>
		<integer>16</integer>
	</dict>

Since none of this is supposed to work, it’s not surprising. You would need to use the diagnostic log in beta (pinch screen) to dig deeper.