TapHome

Shelly 2PM Gen3

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

Shelly 2PM Gen3 to kompaktowy dwukanałowy moduł przekaźnikowy Wi-Fi z wbudowanym pomiarem mocy. Mieści się za standardowym przełącznikiem ściennym i może sterować dwoma niezależnymi obwodami do 10 A każdy (łącznie 16 A przy 230 V AC) lub jedną zmotoryzowaną roletą/żaluzją. TapHome komunikuje się z urządzeniem przez HTTP za pomocą API Gen2+/Gen3 JSON-RPC 2.0 w sieci lokalnej — połączenie z chmurą nie jest wymagane.

Urządzenie obsługuje dwa profile pracy — 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 kanał. W profilu cover dwa wyjścia napędzają jeden silnik do rolet, żaluzji lub zasłon, ze sterowaniem pozycją, obsługą lameli i kalibracją.

W odróżnieniu od Shelly 1PM Gen3, który steruje jednym obwodem, 2PM Gen3 zapewnia sterowanie dwukanałowe lub obsługę zmotoryzowanej rolety. Oba dzielą tę samą platformę Gen3 z procesorem ESP (8 MB flash), do 6 jednoczesnych połączeń HTTP i możliwością aktualizacji do Matter.

Konfiguracja

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

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

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

Wybór profilu

Shelly 2PM Gen3 pracuje w jednym z dwóch profili naraz. Aktywny profil określa, które urządzenia TapHome są funkcjonalne:

  • Profil switch — aktywuje oba przełączniki przekaźnikowe (Przełącznik 1 i Przełącznik 2) z niezależnym pomiarem mocy. Urządzenia rolety i żaluzji będą wyświetlać błąd profilu.
  • Profil cover — aktywuje roletę i żaluzję. Urządzenia przełączników będą wyświetlać błąd profilu.

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

Szablon zawiera wszystkie cztery typy urządzeń (2 przełączniki + roleta + żaluzja), ale działać będą tylko urządzenia odpowiadające aktywnemu profilowi. Urządzenia w niewłaściwym profilu wyświetlają komunikat błędu, np. „Profile is not set to switch" lub „Profile is not set to cover" — to oczekiwane zachowanie, nie awaria.

Kalibracja rolety

Przy użyciu profilu cover limity ruchu silnika muszą być skalibrowane przed działaniem sterowania pozycją. Dopóki kalibracja nie zostanie zakończona, szablon wyświetli błąd „Calibration is required". Skalibruj przez interfejs webowy Shelly lub uruchamiając akcję serwisową Uruchom automatyczną kalibrację w TapHome. Podczas kalibracji roleta przejedzie całkowicie w górę i całkowicie w dół, aby zmierzyć odległości.

Możliwości urządzeń

Sterowanie przekaźnikiem (profil switch)

Szablon udostępnia dwa niezależne przełączniki przekaźnikowe. Każdy przełącznik odczytuje swój 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 również atrybuty serwisowe do monitorowania na kanał:

  • Temperatura — wewnętrzna temperatura urządzenia w °C (temperature.tC)
  • Zużycie energii — energia skumulowana w Wh (aenergy.total)
  • Pobór mocy — moc chwilowa w W (apower)
  • Napięcie elektryczne — napięcie zasilania w V (voltage)
  • Prąd elektryczny — prąd obciążenia w A (current)
  • Częstotliwość — częstotliwość sieci AC w Hz (freq)
  • Współczynnik mocy — wartość współczynnika mocy (pf)

Przełączniki aktualizują się co 2,5 sekundy.

Sterowanie roletą (profil cover)

Urządzenie rolety steruje zmotoryzowaną roletą, zasłoną lub markizą. Odczytuje pozycję z /rpc/Cover.GetStatus?id=0 (pola current_pos i target_pos, 0–100) i zapisuje przez /rpc/Cover.GoToPosition?id=0&pos=N. Szablon odwraca skalę pozycji tak, że 0 = całkowicie otwarta i 100 = całkowicie zamknięta w TapHome.

Roleta udostępnia atrybuty serwisowe:

  • Temperatura — wewnętrzna temperatura urządzenia w °C
  • Zużycie energii — energia skumulowana silnika w Wh
  • Pobór mocy — moc chwilowa silnika w W
  • Napięcie elektryczne — napięcie zasilania w V
  • Prąd elektryczny — prąd silnika w A

Akcja serwisowa Uruchom automatyczną kalibrację jest dostępna do uruchomienia kalibracji bezpośrednio z TapHome.

