TapHome

Fonestar WA-225W

Packet Parser → HTTP
Submitted by
Last updated: 03. 2026
Fonestar WA-225W

The Fonestar WA-225W is a compact Wi-Fi stereo amplifier that supports DLNA and AirPlay for network audio streaming. TapHome communicates with the device over HTTP using UPnP/SOAP XML envelopes sent to port 49152. The template targets the standard UPnP AV Media Renderer profile, so it should work with any Fonestar device that implements DLNA (WA-225W, FONCAST, and similar models).

The template provides volume control, mute, playback transport (play, pause, stop, next, previous), and a play mode selector. No cloud connection is required — all communication happens on the local network.

Configuration

During TapHome template import, enter the device’s IP address. The default placeholder is 192.168.0.1 and the device listens on port 49152 (the standard UPnP AV port).

To find the device’s IP address, check your router’s DHCP client list or use a UPnP/SSDP scanner app. The WA-225W announces itself as a UPnP MediaRenderer on the local network. The MUZO companion app (iOS/Android) also shows connected devices and their IP addresses.

UPnP devices use SSDP for discovery, not mDNS. If the device’s IP changes after a DHCP renewal, you will need to update the IP address in TapHome. Consider assigning a static IP or a DHCP reservation on your router to prevent connectivity issues.

Device capabilities

Volume control

The template exposes volume as a dimmer device. The UPnP GetVolume action returns a value in the 0–100 range, which the template normalizes to 0.0–1.0 for TapHome’s dimmer model (divides by 100 on read, multiplies by 100 on write). Setting the volume to 50% in TapHome sends DesiredVolume=50 to the device.

Mute

Mute is exposed as a switch device. It reads the current mute state via GetMute (returns 0 or 1) and writes via SetMute. Both operations target the Master audio channel on the RenderingControl:1 service.

Playback transport

The template provides five push-button devices for playback transport control:

  • Play — sends the AVTransport:1 Play action (resumes or starts playback)
  • Pause — sends the Pause action (halts playback at the current position)
  • Stop — sends the Stop action (stops playback entirely)
  • Next Track — sends the Next action (advances to the next track)
  • Previous Track — sends the Previous action (returns to the previous track)

These are write-only buttons. Playback must first be initiated from another source (e.g., the MUZO app or another DLNA controller) since the template does not include a SetAVTransportURI action for setting the media source.

Play mode

The play mode device is a multi-value switch that controls the repeat mode via GetTransportSettings and SetPlayMode. Three modes are functional:

PositionTapHome labelUPnP PlayModeEffect
0NormalNORMALSequential playback, no repeat
1Repeat AllREPEAT_ALLRepeat the entire queue
2Repeat OneREPEAT_TRACKRepeat the current track

The template defines 10 multi-value positions, but only positions 0–2 map to actual UPnP play modes. Positions 3–9 (labelled “Shuffle no repeat”, “Shuffle”, etc.) will default to NORMAL when written because the UPnP SHUFFLE mode is not mapped in the template script. Use only the first three positions.

Additional capabilities

The UPnP AV standard also exposes transport state reporting (STOPPED, PLAYING, PAUSED), track position and duration info, media URI management (SetAVTransportURI for queuing tracks), seek functionality, volume control in decibels, loudness enhancement, and rendering presets. These capabilities can be added in a future template update.

Troubleshooting

Device not responding
  1. Verify the amplifier is powered on and connected to Wi-Fi (or Ethernet via RJ-45)
  2. Confirm the IP address in TapHome matches the device’s current IP — check your router’s DHCP client list
  3. Try accessing http://{device-ip}:49152/ in a browser — a UPnP device description XML should load if the device is reachable
  4. Check that TapHome Core and the amplifier are on the same network / VLAN — UPnP traffic does not cross subnet boundaries by default
Playback buttons have no effect

The transport buttons (Play, Pause, Stop, Next, Previous) only work when media is already loaded on the device. The template does not include the SetAVTransportURI action, so playback must first be started from another source (e.g., the MUZO app, a DLNA media server, or another UPnP control point). Once media is playing, the TapHome buttons will control it.

Volume changes not reflected

If volume adjustments from TapHome do not take effect, verify that the device is not muted. Some DLNA renderers ignore volume changes while muted. Also confirm that no other control point (e.g., the MUZO app) is simultaneously sending conflicting commands.

Available devices

Fonestar Module
Volume Dimmer

Master volume level — UPnP 0–100 range normalized to TapHome dimmer scale (0.0–1.0)

numeric Unit: %

Volume

Read level
VAR body := "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><u:GetVolume xmlns:u=\"urn:schemas-upnp-org:service:RenderingControl:1\"><InstanceID>0</InstanceID><Channel>Master</Channel></u:GetVolume></s:Body></s:Envelope>";

VAR response := SENDHTTPREQUEST("/upnp/control/rendercontrol1", "POST", body, "SOAPACTION: \"urn:schemas-upnp-org:service:RenderingControl:1#GetVolume\"", "CONTENT-TYPE: text/xml; charset=\"utf-8\"" );

IF response.IsSuccess
    VAR responseXml := response.Content;
    RETURN(PARSEXML(responseXml, "//CurrentVolume") / 100.0);
ELSE
    ADDERROR(response.Content);
    RETURN(NaN);
END
Write level
VAR body := "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><u:SetVolume xmlns:u=\"urn:schemas-upnp-org:service:RenderingControl:1\"><InstanceID>0</InstanceID><Channel>Master</Channel><DesiredVolume>" + ROUND(Le * 100) + "</DesiredVolume></u:SetVolume></s:Body></s:Envelope>";

