Overview


The sound from this speaker is amazing and I wanted something more portable with great sound. So, a few years back I wired in a USB bluetooth receiver and added lithium ion batteries to this speaker to make it portable and bluetooth enabled. 

I ended up powering it with a 2S2P battery pack for a voltage output of around 3.7v x2  ~= 7.4v and about 4Ah at 7.4V or 29.6Wh.


After using this for a couple of years, I noticed that sometimes the bluetooth would not connect. My current theory is that the voltage eventually gets too low to power the USB. I think this is because I opted to to power it with only a 7.4 volts battery.


I think it is time to update this speaker with a 3S2P battery pack for a voltage of about 11.1v which should give it the longevity it deserves. The upper voltage would be 12.6v while the low voltage would be 9v. The capacity of this new pack should be about 4Ah @11.1V or 44.4Wh


Speaker Power Consumption

Power consumption recording while idle and while listening to some tunes.

Off (Momentary Switch)

- disabled now

15 mA / 0.19w
Idle   30 mA  / 0.38w 
Running  280 mA /  3.5 w


Off Time 

(33.8Wh / 0.19 W)

~7.5 days

Standby Time

(33.8 Wh / 0.38 W)

~3.5 days

Run Time

(33.8 Wh / 3.5 W)

~9.5 hours



Bluetooth Module

Specifications

  • High Bluetooth V5.0 makes your non-Bluetooth devices Bluetooth-Enabled, easily transmit audio wirelessly. It's compatible with a variety of Bluetooth devices.
  • With aptX lantency technology, this adapter provides fast, stable and smooth transmision without audio delay. You will get a rich and clear sound experience and enjoy comfortable audio-video synchronization.
  • Transmitter Mode: Plug into your non-Bluetooth device like TV, PC, CD player, MP3/MP4 and pair to your Bluetooth speakers and headphones. Receiver Mode: Plug into your non-Bluetooth Home/Vehicle Sound Systems and pair to your smart phone.
  • Mini Bluetooth adapter, no need any drivers, plug in the USB port to use. One-button switching mode, red light for transmitting mode, blue light for receiver mode.
  • Charge it on the USB port, never worry about running out of power when you use it. Enjoy 1 year warranty.


I confirmed that the last mode is preserved after powering off/on.

Pictures of Initial Conversion V1


Revision V2

As part of this revision, we are going to add a bigger battery to the speaker.

This new battery build will use 6 - 18650 Lithium Ion batteries with a capacity of about 2Ah each.

Battery Build

We are building a 3S2P 11.1V (12.6v Max) Lithium Ion battery. 

Testing shows a capacity of our battery pack around 3.20Ah or 33.77Wh


BMS

Module name: 3S 12.6V Li-ion Lithium Battery 18650 Charger Protection PCB Board Suitable range: For nominal voltage 3.6V 3.7V lithium battery(Including 18650,26650, lithium polymer batteries)

SpecificationValue
Charging voltage12.6V - 13.0V
Maximum output current20A
Maximum output power / charging power252W
Low Voltage Disconnect9V or 3V/cell
Size59 x 20 x 3.4mm


Buck Converter

Specifications

Module propertyNon-isolated buck module
Input voltage3.2-40V (try not to exceed 38V as input)
Output voltage1.25-35V continuously adjustable
Output current0-3A
Working temperature-40~+85 degrees
Working frequency180KHz
Conversion efficiencyup to 92% (efficiency related to input, output voltage, current, voltage difference)
Switching frequency65KHz
Output ripple<30mV
Short circuit protectionLimited current 8A
Over temperature protectionAutomatically turn off the output after over temperature
Input reverse connection protectionNone, (If necessary, please input a large current diode in the input string)


Question: Can we safely charge this with our 14.6v 20A Charger?

Answer: No, charger toggles between charge and standby and battery shows 13+ volts. The BMS is disconnecting and reconnecting because the voltage is too high.


Perhaps we can add a voltage regulator with the output set to about 12.6v ?


When using the supplied AC/DC wall plug (output=12.2v), the buck converter outputs about 11.5v. This is above the nominal voltage which should still charge the battery.

