devices.esphome.io

Shelly Plus i4

Shelly Plus i4

Device Type: sensor
Electrical Standard: global
Board: esp32

Shelly Plus i4

GPIO Pinout

PinFunction
GPIO12Switch 1 Input
GPIO14Switch 2 Input
GPIO26Switch 4 Input
GPIO27Switch 3 Input

The Shelly Plus i4 is based on the ESP32-U4WDH (Single core, 160MHz, 4MB embedded flash)

Credit to: blakadder

Configuration for generating Home Assistant Events and Multi-Click Actions

substitutions:
device_ssid: "Shelly Plus i4"
device_name: shellyplusi4
device_description: "Shelly Plus i4 Switch Module"
friendly_name: "Shelly Plus i4"
main_device_id: "shellyplusi4id" # Put the name that you want to see in Home Assistant.
project_name: "shelly.plusi4-esp32-solo-esp-idf"
project_version: "1.0"
esphome:
name: ${device_name}
comment: ${device_description}
platformio_options:
board_build.f_cpu: 160000000L
project:
name: "${project_name}"
version: "${project_version}"
esp32:
board: esp32doit-devkit-v1
framework:
type: esp-idf
sdkconfig_options:
CONFIG_FREERTOS_UNICORE: y
CONFIG_ESP32_DEFAULT_CPU_FREQ_160: y
CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ: "160"
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: !secret api_encryption_key
ota:
safe_mode: true
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
power_save_mode: none
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: ${device_ssid} Fallback Hotspot
password: !secret ap_password
# Sensors with general information.
sensor:
- platform: uptime
name: "${friendly_name} Uptime"
id: uptime_sensor
# WiFi Signal sensor.
- platform: wifi_signal
name: ${friendly_name} Signal strength
update_interval: 60s
internal: true
text_sensor:
# Expose WiFi information as sensors.
- platform: wifi_info
ip_address:
name: ${friendly_name} IP
ssid:
name: ${friendly_name} SSID
bssid:
name: ${friendly_name} BSSID
switch:
# this provides for a possibility to restart from the web console or Home automation should we ever need it
- platform: restart
name: "${friendly_name} Restart"
- platform: safe_mode
name: "${friendly_name} Restart (Safe Mode)"
binary_sensor:
- platform: gpio
name: "${device_name} Button 1"
pin:
number: GPIO12
mode:
input: true
on_multi_click:
# double click
- timing:
- ON for at most 1s
- OFF for at most 1s
- ON for at most 1s
- OFF for at least 0.2s
then:
# send double click event
- homeassistant.event:
event: esphome.button_pressed
data:
title: button 1 double click
# long click
- timing:
- ON for at least 1.5s
then:
- homeassistant.event:
event: esphome.button_pressed
data:
title: button 1 long click
# single click
- timing:
- ON for at most 1s
- OFF for at least 0.5s
then:
- homeassistant.event:
event: esphome.button_pressed
data:
title: button 1 short click
# internal: true
id: button1
filters:
- delayed_on_off: 50ms
- platform: gpio
name: "${device_name} Button 2"
pin:
number: GPIO14
mode:
input: true
on_multi_click:
# double click
- timing:
- ON for at most 1s
- OFF for at most 1s
- ON for at most 1s
- OFF for at least 0.2s
then:
# send double click event
- homeassistant.event:
event: esphome.button_pressed
data:
title: button 2 double click
# long click
- timing:
- ON for at least 1.5s
then:
- homeassistant.event:
event: esphome.button_pressed
data:
title: button 2 long click
# single click
- timing:
- ON for at most 1s
- OFF for at least 0.5s
then:
- homeassistant.event:
event: esphome.button_pressed
data:
title: button 2 short click
# internal: true
id: button2
filters:
- delayed_on_off: 50ms
- platform: gpio
name: "${device_name} Button 3"
pin:
number: GPIO27
mode:
input: true
on_multi_click:
# double click
- timing:
- ON for at most 1s
- OFF for at most 1s
- ON for at most 1s
- OFF for at least 0.2s
then:
# send double click event
- homeassistant.event:
event: esphome.button_pressed
data:
title: button 3 double click
# long click
- timing:
- ON for at least 1.5s
then:
- homeassistant.event:
event: esphome.button_pressed
data:
title: button 2 long click
# single click
- timing:
- ON for at most 1s
- OFF for at least 0.5s
then:
- homeassistant.event:
event: esphome.button_pressed
data:
title: button 3 short click
# internal: true
id: button3
filters:
- delayed_on_off: 50ms
- platform: gpio
name: "${device_name} Button 4"
pin:
number: GPIO26
mode:
input: true
on_multi_click:
# double click
- timing:
- ON for at most 1s
- OFF for at most 1s
- ON for at most 1s
- OFF for at least 0.2s
then:
# send double click event
- homeassistant.event:
event: esphome.button_pressed
data:
title: button 4 double click
# long click
- timing:
- ON for at least 1.5s
then:
- homeassistant.event:
event: esphome.button_pressed
data:
title: button 4 long click
# single click
- timing:
- ON for at most 1s
- OFF for at least 0.5s
then:
- homeassistant.event:
event: esphome.button_pressed
data:
title: button 4 short click
# internal: true
id: button4
filters:
- delayed_on_off: 50ms

