TapHome

Shelly 2PM Gen3

Packet Parser → HTTP
Eingereicht von
Zuletzt aktualisiert: 03. 2026
Shelly 2PM Gen3

Der Shelly 2PM Gen3 ist ein kompaktes Zweikanal-WLAN-Relaismodul mit integrierter Leistungsmessung. Er passt hinter einen Standard-Wandschalter und kann zwei unabhängige Stromkreise bis jeweils 10 A (16 A gesamt bei 230 V AC) oder einen einzelnen motorisierten Rollladen/eine Jalousie steuern. TapHome kommuniziert mit dem Gerät über HTTP mittels der Gen2+/Gen3 JSON-RPC 2.0 API im lokalen Netzwerk — keine Cloud-Verbindung erforderlich.

Das Gerät unterstützt zwei Betriebsprofile — Switch und Cover — wählbar über die Shelly-Weboberfläche oder die TapHome-Serviceaktion. Im Switch-Profil arbeiten beide Relaisausgänge (O1 und O2) unabhängig mit kanalweiser Leistungsmessung. Im Cover-Profil steuern die zwei Ausgänge einen einzelnen Motor für Rollläden, Jalousien oder Vorhänge, mit Positionssteuerung, Lamellenunterstützung und Kalibrierung.

Im Unterschied zum Shelly 1PM Gen3, der einen einzelnen Stromkreis steuert, bietet der 2PM Gen3 Zweikanalsteuerung oder motorisierte Beschattungsunterstützung. Beide teilen die gleiche Gen3-Plattform mit ESP-Prozessor (8 MB Flash), bis zu 6 gleichzeitigen HTTP-Verbindungen und Matter-Upgradefähigkeit.

Konfiguration

Der Shelly 2PM Gen3 verbindet sich über WLAN. Während des TapHome-Vorlagenimports geben Sie die IP-Adresse des Geräts ein (Standard-Platzhalter 192.168.0.1).

