TapHome

Shelly Plus Plug S

Packet Parser → HTTP
Dodane przez
Ostatnia aktualizacja: 06. 2026
Shelly Plus Plug S

Shelly Plus Plug S to inteligentne gniazdko Wi-Fi Gen2+ z wbudowanym pomiarem mocy i wielokolorowym pierścieniem LED. Podłącza się do standardowego gniazdka CEE 7/3 (Type-F / Schuko) i może przełączać obciążenia do 12 A / 2760 W przy 230 V. TapHome komunikuje się z urządzeniem lokalnie przez Wi-Fi, korzystając z interfejsu JSON-RPC Gen2+ na porcie 80 — połączenie z chmurą nie jest wymagane.

Szablon udostępnia gniazdko jako sześć urządzeń TapHome: przekaźnik, licznik energii, selektor trybu wskaźnika LED, dwa selektory kolorów LED (dla stanu przekaźnika WŁ. i WYŁ.) oraz ściemniacz jasności dla trybu wskaźnika mocy.

Konfiguracja

Parowanie i konfiguracja sieci

Fabrycznie urządzenie uruchamia się w trybie punktu dostępu z SSID ShellyPlusPlugS-XXXXXX (LED miga na niebiesko). Połącz się z tym SSID, otwórz http://192.168.33.1/ i wybierz swoją sieć domową Wi-Fi w interfejsie webowym. Po dołączeniu do LAN gniazdko jest dostępne na porcie 80 pod swoim adresem IP stacji oraz przez mDNS pod shellyplusplugs-<MAC>.local.

TapHome odpytuje punkty końcowe RPC Gen2+ przez nieszyfrowane HTTP — HTTPS jest domyślnie wyłączone, a uwierzytelnianie HTTP (Shelly.SetAuth) musi pozostać wyłączone, aby szablon działał. Upewnij się, że gniazdko znajduje się w tej samej sieci LAN / VLAN co TapHome Core.

Podczas importu szablonu w TapHome podaj adres IP gniazdka jako parametr IpAddress. Zdecydowanie zalecana jest statyczna rezerwacja DHCP, aby adres nie zmieniał się po restartach.

Możliwości urządzenia

Sterowanie przekaźnikiem

Przekaźnik jest udostępniany jako urządzenie przełączające. Jego stan odczytywany jest z /rpc/Switch.GetStatus?id=0 (boolean output) i sterowany przez /rpc/Switch.Set?id=0&on=true|false. Moduł buforuje pełną odpowiedź Switch.GetStatus, dzięki czemu przekaźnik, licznik i atrybuty serwisowe dzielą jedno wywołanie HTTP na odpytanie.

Pomiar mocy i energii

Wbudowany licznik w komponencie Switch udostępnia:

  • Moc chwilowaapower w watach, przeliczana przez szablon na kW (dzielona przez 1000)
  • Energia skumulowanaaenergy.total w watogodzinach, przeliczana na kWh (dzielona przez 1000)

Trzy dodatkowe odczyty są udostępniane jako atrybuty serwisowe na liczniku:

AtrybutJednostkaPole źródłowe
PrądAcurrent
NapięcieVvoltage
Temperatura wewnętrzna°Ctemperature.tC

Licznik jest tylko do odczytu i aktualizuje się w każdym cyklu odpytywania.

Tryb wskaźnika LED

Wielokolorowy pierścień LED jest sterowany przez komponent RPC PLUGS_UI specyficzny dla Plus Plug S. TapHome udostępnia selektor trybu z trzema poprawnymi opcjami — mimo że szablon wymienia dziesięć slotów enum, tylko pierwsze trzy odpowiadają rzeczywistym trybom firmware’u:

WartośćZachowanie
offPierścień LED wyłączony (stany diagnostyczne Wi-Fi / AP / firmware są nadal wyświetlane)
switchKolor LED odzwierciedla stan przekaźnika — używa kolorów WYŁ. i WŁ. zdefiniowanych przez użytkownika
powerKolor LED odzwierciedla zmierzone obciążenie jako ułamek skonfigurowanego limitu mocy (gradient zielony → żółty → czerwony)

