TapHome

Shelly RGBW2 White

Packet Parser → HTTP
Submitted by
Last updated: 06. 2026
Shelly RGBW2 White

The Shelly RGBW2 is a Wi-Fi LED strip controller with four PWM outputs (12/24 V DC). In White mode, the four outputs — normally used for R, G, B, and W of an RGBW strip — become four independent single-color dimmer channels. Each channel can drive its own white LED strip, LED bulb, or spotlight group. TapHome communicates with the device over HTTP on the local network; no cloud connection is required.

This template is the White-mode counterpart to the Shelly RGBW2 Color-mode template. Both templates share the same hardware but the firmware operates in mutually exclusive modes selected via the device settings. Before importing this template, the device must be configured in White mode — the template validates the mode on every poll and shows an error if the device is set to Color.

Shelly has marked the RGBW2 as discontinued — it is no longer produced or sold by Shelly Group. Existing units continue to function and receive firmware updates.

Wiring

The Shelly RGBW2 is powered from a 12 V or 24 V DC supply (V+ / GND). Each of the four outputs (labeled R, G, B, W on the device) drives one white LED load. Typical wiring layouts for White mode:

  • Four independent white LED strips or bulbs — each channel controls one strip/bulb, common anode (+) to V+
  • Multiple spotlights per channel — several 12/24 V spotlights wired in parallel per output
  • Two white strips with doubled power — pair two channels per strip (parallel) to double output power

Per-channel load limits (from Shelly’s specification) are 45 W at 12 V and 90 W at 24 V. Combined load across all four channels must not exceed 144 W at 12 V or 288 W at 24 V.

Configuration

The template connects over Wi-Fi. During TapHome template import, enter the device’s IP address (default placeholder 192.168.0.1) and an optional transition time in milliseconds (default 300).

The transition time controls how quickly each channel fades between brightness levels. It is sent with every write command and also defines the debounce window — the template ignores polled brightness values for transitionTime + 500 ms after each write to prevent stale reads during a fade.

Mode switching

If the device is currently in Color mode, switch it to White mode before importing this template. Either:

  • Open the Shelly web interface at http://{device-ip} and change the operating mode in the settings, or
  • Send GET /settings?mode=white directly, or
  • Import the Color-mode template temporarily and use its Set mode White service action, then reimport this White-mode template

Mode changes require a device restart. After the device reboots, reimport the White-mode template in TapHome.

Device capabilities

Four independent dimmers

The template exposes four independent dimmer channels, one per PWM output:

ChannelOutput pinEndpointPoll interval
Ch1R/light/02.5 s
Ch2G/light/12.5 s
Ch3B/light/22.5 s
Ch4W/light/32.5 s

Each dimmer reads lights[N].ison and lights[N].brightness (0-100, normalized to 0-1) from the /status response. Write commands use /light/N?turn=on|off&brightness=VALUE&transition=T. The template uses the legacy /light/{idx} endpoint, which Shelly firmware accepts as an alias of the current /white/{idx} endpoint.

Per-channel power metering

Each channel has its own energy meter — Electric Meter Ch1 through Electric Meter Ch4 — reading from meters[0] through meters[3]:

  • Real-time powermeters[N].power in watts, converted to kW
  • Total consumptionmeters[N].total in watt-minutes, converted to kWh

Channel 1 polls at 2.5 s together with its dimmer; channels 2-4 poll at 15 s intervals to reduce load on the Gen1 HTTP stack (which tolerates only two concurrent connections).

Service diagnostics

The template exposes 10 service attributes for device monitoring:

  • Network — IP address, MAC address (formatted with colons), Wi-Fi signal strength (dB)
  • Connectivity — cloud enabled/connected, MQTT connected
  • Device info — device time, uptime (formatted as days/hours/minutes), RAM usage
  • Firmware — firmware update available
Service actions