SENDHTTPREQUEST("/upnp/control/rendercontrol1", "POST", body, "SOAPACTION: \"urn:schemas-upnp-org:service:RenderingControl:1#SetVolume\"", "CONTENT-TYPE: text/xml; charset=\"utf-8\"");
Next Track Push Button
button

Next Track

Write button state
VAR body := "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><u:Next xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID></u:Next></s:Body></s:Envelope>";

SENDHTTPREQUEST("/upnp/control/rendertransport1", "POST", body, "SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#Next\"", "CONTENT-TYPE: text/xml; charset=\"utf-8\"");
Pause Push Button
button

Pause

Write button state
VAR body := "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><u:Pause xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID></u:Pause></s:Body></s:Envelope>";

SENDHTTPREQUEST("/upnp/control/rendertransport1", "POST", body, "SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#Pause\"", "CONTENT-TYPE: text/xml; charset=\"utf-8\"");
Play Push Button
button

Play

Write button state
VAR body := "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><u:Play xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID><Speed>1</Speed></u:Play></s:Body></s:Envelope>";

SENDHTTPREQUEST("/upnp/control/rendertransport1", "POST", body, "SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#Play\"", "CONTENT-TYPE: text/xml; charset=\"utf-8\"");
Previous Track Push Button
button

Previous Track

Write button state
VAR body := "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><u:Previous xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID></u:Previous></s:Body></s:Envelope>";

SENDHTTPREQUEST("/upnp/control/rendertransport1", "POST", body, "SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#Previous\"", "CONTENT-TYPE: text/xml; charset=\"utf-8\"");
Stop Push Button
button

Stop

Write button state
VAR body := "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><u:Stop xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID><Speed>1</Speed></u:Stop></s:Body></s:Envelope>";

SENDHTTPREQUEST("/upnp/control/rendertransport1", "POST", body, "SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#Stop\"", "CONTENT-TYPE: text/xml; charset=\"utf-8\"");
Mute Switch
boolean
Values / States: ON · OFF

Mute

Read switch state
VAR body := "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><u:GetMute xmlns:u=\"urn:schemas-upnp-org:service:RenderingControl:1\"><InstanceID>0</InstanceID><Channel>Master</Channel></u:GetMute></s:Body></s:Envelope>";

VAR response := SENDHTTPREQUEST("/upnp/control/rendercontrol1", "POST", body, "SOAPACTION: \"urn:schemas-upnp-org:service:RenderingControl:1#GetMute\"", "CONTENT-TYPE: text/xml; charset=\"utf-8\"");

IF response.IsSuccess
    VAR responseXml := response.Content;
    RETURN(PARSEXML(responseXml, "//CurrentMute"));
ELSE
    ADDERROR(response.Content);
    RETURN(NaN);
END
Write switch state
VAR body := "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><u:SetMute xmlns:u=\"urn:schemas-upnp-org:service:RenderingControl:1\"><InstanceID>0</InstanceID><Channel>Master</Channel><DesiredMute>" + St +"</DesiredMute></u:SetMute></s:Body></s:Envelope>";

SENDHTTPREQUEST("/upnp/control/rendercontrol1", "POST", body, "SOAPACTION: \"urn:schemas-upnp-org:service:RenderingControl:1#SetMute\"", "CONTENT-TYPE: text/xml; charset=\"utf-8\"");
Play Mode Multi-value Switch

Playback repeat mode — Normal, Repeat All, Repeat One are functional; positions 3–9 have no UPnP mapping and default to Normal

enum
Values / States: Normal · Repeat all · Repeat one · Shuffle no repeat · Shuffle · Shuffle repeat one

Play Mode

Read switch state
VAR body := "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><u:GetTransportSettings xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID></u:GetTransportSettings></s:Body></s:Envelope>";

VAR response := SENDHTTPREQUEST("/upnp/control/rendertransport1", "POST", body, "SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#GetTransportSettings\"", "CONTENT-TYPE: text/xml; charset=\"utf-8\"");

IF response.IsSuccess
    VAR responseXml := response.Content;
    VAR mode := PARSEXML(responseXml, "//PlayMode");
    RETURN(SWITCH(mode, "NORMAL", 0, "REPEAT_ALL", 1, "REPEAT_TRACK", 2, 0));
ELSE
    ADDERROR(response.Content);
    RETURN(NaN);
END
Write switch state
VAR mode := SWITCH(Mu, 0, "NORMAL", 1, "REPEAT_ALL", 2, "REPEAT_TRACK", "NORMAL");

VAR body := "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><u:SetPlayMode xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID><NewPlayMode>" + mode +"</NewPlayMode></u:SetPlayMode></s:Body></s:Envelope>";

SENDHTTPREQUEST("/upnp/control/rendertransport1", "POST", body, "SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#SetPlayMode\"", "CONTENT-TYPE: text/xml; charset=\"utf-8\"");
Connection: Packet Parser → HTTP
Possible improvements (8)
  • Set Media URI — Required action — sets the URI of the media to play. Without this, the device can only control already-playing media (started from another source like the MUZO app).
  • Transport State — Returns current TransportState (STOPPED, PLAYING, PAUSED_PLAYBACK, etc.) — useful for showing playback status in TapHome
  • Track Position Info — Returns current track number, duration, and playback position — would enable progress display
  • Media Info — Returns number of tracks and media duration
  • Seek — Required action — seek by track number, absolute or relative time
  • Volume in dB — Optional — volume control in decibels rather than 0-100 linear scale
  • Loudness — Optional — loudness enhancement toggle
  • Rendering Presets — Required actions — list and select rendering presets (e.g. EQ profiles)

Sources