devices.esphome.io
Shelly Plug S Gen3
Shelly Plug S Gen3
Device Type: plugElectrical Standard: euBoard: esp32c3Difficulty: Soldering required, 4/5
Generation 3 of Shelly Plug-S
At this moment there is NO way to Flash it OTA. You need to open the Plug and use UART!
As always, first take a dump!
esptool -b 115200 --port COM11 read_flash 0x00000 0x800000 shelly_plug_s_gen3.bin
UART Pinout
| Pin | Colour | 
|---|---|
| Reset | Brown | 
| 3v3 | Red | 
| RX | Blue | 
| TX | Yellow | 
| BootSEL | Purple | 
| GND | Black | 
      
  
        
GPIO Pinout
| Pin | Function | 
|---|---|
| GPIO3 | Internal Temperature | 
| GPIO4 | Relay | 
| GPIO5 | LED WS2812 | 
| GPIO6 | BL0942 TX | 
| GPIO7 | BL0942 RX | 
| GPIO18 | Button | 
substitutions:  device_name: shelly-plug-s-gen3  friendly_name: "Shelly Plug S Gen3"  update_bl0942: 5s  max_power: "1500"  max_temp: "60.0"  channel_1: Relay
esphome:  name: ${device_name}  friendly_name: ${friendly_name}  comment: "Free Shelly!"  on_boot:    - delay: 10s    - lambda: !lambda |-        id(rgb_ready) = true;    - script.execute: set_rgb
esp32:  board: esp32-c3-devkitm-1  framework:    type: esp-idf
wifi:  ssid: !secret wifi_ssid  password: !secret wifi_password  ap:    ssid: "FreeShelly Hotspot"    password: !secret wifi_password
logger:
api:
ota:
time:  - platform: homeassistant    id: my_time
globals:  - id: rgb_ready    type: bool    restore_value: false    initial_value: 'false'
script:  - id: set_rgb    mode: queued    then:      - if:          condition:            lambda: 'return id(rgb_ready);'          then:            - if:                condition:                  lambda: 'return id(relay).state;'                then:                  - if:                      condition:                        lambda: 'return id(ring_on).remote_values.is_on();'                      then:                        - light.turn_on:                            id: rgb_light1                            brightness: !lambda |-                              return id(ring_on).remote_values.get_brightness();                            red: !lambda |-                              return id(ring_on).remote_values.get_red();                            green: !lambda |-                              return id(ring_on).remote_values.get_green();                            blue: !lambda |-                              return id(ring_on).remote_values.get_blue();                      else:                        - light.turn_off: rgb_light1                else:                  - if:                      condition:                        lambda: 'return id(ring_off).remote_values.is_on();'                      then:                        - light.turn_on:                            id: rgb_light1                            brightness: !lambda |-                              return id(ring_off).remote_values.get_brightness();                            red: !lambda |-                              return id(ring_off).remote_values.get_red();                            green: !lambda |-                              return id(ring_off).remote_values.get_green();                            blue: !lambda |-                              return id(ring_off).remote_values.get_blue();                      else:                        - light.turn_off: rgb_light1
output:  - platform: template    id: r_out_on    type: float    write_action:      - lambda: |-  - platform: template    id: g_out_on    type: float    write_action:      - lambda: |-  - platform: template    id: b_out_on    type: float    write_action:      - lambda: |-  - platform: template    id: r_out_off    type: float    write_action:      - lambda: |-  - platform: template    id: g_out_off    type: float    write_action:      - lambda: |-  - platform: template    id: b_out_off    type: float    write_action:      - lambda: |-
binary_sensor:  - platform: gpio    id: "push_button"    name: "Button"    internal: true    pin:      number: GPIO18      inverted: true      mode:        input: true        pullup: true    filters:      - delayed_on_off: 5ms    on_click:      then:        - if:            condition:              switch.is_off: button_lock            then:              - switch.toggle: relay
switch:  - platform: gpio    id: relay    pin: GPIO4    name: "Relay"    restore_mode: ALWAYS_ON  - platform: template    id: button_lock    name: "Button Lock"    optimistic: true    restore_mode: ALWAYS_OFF
light:  - platform: rgb    id: ring_on    name: "${channel_1} Ring when On"    icon: "mdi:circle-outline"    default_transition_length: 0s    red: r_out_on    green: g_out_on    blue: b_out_on    restore_mode: RESTORE_DEFAULT_OFF    entity_category: config    on_state:      - delay: 50ms      - script.execute: set_rgb
  - platform: rgb    id: ring_off    name: "${channel_1} Ring when Off"    icon: "mdi:circle-outline"    default_transition_length: 0s    red: r_out_off    green: g_out_off    blue: b_out_off    restore_mode: RESTORE_DEFAULT_OFF    entity_category: config    on_state:      - delay: 50ms      - script.execute: set_rgb
  - platform: esp32_rmt_led_strip    rgb_order: GRB    chipset: ws2812    pin: GPIO5    num_leds: 4    id: rgb_light1    internal: false    default_transition_length: 700ms    restore_mode: ALWAYS_OFF
uart:  id: uart_0  tx_pin: GPIO7  rx_pin: GPIO6  baud_rate: 9600  stop_bits: 1  data_bits: 8  parity: NONE
sensor:  - platform: ntc    sensor: temp_resistance_reading    name: "Temperature"    unit_of_measurement: "°C"    accuracy_decimals: 1    icon: "mdi:thermometer"    calibration:      b_constant: 3350      reference_resistance: 10kOhm      reference_temperature: 298.15K    on_value_range:      - above: ${max_temp}        then:          - switch.turn_off: "relay"          - homeassistant.service:              service: persistent_notification.create              data:                title: Message from ${device_name}              data_template:                message: Switch turned off because temperature exceeded ${max_temp} °C  - platform: resistance    id: temp_resistance_reading    sensor: temp_analog_reading    configuration: DOWNSTREAM    resistor: 10kOhm  - platform: adc    id: temp_analog_reading    pin: GPIO3    attenuation: 12db
  - platform: bl0942    uart_id: uart_0    address: 0    voltage:      name: 'Voltage'      id: bvoltage      icon: mdi:alpha-v-circle-outline      device_class: voltage    current:      name: 'Current'      id: bcurrent      icon: mdi:alpha-a-circle-outline      device_class: current    power:      name: 'Power'      id: bpower      icon: mdi:transmission-tower      device_class: power      on_value_range:        - above: ${max_power}          then:            - switch.turn_off: relay            - homeassistant.service:                service: persistent_notification.create                data:                  title: Message from ${device_name}                data_template:                  message: Switch turned off because power exceeded ${max_power}W    energy:      name: 'Energy'      id: benergy      icon: mdi:lightning-bolt      device_class: energy    frequency:      name: "Frequency"      id: bfreq      accuracy_decimals: 2      icon: mdi:cosine-wave      device_class: frequency    update_interval: ${update_bl0942}Open the device
      
  
        
        
When the seal is cracked open, you need a M2 drill, and drill in center, just a little.
      
  
        
Now take a tapered punch and press the seal out. The whole grounding receptacle will come out.
We need some hot-air (~300°C) and 5 of the iFixit triangle-plastic, there are 3 spots with glue.
Heat them up, and try placeing the plastic around.
      
  
        
You will get a little gap, take anohter plastic and get betweet the white and transparent plastic, and make a circle.
      
  
        
After 2 rounds you can easly take it out.
Edit this page on GitHub