When charging from a vehicle or RV, this should not be an issue since the voltage is typically higher than 12.6v. We might think about replacing the wall ACDC plug with one that outputs about 14v or higher at 3A.

We replaced the AC/DC wall plug with a 16.8V 1A 4s Lithium Battery Charger Adapter.


Installation

So, we added a buck converter to the input which drops the voltage to 12.9v to charge the battery and power the speaker. This buck module was simply hot glued to to the bottom of the board.


A toggle switch was added to disconnect the stereo from the power inputs. This decreases the "standby" load to 15mA as opposed to 30mA.

An added bonus is that it is easier to operate the toggle and toggling on always turns on the unit.


And voila, all done and running on battery and it sounds amazing!


Revision V3

Going to rework this so I don't need the buck converter or I replace the buck converter with a buck/boost converter.

At present it doesn't seem like it is charging to full capacity with the buck converter. Could also just be the battery level monitor. We shall see.


I opted to use a buck boost converter. Tested it out and it holds the voltage steady with varying input voltage. Seems like it is the best option.

Buck/Boost Converter

https://www.amazon.ca/gp/product/B0CCHPPKW4/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

XL6009 buck boost converter

  • With automatic voltage boosting and bucking function.
  • ⚡【Input Voltage】:3.8~32V.
  • ⚡【Output Voltages】:1.25~35V.
  • ⚡【Input Current】:3A (max), no load 18mA (5V input, 8V output, no load less than 18mA. The higher the voltage, the higher the no load current.)
  • ⚡【Conversion efficiency】:<94% (the higher the differential pressure, the lower the efficiency)

Wiring

Using Buck/Boost Converter


We replaced the AC/DC wall plug with a 12V 2.5A Adapter. The previous one died from overheating.

Testing reveals that the speaker pulls upwards of 3A when charging.


The DC jack has the following specifications:

TypeD7
OD4 mm
ID1.7 mm


Additionnel Changes

I also cut the power toggle trace since I always seem to accidentally hit this. When powering on with the switch, the unit defaults to always power on.


I also ended up replacing the speaker connector since it broke apart.


Additional Information


The majority of this information is applicable to using the speaker with Airplay. 

Does not work with the above hack.

IOS App

Philips SoundStudio


Port Scan

Not shown: 995 closed tcp ports (conn-refused)
PORT     STATE SERVICE    VERSION
80/tcp   open  http?
443/tcp  open  https?
1025/tcp open  rtsp       Apple AirTunes rtspd 103.2
1900/tcp open  tcpwrapped
8080/tcp open  http       Pioneer VSX-921, Denon DNP-720AE, or Marantz AV7005 AV receiver http config
Service Info: Device: media device


WIFI Endpoints

When we enable the access point on the speaker, we can access some endpoints.

EndpointDescription
http://192.168.1.1/pc_index.aspHome page
http://192.168.1.1/1000/wireless_network_config.asp

Wifi Network Config


http://192.168.1.1/goform/formHandlerConfigureProfileSettings

Set Wifi Network Cofig

Parameters

ParameterSample Value
SSIDmywifi%28WPA2+TKIP%2BCCMP%29
SSID1
Security1NONE
Key0
Key1
Key2
Key3
KeyIndex1
Passphrasepassword
Passphrase1password
Cipher1TKIP
DHCPClient

http://192.168.1.1:8080/description.xml


eDMP3.9_CE2

BridgeCo (later acquired by SMSC, then Microchip) made turnkey DLNA/AirPlay platforms.

Philips appears to have built their product on top of BridgeCo's reference software.