Basic Configuration - 4 single click buttons

substitutions:
device_ssid: "Shelly Plus i4"
device_name: shellyplusi4
device_description: "Shelly Plus i4 Switch Module"
friendly_name: "Shelly Plus i4"
main_device_id: "shellyplusi4id" # Put the name that you want to see in Home Assistant.
project_name: "shelly.plusi4-esp32-solo-esp-idf"
project_version: "1.0"
esphome:
name: ${device_name}
comment: ${device_description}
platformio_options:
board_build.f_cpu: 160000000L
project:
name: "${project_name}"
version: "${project_version}"
esp32:
board: esp32doit-devkit-v1
framework:
type: esp-idf
sdkconfig_options:
CONFIG_FREERTOS_UNICORE: y
CONFIG_ESP32_DEFAULT_CPU_FREQ_160: y
CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ: "160"
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: !secret api_encryption_key
ota:
safe_mode: true
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
power_save_mode: none
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: ${device_ssid} Fallback Hotspot
password: !secret ap_password
# Sensors with general information.
sensor:
- platform: uptime
name: "${friendly_name} Uptime"
id: uptime_sensor
# WiFi Signal sensor.
- platform: wifi_signal
name: ${friendly_name} Signal strength
update_interval: 60s
internal: true
text_sensor:
# Expose WiFi information as sensors.
- platform: wifi_info
ip_address:
name: ${friendly_name} IP
ssid:
name: ${friendly_name} SSID
bssid:
name: ${friendly_name} BSSID
switch:
# this provides for a possibility to restart from the web console or Home automation should we ever need it
- platform: restart
name: "${friendly_name} Restart"
- platform: safe_mode
name: "${friendly_name} Restart (Safe Mode)"
binary_sensor:
- platform: gpio
name: "${device_name} Button 1"
pin:
number: GPIO12
mode:
input: true
id: button1
filters:
- delayed_on_off: 50ms
- platform: gpio
name: "${device_name} Button 2"
pin:
number: GPIO14
mode:
input: true
id: button2
filters:
- delayed_on_off: 50ms
- platform: gpio
name: "${device_name} Button 3"
pin:
number: GPIO27
mode:
input: true
id: button3
filters:
- delayed_on_off: 50ms
- platform: gpio
name: "${device_name} Button 4"
pin:
number: GPIO26
mode:
input: true
id: button4
filters:
- delayed_on_off: 50ms

If you want to use the Arduino framework you can use the Tasmota Arduino Core 2.0.5 for ESP32 Solo (https://github.com/tasmota/arduino-esp32/releases) port as follows:

esphome:
name: ${device_name}
comment: ${device_description}
platformio_options:
platform_packages:
- framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/2.0.5/framework-arduinoespressif32-solo1.zip
board_build.f_cpu: 160000000L
project:
name: "${project_name}"
version: "${project_version}"
esp32:
board: esp32doit-devkit-v1
variant: esp32
framework:
type: arduino
platform_version: 5.2.0
### the rest of your config
Edit this page on GitHub