Shelly 1PM Gen 4
Shelly 1PM Gen 4
GPIO Pinout
| Pin | Function | 
|---|---|
| GPIO0 | LED (Inverted) | 
| GPIO1 | Button | 
| GPIO3 | NTC | 
| GPIO4 | Relay | 
| GPIO6 | UART Tx | 
| GPIO7 | UART Rx | 
| GPIO10 | Switch | 
| GPIO12 | Add-on module Digital in | 
| GPIO16 | Add-on module Data in | 
| GPIO17 | Add-on module Analog in | 
The Shelly 1PM Gen 4 is based on the ESP32-C6 (Single core, 160MHz, 8MB embedded flash)
Please calibrate the NTC and the voltage / power measurements, the values below are just a rough estimate!
Basic config
esphome:
  name: shelly1pm-gen-4
esp32:
  board: esp32-c6-devkitc-1
  flash_size: 8MB
  framework:
    type: esp-idf
# Enable logging
logger:
# Enable Home Assistant API
api:
ota:
  - platform: esphome
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
captive_portal:
web_server:
uart:
  id: bl0942_uart
  tx_pin: GPIO6
  rx_pin: GPIO7
  baud_rate: 9600
  stop_bits: 1
output:
  - id: relay_output
    platform: gpio
    pin: GPIO4
sensor:
  - id: temperature
    name: Temperature
    platform: ntc
    sensor: temperature_sensor_resistance
    icon: mdi:thermometer
    entity_category: diagnostic
    unit_of_measurement: °C
    accuracy_decimals: 1
    calibration:
      b_constant: 3350
      reference_resistance: 10kOhm
      reference_temperature: 25°C
  - id: temperature_sensor_resistance
    platform: resistance
    sensor: temperature_sensor_voltage
    configuration: DOWNSTREAM
    resistor: 10kOhm
  - id: temperature_sensor_voltage
    platform: adc
    pin: GPIO3
    attenuation: 11db
  - platform: bl0942
    uart_id: bl0942_uart
    update_interval: 1s
    line_frequency: 60Hz
    voltage:
      name: Voltage
      id: sensor_voltage
      entity_category: diagnostic
    current:
      id: sensor_current
      name: current
    power:
      name: Power
      id: sensor_power
    frequency:
      name: Frequency
      id: sensor_frequency
      accuracy_decimals: 2
      entity_category: diagnostic
    energy:
      name: Energy
      id: sensor_energy
      entity_category: diagnostic
      device_class: energy
      state_class: total_increasing
      accuracy_decimals: 3
binary_sensor:
  - id: shelly_add_on_digital_in
    name: addon digital in
    platform: gpio
    pin: GPIO12
    filters:
      - delayed_off: 50ms
  - id: shelly_add_on_data
    name: addon data
    platform: gpio
    pin: GPIO16
    filters:
      - delayed_off: 50ms
  - id: shelly_add_on_analog_in
    name: addon analog in
    platform: gpio
    pin: GPIO17
    filters:
      - delayed_off: 50ms
  - id: shelly_1pm_gen4_switch
    name: Switch
    platform: gpio
    pin: GPIO10
    filters:
      - delayed_off: 50ms
  - id: shelly_1pm_gen4_button
    name: Button
    platform: gpio
    pin: GPIO1
    filters:
      - delayed_off: 50ms
status_led:
  pin:
    number: GPIO0
    inverted: true
Configuration with protections
Configuration as relay with overpower and overtemperature protection
esphome:
  name: shelly-1pm-gen-4
esp32:
  board: esp32-c6-devkitc-1
  flash_size: 8MB
  framework:
    type: esp-idf
# Enable logging
logger:
# Enable Home Assistant API
api:
ota:
  - platform: esphome
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
captive_portal:
web_server:
uart:
  id: bl0942_uart
  tx_pin: GPIO6
  rx_pin: GPIO7
  baud_rate: 9600
  stop_bits: 1