description.xml
<?xml version="1.0"?>
<root
  xmlns="urn:schemas-upnp-org:device-1-0"
  xmlns:ms=" urn:microsoft-com:wmc-1-0"
  xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11"
  xmlns:df="http://schemas.microsoft.com/windows/2008/09/devicefoundation">
	<specVersion>
		<major>1</major>
		<minor>0</minor>
	</specVersion>
	<device
	  ms:X_MS_SupportsWMDRM="true">
		<dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMR-1.50</dlna:X_DLNADOC>
		<pnpx:X_compatibleId>MS_DigitalMediaDeviceClass_DMR_V001
				</pnpx:X_compatibleId>
		<pnpx:X_deviceCategory>MediaDevices
				</pnpx:X_deviceCategory>
		<pnpx:X_hardwareId>BridgecoCE2DM870_0xBD VEN_14E7&DEV_0001&REV_01
				</pnpx:X_hardwareId>
		<df:X_deviceCategory>Multimedia.DMR
				</df:X_deviceCategory>
		<deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
		<friendlyName>unknown</friendlyName>
		<manufacturer></manufacturer>
		<manufacturerURL></manufacturerURL>
		<modelDescription>eDMP3.9_CE2</modelDescription>
		<modelName>eDMP3.9_CE2</modelName>
		<modelNumber></modelNumber>
		<modelURL></modelURL>
		<serialNumber>0025D16935B5</serialNumber>
		<UDN>uuid:5f9ec1b3-ed59-1900-4530-0025d16935b5</UDN>
		<UPC>123810928305556upc</UPC>
		<iconList>
			<icon>
				<mimetype>image/jpeg</mimetype>
				<width>48</width>
				<height>48</height>
				<depth>24</depth>
				<url>/BCO_device_sm_icon.jpg</url>
			</icon>
			<icon>
				<mimetype>image/jpeg</mimetype>
				<width>120</width>
				<height>120</height>
				<depth>24</depth>
				<url>/BCO_device_lrg_icon.jpg</url>
			</icon>
			<icon>
				<mimetype>image/png</mimetype>
				<width>48</width>
				<height>48</height>
				<depth>24</depth>
				<url>/BCO_device_sm_icon.png</url>
			</icon>
			<icon>
				<mimetype>image/png</mimetype>
				<width>120</width>
				<height>120</height>
				<depth>24</depth>
				<url>/BCO_device_lrg_icon.png</url>
			</icon>
		</iconList>
		<serviceList>
			<service>
				<serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>
				<serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>
				<SCPDURL>/RenderingControl/desc.xml</SCPDURL>
				<controlURL>/RenderingControl/ctrl</controlURL>
				<eventSubURL>/RenderingControl/evt</eventSubURL>
			</service>
			<service>
				<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
				<serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
				<SCPDURL>/ConnectionManager/desc.xml</SCPDURL>
				<controlURL>/ConnectionManager/ctrl</controlURL>
				<eventSubURL>/ConnectionManager/evt</eventSubURL>
			</service>
			<service>
				<serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
				<serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>
				<SCPDURL>/AVTransport/desc.xml</SCPDURL>
				<controlURL>/AVTransport/ctrl</controlURL>
				<eventSubURL>/AVTransport/evt</eventSubURL>
			</service>
			<service>
				<serviceType>urn:schemas-dm-holdings-com:service:X_HtmlPageHandler:1</serviceType>
				<serviceId>urn:schemas-dm-holdings-com:serviceId:X_HtmlPage</serviceId>
				<SCPDURL>/HtmlPageHandler/desc.xml</SCPDURL>
				<controlURL>/HtmlPageHandler/ctrl</controlURL>
				<eventSubURL>/HtmlPageHandler/evt</eventSubURL>
			</service>
		</serviceList>
		<deviceList>
			<device>
				<deviceType>urn:schemas-upnp-org:device:WholeHomeAudioDevice:1</deviceType>
				<friendlyName>unknown</friendlyName>
				<manufacturer></manufacturer>
				<manufacturerURL></manufacturerURL>
				<modelDescription>eDMP3.9_CE2</modelDescription>
				<modelName>eDMP3.9_CE2</modelName>
				<modelNumber></modelNumber>
				<UDN>uuid:WholeHomeAudio-Embedded-Device</UDN>
				<serviceList>
					<service>
						<serviceType>urn:schemas-dm-holdings-com:service:X_WholeHomeAudio:1</serviceType>
						<serviceId>urn:schemas-dm-holdings-com:serviceId:X_WholeHomeAudio:1</serviceId>
						<SCPDURL>/WholeHomeAudio/desc.xml</SCPDURL>
						<controlURL>/WholeHomeAudio/ctrl</controlURL>
						<eventSubURL>/WholeHomeAudio/evt</eventSubURL>
					</service>
				</serviceList>
			</device>
		</deviceList>
		<presentationURL>http://192.168.1.1</presentationURL>
	</device>