Three service actions are available:

  • Enable cloud — enables or disables Shelly Cloud connectivity
  • Reboot — triggers a device reboot
  • Set mode White — writes /settings?mode=white to enforce White operating mode (useful after a factory reset or if someone changed the mode via the Shelly app)

The Shelly Cloud API is not used by this template — communication is local HTTP polling only.

Troubleshooting

Device not responding
  1. Verify the Shelly is connected to Wi-Fi and has a valid IP address
  2. Try using the mDNS hostname (shellyrgbw2-AABBCCDDEE.local) instead of the IP address — the IP may have changed after a DHCP renewal
  3. Open http://{device-ip}/shelly in a browser — if it responds, the device is reachable
  4. Check that TapHome CCU and Shelly are on the same network / VLAN
“Mode White is not supported” error

This error means the device is currently set to Color mode. To resolve:

  1. Open the Shelly web interface at http://{device-ip} and switch the operating mode to White, or
  2. Send GET /settings?mode=white directly from a browser or curl, or
  3. If you have the Color-mode template imported, run the Set mode White service action from there
  4. The device needs to reboot after a mode change — wait a few seconds and reload TapHome
Power readings show zero
  1. Confirm white LEDs are connected to the relevant Shelly RGBW2 output (R, G, B, or W pin)
  2. Open the Shelly app or web interface and verify the device model is configured under Settings -> Device Model — without this the meter returns zero
  3. Check that the channel is turned on — the meter only reads when current flows through the output
  4. Poll /status manually and verify meters[N].power returns a non-zero value for the channel in question
Channel does not dim smoothly
  1. Check that the transition time parameter matches the behavior you expect — the default 300 ms is a short crossfade; longer values (e.g., 1500 ms) produce slower fades
  2. Remember that the debounce window equals transitionTime + 500 ms — changes sent faster than this can be coalesced
  3. Verify the LED load is dimmable (some drivers are not PWM-compatible) and that the power supply provides a stable 12/24 V DC

Gen1 Shelly devices support only 2 concurrent HTTP connections. If TapHome and another system (e.g., Home Assistant) poll the same device simultaneously, communication may become unreliable. Keep the poll interval at 10-30 seconds per extra client.

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 RGBW2 White Module
Service Attributes
IP AddressCurrent IP address assigned to the device (reads /status -> wifi_sta.ip)
MAC AddressDevice MAC address, formatted with colons (reads /status -> mac)
WIFI signalWi-Fi signal strength in dB (reads /status -> wifi_sta.rssi)
Cloud enabledWhether Shelly Cloud is enabled on the device (reads /status -> cloud.enabled)
Cloud connectedWhether the device is currently connected to Shelly Cloud (reads /status -> cloud.connected)
MQTT connectedWhether the device is currently connected to an MQTT broker (reads /status -> mqtt.connected)
Device timeCurrent time reported by the device (reads /status -> time)
FW update availableTrue if a firmware update is available for the device (reads /status -> has_update)
UptimeTime elapsed since the last reboot, formatted as days/hours/minutes (reads /status -> uptime)
RAMRAM total and free bytes (reads /status -> ram_total, ram_free)
Service Actions
Enable cloudEnable or disable Shelly Cloud connectivity (writes /settings/cloud?enabled=...)
RebootTrigger an immediate device reboot (writes /reboot)
Set mode WhiteSwitch the device to White operating mode; a device restart is required before the new mode becomes active (writes /settings?mode=white)
Custom Variables
transitionTime (numeric) = TransitionTimeLight transition duration in milliseconds (import parameter, default 300 ms). Also defines the debounce window (transitionTime + 500 ms) during which polled values are ignored after each write.

Shelly RGBW2 White

Read (module)
VAR now := NOW();

IF now.Ticks < debounceTimestamp
    RETURN(0);
END

VAR response := SENDHTTPREQUEST("/status");

IF response.IsSuccess
    jsonStatus := response.Content;
    
    if PARSEJSON(jsonStatus, "$.mode", 1) = "color"
    adderror("Mode Color is not supported");
    end
ELSE
    jsonStatus := NULL;