Die Authentifizierung muss am Shelly-Gerät deaktiviert sein für die TapHome-Integration. TapHome unterstützt nicht die HTTP Digest Auth, die von Gen2+/Gen3-Geräten verwendet wird. Öffnen Sie die Shelly-Weboberfläche (http://{device-ip}) → Settings → Authentication und stellen Sie sicher, dass sie deaktiviert ist.

Wenn der ECO-Modus am Shelly-Gerät aktiviert ist, kann dies zu Kommunikations-Timeouts aufgrund der schnellen Abfrageintervalle der Vorlage (2,5–3 Sekunden) führen. Deaktivieren Sie den ECO-Modus in der Shelly-Weboberfläche, wenn Sie intermittierende Konnektivitätsprobleme feststellen.

Profilauswahl

Der Shelly 2PM Gen3 arbeitet jeweils in einem von zwei Profilen. Das aktive Profil bestimmt, welche TapHome-Geräte funktionsfähig sind:

  • Switch-Profil — aktiviert beide Relaisschalter (Schalter 1 und Schalter 2) mit unabhängiger Leistungsmessung. Die Rollladen- und Jalousiegeräte zeigen einen Profilfehler an.
  • Cover-Profil — aktiviert den Rollladen und die Jalousie. Die Schaltergeräte zeigen einen Profilfehler an.

Das aktive Profil ist als Service-Attribut auf Modulebene („Profil") in TapHome sichtbar. Um das Profil zu ändern, verwenden Sie die Serviceaktion Profil einstellen auf Modulebene oder wechseln Sie es in der Shelly-Weboberfläche. Nach dem Profilwechsel startet das Gerät neu und nur die Geräte, die zum neuen Profil passen, funktionieren ohne Fehler.

Die Vorlage enthält alle vier Gerätetypen (2 Schalter + Rollladen + Jalousie), aber nur die Geräte, die zum aktiven Profil passen, funktionieren. Geräte im falschen Profil zeigen eine Fehlermeldung wie „Profile is not set to switch" oder „Profile is not set to cover" — dies ist erwartetes Verhalten, keine Fehlfunktion.

Rollladen-Kalibrierung

Bei Verwendung des Cover-Profils müssen die Motor-Fahrgrenzen kalibriert werden, bevor die Positionssteuerung funktioniert. Bis die Kalibrierung abgeschlossen ist, zeigt die Vorlage den Fehler „Calibration is required" an. Kalibrieren Sie entweder über die Shelly-Weboberfläche oder durch Auslösen der Serviceaktion Automatische Kalibrierung starten in TapHome. Während der Kalibrierung fährt der Rollladen vollständig auf und vollständig zu, um die Fahrstrecken zu messen.

Gerätefähigkeiten

Relaissteuerung (Switch-Profil)

Die Vorlage stellt zwei unabhängige Relaisschalter bereit. Jeder Schalter liest seinen Status von /rpc/Switch.GetStatus?id={0,1} (Feld output, Boolean) und steuert das Relais über /rpc/Switch.Set?id={0,1}&on=true|false.

Jeder Schalter stellt auch Service-Attribute für die kanalweise Überwachung bereit:

  • Temperatur — interne Gerätetemperatur in °C (temperature.tC)
  • Energieverbrauch — kumulative Energie in Wh (aenergy.total)
  • Leistungsaufnahme — aktuelle Leistung in W (apower)
  • Elektrische Spannung — Versorgungsspannung in V (voltage)
  • Elektrischer Strom — Laststrom in A (current)
  • Frequenz — AC-Netzfrequenz in Hz (freq)
  • Leistungsfaktor — Leistungsfaktorwert (pf)

Die Schalter aktualisieren sich alle 2,5 Sekunden.

Rollladensteuerung (Cover-Profil)

Das Rollladengerät steuert einen motorisierten Rollladen, Vorhang oder eine Markise. Es liest die Position von /rpc/Cover.GetStatus?id=0 (Felder current_pos und target_pos, 0–100) und schreibt über /rpc/Cover.GoToPosition?id=0&pos=N. Die Vorlage invertiert die Positionsskala, sodass 0 = vollständig geöffnet und 100 = vollständig geschlossen in TapHome.

Der Rollladen stellt Service-Attribute bereit:

  • Temperatur — interne Gerätetemperatur in °C
  • Energieverbrauch — kumulative Motorenergie in Wh
  • Leistungsaufnahme — aktuelle Motorleistung in W
  • Elektrische Spannung — Versorgungsspannung in V
  • Elektrischer Strom — Motorstrom in A

Die Serviceaktion Automatische Kalibrierung starten steht zur Verfügung, um die Kalibrierung direkt aus TapHome zu starten.

Jalousiesteuerung (Cover-Profil)

Das Jalousiegerät erweitert den Rollladen um Lamellensteuerung für Horizontaljalousien. Neben der Position liest und schreibt es die Lamellenposition (slat_pos) über /rpc/Cover.GoToPosition?id=0&pos=N&slat_pos=M. Sowohl die Positions- als auch die Neigungsskala sind invertiert (0 = geöffnet, 100 = geschlossen in TapHome).

Die Jalousie stellt die gleichen Service-Attribute wie der Rollladen bereit, plus:

  • Lamelle — zeigt an, ob die Lamellensteuerung aktiviert oder deaktiviert ist (aus Cover.GetConfig → $.slat.enable)
  • Lamellenöffnungszeit — konfigurierte Lamellenöffnungsdauer in Sekunden
  • Lamellenschließzeit — konfigurierte Lamellenschließdauer in Sekunden

Bekanntes Vorlagenproblem: Das Service-Attribut „Slat close time" liest $.slat.open_time statt $.slat.close_time aus der Cover-Konfiguration. Beide Lamellenzeitattribute zeigen aktuell den gleichen Wert (die Öffnungszeit) an. Dies wird in einer zukünftigen Vorlagenrevision korrigiert.

Zwei Serviceaktionen stehen am Jalousiegerät zur Verfügung:

  • Automatische Kalibrierung starten — startet die Rollladenpositionskalibrierung
  • Lamelle einstellen — aktiviert die Lamellensteuerung und konfiguriert Öffnungs-/Schließzeiten (jeweils 0,1–5 Sekunden) über /rpc/Cover.SetConfig

Die Lamellensteuerung muss aktiviert werden, bevor das Jalousiegerät die Neigung steuern kann. Wenn die Lamellenposition nicht vom Gerät verfügbar ist, zeigt die Jalousie den Fehler „Slat position must be enabled for blinds" an. Verwenden Sie die Serviceaktion Lamelle einstellen, um sie zu aktivieren und die Öffnungs-/Schließdauern einzustellen.

Service-Diagnose

Die Vorlage stellt Service-Attribute auf Modulebene für die Geräteüberwachung bereit:

  • WiFi — Name des verbundenen WLAN-Netzwerks
  • IP-Adresse — aktuelle Stations-IP
  • Signalstärke — WiFi RSSI in dB
  • MAC — MAC-Adresse des Geräts
  • Profil — aktuell aktives Geräteprofil (Switch oder Cover)

Das Modul-Leseskript prüft auch auf verfügbare Firmware-Updates und ausstehende Neustart-Anforderungen und zeigt diese als Warnungen in der TapHome-Oberfläche an.

Serviceaktionen

Drei Serviceaktionen stehen auf Modulebene zur Verfügung:

  • Firmware aktualisieren — löst ein Firmware-Update auf die neueste stabile Version aus über /rpc/Shelly.Update
  • Neustart — löst einen Geräteneustart aus über /rpc/Shelly.Reboot
  • Profil einstellen — wechselt zwischen Cover- und Switch-Betriebsmodi über /rpc/Shelly.SetProfile
Weitere Fähigkeiten

Der Shelly 2PM Gen3 stellt auch physische Eingangszustände (input:0, input:1), Rückspeise-/Exportenergiezähler, Betriebszeit, RAM-Nutzung und Gerätezeit in seinen RPC-Antworten bereit. Ein Auto-Off-Timer ist über den Parameter toggle_after verfügbar, Überlastschutz kann über Switch.SetConfig → power_limit konfiguriert werden und Energiezähler können über /rpc/Switch.ResetCounters zurückgesetzt werden. Im Cover-Modus sind direkte Auf-/Zu-/Stopp-Befehle und der Rollladenbewegungsstatus (open/opening/closed/closing/stopped/calibrating) verfügbar. Diese Fähigkeiten können in einem zukünftigen Vorlagenupdate hinzugefügt werden.

Fehlerbehebung

Gerät antwortet nicht
  1. Überprüfen Sie, ob der Shelly mit dem WLAN verbunden ist und eine gültige IP-Adresse hat
  2. Versuchen Sie den mDNS-Hostnamen (shelly2pmg3-AABBCCDDEE.local) statt der IP-Adresse — die IP kann sich nach einer DHCP-Erneuerung geändert haben
  3. Öffnen Sie http://{device-ip}/rpc/Shelly.GetDeviceInfo im Browser — wenn es mit JSON antwortet, ist das Gerät erreichbar
  4. Prüfen Sie, ob TapHome Core und Shelly im gleichen Netzwerk / VLAN sind
  5. Bestätigen Sie, dass die Authentifizierung am Shelly-Gerät deaktiviert ist
Profil-Fehler

Wenn ein Gerät „Profile is not set to switch" oder „Profile is not set to cover" anzeigt:

  1. Prüfen Sie, welches Profil aktuell aktiv ist — das Service-Attribut „Profil" auf Modulebene zeigt den aktuellen Modus
  2. Wechseln Sie zum richtigen Profil über die Serviceaktion Profil einstellen oder entfernen Sie ungenutzte Geräte aus TapHome
  3. Nach dem Profilwechsel startet das Gerät automatisch neu — warten Sie einige Sekunden für die Wiederverbindung
Rollladenposition funktioniert nicht
  1. Überprüfen Sie, ob das Gerät im Cover-Profil ist — das Switch-Profil stellt keine Rollladenfunktionalität bereit
  2. Führen Sie die Serviceaktion Automatische Kalibrierung starten aus — die Positionssteuerung erfordert eine abgeschlossene Kalibrierung
  3. Prüfen Sie, ob der Motor korrekt an den Klemmen O1 und O2 angeschlossen ist
  4. Fragen Sie /rpc/Cover.GetStatus?id=0 manuell ab und überprüfen Sie, ob pos_control true ist
Jalousie-Neigung reagiert nicht
  1. Bestätigen Sie, dass die Lamellensteuerung aktiviert ist — prüfen Sie das Service-Attribut „Lamelle" (sollte „Enabled" anzeigen)
  2. Wenn deaktiviert, verwenden Sie die Serviceaktion Lamelle einstellen zur Aktivierung und Konfiguration der Öffnungs-/Schließzeiten
  3. Überprüfen Sie, ob der Jalousiemotor Neigungsbetrieb unterstützt — Rollläden ohne Neigung ignorieren Lamellenbefehle
Übertemperaturwarnung

Der Shelly 2PM Gen3 verfügt über einen internen Überhitzungsschutz. Wenn die Gerätetemperatur sichere Grenzen überschreitet, steigt der temperature-Wert in den Service-Attributen des Geräts. Sorgen Sie für ausreichende Belüftung um das Gerät, besonders beim Schalten hoher Lasten. Der maximale Schaltstrom beträgt 10 A pro Kanal bei insgesamt 16 A (18 A Spitze).

Shelly Gen2+/Gen3-Geräte unterstützen bis zu 6 gleichzeitige HTTP-Verbindungen. Obwohl dies eine deutliche Verbesserung gegenüber Gen1 (2 Verbindungen) ist, vermeiden Sie gleichzeitiges Abfragen von zu vielen Systemen (TapHome, Home Assistant, eigene Skripte), um eine Verbindungserschöpfung zu vermeiden. Die Shelly 2PM Gen3 Vorlage verwendet bis zu 4 gleichzeitige Endpunkte pro Abfragezyklus, was begrenzten Spielraum für zusätzliche Verbindungen lässt.

Installation in TapHome

Voraussetzungen

  • Shelly-Gerät installiert und eingeschaltet
  • Lokales Wi-Fi-Netzwerk (2,4 GHz)
  • TapHome CCU im selben Netzwerk

Schritt 1 — Shelly mit Wi-Fi verbinden

Option A — Shelly-App (empfohlen):

  1. Laden Sie die Shelly-App herunter (iOS / Android)
  2. Tippen Sie auf +Add Device und folgen Sie dem Bluetooth-Kopplungsassistenten
  3. Geben Sie Ihre Wi-Fi-Zugangsdaten ein, wenn Sie dazu aufgefordert werden

Option B — AP-Modus (ohne App):

  1. Beim ersten Einschalten erstellt das Gerät einen Hotspot: ShellyXXX-AABBCCDDEE
  2. Verbinden Sie Ihr Telefon/PC mit diesem Hotspot
  3. Öffnen Sie http://192.168.33.1Internet & SecurityWi-Fi Mode - Client
  4. Geben Sie SSID und Passwort ein → Save

Shelly unterstützt nur 2,4 GHz-Netzwerke. 5 GHz-Netzwerke werden beim Scannen nicht angezeigt.

Schritt 2 — IP-Adresse ermitteln

Nach der Verbindung mit Wi-Fi ermitteln Sie die zugewiesene IP-Adresse auf eine der folgenden Arten:

  • Shelly-App: Gerätedetail → Device info → IP-Adresse
  • Shelly-Weboberfläche: Verbinden Sie sich mit dem Geräte-AP vor der Wi-Fi-Einrichtung — die IP wird nach dem Speichern angezeigt
  • Router-DHCP-Tabelle: Suchen Sie nach einem Hostnamen wie shelly1pm-AABBCCDDEE
  • mDNS: Pingen Sie shelly<model>-<mac>.local (z. B. shelly1pm-AABBCCDDEE.local) aus dem selben Netzwerk

Weisen Sie dem Shelly-Gerät eine statische IP (DHCP-Reservierung) in Ihrem Router zu, damit sich die Adresse nach einem Router-Neustart nicht ändert.

Schritt 3 — Konfiguration in TapHome

  1. Fügen Sie in TapHome ein neues Modul Packet Parser (HTTP) hinzu
  2. IP Address: Geben Sie die IP aus Schritt 2 ein (z. B. 192.168.1.50)
  3. Port: 80 (Standard, keine Änderung erforderlich)
  4. Importieren Sie die Vorlage — TapHome fragt regelmäßig /status ab, um den Gerätestatus zu lesen

Die HTTP-Authentifizierung ist auf Shelly-Geräten standardmäßig deaktiviert. Wenn Sie den Anmeldeschutz aktiviert haben, unterstützt TapHome derzeit kein HTTP Basic Auth — lassen Sie die Authentifizierung für die TapHome-Integration deaktiviert.

Verfügbare Geräte

Shelly 2PM Gen3 Modul
Serviceattribute
WiFi
IP-Adresse
Signalstärke
MAC
ProfilAktives Geräteprofil — Switch (Doppelrelais) oder Cover (motorisierte Jalousie/Rollladen)
Serviceaktionen
Firmware aktualisieren
Neustart
Profil einstellenWechsel zwischen Cover- und Switch-Betriebsmodus — Gerät startet nach Profilwechsel neu
Benutzerdefinierte Variablen

Shelly 2PM Gen3

Lesen (Modul)
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
Serviceattribute
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");
Serviceaktionen
${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
Parameter: Profile
VAR response := SENDHTTPREQUEST("/rpc/Shelly.SetProfile?name=\"" + 
switch(prof,
0, "cover",
1, "switch",
"")
+ "\"");
IF response.IsSuccess
    return("OK");
else
    return("Error");
END
Schalter 1 Schalter

Relaisausgang 1 mit kanalweiser Leistungsmessung — erfordert Switch-Profil

boolean
Werte / Zustände: ON · OFF

Schalter 1

Schaltzustand lesen
VAR response := SENDHTTPREQUEST("/rpc/Switch.GetStatus?id=" + ID);
IF response.IsSuccess
    Switch.GetStatus := response.Content;  
END
return(PARSEJSON(Switch.GetStatus, "$.output", true));
Schaltzustand schreiben
VAR response := SENDHTTPREQUEST("rpc/Switch.Set?id=" + ID + "&on=" + if(St,"true","false"));
IF response.IsSuccess = false
  ADDERROR(response.StatusCode);
END
Lesen (Modul)
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
Serviceattribute
${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)
Schalter 2 Schalter

Relaisausgang 2 mit kanalweiser Leistungsmessung — erfordert Switch-Profil

boolean
Werte / Zustände: ON · OFF

Schalter 2

Schaltzustand lesen
VAR response := SENDHTTPREQUEST("/rpc/Switch.GetStatus?id=" + ID);
IF response.IsSuccess
    Switch.GetStatus := response.Content;  
END
return(PARSEJSON(Switch.GetStatus, "$.output", true));
Schaltzustand schreiben
VAR response := SENDHTTPREQUEST("rpc/Switch.Set?id=" + ID + "&on=" + if(St,"true","false"));
IF response.IsSuccess = false
  ADDERROR(response.StatusCode);
END
Lesen (Modul)
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
Serviceattribute
${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)
Beschattung Schieber

Motorisierter Rollladen oder Vorhang mit Positionssteuerung — erfordert Cover-Profil und Kalibrierung

numeric Einheit: %
Serviceattribute
Temperatur
Energieverbrauch
Leistungsaufnahme
Elektrische Spannung
Elektrischer Strom
Serviceaktionen
Automatische Kalibrierung starten

Beschattung

Lesen (Modul)
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
Jalousiestellung lesen
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));
Jalousiestellung schreiben
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
Serviceattribute
${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)
Serviceaktionen
${start_automatic_calibration}
VAR response := SENDHTTPREQUEST("/rpc/Cover.Calibrate?id=" + ID);
IF response.IsSuccess
    return("OK");
