TapHome

Shelly Plus i4

Packet Parser → MQTT
Trimis de
Ultima actualizare: 03. 2026

Acest dispozitiv acceptă mDNS

În loc să folosiți o adresă IP, puteți accesa dispozitivul la:

shellyplusi4-{MAC}.local

Înlocuiți {MAC} cu adresa MAC a dispozitivului dvs. (majuscule, fără două puncte).

TapHome acceptă mDNS — folosirea unui nume de gazdă este mai fiabilă decât un IP static.

Shelly Plus i4

Shelly Plus i4 este un modul Wi-Fi compact cu 4 intrări digitale. Nu are relee sau ieșiri — funcționează doar ca dispozitiv de intrare, care detectează apăsările butoanelor și stările întrerupătoarelor pe patru borne independente (SW1–SW4). Se montează în spatele unui întrerupător de perete standard (37 x 42 x 16 mm) și se alimentează la 110–240 VAC. TapHome comunică cu dispozitivul prin MQTT, folosind notificările JSON-RPC 2.0 Gen2+ în rețeaua locală — nu este necesară conexiunea la cloud.

Fiecare dintre cele patru intrări se poate configura independent fie în modul buton (detectează apăsarea simplă, apăsarea dublă și apăsarea lungă), fie în modul întrerupător (detectează starea deschis/închis). Șablonul TapHome creează pentru fiecare intrare atât un dispozitiv de tip buton, cât și un dispozitiv de tip contact reed — îl folosiți pe cel care corespunde configurării intrării în interfața web Shelly.

Configurare

Configurarea brokerului MQTT