Sterowanie żaluzją (profil cover)

Urządzenie żaluzji rozszerza roletę o sterowanie nachyleniem lameli dla żaluzji poziomych. Oprócz pozycji odczytuje i zapisuje pozycję lameli (slat_pos) przez /rpc/Cover.GoToPosition?id=0&pos=N&slat_pos=M. Obie skale pozycji i nachylenia są odwrócone (0 = otwarta, 100 = zamknięta w TapHome).

Żaluzja udostępnia te same atrybuty serwisowe co roleta, plus:

  • Lamela — pokazuje, czy sterowanie lamelami jest włączone lub wyłączone (z Cover.GetConfig → $.slat.enable)
  • Czas otwarcia lameli — skonfigurowany czas otwierania lameli w sekundach
  • Czas zamknięcia lameli — skonfigurowany czas zamykania lameli w sekundach

Znany problem szablonu: Atrybut serwisowy „Slat close time" odczytuje $.slat.open_time zamiast $.slat.close_time z konfiguracji Cover. Oba atrybuty czasu lameli obecnie wyświetlają tę samą wartość (czas otwarcia). Zostanie to naprawione w przyszłej rewizji szablonu.

Dwie akcje serwisowe są dostępne na urządzeniu żaluzji:

  • Uruchom automatyczną kalibrację — uruchamia kalibrację pozycji rolety
  • Ustaw lamelę — włącza sterowanie lamelami i konfiguruje czasy otwarcia/zamknięcia (0,1–5 sekund każdy) przez /rpc/Cover.SetConfig

Sterowanie lamelami musi być włączone, zanim urządzenie żaluzji będzie mogło sterować nachyleniem. Jeśli pozycja lameli nie jest dostępna z urządzenia, żaluzja wyświetli błąd „Slat position must be enabled for blinds". Użyj akcji serwisowej Ustaw lamelę, aby ją włączyć i ustawić czasy otwarcia/zamknięcia.

Diagnostyka serwisowa

Szablon udostępnia atrybuty serwisowe na poziomie modułu do monitorowania urządzenia:

  • WiFi — nazwa podłączonej sieci SSID
  • Adres IP — aktualny adres IP stacji
  • Siła sygnału — WiFi RSSI w dB
  • MAC — adres MAC urządzenia
  • Profil — aktualnie aktywny profil urządzenia (switch lub cover)

Skrypt odczytu modułu sprawdza również dostępność aktualizacji firmware i oczekujące wymagania restartu, wyświetlając je jako ostrzeżenia w interfejsie TapHome.

Akcje serwisowe

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

  • Aktualizacja firmware — uruchamia aktualizację firmware do najnowszej stabilnej wersji przez /rpc/Shelly.Update
  • Restart — uruchamia restart urządzenia przez /rpc/Shelly.Reboot
  • Ustaw profil — przełącza między trybami pracy cover i switch przez /rpc/Shelly.SetProfile
Dodatkowe możliwości

Shelly 2PM Gen3 udostępnia również stany fizycznych wejść (input:0, input:1), liczniki energii zwrotnej/eksportowanej, czas pracy, wykorzystanie RAM i czas urządzenia w swoich odpowiedziach RPC. Timer auto-off jest dostępny przez parametr toggle_after, ochrona przed przeciążeniem można skonfigurować przez Switch.SetConfig → power_limit, a liczniki energii można zresetować przez /rpc/Switch.ResetCounters. W trybie cover dostępne są bezpośrednie polecenia open/close/stop i stan ruchu rolety (open/opening/closed/closing/stopped/calibrating). 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 (shelly2pmg3-AABBCCDDEE.local) zamiast adresu IP — IP mógł się zmienić po odnowieniu DHCP
  3. Otwórz http://{device-ip}/rpc/Shelly.GetDeviceInfo w przeglądarce — jeśli odpowie JSON-em, urządzenie jest osiągalne
  4. Sprawdź, czy TapHome Core i Shelly są w tej samej sieci / VLAN
  5. Potwierdź, że uwierzytelnianie jest wyłączone na urządzeniu Shelly
Błędy niezgodności profilu

Jeśli urządzenie wyświetla „Profile is not set to switch" lub „Profile is not set to cover":

  1. Sprawdź, który profil jest aktualnie aktywny — atrybut serwisowy „Profil" na poziomie modułu pokazuje aktualny tryb
  2. Przełącz na właściwy profil za pomocą akcji serwisowej Ustaw profil lub usuń nieużywane urządzenia z TapHome
  3. Po przełączeniu profili urządzenie restartuje się automatycznie — odczekaj kilka sekund na ponowne połączenie