END
Service Attributes
IP Address
VAR response := SENDHTTPREQUEST("/status");

IF response.IsSuccess
    jsonStatus := response.Content;
ELSE
    jsonStatus := NULL;
END

VAR address := PARSEJSON(jsonStatus, "$.wifi_sta.ip", 1);
IF (ISNULL(address), "-", address)
MAC Address
VAR value := PARSEJSON(jsonStatus, "$.mac", 1);
IF ISNULL(value)
    RETURN("-");
END;

STRING mac;
INT i := 0;
INT len := LENGTH(value);

WHILE i < len
    mac += GETAT(value, i);
    i += 1;
    
    IF MOD(i, 2) = 0 AND i < len
        mac += ":";
    END
LOOP

mac
WIFI signal
VAR signal := PARSEJSON(jsonStatus, "$.wifi_sta.rssi", 1);
IF (ISNULL(signal), "-", signal + "db");
Cloud enabled
VAR value := PARSEJSON(jsonStatus, "$.cloud.enabled", 1);
IF (ISNULL(value), "-", value)
Cloud connected
VAR value := PARSEJSON(jsonStatus, "$.cloud.connected", 1);
IF (ISNULL(value), "-", value)
MQTT connected
VAR value := PARSEJSON(jsonStatus, "$.mqtt.connected", 1);
IF (ISNULL(value), "-", value)
Device time
VAR value := PARSEJSON(jsonStatus, "$.time", 1);
IF (ISNULL(value), "-", value)
FW update available
VAR value := PARSEJSON(jsonStatus, "$.has_update");
IF (ISNULL(value), "-", value)
Uptime
VAR value := PARSEJSON(jsonStatus, "$.uptime", 1);
IF ISNULL(value)
    RETURN("-");
END

VAR days := FLOOR(value/86400, 1);
value := MOD(value, 86400);
VAR hours := FLOOR(value/3600, 1);
value := MOD(value, 3600);
VAR minutes := FLOOR(value/60, 1);

days + "day(s) " + hours + "h " + minutes + "m"
RAM
VAR ramFree := PARSEJSON(jsonStatus, "$.ram_free", 1);
VAR ramTotal := PARSEJSON(jsonStatus, "$.ram_total", 1);

IF ISNULL(ramFree) OR ISNULL(ramTotal)
    RETURN("-");
END

ramFree + " bytes free of " + ramTotal
Service Actions
Enable cloud
Parameters: Enable (Enable / Disable)
VAR response := SENDHTTPREQUEST("/settings/cloud?enabled=" + enable);
VAR contentJson := response.Content;
VAR wasEnabled := PARSEJSON(contentJson, "enabled");

IF(wasEnabled, "Cloud enabled", "Cloud disabled");
Reboot
VAR response := SENDHTTPREQUEST("/reboot");
VAR contentJson := response.Content;
VAR wasRebooted := PARSEJSON(contentJson, "ok");

IF(wasRebooted, "Reboot successful", "Error");
Set mode White
VAR response := SENDHTTPREQUEST("/settings?mode=white");
IF(response.isSuccess, "White mode is set", "Error");
Electric Meter Ch1 Electricity Meter Read-only

Channel 1 (R pin) power consumption — instantaneous power (kW) and cumulative energy (kWh)

numeric Unit: W / kWh

Electric Meter Ch1

Read total consumption
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR power := PARSEJSON(jsonStatus, "$.meters[0].power");
VAR total := PARSEJSON(jsonStatus, "$.meters[0].total");
BOOL isOn := PARSEJSON(jsonStatus, "$.lights[0].ison");

IF ISNULL(power) OR ISNULL(total) OR (ison AND power=0)
    ADDWARNING("To enable power monitoring, open device settings in Shelly app or web browser and configure device model in Settings->Device Model");
    
    RETURN(NaN);
END

total / 60000.0
Read demand
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR power := PARSEJSON(jsonStatus, "$.meters[0].power", 1);