</root>


Soap APIs

URLDescription
/RenderingControl/ctrl

ListPresets

FactoryDefaults, InstallationDefaults


SelectPreset



GetMute / SetMute
GetVolume / SetVolume

But the only allowed preset listed is: FactoryDefaults


The capabilities are defined in:  /RenderingControl/desc.xml

curl http://192.168.1.1:8080/RenderingControl/desc.xml

<?xml version="1.0"?>
<scpd
  xmlns="urn:schemas-upnp-org:service-1-0">
	<specVersion>
		<major>1</major>
		<minor>0</minor>
	</specVersion>
	<actionList>
		<action>
			<name>ListPresets</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>CurrentPresetNameList</name>
					<direction>out</direction>
					<relatedStateVariable>PresetNameList</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>SelectPreset</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>PresetName</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_PresetName</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetMute</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>Channel</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
				</argument>
				<argument>
					<name>CurrentMute</name>
					<direction>out</direction>
					<relatedStateVariable>Mute</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>SetMute</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>Channel</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
				</argument>
				<argument>
					<name>DesiredMute</name>
					<direction>in</direction>
					<relatedStateVariable>Mute</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetVolume</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>Channel</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
				</argument>
				<argument>
					<name>CurrentVolume</name>
					<direction>out</direction>
					<relatedStateVariable>Volume</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>SetVolume</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>Channel</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
				</argument>
				<argument>
					<name>DesiredVolume</name>
					<direction>in</direction>
					<relatedStateVariable>Volume</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
	</actionList>
	<serviceStateTable>
		<stateVariable sendEvents="no">
			<name>PresetNameList</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="yes">
			<name>LastChange</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>Mute</name>
			<dataType>boolean</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>Volume</name>
			<dataType>ui2</dataType>
			<allowedValueRange>
				<minimum>0</minimum>
				<maximum>100</maximum>
				<step>1</step>
			</allowedValueRange>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_Channel</name>
			<dataType>string</dataType>
			<allowedValueList>
				<allowedValue>Master</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_InstanceID</name>
			<dataType>ui4</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_PresetName</name>
			<dataType>string</dataType>
			<allowedValueList>
				<allowedValue>FactoryDefaults</allowedValue>
			</allowedValueList>
		</stateVariable>
	</serviceStateTable>
</scpd>


Get Presets

curl -s \
  -H 'Content-Type: text/xml; charset="utf-8"' \
  -H 'SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#ListPresets"' \
  --data '<?xml version="1.0" encoding="utf-8"?>
<s:Envelope
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
    s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:ListPresets
        xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1">
      <InstanceID>0</InstanceID>
    </u:ListPresets>
  </s:Body>
</s:Envelope>' \
  http://192.168.1.1:8080/RenderingControl/ctrl


Set Preset

curl -s \
  -H 'Content-Type: text/xml; charset="utf-8"' \
  -H 'SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SelectPreset"' \
  --data '<?xml version="1.0" encoding="utf-8"?>
<s:Envelope
  xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
  s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:SelectPreset xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1">
      <InstanceID>0</InstanceID>
      <PresetName>Jazz</PresetName>
    </u:SelectPreset>
  </s:Body>
</s:Envelope>' \
  http://192.168.1.1:8080/RenderingControl/ctrl



/AVTransport/ctrl

Play, Pause, Stop, etc.

curl http://192.168.1.1:8080/AVTransport/desc.xml