Sterowanie pozycją rolety nie działa
  1. Sprawdź, czy urządzenie jest w profilu cover — profil switch nie udostępnia funkcjonalności rolety
  2. Uruchom akcję serwisową Uruchom automatyczną kalibrację — sterowanie pozycją wymaga ukończonej kalibracji
  3. Sprawdź, czy silnik jest prawidłowo podłączony do zacisków O1 i O2
  4. Odpytaj /rpc/Cover.GetStatus?id=0 ręcznie i sprawdź, czy pos_control to true
Nachylenie żaluzji nie reaguje
  1. Potwierdź, że sterowanie lamelami jest włączone — sprawdź atrybut serwisowy „Lamela" (powinien pokazywać „Enabled")
  2. Jeśli wyłączone, użyj akcji serwisowej Ustaw lamelę do włączenia i konfiguracji czasów otwarcia/zamknięcia
  3. Sprawdź, czy silnik żaluzji obsługuje operację nachylenia — rolety bez nachylenia ignorują polecenia lameli
Ostrzeżenie o przegrzaniu

Shelly 2PM Gen3 ma wewnętrzną ochronę termiczną. Jeśli temperatura urządzenia przekroczy bezpieczne limity, wartość temperature w atrybutach serwisowych urządzenia wzrośnie. Zapewnij odpowiednią wentylację wokół urządzenia, szczególnie przy przełączaniu dużych obciążeń. Maksymalny prąd przełączania wynosi 10 A na kanał, łącznie 16 A (18 A szczytowo).

Urządzenia Shelly Gen2+/Gen3 obsługują do 6 jednoczesnych połączeń HTTP. Choć jest to znaczna poprawa w stosunku do Gen1 (2 połączenia), unikaj odpytywania z zbyt wielu systemów jednocześnie (TapHome, Home Assistant, własne skrypty), aby zapobiec wyczerpaniu połączeń. Szablon Shelly 2PM Gen3 używa do 4 jednoczesnych endpointów na cykl odpytywania, co pozostawia ograniczony margines na dodatkowe połączenia.

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 2PM Gen3 Moduł
Atrybuty serwisowe
WiFi
Adres IP
Siła sygnału
MAC
ProfilAktywny profil urządzenia — switch (podwójny przekaźnik) lub cover (zmotoryzowana żaluzja/roleta)
Akcje serwisowe
Aktualizacja firmware
Restart
Ustaw profilPrzełączanie między trybami cover i switch — urządzenie restartuje się po zmianie profilu
Zmienne niestandardowe

Shelly 2PM Gen3

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

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")
Profile
PARSEJSON(Sys.GetConfig, "$.device.profile");
Akcje serwisowe
${xml_update_fw}
VAR response := SENDHTTPREQUEST("/rpc/Shelly.Update?stage=\"stable\"");
IF response.IsSuccess
    return("OK");
else
    return("Error");
END

${restart}
VAR response := SENDHTTPREQUEST("/rpc/Shelly.Reboot");
IF response.IsSuccess
    return("OK");
else
    return("Error");
END
Set Profile
Parametry: Profile
VAR response := SENDHTTPREQUEST("/rpc/Shelly.SetProfile?name=\"" + 
switch(prof,
0, "cover",
1, "switch",
"")
+ "\"");
IF response.IsSuccess
    return("OK");
else
    return("Error");
END
Przełącznik 1 Przełącznik

Wyjście przekaźnikowe 1 z pomiarem mocy na kanał — wymaga profilu switch

boolean
Wartości / Stany: ON · OFF

Przełącznik 1

Odczyt stanu przełącznika
VAR response := SENDHTTPREQUEST("/rpc/Switch.GetStatus?id=" + ID);
IF response.IsSuccess
    Switch.GetStatus := response.Content;  
END
return(PARSEJSON(Switch.GetStatus, "$.output", true));
Zapis stanu przełącznika
VAR response := SENDHTTPREQUEST("rpc/Switch.Set?id=" + ID + "&on=" + if(St,"true","false"));
IF response.IsSuccess = false
  ADDERROR(response.StatusCode);
END
Odczyt (moduł)
if PARSEJSON(Sys.GetConfig, "$.device.profile") != "switch"
	adderror("Profile is not set to switch (" + PARSEJSON(Sys.GetConfig, "$.device.profile") + ")");
end

