TapHome

Shelly Plus Plug S

Packet Parser → HTTP
Submitted by
Last updated: 06. 2026
Shelly Plus Plug S

The Shelly Plus Plug S is a Gen2+ Wi-Fi smart plug with built-in power metering and a multicolour LED ring indicator. It plugs into a standard CEE 7/3 (Type-F / Schuko) socket and can switch loads up to 12 A / 2760 W at 230 V. TapHome communicates with the device locally over Wi-Fi using the Gen2+ JSON-RPC API on port 80 — no cloud connection is required.

The template exposes the plug as six TapHome devices: a relay switch, an electricity meter, an LED indication mode selector, two LED colour pickers (relay-ON and relay-OFF states) and a brightness dimmer for the power-indication mode.

Configuration

Pairing and network setup

Out of the box the device boots into access-point mode with SSID ShellyPlusPlugS-XXXXXX (LED flashes blue). Connect to this SSID, open http://192.168.33.1/ and join your local Wi-Fi from the web UI. After the plug joins your LAN, it is reachable on port 80 at its station IP address and over mDNS at shellyplusplugs-<MAC>.local.

TapHome polls the Gen2+ RPC endpoints over plain HTTP — HTTPS is disabled by default and HTTP authentication (Shelly.SetAuth) must remain disabled for the template to work. Make sure the plug sits on the same LAN / VLAN as the TapHome Core.

During template import in TapHome, supply the plug’s IP address as the IpAddress parameter. A static DHCP reservation is strongly recommended so the address does not change between reboots.

Device capabilities

Relay control

The relay is exposed as a switch device. Its state is read from /rpc/Switch.GetStatus?id=0 (the output boolean) and controlled via /rpc/Switch.Set?id=0&on=true|false. The module caches the full Switch.GetStatus response so the relay, meter and service attributes all share one HTTP call per poll.

Power and energy metering

The built-in meter on the Switch component provides:

  • Instantaneous powerapower in watts, converted to kW by the template (divided by 1000)
  • Cumulative energyaenergy.total in watt-hours, converted to kWh (divided by 1000)

Three further readings are exposed as service attributes on the meter:

AttributeUnitSource field
CurrentAcurrent
VoltageVvoltage
Internal temperature°Ctemperature.tC

The meter is read-only and updates on every poll cycle.

LED indication mode

The multicolour LED ring is controlled by the Plus-Plug-S-specific PLUGS_UI RPC component. TapHome exposes a mode selector with three valid options — despite the template listing ten enum slots, only the first three correspond to real firmware modes:

ValueBehaviour
offLED ring disabled (Wi-Fi / AP / firmware diagnostic states are still shown)
switchLED colour reflects the relay state — uses the user-defined OFF and ON colours
powerLED colour reflects measured load as a fraction of the configured power limit (green → yellow → red gradient)

Switching between modes is a cosmetic change and does not require a reboot.

LED colours (switch mode)

Two independent HSB devices let you pick the LED ring colour for each relay state:

  • LED Color (OFF state) — colour + brightness shown while the relay is OFF
  • LED Color (ON state) — colour + brightness shown while the relay is ON

Both map to leds.colors.switch:0.{off|on}.{rgb,brightness} in the PLUGS_UI config. Shelly stores RGB values as percent (0–100 per channel), not 0–255, so the template multiplies each channel by 2.55 when converting between HSV and the device’s native format. This conversion is internal — from TapHome the devices behave like any other HSB colour picker.

LED brightness (power mode)

When the LED is in power mode the colour is chosen automatically by the firmware based on load. Only the brightness is user-configurable, so the template exposes it as a dimmer (leds.colors.power.brightness, 0–100 % scaled to a 0.0–1.0 TapHome dimmer level).

Module diagnostics and actions

The HTTP module exposes four service attributes parsed from /rpc/WiFi.GetStatus and /rpc/Sys.GetStatus:

AttributeSource
Wi-Fi SSIDssid
IP addresssta_ip
Signal strengthrssi (dBm)
MAC addressmac

Two service actions are also available:

  • Firmware update — triggers an OTA update on the stable channel (/rpc/Shelly.Update?stage="stable"). Activated automatically when Sys.GetStatus reports available_updates.stable.
  • Reboot — reboots the device (/rpc/Shelly.Reboot), useful after network configuration changes or to clear transient issues.