IF ISNULL(power)
    RETURN(NaN);
END

power / 1000.0
Dimmer Ch1 (R) Dimmer

Channel 1 white dimmer (R pin output) — brightness 0-100% via /light/0 endpoint

numeric Unit: 0–1

Dimmer Ch1 (R)

Read level
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR now := NOW();
var tmp := now.Ticks - debounceTimestamp;
if now.Ticks > debounceTimestamp
    BOOL isOn := PARSEJSON(jsonStatus, "$.lights[0].ison");
    var brightness := PARSEJSON(jsonStatus, "$.lights[0].brightness");

    if isOn
        return(brightness / 100);
    else
        return(0);
    end
else
    return(le);
end
Write level
IF St > 0.5
    SENDHTTPREQUEST("light/0?turn=on&transition=" + transitionTime + "&brightness=" + ROUND(Le*100.0));
ELSE
    SENDHTTPREQUEST("light/0?turn=off&transition=" + transitionTime);
END

VAR now := NOW();
debounceTimestamp := now.Ticks + transitionTime + 500;
Electric Meter Ch2 Electricity Meter Read-only

Channel 2 (G pin) power consumption — instantaneous power (kW) and cumulative energy (kWh)

numeric Unit: W / kWh

Electric Meter Ch2

Read total consumption
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR power := PARSEJSON(jsonStatus, "$.meters[1].power");
VAR total := PARSEJSON(jsonStatus, "$.meters[1].total");
BOOL isOn := PARSEJSON(jsonStatus, "$.lights[1].ison");

IF ISNULL(power) OR ISNULL(total) OR (ison AND power=0)
    ADDWARNING("To enable power monitoring, open device settings in Shelly app or web browser and configure device model in Settings->Device Model");
    
    RETURN(NaN);
END

total / 60000.0
Read demand
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR power := PARSEJSON(jsonStatus, "$.meters[1].power", 1);

IF ISNULL(power)
    RETURN(NaN);
END

power / 1000.0
Dimmer Ch2 (G) Dimmer

Channel 2 white dimmer (G pin output) — brightness 0-100% via /light/1 endpoint

numeric Unit: 0–1

Dimmer Ch2 (G)

Read level
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR now := NOW();
var tmp := now.Ticks - debounceTimestamp;
if now.Ticks > debounceTimestamp
    BOOL isOn := PARSEJSON(jsonStatus, "$.lights[1].ison");
    var brightness := PARSEJSON(jsonStatus, "$.lights[1].brightness");

    if isOn
        return(brightness / 100);
    else
        return(0);
    end
else
    return(le);
end
Write level
IF St > 0.5
    SENDHTTPREQUEST("light/1?turn=on&transition=" + transitionTime + "&brightness=" + ROUND(Le*100.0));
ELSE
    SENDHTTPREQUEST("light/1?turn=off&transition=" + transitionTime);
END

VAR now := NOW();
debounceTimestamp := now.Ticks + transitionTime + 500;
Electric Meter Ch3 Electricity Meter Read-only

Channel 3 (B pin) power consumption — instantaneous power (kW) and cumulative energy (kWh)

numeric Unit: W / kWh

Electric Meter Ch3

Read total consumption
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR power := PARSEJSON(jsonStatus, "$.meters[2].power");
VAR total := PARSEJSON(jsonStatus, "$.meters[2].total");
BOOL isOn := PARSEJSON(jsonStatus, "$.lights[2].ison");

IF ISNULL(power) OR ISNULL(total) OR (ison AND power=0)
    ADDWARNING("To enable power monitoring, open device settings in Shelly app or web browser and configure device model in Settings->Device Model");
    
    RETURN(NaN);
END

total / 60000.0
Read demand
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR power := PARSEJSON(jsonStatus, "$.meters[2].power", 1);

IF ISNULL(power)
    RETURN(NaN);
END

power / 1000.0
Dimmer Ch3 (B) Dimmer