VAR response := SENDHTTPREQUEST("/rpc/Switch.GetStatus?id=" + ID);
IF response.IsSuccess
    Switch.GetStatus := response.Content;  
END

response := SENDHTTPREQUEST("/rpc/Switch.GetConfig?id=" + ID);
IF response.IsSuccess
    Switch.GetConfig := response.Content;
END

if ! ISNULL(parsejson(Switch.GetStatus, "errors", true))
    adderror("Error: " + parsejson(Switch.GetStatus, "errors"));
end
Atrybuty serwisowe
${device_variable_realtemperature} [°C]
parsejson(Switch.GetStatus, "$.temperature.tC", true)
${device_variable_electricityconsumption} [Wh]
parsejson(Switch.GetStatus, "$.aenergy.total", true)
${device_variable_electricitydemand} [W]
parsejson(Switch.GetStatus, "$.apower", true)
${valueLogType_ElectricVoltage} [V]
parsejson(Switch.GetStatus, "$.voltage", true)
${valueLogType_ElectricCurrent} [A]
parsejson(Switch.GetStatus, "$.current", true)
${frequency} [Hz]
parsejson(Switch.GetStatus, "$.freq", true)
Power Factor
parsejson(Switch.GetStatus, "$.pf", true)
Przełącznik 2 Przełącznik

Wyjście przekaźnikowe 2 z pomiarem mocy na kanał — wymaga profilu switch

boolean
Wartości / Stany: ON · OFF

Przełącznik 2

Odczyt stanu przełącznika
VAR response := SENDHTTPREQUEST("/rpc/Switch.GetStatus?id=" + ID);
IF response.IsSuccess
    Switch.GetStatus := response.Content;  
END
return(PARSEJSON(Switch.GetStatus, "$.output", true));
Zapis stanu przełącznika
VAR response := SENDHTTPREQUEST("rpc/Switch.Set?id=" + ID + "&on=" + if(St,"true","false"));
IF response.IsSuccess = false
  ADDERROR(response.StatusCode);
END
Odczyt (moduł)
if PARSEJSON(Sys.GetConfig, "$.device.profile") != "switch"
	adderror("Profile is not set to switch (" + PARSEJSON(Sys.GetConfig, "$.device.profile") + ")");
end

VAR response := SENDHTTPREQUEST("/rpc/Switch.GetStatus?id=" + ID);
IF response.IsSuccess
    Switch.GetStatus := response.Content;  
END

response := SENDHTTPREQUEST("/rpc/Switch.GetConfig?id=" + ID);
IF response.IsSuccess
    Switch.GetConfig := response.Content;
END

if ! ISNULL(parsejson(Switch.GetStatus, "errors", true))
    adderror("Error: " + parsejson(Switch.GetStatus, "errors"));
end
Atrybuty serwisowe
${device_variable_realtemperature} [°C]
parsejson(Switch.GetStatus, "$.temperature.tC", true)
${device_variable_electricityconsumption} [Wh]
parsejson(Switch.GetStatus, "$.aenergy.total", true)
${device_variable_electricitydemand} [W]
parsejson(Switch.GetStatus, "$.apower", true)
${valueLogType_ElectricVoltage} [V]
parsejson(Switch.GetStatus, "$.voltage", true)
${valueLogType_ElectricCurrent} [A]
parsejson(Switch.GetStatus, "$.current", true)
${frequency} [Hz]
parsejson(Switch.GetStatus, "$.freq", true)
Power Factor
parsejson(Switch.GetStatus, "$.pf", true)
Roleta Suwak

Zmotoryzowana roleta lub zasłona ze sterowaniem pozycją — wymaga profilu cover i kalibracji

numeric Jednostka: %
Atrybuty serwisowe
Temperatura
Zużycie energii
Pobór mocy
Napięcie elektryczne
Prąd elektryczny
Akcje serwisowe
Uruchom automatyczną kalibrację

Roleta

Odczyt (moduł)
if PARSEJSON(Sys.GetConfig, "$.device.profile") != "cover"
	adderror("Profile is not set to cover (" + PARSEJSON(Sys.GetConfig, "$.device.profile") + ")");
end

VAR response := SENDHTTPREQUEST("/rpc/Cover.GetStatus?id=" + ID);
IF response.IsSuccess
    Cover.GetStatus := response.Content;  
END

response := SENDHTTPREQUEST("/rpc/Cover.GetConfig?id=" + ID);
IF response.IsSuccess
    Cover.GetConfig := response.Content;
END