else
    return("Error");
END
Jalousie Jalousie

Jalousie mit Positions- und Lamellensteuerung — erfordert Cover-Profil, Kalibrierung und aktivierte Lamellen

numeric Einheit: %
Serviceattribute
Temperatur
Energieverbrauch
Leistungsaufnahme
Elektrische Spannung
Elektrischer Strom
LamelleOb die Lamellensteuerung in der Shelly-Cover-Konfiguration aktiviert ist
Lamellenöffnungszeit
Lamellenschließzeit
Serviceaktionen
Automatische Kalibrierung starten
Lamelle einstellenLamellensteuerung aktivieren und Öffnungs-/Schließdauer konfigurieren (0,1–5 Sekunden)

Jalousie

Lesen (Modul)
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
Jalousiestellung lesen
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);
Jalousiestellung schreiben
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
Lamellenneigung lesen
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
Lamellenneigung schreiben
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
Serviceattribute
${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)
Serviceaktionen
${start_automatic_calibration}
VAR response := SENDHTTPREQUEST("/rpc/Cover.Calibrate?id=" + ID);
IF response.IsSuccess
    return("OK");
else
    return("Error");
END
Set Slat
Parameter: 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
Verbindung: Packet Parser → HTTP
Mögliche Verbesserungen (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

Quellen