If you only need on/off control and basic energy monitoring, ignore the LED devices — they are optional. The relay and meter work independently of the LED indication mode.

Troubleshooting

Device not responding
  1. Verify the plug is connected to Wi-Fi — the LED should not be flashing or solid red
  2. Try the mDNS hostname shellyplusplugs-<MAC>.local instead of the IP address — the DHCP lease may have changed
  3. Open http://{device-ip}/rpc/Shelly.GetDeviceInfo in a browser; if it responds with JSON the device is reachable
  4. Confirm TapHome Core and the plug are on the same LAN / VLAN
  5. Make sure HTTP authentication is disabled in the Shelly web UI — the template does not support digest auth
Power readings show zero
  1. Confirm a load is actually plugged into the Shelly, not bypassed
  2. Check that the relay is ON — the meter reports 0 W when the relay is open
  3. Query /rpc/Switch.GetStatus?id=0 directly in a browser and verify that apower is non-zero
LED does not change after a mode switch
  1. The LED only reflects runtime state in switch and power modes; in off mode it stays dark except for system diagnostic patterns (AP mode, reconnecting, OTA)
  2. In switch mode make sure the ON and OFF colours are not both set to black / 0 % brightness
  3. System indications (blue flashing for AP mode, red for Wi-Fi problems) always override the user LED configuration — if the LED is flashing red, the plug is not on your Wi-Fi
Firmware update action does not fire
  1. The template only triggers the update when Sys.GetStatus reports available_updates.stable — run the action manually from the device card or web UI if the plug is already up-to-date
  2. The template targets the stable channel only; beta firmware must be installed from the Shelly web UI

How to install in TapHome

Prerequisites

  • Shelly device installed and powered on
  • Local Wi-Fi network (2.4 GHz)
  • TapHome CCU on the same network

Step 1 — Connect Shelly to Wi-Fi

Option A — Shelly app (recommended):

  1. Download the Shelly app (iOS / Android)
  2. Tap +Add Device and follow the Bluetooth pairing wizard
  3. Enter your Wi-Fi credentials when prompted

Option B — AP mode (no app):

  1. On first power-up the device creates a hotspot: ShellyXXX-AABBCCDDEE
  2. Connect your phone/PC to that hotspot
  3. Open http://192.168.33.1Internet & SecurityWi-Fi Mode - Client
  4. Enter SSID and password → Save

Shelly only supports 2.4 GHz networks. 5 GHz networks will not appear in the scan.

Step 2 — Find the device address

Shelly Gen1 devices support mDNS (Zeroconf). You can reach the device using a hostname instead of an IP address:

1
shelly<model>-<MAC>.local

For example: shelly1pm-AABBCCDDEE.local (MAC address in uppercase hex, no colons).

Recommended: use the TapHome IP Scanner. Open the TapHome app and use the IP Scanner (Settings → Network → Scan). The scanner will discover devices on your network and show both the IP address and the mDNS hostname. Use the hostname instead of the IP address for a more reliable connection — it stays the same even if the device’s IP changes after a router reboot.

Alternative methods to find the IP address:

  • Shelly app: Device detail → Device info → IP address
  • Shelly web UI: Connect to the device AP before Wi-Fi setup — the IP is shown after saving
  • Router DHCP table: Look for a hostname like shelly1pm-AABBCCDDEE

Step 3 — Configure in TapHome

  1. In TapHome, add a new Packet Parser (HTTP) module
  2. Address: enter the mDNS hostname (e.g., shelly1pm-AABBCCDDEE.local) or IP address from Step 2
  3. Port: 80 (default, no change needed)
  4. Import the template — TapHome will poll /status to read device state

HTTP authentication is disabled by default on Shelly devices. If you have enabled login protection, TapHome does not support HTTP Basic Auth at this time — keep auth disabled for TapHome integration.

Available devices

Shelly Plus Plug S Module
Service Attributes
Wi-Fi SSID
IP address
Signal strengthWi-Fi signal strength in dBm — values closer to 0 indicate a stronger connection (e.g. −55 dBm is good, −80 dBm is weak)
MAC address
Service Actions
Firmware updateTriggers an over-the-air firmware update from the Shelly stable channel
RebootReboots the device — useful after network configuration changes or to clear transient issues
Custom Variables

Shelly Plus Plug S