if ! parsejson(Cover.GetStatus, "$.pos_control", true)
    #adderror("${presence_calibration_required}");
    adderror("Calibration is required");
end

if ! ISNULL(parsejson(Cover.GetStatus, "errors", true))
    adderror("Error: " + parsejson(Cover.GetStatus, "errors"));
end
Odczyt poziomu rolety
var pos := PARSEJSON(Cover.GetStatus, "$.current_pos", true);
if ! isnull(PARSEJSON(Cover.GetStatus, "$.target_pos", true))
	pos := PARSEJSON(Cover.GetStatus, "$.target_pos", true);
end

return(linear(pos,0,1,100,0));
Zapis poziomu rolety
VAR response := SENDHTTPREQUEST("rpc/Cover.GoToPosition?id=" + ID + "&pos=" + round(linear(Bl,0,100,1,0)));
IF response.IsSuccess = false
  ADDERROR(response.StatusCode);
END

response := SENDHTTPREQUEST("/rpc/Cover.GetStatus?id=" + ID);
IF response.IsSuccess
    Cover.GetStatus := response.Content;  
END
Atrybuty serwisowe
${device_variable_realtemperature} [°C]
parsejson(Cover.GetStatus, "$.temperature.tC", true)
${device_variable_electricityconsumption} [Wh]
parsejson(Cover.GetStatus, "$.aenergy.total", true)
${device_variable_electricitydemand} [W]
parsejson(Cover.GetStatus, "$.apower", true)
${valueLogType_ElectricVoltage} [V]
parsejson(Cover.GetStatus, "$.voltage", true)
${valueLogType_ElectricCurrent} [A]
parsejson(Cover.GetStatus, "$.current", true)
Akcje serwisowe
${start_automatic_calibration}
VAR response := SENDHTTPREQUEST("/rpc/Cover.Calibrate?id=" + ID);
IF response.IsSuccess
    return("OK");
else
    return("Error");
END
Żaluzja Roleta

Żaluzja ze sterowaniem pozycją i nachyleniem lameli — wymaga profilu cover, kalibracji i włączonych lameli

numeric Jednostka: %
Atrybuty serwisowe
Temperatura
Zużycie energii
Pobór mocy
Napięcie elektryczne
Prąd elektryczny
LamelaCzy sterowanie nachyleniem lameli jest włączone w konfiguracji Shelly Cover
Czas otwarcia lameli
Czas zamknięcia lameli
Akcje serwisowe
Uruchom automatyczną kalibrację
Ustaw lamelęWłącz sterowanie lamelami i skonfiguruj czas otwarcia/zamknięcia (0,1–5 sekund)

Żaluzja

Odczyt (moduł)
if PARSEJSON(Sys.GetConfig, "$.device.profile") != "cover"
	adderror("Profile is not set to cover (" + PARSEJSON(Sys.GetConfig, "$.device.profile") + ")");
end

VAR response := SENDHTTPREQUEST("/rpc/Cover.GetStatus?id=" + ID);
IF response.IsSuccess
    Cover.GetStatus := response.Content;  
END

response := SENDHTTPREQUEST("/rpc/Cover.GetConfig?id=" + ID);
IF response.IsSuccess
    Cover.GetConfig := response.Content;
END

if ! parsejson(Cover.GetStatus, "$.pos_control", true)
    #adderror("${presence_calibration_required}");
    adderror("Calibration is required");
end

if ! ISNULL(parsejson(Cover.GetStatus, "errors", true))
    adderror("Error: " + parsejson(Cover.GetStatus, "errors"));
end
Odczyt poziomu rolety
var pos := PARSEJSON(Cover.GetStatus, "$.current_pos", true);
var target := PARSEJSON(Cover.GetStatus, "$.target_pos", true);
var slatPos := PARSEJSON(Cover.GetStatus, "$.slat_pos", true);

BlSend := 0;
if BsSend = 0 and (Bs = 0 or Bs = 1) 
	if (!isnull(target))
		DeltaPos := 0;
		return(linear(target,0,1,100,0));
	else
		return(linear(pos - DeltaPos,0,1,100,0));	
	end
end

return(Bl);
Zapis poziomu rolety
var pos := PARSEJSON(Cover.GetStatus, "$.current_pos", true);
var target := PARSEJSON(Cover.GetStatus, "$.target_pos", true);
var slatPos := PARSEJSON(Cover.GetStatus, "$.slat_pos", true);