Channel 3 white dimmer (B pin output) — brightness 0-100% via /light/2 endpoint

numeric Unit: 0–1

Dimmer Ch3 (B)

Read level
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR now := NOW();
var tmp := now.Ticks - debounceTimestamp;
if now.Ticks > debounceTimestamp
    BOOL isOn := PARSEJSON(jsonStatus, "$.lights[2].ison");
    var brightness := PARSEJSON(jsonStatus, "$.lights[2].brightness");

    if isOn
        return(brightness / 100);
    else
        return(0);
    end
else
    return(le);
end
Write level
IF St > 0.5
    SENDHTTPREQUEST("light/2?turn=on&transition=" + transitionTime + "&brightness=" + ROUND(Le*100.0));
ELSE
    SENDHTTPREQUEST("light/2?turn=off&transition=" + transitionTime);
END

VAR now := NOW();
debounceTimestamp := now.Ticks + transitionTime + 500;
Electric Meter Ch4 Electricity Meter Read-only

Channel 4 (W pin) power consumption — instantaneous power (kW) and cumulative energy (kWh)

numeric Unit: W / kWh

Electric Meter Ch4

Read total consumption
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR power := PARSEJSON(jsonStatus, "$.meters[3].power");
VAR total := PARSEJSON(jsonStatus, "$.meters[3].total");
BOOL isOn := PARSEJSON(jsonStatus, "$.lights[3].ison");

IF ISNULL(power) OR ISNULL(total) OR (ison AND power=0)
    ADDWARNING("To enable power monitoring, open device settings in Shelly app or web browser and configure device model in Settings->Device Model");
    
    RETURN(NaN);
END

total / 60000.0
Read demand
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR power := PARSEJSON(jsonStatus, "$.meters[3].power", 1);

IF ISNULL(power)
    RETURN(NaN);
END

power / 1000.0
Dimmer Ch4 (W) Dimmer

Channel 4 white dimmer (W pin output) — brightness 0-100% via /light/3 endpoint

numeric Unit: 0–1

Dimmer Ch4 (W)

Read level
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR now := NOW();
var tmp := now.Ticks - debounceTimestamp;
if now.Ticks > debounceTimestamp
    BOOL isOn := PARSEJSON(jsonStatus, "$.lights[3].ison");
    var brightness := PARSEJSON(jsonStatus, "$.lights[3].brightness");

    if isOn
        return(brightness / 100);
    else
        return(0);
    end
else
    return(le);
end
Write level
IF St > 0.5
    SENDHTTPREQUEST("light/3?turn=on&transition=" + transitionTime + "&brightness=" + ROUND(Le*100.0));
ELSE
    SENDHTTPREQUEST("light/3?turn=off&transition=" + transitionTime);
END

VAR now := NOW();
debounceTimestamp := now.Ticks + transitionTime + 500;
Connection: Packet Parser → HTTP
Possible improvements (10)
  • Auto-off timer per channel — Each /white/{idx} (or legacy /light/{idx}) accepts a timer=N parameter for auto-off countdown; timer_remaining is readable from /status
  • Per-channel default state & auto-on/auto-off — Per-channel settings (default_state off/on/last, auto_on, auto_off, name) — not exposed as service action
  • Night mode (per channel) — Time-window auto-dim (enabled, start_time, end_time, brightness) per white channel — fw v1.12.0+
  • Input State — Physical button/switch input state (0/1), available in /status response
  • WiFi RSSI (numeric) — WiFi RSSI in dBm as numeric value — template reads it only as a formatted string with 'db' suffix
  • Power protection — Max power setting in Watts, available in /settings; read + write possible via /settings?max_power=N
  • OTA firmware update — Trigger OTA firmware update via /ota?update=true
  • Internal device temperature — Internal temperature in °C, available in /status response (Gen1 devices)
  • Overheated — Overtemperature flag, boolean, available in /status response
  • Set mode Color — Switch back to Color mode — template only exposes Set mode White; inverse action omitted (by design, this template is White-only)

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