Read (module)
VAR response := SENDHTTPREQUEST("/rpc/Sys.GetStatus");
IF response.IsSuccess
    Sys.GetStatus := response.Content;
END

response := SENDHTTPREQUEST("/rpc/Sys.GetConfig");
IF response.IsSuccess
    Sys.GetConfig := response.Content;
END

response := SENDHTTPREQUEST("/rpc/WiFi.GetStatus");
IF response.IsSuccess
    WiFi.GetStatus := response.Content;
END

response := SENDHTTPREQUEST("/rpc/PLUGS_UI.GetConfig");
IF response.IsSuccess
    PLUGS_UI.GetConfig := response.Content;
END

if ! ISNULL(parsejson(Sys.GetStatus, "available_updates.stable", true))
    addwarning("New firmware update is available");
end

if parsejson(Sys.GetStatus, "restart_required", true)
    addwarning("Restart required");
end
Service Attributes
Wifi
PARSEJSON(WiFi.GetStatus, "ssid")
${ipAddress}
PARSEJSON(WiFi.GetStatus, "sta_ip")
${xml_signal_strength} [dB]
PARSEJSON(WiFi.GetStatus, "rssi")
MAC
PARSEJSON(Sys.GetStatus, "mac")
Service Actions
${xml_update_fw}
VAR response := SENDHTTPREQUEST("/rpc/Shelly.Update?stage=\"stable\"");
IF response.IsSuccess
    return("OK");
else
    return("Error");
END

Reboot
VAR response := SENDHTTPREQUEST("/rpc/Shelly.Reboot");
IF response.IsSuccess
    return("OK");
else
    return("Error");
END
Switch Switch
boolean
Values / States: ON · OFF

Switch

Read switch state
var x := (sendhttprequest("/rpc/Switch.GetStatus?id=0"));
var status := x.Content;
return(PARSEJSON(status, "$.output", true));
Write switch state
VAR response := SENDHTTPREQUEST("rpc/Switch.Set?id=0&on=" + if(St,"true","false"));
IF response.IsSuccess = false
  ADDERROR(response.StatusCode);
END
Electric Meter Electricity Meter Read-only

Instantaneous power (kW) and cumulative energy (kWh) measured by the built-in meter, with current, voltage and internal temperature diagnostics

numeric Unit: kW / kWh
Service Attributes
Current
Voltage
TemperatureInternal device temperature in °C — the plug shuts off automatically on overheating

Electric Meter

Read total consumption
return(parsejson(parsejson(Switch.GetStatus,"aenergy"), "total")/1000);
Read demand
return(parsejson(Switch.GetStatus,"apower")/1000);
Read (module)
VAR response := SENDHTTPREQUEST("/rpc/Switch.GetStatus?id=0");
IF response.IsSuccess
    Switch.GetStatus := response.Content;
END
Service Attributes
${electric_current} [A]
return(parsejson(Switch.GetStatus,"current"));
${electric_voltage} [V]
return(parsejson(Switch.GetStatus,"voltage"));
${temperature} [°C]
return(parsejson(parsejson(Switch.GetStatus,"temperature"), "tC"));
LED Indication Mode Multi-value Switch

LED ring behaviour — Off (disabled), Switch (colour reflects relay state) or Power (colour reflects load as green → yellow → red)

string enum
Values / States: ${xml_off} · ${switch} · ${xml_power}

LED Indication Mode

Read switch state
switch(parsejson(PLUGS_UI.GetConfig, "leds.mode"), "power", 2, "switch", 1, 0)
Write switch state
VAR response := SENDHTTPREQUEST("rpc/PLUGS_UI.SetConfig?config={\"leds\":{\"mode\":\"" + switch(Mu, 2, "power", 1, "switch", "off") + "\"}}");

response := SENDHTTPREQUEST("/rpc/PLUGS_UI.GetConfig");
IF response.IsSuccess
    PLUGS_UI.GetConfig := response.Content;
END
LED Color (OFF state) HSB Light

RGB colour and brightness of the LED ring while the relay is OFF (used in Switch indication mode)

HSB (hue, saturation, brightness) hsv-to-rgb

LED Color (OFF state)

Read brightness
parsejson(PLUGS_UI.GetConfig, basePath + ".brightness") / 100
Write brightness
VAR rgb := HSVTORGB( Hd, Sa, Hb);