<?xml version="1.0"?>
<scpd
  xmlns="urn:schemas-upnp-org:service-1-0">
	<specVersion>
		<major>1</major>
		<minor>0</minor>
	</specVersion>
	<actionList>
		<action>
			<name>SetAVTransportURI</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>CurrentURI</name>
					<direction>in</direction>
					<relatedStateVariable>AVTransportURI</relatedStateVariable>
				</argument>
				<argument>
					<name>CurrentURIMetaData</name>
					<direction>in</direction>
					<relatedStateVariable>AVTransportURIMetaData</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetMediaInfo</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>NrTracks</name>
					<direction>out</direction>
					<relatedStateVariable>NumberOfTracks</relatedStateVariable>
				</argument>
				<argument>
					<name>MediaDuration</name>
					<direction>out</direction>
					<relatedStateVariable>CurrentMediaDuration</relatedStateVariable>
				</argument>
				<argument>
					<name>CurrentURI</name>
					<direction>out</direction>
					<relatedStateVariable>AVTransportURI</relatedStateVariable>
				</argument>
				<argument>
					<name>CurrentURIMetaData</name>
					<direction>out</direction>
					<relatedStateVariable>AVTransportURIMetaData</relatedStateVariable>
				</argument>
				<argument>
					<name>NextURI</name>
					<direction>out</direction>
					<relatedStateVariable>NextAVTransportURI</relatedStateVariable>
				</argument>
				<argument>
					<name>NextURIMetaData</name>
					<direction>out</direction>
					<relatedStateVariable>NextAVTransportURIMetaData</relatedStateVariable>
				</argument>
				<argument>
					<name>PlayMedium</name>
					<direction>out</direction>
					<relatedStateVariable>PlaybackStorageMedium</relatedStateVariable>
				</argument>
				<argument>
					<name>RecordMedium</name>
					<direction>out</direction>
					<relatedStateVariable>RecordStorageMedium</relatedStateVariable>
				</argument>
				<argument>
					<name>WriteStatus</name>
					<direction>out</direction>
					<relatedStateVariable>RecordMediumWriteStatus</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetTransportInfo</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>CurrentTransportState</name>
					<direction>out</direction>
					<relatedStateVariable>TransportState</relatedStateVariable>
				</argument>
				<argument>
					<name>CurrentTransportStatus</name>
					<direction>out</direction>
					<relatedStateVariable>TransportStatus</relatedStateVariable>
				</argument>
				<argument>
					<name>CurrentSpeed</name>
					<direction>out</direction>
					<relatedStateVariable>TransportPlaySpeed</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetPositionInfo</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>Track</name>
					<direction>out</direction>
					<relatedStateVariable>CurrentTrack</relatedStateVariable>
				</argument>
				<argument>
					<name>TrackDuration</name>
					<direction>out</direction>
					<relatedStateVariable>CurrentTrackDuration</relatedStateVariable>
				</argument>
				<argument>
					<name>TrackMetaData</name>
					<direction>out</direction>
					<relatedStateVariable>CurrentTrackMetaData</relatedStateVariable>
				</argument>
				<argument>
					<name>TrackURI</name>
					<direction>out</direction>
					<relatedStateVariable>CurrentTrackURI</relatedStateVariable>
				</argument>
				<argument>
					<name>RelTime</name>
					<direction>out</direction>
					<relatedStateVariable>RelativeTimePosition</relatedStateVariable>
				</argument>
				<argument>
					<name>AbsTime</name>
					<direction>out</direction>
					<relatedStateVariable>AbsoluteTimePosition</relatedStateVariable>
				</argument>
				<argument>
					<name>RelCount</name>
					<direction>out</direction>
					<relatedStateVariable>RelativeCounterPosition</relatedStateVariable>
				</argument>
				<argument>
					<name>AbsCount</name>
					<direction>out</direction>
					<relatedStateVariable>AbsoluteCounterPosition</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetDeviceCapabilities</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>PlayMedia</name>
					<direction>out</direction>
					<relatedStateVariable>PossiblePlaybackStorageMedia</relatedStateVariable>
				</argument>
				<argument>
					<name>RecMedia</name>
					<direction>out</direction>
					<relatedStateVariable>PossibleRecordStorageMedia</relatedStateVariable>
				</argument>
				<argument>
					<name>RecQualityModes</name>
					<direction>out</direction>
					<relatedStateVariable>PossibleRecordQualityModes</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetTransportSettings</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>PlayMode</name>
					<direction>out</direction>
					<relatedStateVariable>CurrentPlayMode</relatedStateVariable>
				</argument>
				<argument>
					<name>RecQualityMode</name>
					<direction>out</direction>
					<relatedStateVariable>CurrentRecordQualityMode</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>Stop</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>Play</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>Speed</name>
					<direction>in</direction>
					<relatedStateVariable>TransportPlaySpeed</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>Pause</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>Seek</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>Unit</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_SeekMode</relatedStateVariable>
				</argument>
				<argument>
					<name>Target</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_SeekTarget</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>Next</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>Previous</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>SetPlayMode</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>NewPlayMode</name>
					<direction>in</direction>
					<relatedStateVariable>CurrentPlayMode</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetCurrentTransportActions</name>
			<argumentList>
				<argument>
					<name>InstanceID</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
				</argument>
				<argument>
					<name>Actions</name>
					<direction>out</direction>
					<relatedStateVariable>CurrentTransportActions</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
	</actionList>
	<serviceStateTable>
		<stateVariable sendEvents="no">
			<name>TransportState</name>
			<dataType>string</dataType>
			<allowedValueList>
				<allowedValue>STOPPED</allowedValue>
				<allowedValue>PLAYING</allowedValue>
				<allowedValue>PAUSED_PLAYBACK</allowedValue>
				<allowedValue>TRANSITIONING</allowedValue>
				<allowedValue>NO_MEDIA_PRESENT</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>TransportStatus</name>
			<dataType>string</dataType>
			<allowedValueList>
				<allowedValue>OK</allowedValue>
				<allowedValue>ERROR_OCCURRED</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>PlaybackStorageMedium</name>
			<dataType>string</dataType>
			<allowedValueList>
				<allowedValue>NETWORK</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>RecordStorageMedium</name>
			<dataType>string</dataType>
			<allowedValueList>
				<allowedValue>NOT_IMPLEMENTED</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>PossiblePlaybackStorageMedia</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>PossibleRecordStorageMedia</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>CurrentPlayMode</name>
			<dataType>string</dataType>
			<defaultValue>NORMAL</defaultValue>
			<allowedValueList>
				<allowedValue>NORMAL</allowedValue>
				<allowedValue>SHUFFLE</allowedValue>
				<allowedValue>REPEAT_ONE</allowedValue>
				<allowedValue>REPEAT_ALL</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>TransportPlaySpeed</name>
			<dataType>string</dataType>
			<allowedValueList>
				<allowedValue>1</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>RecordMediumWriteStatus</name>
			<dataType>string</dataType>
			<allowedValueList>
				<allowedValue>NOT_IMPLEMENTED</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>CurrentRecordQualityMode</name>
			<dataType>string</dataType>
			<allowedValueList>
				<allowedValue>NOT_IMPLEMENTED</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>PossibleRecordQualityModes</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>NumberOfTracks</name>
			<dataType>ui4</dataType>
			<allowedValueRange>
				<minimum>0</minimum>
				<maximum>1</maximum>
			</allowedValueRange>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>CurrentTrack</name>
			<dataType>ui4</dataType>
			<allowedValueRange>
				<minimum>0</minimum>
				<maximum>1</maximum>
				<step>1</step>
			</allowedValueRange>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>CurrentTrackDuration</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>CurrentMediaDuration</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>CurrentTrackMetaData</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>CurrentTrackURI</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>AVTransportURI</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>AVTransportURIMetaData</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>NextAVTransportURI</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>NextAVTransportURIMetaData</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>RelativeTimePosition</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>AbsoluteTimePosition</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>RelativeCounterPosition</name>
			<dataType>i4</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>AbsoluteCounterPosition</name>
			<dataType>i4</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>CurrentTransportActions</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="yes">
			<name>LastChange</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_SeekMode</name>
			<dataType>string</dataType>
			<allowedValueList>
				<allowedValue>TRACK_NR</allowedValue>
				<allowedValue>REL_TIME</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_SeekTarget</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_InstanceID</name>
			<dataType>ui4</dataType>
		</stateVariable>
	</serviceStateTable>