Przełączanie między trybami to zmiana kosmetyczna i nie wymaga restartu.

Kolory LED (tryb switch)

Dwa niezależne urządzenia HSB pozwalają wybrać kolor pierścienia LED dla każdego stanu przekaźnika:

  • Kolor LED (stan WYŁ.) — kolor i jasność przy wyłączonym przekaźniku
  • Kolor LED (stan WŁ.) — kolor i jasność przy włączonym przekaźniku

Oba są mapowane na leds.colors.switch:0.{off|on}.{rgb,brightness} w konfiguracji PLUGS_UI. Shelly przechowuje wartości RGB w procentach (0–100 na kanał), a nie 0–255, więc szablon mnoży każdy kanał przez 2,55 podczas konwersji między HSV a natywnym formatem urządzenia. Konwersja jest wewnętrzna — w TapHome urządzenia zachowują się jak każdy inny selektor kolorów HSB.

Jasność LED (tryb power)

Gdy LED jest w trybie power, kolor jest wybierany automatycznie przez firmware na podstawie obciążenia. Tylko jasność jest konfigurowalna przez użytkownika, dlatego szablon udostępnia ją jako ściemniacz (leds.colors.power.brightness, 0–100 % przeskalowane na poziom ściemniacza TapHome 0,0–1,0).

Diagnostyka i akcje modułu

Moduł HTTP udostępnia cztery atrybuty serwisowe parsowane z /rpc/WiFi.GetStatus i /rpc/Sys.GetStatus:

AtrybutŹródło
SSID Wi-Fissid
Adres IPsta_ip
Siła sygnałurssi (dBm)
Adres MACmac

Dostępne są również dwie akcje serwisowe:

  • Aktualizacja firmware’u — uruchamia aktualizację OTA z kanału stabilnego (/rpc/Shelly.Update?stage="stable"). Aktywowana automatycznie, gdy Sys.GetStatus zgłasza available_updates.stable.
  • Restart — restartuje urządzenie (/rpc/Shelly.Reboot), przydatne po zmianach konfiguracji sieci lub w celu usunięcia przejściowych problemów.

Jeśli potrzebujesz tylko przełączania wł./wył. i podstawowego monitorowania energii, zignoruj urządzenia LED — są opcjonalne. Przekaźnik i licznik działają niezależnie od trybu wskaźnika LED.

Rozwiązywanie problemów

Urządzenie nie odpowiada
  1. Sprawdź, czy gniazdko jest połączone z Wi-Fi — LED nie powinien migać ani świecić na czerwono
  2. Spróbuj użyć nazwy mDNS shellyplusplugs-<MAC>.local zamiast adresu IP — dzierżawa DHCP mogła się zmienić
  3. Otwórz http://{ip-urządzenia}/rpc/Shelly.GetDeviceInfo w przeglądarce; jeśli odpowie JSON-em, urządzenie jest osiągalne
  4. Upewnij się, że TapHome Core i gniazdko znajdują się w tej samej sieci LAN / VLAN
  5. Upewnij się, że uwierzytelnianie HTTP jest wyłączone w interfejsie webowym Shelly — szablon nie obsługuje uwierzytelniania digest
Licznik mocy pokazuje zero
  1. Sprawdź, czy do Shelly faktycznie podłączone jest obciążenie i czy nie jest pominięte
  2. Sprawdź, czy przekaźnik jest włączony — licznik pokazuje 0 W, gdy przekaźnik jest rozwarty
  3. Odpytaj bezpośrednio /rpc/Switch.GetStatus?id=0 w przeglądarce i sprawdź, czy apower jest niezerowe
LED nie zmienia się po zmianie trybu
  1. LED odzwierciedla stan runtime tylko w trybach switch i power; w trybie off pozostaje ciemny, z wyjątkiem wzorów diagnostyki systemu (tryb AP, ponowne łączenie, OTA)
  2. W trybie switch upewnij się, że kolory WŁ. i WYŁ. nie są oba ustawione na czarny / 0 % jasności
  3. Wskazania systemowe (niebieskie miganie w trybie AP, czerwone przy problemach z Wi-Fi) zawsze nadpisują konfigurację LED użytkownika — jeśli LED miga na czerwono, gniazdko nie jest w Twojej sieci Wi-Fi