VAR response := SENDHTTPREQUEST("rpc/PLUGS_UI.SetConfig?config={\"leds\":{\"colors\":{\"switch:0\":{\"off\":{\"brightness\":" + Hb*100 + "}}}}}");

response := SENDHTTPREQUEST("/rpc/PLUGS_UI.GetConfig");
IF response.IsSuccess
    PLUGS_UI.GetConfig := response.Content;
END
Read hue
VAR HSVColor := RGBTOHSV(parsejson(PLUGS_UI.GetConfig, basePath + ".rgb[0]") *2.55, parsejson(PLUGS_UI.GetConfig, basePath + ".rgb[1]") *2.55, parsejson(PLUGS_UI.GetConfig, basePath + ".rgb[2]") *2.55);

HSVColor.Hue
Write hue
VAR rgb := HSVTORGB( Hd, Sa, Hb);

VAR response := SENDHTTPREQUEST("rpc/PLUGS_UI.SetConfig?config={\"leds\":{\"colors\":{\"switch:0\":{\"off\":{\"rgb\":[" + rgb.red/2.55 + "," + rgb.green/2.55 + "," + rgb.blue/2.55 + "],\"brightness\":" + Hb*100 + "}}}}}");

response := SENDHTTPREQUEST("/rpc/PLUGS_UI.GetConfig");
IF response.IsSuccess
    PLUGS_UI.GetConfig := response.Content;
END
Read saturation
VAR HSVColor := RGBTOHSV(parsejson(PLUGS_UI.GetConfig, basePath + ".rgb[0]") *2.55, parsejson(PLUGS_UI.GetConfig, basePath + ".rgb[1]") *2.55, parsejson(PLUGS_UI.GetConfig, basePath + ".rgb[2]") *2.55);

HSVColor.Saturation
Write saturation
VAR rgb := HSVTORGB( Hd, Sa, Hb);

VAR response := SENDHTTPREQUEST("rpc/PLUGS_UI.SetConfig?config={\"leds\":{\"colors\":{\"switch:0\":{\"off\":{\"rgb\":[" + rgb.red/2.55 + "," + rgb.green/2.55 + "," + rgb.blue/2.55 + "],\"brightness\":" + Hb*100 + "}}}}}");

response := SENDHTTPREQUEST("/rpc/PLUGS_UI.GetConfig");
IF response.IsSuccess
    PLUGS_UI.GetConfig := response.Content;
END
LED Color (ON state) HSB Light

RGB colour and brightness of the LED ring while the relay is ON (used in Switch indication mode)

HSB (hue, saturation, brightness) hsv-to-rgb

LED Color (ON state)

Read brightness
parsejson(PLUGS_UI.GetConfig, basePath + ".brightness") / 100
Write brightness
VAR rgb := HSVTORGB( Hd, Sa, Hb);

VAR response := SENDHTTPREQUEST("rpc/PLUGS_UI.SetConfig?config={\"leds\":{\"colors\":{\"switch:0\":{\"on\":{\"brightness\":" + Hb*100 + "}}}}}");

response := SENDHTTPREQUEST("/rpc/PLUGS_UI.GetConfig");
IF response.IsSuccess
    PLUGS_UI.GetConfig := response.Content;
END
Read hue
VAR HSVColor := RGBTOHSV(parsejson(PLUGS_UI.GetConfig, basePath + ".rgb[0]") *2.55, parsejson(PLUGS_UI.GetConfig, basePath + ".rgb[1]") *2.55, parsejson(PLUGS_UI.GetConfig, basePath + ".rgb[2]") *2.55);

HSVColor.Hue
Write hue
VAR rgb := HSVTORGB( Hd, Sa, Hb);

VAR response := SENDHTTPREQUEST("rpc/PLUGS_UI.SetConfig?config={\"leds\":{\"colors\":{\"switch:0\":{\"on\":{\"rgb\":[" + rgb.red/2.55 + "," + rgb.green/2.55 + "," + rgb.blue/2.55 + "],\"brightness\":" + Hb*100 + "}}}}}");

response := SENDHTTPREQUEST("/rpc/PLUGS_UI.GetConfig");
IF response.IsSuccess
    PLUGS_UI.GetConfig := response.Content;