</scpd>


/HtmlPageHandler/ctrl

Device name, network settings, refresh, and IR-command injection.

The capabilities are defined in:  /HtmlPageHandler/desc.xml


curl http://192.168.1.1:8080/HtmlPageHandler/desc.xml

<scpd
  xmlns="urn:schemas-upnp-org:service-1-0">
	<specVersion>
		<major>1</major>
		<minor>0</minor>
	</specVersion>
	<actionList>
		<action>
			<name>actHtmlDeviceName</name>
			<argumentList>
				<argument>
					<name>argHtmlDeviceName</name>
					<direction>in</direction>
					<relatedStateVariable>varHtmlDeviceName</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>actHtmlRefresh</name>
			<argumentList>
				<argument>
					<name>argHtmlRefresh</name>
					<direction>in</direction>
					<relatedStateVariable>varHtmlRefresh</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>actHtmlTcpip</name>
			<argumentList>
				<argument>
					<name>argHtmlDHCPFlag</name>
					<direction>in</direction>
					<relatedStateVariable>varHtmlDHCPFlag</relatedStateVariable>
				</argument>
				<argument>
					<name>argHtmlIPAddress</name>
					<direction>in</direction>
					<relatedStateVariable>varHtmlIPAddress</relatedStateVariable>
				</argument>
				<argument>
					<name>argHtmlNetMask</name>
					<direction>in</direction>
					<relatedStateVariable>varHtmlNetMask</relatedStateVariable>
				</argument>
				<argument>
					<name>argHtmlDNS1</name>
					<direction>in</direction>
					<relatedStateVariable>varHtmlDNS1</relatedStateVariable>
				</argument>
				<argument>
					<name>argHtmlDNS2</name>
					<direction>in</direction>
					<relatedStateVariable>varHtmlDNS2</relatedStateVariable>
				</argument>
				<argument>
					<name>argHtmlGateway</name>
					<direction>in</direction>
					<relatedStateVariable>varHtmlGateway</relatedStateVariable>
				</argument>
				<argument>
					<name>argHtmlProxyFlag</name>
					<direction>in</direction>
					<relatedStateVariable>varHtmlProxyFlag</relatedStateVariable>
				</argument>
				<argument>
					<name>argHtmlProxyName</name>
					<direction>in</direction>
					<relatedStateVariable>varHtmlProxyName</relatedStateVariable>
				</argument>
				<argument>
					<name>argHtmlProxyPort</name>
					<direction>in</direction>
					<relatedStateVariable>varHtmlProxyPort</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>actHtmlIrControl</name>
			<argumentList>
				<argument>
					<name>argIrControl</name>
					<direction>in</direction>
					<relatedStateVariable>varHtmlIrCommand</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
	</actionList>
	<serviceStateTable>
		<stateVariable sendEvents="no">
			<name>varHtmlDeviceName</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>varHtmlDHCPFlag</name>
			<dataType>boolean</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>varHtmlIPAddress</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>varHtmlNetMask</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>varHtmlDNS1</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>varHtmlDNS2</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>varHtmlGateway</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>varHtmlProxyFlag</name>
			<dataType>boolean</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>varHtmlProxyName</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>varHtmlProxyPort</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>varHtmlIrCommand</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>varHtmlRefresh</name>
			<dataType>string</dataType>
		</stateVariable>
	</serviceStateTable>