Akcja aktualizacji firmware’u nie uruchamia się
  1. Szablon uruchamia aktualizację tylko gdy Sys.GetStatus zgłasza available_updates.stable — wykonaj akcję ręcznie z karty urządzenia lub interfejsu webowego, jeśli gniazdko jest już aktualne
  2. Szablon celuje tylko w kanał stabilny; firmware beta musi być zainstalowany z interfejsu webowego Shelly

Jak zainstalować w TapHome

Wymagania wstępne

  • Urządzenie Shelly zainstalowane i włączone
  • Lokalna sieć Wi-Fi (2,4 GHz)
  • TapHome CCU w tej samej sieci

Krok 1 — Podłącz Shelly do Wi-Fi

Opcja A — Aplikacja Shelly (zalecana):

  1. Pobierz aplikację Shelly (iOS / Android)
  2. Dotknij +Add Device i postępuj zgodnie z kreatorem parowania Bluetooth
  3. Wprowadź dane logowania Wi-Fi, gdy zostaniesz o to poproszony

Opcja B — Tryb AP (bez aplikacji):

  1. Przy pierwszym uruchomieniu urządzenie tworzy hotspot: ShellyXXX-AABBCCDDEE
  2. Połącz telefon/PC z tym hotspotem
  3. Otwórz http://192.168.33.1Internet & SecurityWi-Fi Mode - Client
  4. Wprowadź SSID i hasło → Save

Shelly obsługuje tylko sieci 2,4 GHz. Sieci 5 GHz nie pojawią się podczas skanowania.

Krok 2 — Znajdź adres IP

Po połączeniu z Wi-Fi znajdź przypisany adres IP za pomocą jednej z poniższych metod:

  • Aplikacja Shelly: Szczegóły urządzenia → Device info → Adres IP
  • Interfejs webowy Shelly: Połącz się z AP urządzenia przed konfiguracją Wi-Fi — IP zostanie wyświetlone po zapisaniu
  • Tabela DHCP routera: Szukaj nazwy hosta takiej jak shelly1pm-AABBCCDDEE
  • mDNS: Pinguj shelly<model>-<mac>.local (np. shelly1pm-AABBCCDDEE.local) z tej samej sieci

Przypisz urządzeniu Shelly statyczny IP (rezerwację DHCP) w routerze, aby adres nie zmieniał się po ponownym uruchomieniu routera.

Krok 3 — Konfiguracja w TapHome

  1. W TapHome dodaj nowy moduł Packet Parser (HTTP)
  2. IP Address: wprowadź IP z kroku 2 (np. 192.168.1.50)
  3. Port: 80 (domyślny, nie wymaga zmiany)
  4. Zaimportuj szablon — TapHome będzie okresowo odpytywać /status w celu odczytu stanu urządzenia

Uwierzytelnianie HTTP jest domyślnie wyłączone na urządzeniach Shelly. Jeśli włączyłeś ochronę logowaniem, TapHome obecnie nie obsługuje HTTP Basic Auth — pozostaw uwierzytelnianie wyłączone dla integracji z TapHome.

Dostępne urządzenia

Shelly Plus Plug S Moduł
Atrybuty serwisowe
SSID Wi-Fi
Adres IP
Siła sygnałuSiła sygnału Wi-Fi w dBm — wartości bliższe 0 oznaczają silniejsze połączenie (np. −55 dBm dobre, −80 dBm słabe)
Adres MAC
Akcje serwisowe
Aktualizacja firmware'uUruchamia aktualizację firmware'u OTA z kanału stabilnego Shelly
RestartRestartuje urządzenie — przydatne po zmianach konfiguracji sieci lub w celu usunięcia przejściowych problemów
Zmienne niestandardowe

Shelly Plus Plug S