output:
  - id: relay_output
    platform: gpio
    pin: GPIO4
switch:
  # Use a template switch to allow for checking fault conditions before switching on the relay output.
  - platform: template
    id: relay
    name: Relay
    device_class: outlet
    restore_mode: ALWAYS_ON
    turn_on_action:
      if:
        any:
          - sensor.in_range:
              id: temperature
              below: 75.0
          # Temperature sensor is unknown for several seconds on boot. Allow the relay to switch on anyway.
          - and:
              - lambda: "return isnan(id(temperature).state);"
              - binary_sensor.is_off: error_overtemp
        then:
          - output.turn_on: relay_output
          - binary_sensor.template.publish:
              id: error_overtemp
              state: OFF
          - binary_sensor.template.publish:
              id: error_overpower
              state: OFF
          - switch.template.publish:
              id: relay
              state: ON
        else:
          - switch.template.publish:
              id: relay
              state: OFF
    turn_off_action:
      then:
        - output.turn_off: relay_output
        - switch.template.publish:
            id: relay
            state: OFF
sensor:
  - id: temperature
    name: Temperature
    platform: ntc
    sensor: temperature_sensor_resistance
    icon: mdi:thermometer
    entity_category: diagnostic
    unit_of_measurement: °C
    accuracy_decimals: 1
    calibration:
      b_constant: 3350
      reference_resistance: 10kOhm
      reference_temperature: 25°C
  - id: temperature_sensor_resistance
    platform: resistance
    sensor: temperature_sensor_voltage
    configuration: DOWNSTREAM
    resistor: 10kOhm
  - id: temperature_sensor_voltage
    platform: adc
    pin: GPIO3
    attenuation: 11db
  - platform: bl0942
    uart_id: bl0942_uart
    update_interval: 1s
    line_frequency: 60Hz
    voltage:
      name: Voltage
      id: sensor_voltage
      entity_category: diagnostic
    current:
      id: sensor_current
      name: current
    power:
      name: Power
      id: sensor_power
    frequency:
      name: Frequency
      id: sensor_frequency
      accuracy_decimals: 2
      entity_category: diagnostic
    energy:
      name: Energy
      id: sensor_energy
      entity_category: diagnostic
      device_class: energy
      state_class: total_increasing
      accuracy_decimals: 3
binary_sensor:
  - id: shelly_add_on_digital_in
    name: addon digital in
    platform: gpio
    pin: GPIO12
    filters:
      - delayed_off: 50ms
  - id: shelly_add_on_data
    name: addon data
    platform: gpio
    pin: GPIO16
    filters:
      - delayed_off: 50ms
  - id: shelly_add_on_analog_in
    name: addon analog in
    platform: gpio
    pin: GPIO17
    filters:
      - delayed_off: 50ms
  - id: shelly_1pm_gen4_switch
    name: Switch
    platform: gpio
    pin: GPIO10
    filters:
      - delayed_off: 50ms
  - id: shelly_1pm_gen4_button
    name: Button
    platform: gpio
    pin: GPIO1
    filters:
      - delayed_off: 50ms
  - id: error_overtemp
    name: Overheating
    device_class: problem
    entity_category: diagnostic
    platform: template
    condition:
      any:
        - binary_sensor.is_on: error_overtemp # Latch ON
        - sensor.in_range:
            id: temperature
            above: 75.0
    on_press:
      then:
        - switch.turn_off: relay
  - id: error_overpower
    name: Overpowering
    device_class: problem
    entity_category: diagnostic
    platform: template
    condition:
      any:
        - binary_sensor.is_on: error_overpower # Latch ON
        - for:
            time: 1s
            condition:
              sensor.in_range:
                id: sensor_current
                above: 16 # This is model specific!
    on_press:
      then:
        - switch.turn_off: relay
status_led:
  pin:
    number: GPIO0
    inverted: true