</scpd>


/WholeHomeAudio/desc.xml

Status, grouping, and generic playback commands

The capabilities are defined in:  /WholeHomeAudio/desc.xml


curl http://192.168.1.1:8080/WholeHomeAudio/desc.xml

<?xml version="1.0"?>
<scpd
  xmlns="urn:schemas-upnp-org:service-1-0">
	<specVersion>
		<major>1</major>
		<minor>0</minor>
	</specVersion>
	<actionList>
		<action>
			<name>GetDeviceStatusInfo</name>
			<argumentList>
				<argument>
					<name>FriendlyName</name>
					<direction>out</direction>
					<relatedStateVariable>A_ARG_TYPE_FriendlyName</relatedStateVariable>
				</argument>
				<argument>
					<name>ModelName</name>
					<direction>out</direction>
					<relatedStateVariable>A_ARG_TYPE_ModelName</relatedStateVariable>
				</argument>
				<argument>
					<name>Source</name>
					<direction>out</direction>
					<relatedStateVariable>A_ARG_TYPE_Source</relatedStateVariable>
				</argument>
				<argument>
					<name>Volume</name>
					<direction>out</direction>
					<relatedStateVariable>A_ARG_TYPE_Volume</relatedStateVariable>
				</argument>
				<argument>
					<name>PowerStatus</name>
					<direction>out</direction>
					<relatedStateVariable>A_ARG_TYPE_PowerStatus</relatedStateVariable>
				</argument>
				<argument>
					<name>ZoneInfo</name>
					<direction>out</direction>
					<relatedStateVariable>A_ARG_TYPE_ZoneInfo</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>Invitation</name>
			<argumentList>
				<argument>
					<name>Uuid</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_Uuid</relatedStateVariable>
				</argument>
				<argument>
					<name>Timeout</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_Timeout</relatedStateVariable>
				</argument>
				<argument>
					<name>Status</name>
					<direction>out</direction>
					<relatedStateVariable>A_ARG_TYPE_Status</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>JoinParty</name>
			<argumentList>
				<argument>
					<name>Uuid</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_Uuid</relatedStateVariable>
				</argument>
				<argument>
					<name>Status</name>
					<direction>out</direction>
					<relatedStateVariable>A_ARG_TYPE_Status</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>LeaveParty</name>
			<argumentList>
				<argument>
					<name>Uuid</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_Uuid</relatedStateVariable>
				</argument>
				<argument>
					<name>Status</name>
					<direction>out</direction>
					<relatedStateVariable>A_ARG_TYPE_Status</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>PlaybackCommand</name>
			<argumentList>
				<argument>
					<name>Uuid</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_Uuid</relatedStateVariable>
				</argument>
				<argument>
					<name>CommandType</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_WhaCommandType</relatedStateVariable>
				</argument>
				<argument>
					<name>CommandParam</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_WhaCommandParam</relatedStateVariable>
				</argument>
				<argument>
					<name>CommandStatus</name>
					<direction>out</direction>
					<relatedStateVariable>A_ARG_TYPE_WhaCommandStatus</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>ExcludeFromParty</name>
			<argumentList>
				<argument>
					<name>Uuid</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_Uuid</relatedStateVariable>
				</argument>
				<argument>
					<name>PowerOff</name>
					<direction>in</direction>
					<relatedStateVariable>A_ARG_TYPE_PowerOff</relatedStateVariable>
				</argument>
				<argument>
					<name>ExcludeStatus</name>
					<direction>out</direction>
					<relatedStateVariable>A_ARG_TYPE_ExcludeStatus</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>IsAlive</name>
		</action>
	</actionList>
	<serviceStateTable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_FriendlyName</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_ModelName</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_Source</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_Volume</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_PowerStatus</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_ZoneInfo</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_Uuid</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_Timeout</name>
			<dataType>i4</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_Status</name>
			<dataType>i4</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_WhaCommandType</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_WhaCommandParam</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_WhaCommandStatus</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_PowerOff</name>
			<dataType>i4</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>A_ARG_TYPE_ExcludeStatus</name>
			<dataType>i4</dataType>
		</stateVariable>
		<stateVariable sendEvents="yes">
			<name>DeviceState</name>
			<dataType>i4</dataType>
		</stateVariable>
		<stateVariable sendEvents="yes">
			<name>PartyInfo</name>
			<dataType>string</dataType>
		</stateVariable>
	</serviceStateTable>
</scpd>


References