Odczyt (moduł)
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
Atrybuty serwisowe
Wifi
PARSEJSON(WiFi.GetStatus, "ssid")
${ipAddress}
PARSEJSON(WiFi.GetStatus, "sta_ip")
${xml_signal_strength} [dB]
PARSEJSON(WiFi.GetStatus, "rssi")
MAC
PARSEJSON(Sys.GetStatus, "mac")
Akcje serwisowe
${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
Przełącznik Przełącznik
boolean
Wartości / Stany: ON · OFF

Przełącznik

Odczyt stanu przełącznika
var x := (sendhttprequest("/rpc/Switch.GetStatus?id=0"));
var status := x.Content;
return(PARSEJSON(status, "$.output", true));
Zapis stanu przełącznika
VAR response := SENDHTTPREQUEST("rpc/Switch.Set?id=0&on=" + if(St,"true","false"));
IF response.IsSuccess = false
  ADDERROR(response.StatusCode);
END
Licznik energii Licznik energii Tylko do odczytu

Moc chwilowa (kW) i energia skumulowana (kWh) mierzone przez wbudowany licznik, z diagnostyką prądu, napięcia i temperatury wewnętrznej

numeric Jednostka: kW / kWh
Atrybuty serwisowe
Prąd
Napięcie
TemperaturaWewnętrzna temperatura urządzenia w °C — gniazdko wyłącza się automatycznie przy przegrzaniu

Licznik energii

Odczyt całkowitego zużycia
return(parsejson(parsejson(Switch.GetStatus,"aenergy"), "total")/1000);
Odczyt zapotrzebowania
return(parsejson(Switch.GetStatus,"apower")/1000);
Odczyt (moduł)
VAR response := SENDHTTPREQUEST("/rpc/Switch.GetStatus?id=0");
IF response.IsSuccess
    Switch.GetStatus := response.Content;
END
Atrybuty serwisowe
${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"));
Tryb wskaźnika LED Przełącznik wielowartościowy

Zachowanie pierścienia LED — Off (wyłączony), Switch (kolor odzwierciedla stan przekaźnika) lub Power (kolor odzwierciedla obciążenie zielony → żółty → czerwony)

string enum
Wartości / Stany: ${xml_off} · ${switch} · ${xml_power}

Tryb wskaźnika LED

Odczyt stanu przełącznika
switch(parsejson(PLUGS_UI.GetConfig, "leds.mode"), "power", 2, "switch", 1, 0)
Zapis stanu przełącznika
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
Kolor LED (stan WYŁ.) Światło HSB

Kolor RGB i jasność pierścienia LED przy wyłączonym przekaźniku (używany w trybie Switch)

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

Kolor LED (stan WYŁ.)

Odczyt jasności
parsejson(PLUGS_UI.GetConfig, basePath + ".brightness") / 100
Zapis jasności
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
Odczyt odcienia
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
Zapis odcienia
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
Odczyt nasycenia
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
Zapis nasycenia
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
Kolor LED (stan WŁ.) Światło HSB

Kolor RGB i jasność pierścienia LED przy włączonym przekaźniku (używany w trybie Switch)

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

Kolor LED (stan WŁ.)

Odczyt jasności
parsejson(PLUGS_UI.GetConfig, basePath + ".brightness") / 100
Zapis jasności
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
Odczyt odcienia
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
Zapis odcienia
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
Odczyt nasycenia
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
Zapis nasycenia
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
Jasność LED (tryb Power) Ściemniacz

Jasność pierścienia LED w trybie Power — sam kolor jest dobierany automatycznie przez firmware na podstawie obciążenia

numeric

Jasność LED (tryb Power)

Odczyt poziomu
parsejson(PLUGS_UI.GetConfig, "leds.colors.power.brightness") / 100
Zapis poziomu
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
Połączenie: Packet Parser → HTTP
Możliwe ulepszenia (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

Źródła

Znalazłeś problem z tym szablonem urządzenia?

Napisz nam, co nie działa, czego brakuje lub jak powinien zachowywać się szablon. Twoja opinia pomaga nam utrzymać katalog dokładnym.

Zweryfikowane przez TapHome

Chcesz tego użyć w swoim TapHome Core?

Otwórz ten szablon w portalu klienta, aby zastosować go w swoim domu, lub zaproponuj modyfikację i wyślij ją z powrotem do katalogu.

Otwórz w portalu