Shelly Plus i4 comunică prin MQTT. Aveți nevoie de un broker MQTT care rulează în rețeaua dvs. (de ex. Mosquitto). În interfața web Shelly (http://{device-ip}), mergeți la Settings → MQTT, activați MQTT și introduceți adresa IP și portul brokerului.

Parametrii de import ai șablonului

La importul șablonului în TapHome, introduceți trei parametri:

ParametruDescriereExemplu
MQTT Broker IPAdresa IP a brokerului MQTT192.168.1.10
MQTT Broker PortPortul brokerului (implicit 1883)1883
Shelly IDID-ul de client MQTT din interfața web Shelly → Settings → MQTTshellyplusi4-xxxxxxxxxxxx
Configurarea modului intrărilor

După importul șablonului, configurați fiecare intrare în interfața web Shelly (http://{device-ip}) → Inputs:

  • Modul buton — pentru butoane cu revenire. Folosiți dispozitivul corespunzător Buton 1–4 în TapHome.
  • Modul întrerupător — pentru întrerupătoare cu reținere sau contacte reed. Folosiți dispozitivul corespunzător Întrerupător 1–4 în TapHome.

Fiecare intrare fizică poate avea la un moment dat un singur tip. Dacă o intrare este setată în modul întrerupător, dar TapHome primește un eveniment de buton (sau invers), scriptul de ascultare semnalează o eroare care indică nepotrivirea.

Funcțiile dispozitivului

Detectarea apăsării butoanelor (Buton 1–4)

Patru dispozitive de tip buton ascultă mesajele MQTT NotifyEvent din topicul {device_id}/events/rpc. Fiecare buton detectează trei tipuri de apăsare și le transformă în valori numerice:

Tip de apăsareValoare
Apăsare simplă1
Apăsare lungă2
Apăsare dublă3

Dispozitivele de tip buton sunt doar pentru citire — raportează ultimul eveniment detectat. Fiecare buton ascultă evenimentele componentei de intrare corespunzătoare (de la input:0 până la input:3).

Detectarea întrerupătoarelor/contactelor reed (Întrerupător 1–4)

Patru dispozitive de tip contact reed ascultă mesajele MQTT NotifyStatus. Fiecare întrerupător citește starea binară a intrării corespunzătoare:

StareValoare
Închis (activ)1
Deschis (inactiv)0

Dispozitivele de tip întrerupător sunt doar pentru citire, cu un interval de interogare de 2,5 secunde. Sunt potrivite pentru întrerupătoare cu reținere, contacte reed magnetice sau orice senzor binar pornit/oprit conectat la bornele de intrare.

Funcții suplimentare

API-ul Shelly Plus i4 acceptă și detectarea apăsării triple, evenimentele brute de apăsare și eliberare a butonului (button-down/button-up) și metoda programatică Input.Trigger (specifică dispozitivelor i4), care poate genera evenimente fără o intrare fizică. Diagnosticarea sistemului (timp de funcționare, MAC, Wi-Fi RSSI) este disponibilă prin HTTP RPC, dar nu este inclusă în acest șablon exclusiv MQTT. Aceste funcții pot fi adăugate într-o actualizare viitoare a șablonului.

Rezolvarea problemelor

Apăsările butoanelor nu sunt detectate
  1. Verificați dacă intrarea este configurată în modul button în interfața web Shelly → Inputs
  2. Verificați dacă TapHome este conectat la brokerul MQTT și dacă Shelly ID corespunde ID-ului de client MQTT al dispozitivului
  3. Dacă TapHome afișează eroarea „Device is set as switch”, intrarea este în modul întrerupător — schimbați-o în modul buton în interfața web Shelly sau folosiți în schimb dispozitivul Întrerupător 1–4
Starea întrerupătorului nu se actualizează
  1. Verificați dacă intrarea este configurată în modul switch în interfața web Shelly → Inputs
  2. Dacă TapHome afișează eroarea „Device is set as button”, intrarea este în modul buton — schimbați-o în modul întrerupător sau folosiți în schimb dispozitivul Buton 1–4
  3. Comutați întrerupătorul fizic și verificați în brokerul MQTT mesajele NotifyStatus din topicul shellyplusi4-{id}/events/rpc
Dispozitivul nu este accesibil
  1. Verificați dacă Shelly este conectat la Wi-Fi — LED-ul albastru trebuie să lumineze continuu
  2. Verificați dacă MQTT este activat în interfața web Shelly → Settings → MQTT și dacă adresa brokerului este corectă
  3. Încercați să folosiți numele de gazdă mDNS (shellyplusi4-AABBCCDDEE.local) pentru a accesa interfața web Shelly
  4. Verificați dacă brokerul MQTT rulează și este accesibil atât din TapHome Core, cât și de pe dispozitivul Shelly

Shelly Plus i4 are o limită de 80 de notificări MQTT într-un interval de 60 de secunde. Apăsările repetate rapid ale butoanelor pot depăși această limită, iar unele evenimente se pot pierde. Este o limitare a firmware-ului.

Cum se instalează în TapHome

Cerințe preliminare

  • Dispozitiv Shelly conectat la Wi-Fi (2,4 GHz), de ex. prin aplicația Shelly sau prin punctul de acces propriu al dispozitivului
  • Broker MQTT care rulează în rețeaua dvs. locală (de ex. Mosquitto, Home Assistant sau brokerul integrat TapHome)
  • TapHome CCU în aceeași rețea cu brokerul

La dispozitivele Gen1, activarea MQTT dezactivează Shelly Cloud. Cele două nu pot funcționa simultan. La dispozitivele Gen2/Plus această limitare nu se aplică.

Pasul 1 — Activați MQTT pe dispozitivul Shelly

Dispozitive Gen1 (Shelly 1, 1PM, 2.5, EM, 3EM, Plug S, RGBW2, Dimmer, TRV…)

  1. Deschideți interfața web Shelly: http://<device-ip>/
  2. Accesați Internet & Security → Advanced — MQTT
  3. Activați MQTT
  4. Setați MQTT Server: <broker-ip>:<port> (de ex. 192.168.1.10:1883)
  5. Opțional, setați MQTT User și MQTT Password, dacă brokerul dvs. necesită autentificare
  6. Faceți clic pe Save — dispozitivul repornește și se conectează la broker

Dispozitive Gen2 / Plus (Shelly Plus 1, Plus 1PM, Plus 2PM, Plus Plug S, Plus H&T, Pro 3EM…)

  1. Deschideți interfața web Shelly: http://<device-ip>/
  2. Accesați Settings → MQTT
  3. Activați MQTT
  4. Setați Server: <broker-ip>:<port> (de ex. 192.168.1.10:1883)
  5. Câmpul Client ID este precompletat cu ID-ul dispozitivului (de ex. shellyplus1pm-AABBCCDDEE) — lăsați-l neschimbat, dacă nu aveți un motiv anume să îl modificați
  6. Faceți clic pe Save și reporniți dispozitivul

Pentru a verifica funcționarea MQTT, folosiți un client MQTT (de ex. MQTT Explorer) și abonați-vă la shellies/# (Gen1) sau <device-id>/# (Gen2). Ar trebui să vedeți mesajele de stare trimise de dispozitiv.

Pasul 2 — Aflați Device ID / MQTT Client ID

Unele șabloane necesită parametrul Device ID sau MQTT Client ID. Acesta este identificatorul unic folosit în topicurile MQTT.

  • Gen1: se găsește pe etichetă, ca adresă MAC (de ex. AABBCCDDEE). Device ID = shelly<model>-<mac>, de ex. shelly1pm-AABBCCDDEE
  • Gen2/Plus: se găsește în interfața web Shelly, la Settings → Device Info → Device ID, sau pe eticheta dispozitivului

Pasul 3 — Configurați dispozitivul în TapHome

  1. În TapHome adăugați un nou modul Packet Parser (MQTT)
  2. IP Address: introduceți adresa IP a brokerului MQTT (de ex. 192.168.1.10)
  3. Port: 1883 (implicit; pentru TLS folosiți 8883)
  4. Device ID / MQTT Client ID: introduceți valoarea de la pasul 2 (dacă șablonul o necesită)
  5. Importați șablonul — TapHome se abonează automat la topicurile dispozitivului

Dispozitive disponibile

Shelly Plus i4 Modul
Variabile personalizate
ID (string)
Buton 1 Buton Doar citire

Buton pe input:0 — detectează apăsarea simplă (1), apăsarea lungă (2), apăsarea dublă (3)

numeric JSON-RPC event
Variabilă: Button

Buton 1

Ascultător
Bp := 0;
#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0
    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF method = "NotifyEvent"
        VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
        VAR component := PARSEJSON(zero, "component");
        VAR event := PARSEJSON(zero, "event");
    
        if component = "input:0"
            Bp := SWITCH(event, "single_push", Bp := 1, "double_push", Bp :=3,  "long_push", Bp := 2, Bp := 0 );
            #RETURN(Bp);
        END
    elseif method = "NotifyStatus"
        IF( INDEXOF(params, "input:0") > -1, ADDERROR("Device is set as switch"));
    END
END
Buton 2 Buton Doar citire

Buton pe input:1 — detectează apăsarea simplă (1), apăsarea lungă (2), apăsarea dublă (3)

numeric JSON-RPC event

Buton 2

Ascultător
Bp := 0;

#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF method = "NotifyEvent"
        VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
        VAR component := PARSEJSON(zero, "component");
        VAR event := PARSEJSON(zero, "event");
    
        if component = "input:1"
            Bp := SWITCH(event, "single_push", Bp := 1, "double_push", Bp :=3,  "long_push", Bp := 2, Bp := 0 );
            #RETURN(Bp);
        END
    elseif method = "NotifyStatus"
        IF( INDEXOF(params, "input:0") > -1, ADDERROR("Device is set as switch"));
    END
END
Buton 3 Buton Doar citire

Buton pe input:2 — detectează apăsarea simplă (1), apăsarea lungă (2), apăsarea dublă (3)

numeric JSON-RPC event

Buton 3

Ascultător
Bp := 0;

#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF method = "NotifyEvent"
        VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
        VAR component := PARSEJSON(zero, "component");
        VAR event := PARSEJSON(zero, "event");
    
        if component = "input:2"
            Bp := SWITCH(event, "single_push", Bp := 1, "double_push", Bp :=3,  "long_push", Bp := 2, Bp := 0 );
            #RETURN(Bp);
        END
    elseif method = "NotifyStatus"
        IF( INDEXOF(params, "input:0") > -1, ADDERROR("Device is set as switch"));
    END
END
Buton 4 Buton Doar citire

Buton pe input:3 — detectează apăsarea simplă (1), apăsarea lungă (2), apăsarea dublă (3)

numeric JSON-RPC event

Buton 4

Ascultător
Bp := 0;

#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF method = "NotifyEvent"
        VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
        VAR component := PARSEJSON(zero, "component");
        VAR event := PARSEJSON(zero, "event");
    
        if component = "input:3"
            Bp := SWITCH(event, "single_push", Bp := 1, "double_push", Bp :=3,  "long_push", Bp := 2, Bp := 0 );
            #RETURN(Bp);
        END
    elseif method = "NotifyStatus"
        IF( INDEXOF(params, "input:0") > -1, ADDERROR("Device is set as switch"));
    END
END
Întrerupător 1 Contact reed Doar citire

Contact reed pe input:0 — închis (1), deschis (0)

boolean JSON-RPC status

Întrerupător 1

Ascultător
#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF(method ="NotifyEvent")
    VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
    VAR component := PARSEJSON(zero, "component");
    
    if component = "input:0"
    ADDERROR("Device is set as button");
    END
    
    IF(method = "NotifyStatus")
    IF( INDEXOF(params, "input:0") > -1)
        VAR input := PARSEJSON(params, "input:0");
        SWITCH(PARSEJSON(input, "state"), true, Rc := 1, Rc := 0);
    END  
    END
END
END
Întrerupător 2 Contact reed Doar citire

Contact reed pe input:1 — închis (1), deschis (0)

boolean JSON-RPC status

Întrerupător 2

Ascultător
#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF(method ="NotifyEvent")
    VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
    VAR component := PARSEJSON(zero, "component");
    
    if component = "input:1"
    ADDERROR("Device is set as button");
    END
    
    IF(method = "NotifyStatus")
    IF( INDEXOF(params, "input:1") > -1)
    VAR input := PARSEJSON(params, "input:1");
        SWITCH(PARSEJSON(input, "state"), true, Rc := 1, Rc := 0);
    END  
    END
END
END
Întrerupător 3 Contact reed Doar citire

Contact reed pe input:2 — închis (1), deschis (0)

boolean JSON-RPC status

Întrerupător 3

Ascultător
#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF(method ="NotifyEvent")
    VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
    VAR component := PARSEJSON(zero, "component");
    
    if component = "input:2"
    ADDERROR("Device is set as button");
    END
    
    IF(method = "NotifyStatus")
    IF( INDEXOF(params, "input:2") > -1)
    VAR input := PARSEJSON(params, "input:2");
        SWITCH(PARSEJSON(input, "state"), true, Rc := 1, Rc := 0);
    END  
    END
END
END
Întrerupător 4 Contact reed Doar citire

Contact reed pe input:3 — închis (1), deschis (0)

boolean JSON-RPC status

Întrerupător 4

Ascultător
#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF(method ="NotifyEvent")
    VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
    VAR component := PARSEJSON(zero, "component");
    
    if component = "input:3"
    ADDERROR("Device is set as button");
    END
    
    IF(method = "NotifyStatus")
    IF( INDEXOF(params, "input:3") > -1)
    VAR input := PARSEJSON(params, "input:3");
        SWITCH(PARSEJSON(input, "state"), true, Rc := 1, Rc := 0);
    END  
    END
END
END
Conexiune: Packet Parser → MQTT • Nume gazdă: shellyplusi4-{MAC}.local
Îmbunătățiri posibile (7)
  • Triple Push Detection — Input component supports triple_push events but template only maps single_push, double_push, long_push
  • Button Press/Release Events — Raw button-down and button-up events available via MQTT but not captured by template
  • Programmatic Input Trigger — Input.Trigger method allows emitting events without physical input — unique to i4/i4 Gen3 devices
  • System Status (uptime, RAM, MAC, time) — Available via HTTP /rpc/Sys.GetStatus but template uses MQTT only — no HTTP polling configured
  • WiFi Status (SSID, IP, RSSI) — Available via HTTP /rpc/WiFi.GetStatus but template uses MQTT only
  • Analog Input Mode — Input component supports analog mode (0-100%) but template does not implement it — Plus i4 hardware supports digital inputs only
  • Counter/Pulse Input Mode — Input component supports pulse counting mode but template does not implement it

Surse

Ați găsit o problemă la acest șablon de dispozitiv?

Spuneți-ne ce nu funcționează, ce lipsește sau cum ar trebui să se comporte șablonul. Feedbackul dvs. ne ajută să păstrăm catalogul corect.

Verificat de TapHome

Doriți să folosiți acest șablon în TapHome Core?

Deschideți acest șablon în Customer Portal pentru a-l aplica într-una dintre locuințele dvs. sau pentru a propune o îmbunătățire și a o trimite înapoi în catalog.

Deschideți în portal