TapHome

Shelly Plus 2PM

Packet Parser → HTTP
Dodane przez
Ostatnia aktualizacja: 03. 2026
Shelly Plus 2PM

Shelly Plus 2PM to kompaktowy dwukanałowy przekaźnik Wi-Fi z wbudowanym pomiarem mocy na obu kanałach. Mieści się za standardowym włącznikiem ściennym i może sterować dwoma niezależnymi obwodami, każdy do 10 A (łącznie 16 A przy 230 V AC), lub napędzać pojedynczą zmotoryzowaną roletę. TapHome komunikuje się z urządzeniem przez HTTP za pomocą Gen2+ RPC API w sieci lokalnej — połączenie z chmurą nie jest wymagane.

Urządzenie obsługuje dwa profile operacyjne — switch i cover — wybierane przez interfejs webowy Shelly lub akcję serwisową TapHome. W profilu switch oba wyjścia przekaźnikowe (O1 i O2) działają niezależnie z pomiarem mocy na każdym kanale. W profilu cover oba wyjścia napędzają pojedynczy silnik dla rolet, żaluzji lub zasłon, ze sterowaniem pozycją i kalibracją.

Shelly Plus 2PM został wycofany z produkcji. Jego następca, Shelly 2PM Gen3, oferuje tę samą funkcjonalność podwójnego profilu z ulepszonym procesorem (8 MB flash), do 6 jednoczesnych połączeń HTTP i możliwością aktualizacji do Matter.

Konfiguracja

Shelly Plus 2PM łączy się przez Wi-Fi. Podczas importu szablonu TapHome wprowadź adres IP urządzenia (domyślny symbol zastępczy 192.168.0.1).