END
Read saturation
VAR HSVColor := RGBTOHSV(parsejson(PLUGS_UI.GetConfig, basePath + ".rgb[0]") *2.55, parsejson(PLUGS_UI.GetConfig, basePath + ".rgb[1]") *2.55, parsejson(PLUGS_UI.GetConfig, basePath + ".rgb[2]") *2.55);

HSVColor.Saturation
Write saturation
VAR rgb := HSVTORGB( Hd, Sa, Hb);

VAR response := SENDHTTPREQUEST("rpc/PLUGS_UI.SetConfig?config={\"leds\":{\"colors\":{\"switch:0\":{\"on\":{\"rgb\":[" + rgb.red/2.55 + "," + rgb.green/2.55 + "," + rgb.blue/2.55 + "],\"brightness\":" + Hb*100 + "}}}}}");

response := SENDHTTPREQUEST("/rpc/PLUGS_UI.GetConfig");
IF response.IsSuccess
    PLUGS_UI.GetConfig := response.Content;
END
LED Brightness (Power mode) Dimmer

Brightness of the LED ring in Power indication mode — colour itself is auto-selected by the firmware based on load

numeric

LED Brightness (Power mode)

Read level
parsejson(PLUGS_UI.GetConfig, "leds.colors.power.brightness") / 100
Write level
VAR response := SENDHTTPREQUEST("rpc/PLUGS_UI.SetConfig?config={\"leds\":{\"colors\":{\"power\":{\"brightness\":" + Le*100 + "}}}}");

response := SENDHTTPREQUEST("/rpc/PLUGS_UI.GetConfig");
IF response.IsSuccess
    PLUGS_UI.GetConfig := response.Content;
END
Connection: Packet Parser → HTTP
Possible improvements (23)
  • Power Factor — Power factor (0.0–1.0) reported in Switch.GetStatus response for metered devices
  • Line Frequency — AC line frequency in Hz, available in Switch.GetStatus response
  • Returned Energy — Returned/exported energy in Wh, for bi-directional metering scenarios
  • Per-minute Energy History — Rolling three-minute energy buffer in mWh, useful for fine-grained load profiling
  • Toggle Relay — Toggles the relay state without needing to know current state; not mapped as a TapHome service action
  • Auto-off Timer — Optional toggle_after parameter (seconds) on Switch.Set — relay auto-reverts after N seconds
  • Overpower Protection — Configurable power limit (W); firmware turns the relay off when exceeded. Template does not expose a setter
  • Over-voltage / Over-current Protection — Voltage and current safety thresholds configurable via Switch.SetConfig; not exposed by template
  • Initial State After Power-up — Relay behaviour after power loss (off / on / restore_last / match_input); not exposed by template
  • Reset Energy Counters — Resets aenergy / ret_aenergy counters; not exposed by template
  • Button Input Mode — Physical button behaviour (momentary / detached); device-internal, not exposed as a TapHome input
  • LED Night Mode — Dims the LED ring during a configurable HH:MM window (wraps midnight); not mapped by template
  • Local Scheduler — On-device cron-like scheduler for relay actions; no TapHome equivalent (TapHome uses its own schedules)
  • Webhooks — Outbound HTTP webhooks on device events; not used by template (TapHome polls instead)
  • mJS Scripts — Up to 10 on-device mJS scripts; out of scope for TapHome integration
  • Shelly Cloud Connection — Cloud connection status and enable/disable toggle; not mapped by template (TapHome communicates locally)
  • Bluetooth LE Configuration — BLE gateway enable/disable and observer mode; not exposed by template
  • MQTT Transport Config — Inbound/outbound MQTT RPC transport config; template uses HTTP exclusively
  • System Diagnostics — Uptime, RAM/FS utilisation, last reset reason — available in cached Sys.GetStatus but not surfaced as attributes
  • Device Time — Device wall-clock (HH:MM) and unix epoch; not surfaced as attribute
  • Beta Firmware Availability — Template warns on available_updates.stable but ignores the beta channel
  • Factory Reset — Restores factory defaults; not exposed by template (deliberately destructive)
  • HTTP Authentication — Enables digest auth on the RPC endpoint; template assumes no-auth local access

Sources

Found a problem with this device template?

Tell us what's wrong, what's missing, or how the template should behave. We rely on your feedback to keep the catalog accurate.

Verified by TapHome

Want to use this in your TapHome Core?

Open this template in the Customer Portal to apply it to one of your homes, or to draft a refinement and submit it back to the catalog.

Open in portal