VAR response := SENDHTTPREQUEST("rpc/Cover.GoToPosition?id=0&pos=" + round(linear(Bl,0,100,1,0)));
BlSend := 1;
IF response.IsSuccess = false
  ADDERROR(response.StatusCode);
END

#response := SENDHTTPREQUEST("/rpc/Cover.GetStatus?id=0");
#IF response.IsSuccess
#    Cover.GetStatus := response.Content;  
#END
Odczyt nachylenia lameli
var pos := PARSEJSON(Cover.GetStatus, "$.current_pos", true);
var slatPos := PARSEJSON(Cover.GetStatus, "$.slat_pos", true);
var state := PARSEJSON(Cover.GetStatus, "$.state", true);
var date := NOW();

if ISNULL(slatPos)
    adderror("Slat position must be enabled for blinds");
    return(NaN);
end

if state = "closing" or state = "opening"
	BsSend := 1;
	return(Bs);
end

if BsSend > 1
	BsSend := 1;
	return(Bs);
else
	if BsSend = 1
		BsSend := 0;
		DeltaPos := pos - round(linear(Bl,0,100,1,0));	
	end
	return(linear(slatPos,0,1,100,0));
end
Zapis nachylenia lameli
var date := NOW();
var pos := PARSEJSON(Cover.GetStatus, "$.current_pos", true);

if BlSend = 0
	VAR response := SENDHTTPREQUEST("rpc/Cover.GoToPosition?id=0&pos=" + pos + "&slat_pos=" + round(linear(Bs,0,100,1,0)));
	BsSend := date.UNIXTIME;
	IF response.IsSuccess = false
	  ADDERROR(response.StatusCode);
	END
end

#response := SENDHTTPREQUEST("/rpc/Cover.GetStatus?id=0");
#IF response.IsSuccess
#    Cover.GetStatus := response.Content;  
#END
Atrybuty serwisowe
${device_variable_realtemperature} [°C]
parsejson(Cover.GetStatus, "$.temperature.tC", true)
${device_variable_electricityconsumption} [Wh]
parsejson(Cover.GetStatus, "$.aenergy.total", true)
${device_variable_electricitydemand} [W]
parsejson(Cover.GetStatus, "$.apower", true)
${valueLogType_ElectricVoltage} [V]
parsejson(Cover.GetStatus, "$.voltage", true)
${valueLogType_ElectricCurrent} [A]
parsejson(Cover.GetStatus, "$.current", true)
Slat
if(parsejson(Cover.GetConfig, "$.slat.enable", true), "Enabled", "Disabled")
Slat open time [s]
parsejson(Cover.GetConfig, "$.slat.open_time ", true)
Slat close time [s]
parsejson(Cover.GetConfig, "$.slat.open_time ", true)
Akcje serwisowe
${start_automatic_calibration}
VAR response := SENDHTTPREQUEST("/rpc/Cover.Calibrate?id=" + ID);
IF response.IsSuccess
    return("OK");
else
    return("Error");
END
Set Slat
Parametry: Open time [s] (0.1–5 ot), Close time [s] (0.1–5 ct)
VAR response := SENDHTTPREQUEST("/rpc/Cover.SetConfig?id=" + ID + 
	"&config={\"slat\":{\"enable\":true, \"open_time\": " + ot +", \"close_time\": " + ct +"}}");
IF response.IsSuccess
    return("OK");
else
    return("Error");
END
Połączenie: Packet Parser → HTTP
Możliwe ulepszenia (11)
  • Input 1 State — Physical switch/button input 1 state, available via /rpc/Input.GetStatus?id=0
  • Input 2 State — Physical switch/button input 2 state, available via /rpc/Input.GetStatus?id=1
  • Returned Energy — Returned/exported energy in Wh, for bi-directional metering scenarios
  • Uptime — Seconds since last reboot, available in Sys.GetStatus response
  • RAM Usage — Total and free RAM in bytes, available in Sys.GetStatus response
  • Device Time — Current device time in HH:MM format, available in Sys.GetStatus response
  • Auto-off Timer — Auto-reset timer in seconds via toggle_after parameter, could be added as switch parameter
  • Reset Energy Counters — Resets energy measurement counters (aenergy, ret_aenergy) for both channels
  • Overpower Protection — Configurable power limit threshold in Watts, relay turns off when exceeded
  • Cover State — Cover movement state (open/opening/closed/closing/stopped/calibrating), available in Cover.GetStatus
  • Cover Open/Close/Stop Commands — Direct open/close/stop commands without position parameter; template uses GoToPosition instead

Źródła