Uwierzytelnianie musi być wyłączone na urządzeniu Shelly do integracji z TapHome. TapHome nie obsługuje HTTP Digest Auth używanego przez urządzenia Gen2+. Otwórz interfejs webowy Shelly (http://{ip-urzadzenia}) → Settings → Authentication i upewnij się, że jest wyłączone.

Jeśli tryb ECO jest włączony na urządzeniu Shelly, może powodować przekroczenia czasu komunikacji z powodu szybkich interwałów odpytywania szablonu (2,5–5 sekund). Wyłącz tryb ECO w interfejsie webowym Shelly, jeśli doświadczasz sporadycznych problemów z łącznością.

Wybór profilu

Shelly Plus 2PM działa w jednym z dwóch profili naraz. Aktywny profil określa, które urządzenia TapHome będą funkcjonalne:

  • Profil switch — aktywuje oba przekaźniki (Switch 1 i Switch 2) oraz ich liczniki energii dla każdego kanału. Urządzenie rolety i licznik energii rolety nie będą odpowiadać.
  • Profil cover — aktywuje urządzenie rolety i jego licznik energii. Dwa urządzenia przełączające i ich liczniki energii nie będą odpowiadać.

Aktywny profil jest widoczny jako atrybut serwisowy na poziomie modułu (“Profile”) w TapHome. Aby zmienić profil, użyj akcji serwisowej Profile na poziomie modułu lub przełącz go w interfejsie webowym Shelly. Po zmianie profilu urządzenie restartuje się i działać będą tylko urządzenia odpowiadające nowemu profilowi.

Szablon zawiera wszystkie sześć urządzeń (2 przełączniki + 2 liczniki mocy przełączników + 1 roleta + 1 licznik mocy rolety), ale działać będą tylko urządzenia odpowiadające aktywnemu profilowi. To oczekiwane zachowanie — urządzenia na niewłaściwym profilu po prostu nie odpowiadają.

Kalibracja osłony

Podczas korzystania z profilu cover, zakresy ruchu silnika muszą być skalibrowane, zanim sterowanie pozycją zacznie działać. Do zakończenia kalibracji current_pos zwraca null, a atrybut serwisowy “Calibrated” pokazuje false. Kalibruj przez interfejs webowy Shelly lub uruchamiając akcję serwisową Calibrate na urządzeniu Shutter w TapHome. Podczas kalibracji osłona wykonuje wieloetapową sekwencję (pełne otwarcie → pełne zamknięcie → pełne otwarcie → zamykanie krokami → otwieranie krokami) w celu zmierzenia odległości ruchu.

Możliwości urządzenia

Sterowanie przekaźnikiem (profil switch)

Szablon udostępnia dwa niezależne przekaźniki. Każdy przełącznik odczytuje stan z /rpc/Switch.GetStatus?id={0,1} (pole output, boolean) i steruje przekaźnikiem przez /rpc/Switch.Set?id={0,1}&on=true|false.

Każdy przełącznik udostępnia siedem atrybutów serwisowych:

  • Source — źródło ostatniego polecenia (http, UI, WS_in itp.)
  • Temperature — temperatura wewnętrzna urządzenia w °C
  • Initial State — zachowanie przełącznika przy włączeniu zasilania (off, on, restore_last lub match_input)
  • Input Mode — tryb okablowania wejścia fizycznego (follow lub detached)
  • Power Limit — maksymalny próg mocy w watach dla ochrony przed przeciążeniem
  • Voltage Limit — maksymalny próg napięcia w woltach
  • Current Limit — maksymalny próg prądu w amperach

Dwie akcje serwisowe są dostępne dla każdego przełącznika:

  • Set Initial State — konfiguruje zachowanie przekaźnika po włączeniu zasilania (off, on, restore_last, match_input)
  • Set Mode — konfiguruje tryb okablowania wejścia fizycznego (follow, detached)
Pomiar mocy (profil switch)

Każdy kanał przełącznika ma dedykowany licznik energii odczytujący dwie wartości z /rpc/Switch.GetStatus:

  • Moc chwilowaapower w watach, szablon konwertuje na kW
  • Całkowite zużycieaenergy.total w watogodzinach, szablon konwertuje na kWh

Każdy licznik energii udostępnia również trzy atrybuty serwisowe:

  • Voltage — napięcie zasilania w woltach
  • Current — prąd obciążenia w amperach
  • Power Factor — współczynnik mocy obciążenia

Liczniki są tylko do odczytu — aktualizują się automatycznie z każdym cyklem odpytywania.

Sterowanie roletą (profil cover)

Urządzenie rolety steruje zmotoryzowaną roletą, zasłoną lub markizą. Pozycję odczytuje z /rpc/Cover.GetStatus?id=0 (pole current_pos, 0–100%) i zapisuje przez /rpc/Cover.GoToPosition?id=0&pos=N.

Urządzenie rolety udostępnia 21 atrybutów serwisowych:

  • Stan — źródło, stan (open/closed/opening/closing/stopped/calibrating), aktualna i docelowa pozycja, timeout ruchu i czas startu
  • Kalibracja — czy sterowanie pozycją jest włączone (pos_control)
  • Temperatura — temperatura wewnętrzna urządzenia w °C
  • Zachowanie przy włączeniu — konfiguracja stanu początkowego (open, closed, stopped)
  • Ustawienia wejść — tryb wejścia (single, dual, detached), zamiana wejść, odwrócenie kierunków
  • Limity ochronne — limit mocy (W), limit napięcia (V), limit prądu (A)
  • Ustawienia silnika — próg mocy jałowej (0–50 W), okres potwierdzenia jałowego (0,25–2 s)
  • Limity ruchu — maksymalny czas otwarcia (0,1–300 s), maksymalny czas zamknięcia (0,1–300 s)
  • Funkcje bezpieczeństwa — stan wykrywania przeszkód, stan wyłącznika bezpieczeństwa

Sześć akcji serwisowych jest dostępnych dla rolety:

  • Open — otwiera osłonę całkowicie
  • Close — zamyka osłonę całkowicie
  • Stop — zatrzymuje ruch natychmiast
  • Calibrate — rozpoczyna procedurę kalibracji dla sterowania pozycją
  • Go to Position — przenosi osłonę na konkretną pozycję (0–100%)
  • Reverse directions — przełącza konfigurację invert_directions i restartuje urządzenie
Pomiar mocy (profil cover)

Roleta ma dedykowany licznik energii odczytujący z /rpc/Cover.GetStatus:

  • Moc chwilowaapower w watach, szablon konwertuje na kW
  • Całkowite zużycieaenergy.total w watogodzinach, szablon konwertuje na kWh

Licznik energii rolety udostępnia również napięcie, prąd i współczynnik mocy jako atrybuty serwisowe.

Diagnostyka serwisowa

Szablon udostępnia dwa atrybuty serwisowe na poziomie modułu:

  • MAC — adres MAC urządzenia z konfiguracji systemowej
  • Profile — aktualnie aktywny profil urządzenia (switch lub cover)

Skrypt odczytu modułu sprawdza również restart_required z /rpc/Sys.GetStatus i wyświetla ostrzeżenie w TapHome, jeśli restart jest wymagany.

Akcje serwisowe

Dwie akcje serwisowe są dostępne na poziomie modułu:

  • Reboot — wyzwala restart urządzenia przez /rpc/Shelly.Reboot
  • Profile — przełącza między profilami operacyjnymi switch i cover przez /rpc/Shelly.SetProfile
Dodatkowe możliwości

Shelly Plus 2PM udostępnia również częstotliwość sieciową (freq), minutowe wartości energii (aenergy.by_minute), stany wejść fizycznych (input:0, input:1), siłę sygnału Wi-Fi (RSSI) i endpoint przełączania w swoich odpowiedziach RPC. Liczniki energii można zresetować przez /rpc/Switch.ResetCounters (profil switch) lub /rpc/Cover.ResetCounters (profil cover). W trybie cover pozycja lameli/pochylenia dla żaluzji weneckich jest dostępna, gdy sprzęt to obsługuje. Te możliwości mogą zostać dodane w przyszłej aktualizacji szablonu.

Rozwiązywanie problemów

Urządzenie nie odpowiada
  1. Sprawdź, czy Shelly jest połączony z Wi-Fi i ma prawidłowy adres IP
  2. Spróbuj użyć nazwy hosta mDNS (shellyplus2pm-AABBCCDDEE.local) zamiast adresu IP — IP mógł się zmienić po odnowieniu DHCP
  3. Otwórz http://{ip-urzadzenia}/rpc/Shelly.GetDeviceInfo w przeglądarce — jeśli odpowiada JSON, urządzenie jest osiągalne
  4. Sprawdź, czy TapHome Core i Shelly są w tej samej sieci / VLAN
  5. Upewnij się, że uwierzytelnianie jest wyłączone na urządzeniu Shelly
Niezgodność profilu — urządzenia nie odpowiadają

Jeśli niektóre urządzenia nie pokazują odczytów, podczas gdy inne działają poprawnie:

  1. Sprawdź, który profil jest aktualnie aktywny — atrybut serwisowy “Profile” na poziomie modułu pokazuje bieżący tryb
  2. Przełącz na właściwy profil za pomocą akcji serwisowej Profile lub zignoruj nieużywane urządzenia
  3. Po przełączeniu profilu urządzenie automatycznie się restartuje — poczekaj kilka sekund na ponowne połączenie
Pozycja osłony nie działa
  1. Sprawdź, czy urządzenie jest w profilu cover — profil switch nie udostępnia funkcji osłony
  2. Uruchom akcję serwisową Calibrate na urządzeniu Shutter — sterowanie pozycją wymaga ukończonej kalibracji
  3. Sprawdź, czy silnik jest prawidłowo podłączony do zacisków O1 i O2
  4. Ręcznie odpytaj /rpc/Cover.GetStatus?id=0 i sprawdź, czy pos_control ma wartość true
Kalibracja osłony nie powiodła się

Kalibracja zostaje przerwana, jeśli:

  • Osłona nie osiąga pozycji końcowej w czasie maxtime_open lub maxtime_close
  • Funkcja bezpieczeństwa (wykrywanie przeszkód lub wyłącznik bezpieczeństwa) zostaje aktywowana podczas kalibracji
  • Podczas kalibracji wydane zostaje zewnętrzne polecenie zatrzymania
  • Kierunek silnika nie odpowiada oczekiwanemu sprzężeniu zwrotnemu
  • Urządzenie restartuje się podczas kalibracji

Sprawdź okablowanie silnika, zwiększ maxtime_open/maxtime_close jeśli silnik jest wolny i upewnij się, że nie ma przeszkód.

Odczyty mocy pokazują zero
  1. Potwierdź, że obciążenie jest podłączone przez przekaźnik Shelly (nie jest obejście)
  2. Sprawdź, czy przekaźnik jest włączony — licznik mierzy tylko gdy prąd przepływa przez przekaźnik
  3. Ręcznie odpytaj /rpc/Switch.GetStatus?id=0 (profil switch) lub /rpc/Cover.GetStatus?id=0 (profil cover) i sprawdź, czy apower zwraca wartość niezerową

Urządzenia Shelly Gen2+ obsługują do 6 jednoczesnych połączeń HTTP. Mimo że to poprawa w stosunku do Gen1 (2 połączenia), unikaj jednoczesnego odpytywania z zbyt wielu systemów (TapHome, Home Assistant, niestandardowe skrypty), aby zapobiec wyczerpaniu połączeń.

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 2PM Moduł
Atrybuty serwisowe
MACAdres MAC urządzenia z konfiguracji systemowej
ProfilAktywny profil urządzenia — switch lub cover
Akcje serwisowe
RestartRestartuje urządzenie
ProfilPrzełączanie między profilami switch i cover — wymaga restartu urządzenia
Zmienne niestandardowe

Shelly Plus 2 PM

Odczyt (moduł)
VAR response := SENDHTTPREQUEST("/rpc/Sys.GetConfig");
IF response.IsSuccess
  VAR content := response.Content;
  VAR responseHeaders := response.Headers;
  SysConfig := response.Content;
END;
 
response := SENDHTTPREQUEST("/rpc/Sys.GetStatus");
IF response.IsSuccess
  content := response.Content;
  responseHeaders := response.Headers;
  if(PARSEJSON(response.Content, "$.restart_required") = true, ADDERROR("Restart required"));
END
Atrybuty serwisowe
MAC
PARSEJSON(SysConfig, "$.device.mac");
Profile
PARSEJSON(SysConfig, "$.device.profile");
Akcje serwisowe
Reboot
VAR response := SENDHTTPREQUEST("/rpc/Shelly.Reboot");
IF response.IsSuccess
  VAR content := response.Content;
  VAR responseHeaders := response.Headers;
  Return("OK");
END;
Profile
Parametry: Profile
var profile := SWITCH(pr, 1, "cover", "switch");
VAR response := SENDHTTPREQUEST("/rpc/Shelly.SetProfile?name=\""+profile+"\"");
IF response.IsSuccess
  VAR content := response.Content;
  VAR responseHeaders := response.Headers;
  Return("OK");
END;
Miernik mocy (Roleta) Licznik energii Tylko do odczytu

Pomiar energii w trybie cover — moc chwilowa (kW) i energia skumulowana (kWh)

numeric Jednostka: kW / kWh json_path
Atrybuty serwisowe
NapięcieNapięcie zasilania w Voltach
PrądPrąd obciążenia w Amperach
Współczynnik mocyWspółczynnik mocy obciążenia

Miernik mocy (Roleta)

Odczyt całkowitego zużycia
if PARSEJSON(SysConfig, "$.device.profile") = "switch"
    adderror("Device profile is set to switch");
else
    return(PARSEJSON(CoverStatus, "$.aenergy.total") / 1000);
end
Odczyt zapotrzebowania
if PARSEJSON(SysConfig, "$.device.profile") = "cover"
    return(PARSEJSON(CoverStatus, "$.apower", true) / 1000);
end
Odczyt (moduł)
if PARSEJSON(SysConfig, "$.device.profile") = "cover"
    var response := SENDHTTPREQUEST("/rpc/Cover.GetStatus?id=" + Id);
    IF response.IsSuccess
        VAR content := response.Content;
        VAR responseHeaders := response.Headers;
        CoverStatus := response.Content;
    END
end
Atrybuty serwisowe
Voltage [V]
PARSEJSON(CoverStatus, "$.voltage", true);
Current [A]
PARSEJSON(CoverStatus, "$.current", true);
Power Factor
PARSEJSON(CoverStatus, "$.pf", true);
Miernik mocy (Przełącznik 1) Licznik energii Tylko do odczytu

Pomiar energii dla kanału przełącznika 1 — moc chwilowa (kW) i energia skumulowana (kWh)

numeric Jednostka: kW / kWh json_path
Atrybuty serwisowe
NapięcieNapięcie zasilania w Voltach
PrądPrąd obciążenia w Amperach
Współczynnik mocyWspółczynnik mocy obciążenia

Miernik mocy (Przełącznik 1)

Odczyt całkowitego zużycia
if PARSEJSON(SysConfig, "$.device.profile") = "cover"
    adderror("Device profile is set to cover");
else
    return(PARSEJSON(SwitchStatus, "$.aenergy.total", true) / 1000);
end
Odczyt zapotrzebowania
if PARSEJSON(SysConfig, "$.device.profile") = "switch"
    return(PARSEJSON(SwitchStatus, "$.apower", true) / 1000);
end
Odczyt (moduł)
if PARSEJSON(SysConfig, "$.device.profile") = "switch"
    var response := SENDHTTPREQUEST("/rpc/Switch.GetStatus?id=" + Id);
    IF response.IsSuccess
        VAR content := response.Content;
        VAR responseHeaders := response.Headers;
        SwitchStatus := response.Content;
    END
end
Atrybuty serwisowe
Voltage [V]
PARSEJSON(SwitchStatus, "$.voltage", true);
Current [A]
PARSEJSON(SwitchStatus, "$.current", true);
Power Factor
PARSEJSON(SwitchStatus, "$.pf", true);
Miernik mocy (Przełącznik 2) Licznik energii Tylko do odczytu

Pomiar energii dla kanału przełącznika 2 — moc chwilowa (kW) i energia skumulowana (kWh)

numeric Jednostka: kW / kWh json_path
Atrybuty serwisowe
NapięcieNapięcie zasilania w Voltach
PrądPrąd obciążenia w Amperach
Współczynnik mocyWspółczynnik mocy obciążenia

Miernik mocy (Przełącznik 2)

Odczyt całkowitego zużycia
if PARSEJSON(SysConfig, "$.device.profile") = "cover"
    adderror("Device profile is set to cover");
else
    return(PARSEJSON(SwitchStatus, "$.aenergy.total", true) / 1000);
end
Odczyt zapotrzebowania
if PARSEJSON(SysConfig, "$.device.profile") = "switch"
    return(PARSEJSON(SwitchStatus, "$.apower", true) / 1000);
end
Odczyt (moduł)
if PARSEJSON(SysConfig, "$.device.profile") = "switch"
    var response := SENDHTTPREQUEST("/rpc/Switch.GetStatus?id=" + Id);
    IF response.IsSuccess
        VAR content := response.Content;
        VAR responseHeaders := response.Headers;
        SwitchStatus := response.Content;
    END
end
Atrybuty serwisowe
Voltage [V]
PARSEJSON(SwitchStatus, "$.voltage", true);
Current [A]
PARSEJSON(SwitchStatus, "$.current", true);
Power Factor
PARSEJSON(SwitchStatus, "$.pf", true);
Roleta Suwak

Zmotoryzowane sterowanie roletą ze śledzeniem pozycji — wymaga kalibracji do sterowania pozycją

numeric Jednostka: % json_path
Atrybuty serwisowe
ŹródłoŹródło ostatniego polecenia rolety
StanAktualny stan rolety — open, closed, opening, closing, stopped, calibrating
Aktualna pozycjaAktualna pozycja rolety w procentach (0–100), null jeśli nieskalibrowana
Pozycja docelowaPozycja docelowa podczas ruchu rolety
Limit czasu ruchuSekundy do automatycznego zatrzymania podczas ruchu
Ruch rozpoczęty oZnacznik czasu rozpoczęcia bieżącego ruchu
SkalibrowanyCzy sterowanie pozycją jest włączone (true po udanej kalibracji)
TemperaturaTemperatura wewnętrzna urządzenia w stopniach Celsjusza
Stan początkowyZachowanie rolety po włączeniu — open, closed lub stopped
Tryb wejściaTryb okablowania wejścia fizycznego — single, dual lub detached
Limit mocyMaksymalny próg mocy w Watach dla ochrony przed przeciążeniem
Limit napięciaMaksymalny próg napięcia w Voltach dla ochrony przed przepięciem
Limit prąduMaksymalny próg prądu w Amperach dla ochrony przed nadprądem
Próg mocy jałowej silnikaPróg mocy, poniżej którego silnik jest uznawany za bezczynny (0–50 W)
Okres potwierdzenia bezczynności silnikaCzas, przez który silnik musi pozostać poniżej progu bezczynności, aby potwierdzić zatrzymanie (0,25–2 s)
Maksymalny czas otwarciaMaksymalny czas otwarcia przed automatycznym zatrzymaniem (0,1–300 s)
Maksymalny czas zamknięciaMaksymalny czas zamknięcia przed automatycznym zatrzymaniem (0,1–300 s)
Zamień wejściaCzy przypisanie wejść S1/S2 jest zamienione
Odwróć kierunkiCzy kierunki otwarcia/zamknięcia są odwrócone
Wykrywanie przeszkódCzy wykrywanie przeszkód jest włączone
Wyłącznik bezpieczeństwaCzy funkcja wyłącznika bezpieczeństwa jest włączona
Akcje serwisowe
OtwórzCałkowicie otwiera roletę
ZamknijCałkowicie zamyka roletę
ZatrzymajNatychmiast zatrzymuje ruch rolety
KalibracjaUruchamia kalibrację rolety — wymagana do sterowania pozycją
Przejdź do pozycjiPrzesuwa roletę do określonej pozycji (0–100 %)
Odwróć kierunkiPrzełącza konfigurację invert_directions i restartuje urządzenie

Roleta

Odczyt (moduł)
if PARSEJSON(SysConfig, "$.device.profile") = "switch"
    adderror("Device profile is set to switch");
else
    var response := SENDHTTPREQUEST("/rpc/Cover.GetStatus?id=" + Id);
    IF response.IsSuccess
        VAR content := response.Content;
        VAR responseHeaders := response.Headers;
        CoverStatus := response.Content;
    END
    
    response := SENDHTTPREQUEST("/rpc/Cover.GetConfig?id=" + Id);
    IF response.IsSuccess
        content := response.Content;
        responseHeaders := response.Headers;
        CoverConfig := response.Content;
    END
end
Odczyt poziomu rolety
if PARSEJSON(SysConfig, "$.device.profile") = "switch"
    adderror("Device profile is set to switch");
else
    var response := SENDHTTPREQUEST("/rpc/Cover.GetStatus?id=" + Id);
    IF response.IsSuccess
        CoverStatus := response.Content;
    END
    if PARSEJSON(CoverStatus, "$.pos_control", true) = true
        var pos := -1;
        var curpos := PARSEJSON(CoverStatus, "$.current_pos", true);
        if ISNULL(curpos)
            adderror("Device lost its position. Open or close the cover completely to enable back position control.");
            return(0);
        end
        var target := PARSEJSON(CoverStatus, "$.target_pos", true);
        if(ISNULL(target), pos := curpos, pos := target);
        if PARSEJSON(CoverConfig, "$.invert_directions", true)
            return(linear(pos, 0, 0, 100, 1));
        else
            return(linear(pos, 0, 1, 100, 0));
        end
    else
        adderror("Device is not calibrated");
    end
end
Zapis poziomu rolety
if PARSEJSON(SysConfig, "$.device.profile") = "switch"
    adderror("Device profile is set to switch");
else
    var pos := 0;
    if PARSEJSON(CoverConfig, "$.invert_directions", true)
        pos := linear(Bl, 0, 0, 1, 100);
    else
        pos := linear(Bl, 0, 100, 1, 0);
    end
    VAR response := SENDHTTPREQUEST("rpc/Cover.GoToPosition?id=" + Id + "&pos=" + pos);
    IF response.IsSuccess
      VAR content := response.Content;
      Return("OK");
    else
      return(parsejson(response.Content,"$.message"));
    END
end
Atrybuty serwisowe
Source
PARSEJSON(CoverStatus, "$.source", true);
State
PARSEJSON(CoverStatus, "$.state", true);
Current Position
PARSEJSON(CoverStatus, "$.current_pos", true);
Target Position
PARSEJSON(CoverStatus, "$.target_pos", true);
Move Timeout
PARSEJSON(CoverStatus, "$.move_timeout", true);
Move Started at
PARSEJSON(CoverStatus, "$.move_started_at", true);
Calibrated
PARSEJSON(CoverStatus, "$.pos_control", true);
Temperature [°C]
PARSEJSON(CoverStatus, "$.temperature.tC", true);
Initial State
PARSEJSON(CoverConfig, "$.initial_state", true);
Input Mode
PARSEJSON(CoverConfig, "$.in_mode", true);
Power Limit [W]
PARSEJSON(CoverConfig, "$.power_limit", true);
Voltage Limit [V]
PARSEJSON(CoverConfig, "$.voltage_limit", true);
Current Limit [A]
PARSEJSON(CoverConfig, "$.current_limit", true);
Motor Idle Power Threshold [W]
PARSEJSON(CoverConfig, "$.motor.idle_power_thr", true);
Motor Idle Confirm Period [s]
PARSEJSON(CoverConfig, "$.motor.idle_confirm_period", true);
Max Time Open [s]
PARSEJSON(CoverConfig, "$.maxtime_open", true);
Max Time Close [s]
PARSEJSON(CoverConfig, "$.maxtime_close", true);
Swap Inputs
PARSEJSON(CoverConfig, "$.swap_inputs", true);
Invert Directions
PARSEJSON(CoverConfig, "$.invert_directions", true);
Obstruction Detection
PARSEJSON(CoverConfig, "$.obstruction_detection", true);
Safety Switch
PARSEJSON(CoverConfig, "$.safety_switch", true);
Akcje serwisowe
Open
VAR response := SENDHTTPREQUEST("rpc/Cover.Open?id=" + Id );
IF response.IsSuccess
  VAR content := response.Content;
  Return("OK");
else
  return(parsejson(response.Content,"$.message"));
END;
Close
VAR response := SENDHTTPREQUEST("rpc/Cover.Close?id=" + Id );
IF response.IsSuccess
  VAR content := response.Content;
  Return("OK");
else
  return(parsejson(response.Content,"$.message"));
END;
Stop
VAR response := SENDHTTPREQUEST("rpc/Cover.Stop?id=" + Id );
IF response.IsSuccess
  VAR content := response.Content;
  Return("OK");
else
  return(parsejson(response.Content,"$.message"));
END;
Calibrate
VAR response := SENDHTTPREQUEST("rpc/Cover.Calibrate?id=" + Id );
IF response.IsSuccess
  VAR content := response.Content;
  Return("OK");
else
  return(parsejson(response.Content,"$.message"));
END;
Go to Position
Parametry: Position (0–100 pos)
VAR response := SENDHTTPREQUEST("rpc/Cover.GoToPosition?id=" + Id + "&pos=" + pos);
IF response.IsSuccess
  VAR content := response.Content;
  Return("OK");
else
  return(parsejson(response.Content,"$.message"));
END;
Reverse directions
var reverse := "false";
if(PARSEJSON(CoverConfig, "$.invert_directions"), reverse := "false", reverse := "true");
VAR response := SENDHTTPREQUEST("rpc/Cover.SetConfig?id=0&config={\"invert_directions\":" + reverse + "}");
IF response.IsSuccess
  SENDHTTPREQUEST("rpc/Shelly.Reboot");
  Return("OK");
else
  return(parsejson(response.Content,"$.message"));
END;
Przełącznik 1 Przełącznik

Wyjście przekaźnikowe kanał 1 — sterowanie włączaniem/wyłączaniem z konfiguracją zachowania po włączeniu i trybu wejścia

boolean json_path
Wartości / Stany: ON · OFF
Akcje serwisowe
Ustaw stan początkowyKonfiguruje zachowanie przełącznika po włączeniu
Ustaw trybKonfiguruje tryb okablowania wejścia fizycznego

Przełącznik 1

Odczyt stanu przełącznika
if PARSEJSON(SysConfig, "$.device.profile") = "cover"
    adderror("Device profile is set to cover");
else
    RETURN(PARSEJSON(SwitchStatus, "$.output", true));
end
Zapis stanu przełącznika
if PARSEJSON(SysConfig, "$.device.profile") = "switch"
    VAR response := SENDHTTPREQUEST("rpc/Switch.Set?id=" + Id + "&on=" + if(St,"true","false"));
    IF response.IsSuccess = false
      ADDERROR(response.StatusCode);
    END
end
Odczyt (moduł)
if PARSEJSON(SysConfig, "$.device.profile") = "switch"
    var response := SENDHTTPREQUEST("/rpc/Switch.GetStatus?id=" + Id);
    IF response.IsSuccess
        VAR content := response.Content;
        VAR responseHeaders := response.Headers;
        SwitchStatus := response.Content;
    END
    
    response := SENDHTTPREQUEST("/rpc/Switch.GetConfig?id=" + Id);
    IF response.IsSuccess
        content := response.Content;
        responseHeaders := response.Headers;
        SwitchConfig := response.Content;
    END
end
Atrybuty serwisowe
Source
PARSEJSON(SwitchStatus, "$.source", true);
Temprature [°C]
PARSEJSON(SwitchStatus, "$.temperature.tC", true);
Initial State
PARSEJSON(SwitchConfig, "$.initial_state", true);
Input Mode
PARSEJSON(SwitchConfig, "$.in_mode", true);
Power Limit [W]
PARSEJSON(SwitchConfig, "$.power_limit", true);
Voltage Limit [V]
PARSEJSON(SwitchConfig, "$.voltage_limit", true);
Current Limit [A]
PARSEJSON(SwitchConfig, "$.current_limit", true);
Akcje serwisowe
Set Initial State
Parametry: Mode
var mode := SWITCH(md, 1, "on", 2, "restore_last", 3, "match_input", "off");
VAR response := SENDHTTPREQUEST("rpc/Switch.SetConfig?id=" + Id +"&config={\"initial_state\":\""+mode+"\"}");
IF response.IsSuccess
  VAR content := response.Content;
  Return("OK");
else
  return(parsejson(response.Content,"$.message"));
END;
Set Mode
Parametry: Mode
var mode := SWITCH(md, 1, "detached", "follow");
VAR response := SENDHTTPREQUEST("rpc/Switch.SetConfig?id=" + Id +"&config={\"in_mode\":\""+mode+"\"}");
IF response.IsSuccess
  VAR content := response.Content;
  Return("OK");
else
  return(parsejson(response.Content,"$.message"));
END;
Przełącznik 2 Przełącznik

Wyjście przekaźnikowe kanał 2 — sterowanie włączaniem/wyłączaniem z konfiguracją zachowania po włączeniu i trybu wejścia

boolean json_path
Wartości / Stany: ON · OFF
Akcje serwisowe
Ustaw stan początkowyKonfiguruje zachowanie przełącznika po włączeniu
Ustaw trybKonfiguruje tryb okablowania wejścia fizycznego

Przełącznik 2

Odczyt stanu przełącznika
if PARSEJSON(SysConfig, "$.device.profile") = "cover"
    adderror("Device profile is set to cover");
else
    RETURN(PARSEJSON(SwitchStatus, "$.output", true));
end
Zapis stanu przełącznika
if PARSEJSON(SysConfig, "$.device.profile") = "switch"
    VAR response := SENDHTTPREQUEST("rpc/Switch.Set?id=" + Id + "&on=" + if(St,"true","false"));
    IF response.IsSuccess = false
      ADDERROR(response.StatusCode);
    END
end
Odczyt (moduł)
if PARSEJSON(SysConfig, "$.device.profile") = "switch"
    var response := SENDHTTPREQUEST("/rpc/Switch.GetStatus?id=" + Id);
    IF response.IsSuccess
        VAR content := response.Content;
        VAR responseHeaders := response.Headers;
        SwitchStatus := response.Content;
    END
    
    response := SENDHTTPREQUEST("/rpc/Switch.GetConfig?id=" + Id);
    IF response.IsSuccess
        content := response.Content;
        responseHeaders := response.Headers;
        SwitchConfig := response.Content;
    END
end
Atrybuty serwisowe
Source
PARSEJSON(SwitchStatus, "$.source", true);
Temprature [°C]
PARSEJSON(SwitchStatus, "$.temperature.tC", true);
Initial State
PARSEJSON(SwitchConfig, "$.initial_state", true);
Input Mode
PARSEJSON(SwitchConfig, "$.in_mode", true);
Power Limit [W]
PARSEJSON(SwitchConfig, "$.power_limit", true);
Voltage Limit [V]
PARSEJSON(SwitchConfig, "$.voltage_limit", true);
Current Limit [A]
PARSEJSON(SwitchConfig, "$.current_limit", true);
Akcje serwisowe
Set Initial State
Parametry: Mode
var mode := SWITCH(md, 1, "on", 2, "restore_last", 3, "match_input", "off");
VAR response := SENDHTTPREQUEST("rpc/Switch.SetConfig?id=" + Id +"&config={\"initial_state\":\""+mode+"\"}");
IF response.IsSuccess
  VAR content := response.Content;
  Return("OK");
else
  return(parsejson(response.Content,"$.message"));
END;
Set Mode
Parametry: Mode
var mode := SWITCH(md, 1, "detached", "follow");
VAR response := SENDHTTPREQUEST("rpc/Switch.SetConfig?id=" + Id +"&config={\"in_mode\":\""+mode+"\"}");
IF response.IsSuccess
  VAR content := response.Content;
  Return("OK");
else
  return(parsejson(response.Content,"$.message"));
END;
Połączenie: Packet Parser → HTTP
Możliwe ulepszenia (8)
  • Frequency — Network frequency in Hz, available in both Switch and Cover status responses
  • Energy per Minute — Last 3 minute energy values in Wh, available but not exposed as separate device
  • Input 1 State — Physical input state (input:0), available in both profiles
  • Input 2 State — Physical input state (input:1), available in both profiles
  • Switch Toggle — Toggle switch without knowing current state — could be added as service action
  • Reset Energy Counters — Resets energy measurement counters — could be added as service action
  • Slat Position — Slat/tilt position for venetian blinds, if hardware supports it
  • WiFi Signal Strength — RSSI in dBm, available via WiFi component

Źródła