Shelly Plug US
GPIO Pinout
| Pin | Function | 
|---|---|
| GPIO0 | LED (Inverted) | 
| GPIO2 | Blue LED (Inverted) | 
| GPIO4 | Relay | 
| GPIO5 | HLWBL CF Pin (active power) | 
| GPIO12 | HLWBL SEL | 
| GPIO13 | Button | 
| A0 | NTC | 
HLWBL CF1 pin (GPIO14 according to Tasmota template) does not appear to connected in my test and returns junk data. A0 might be hooked up to a NTC, I do not have the values needed to calibrate it to return proper data so I am not including it in my configuration.
Configuration as relay with overpower protection
When integration with home assistant exists, it will appear as a switch, 6 sensors (button state, power, voltage,
current, wifi strength and total daily energy)
When the max_power is exceeded, the relay will be switched off and a persistent notification will be created in
home-assistant
Credit and thanks to the following resources:
- Blakadder template for documenting the GPIO pins (though I found some errors)
- Shelly Plug S config in this repo
- Reddit tuning thread (magic numbers for tuning sensors)
- Aoycocr X10S device page for a similar device
- FCC documentation including pictures of the circuits
substitutions:
  devicename: shelly-plug-us
  relay_name: Outlet
  wifi_ssid: !secret wifi_ssid
  wifi_pass: !secret wifi_pass
  api_pass: !secret api_pass
  ota_pass: !secret ota_pass
  # 110VAC * 15A , specs are from Shelly specs
  max_power: "1650"
  # Higher value gives lower watt readout
  current_res: "0.00290"
  # Lower value gives lower voltage readout
  voltage_div: "940"
  # Relay state on boot. Other options can be found here https://esphome.io/components/switch/gpio.html
  restore_mode: RESTORE_DEFAULT_ON
esphome:
  name: ${devicename}
esp8266:
  board: esp8285
wifi:
  ssid: ${wifi_ssid}
  password: ${wifi_pass}
# Enable logging
logger:
# Enable Home Assistant API
api:
  encryption:
    key: !secret api_key
ota:
  password: ${ota_pass}
time:
  - platform: homeassistant
    id: my_time
binary_sensor:
  - platform: gpio
    pin:
      number: GPIO13
      inverted: True
    name: "${devicename}_button"
    on_press:
      - switch.toggle: relay
      - output.turn_on: led_r
      - delay: 500ms
      - output.turn_off: led_r
output:
  - platform: gpio
    pin:
      number: GPIO00
      inverted: True
    id: led_r
  - platform: gpio
    pin:
      number: GPIO02
      inverted: True
    id: led_b
interval:
  - interval: 1s
    then:
      if:
        condition:
          wifi.connected:
        then:
          - output.turn_off: led_r
          - output.turn_on: led_b
        else:
          - output.turn_off: led_b
          - delay: 500ms
          - output.turn_on: led_r
          - delay: 500ms
          - output.turn_off: led_r
          - delay: 500ms
          - output.turn_on: led_b
switch:
  - platform: gpio
    pin: GPIO4
    id: relay
    restore_mode: ${restore_mode}
    name: "${relay_name}"
sensor:
  - platform: wifi_signal
    name: "${devicename} WiFi Signal"
    update_interval: 5min
  - platform: hlw8012
    sel_pin:
      number: GPIO12
      inverted: true
    cf_pin: GPIO5
    cf1_pin: GPIO14
    current_resistor: ${current_res}
    voltage_divider: ${voltage_div}
    current:
      name: "${relay_name} current"
    voltage:
      name: "${relay_name} voltage"
    power:
      name: "${relay_name} power"
      id: power
      unit_of_measurement: "W"
      icon: mdi:flash-outline
      # filters:
      # # This calibrations we generated with a 40W and 100W incandescent light bulb
      # - calibrate_linear:
      #   - 0 -> 0
      #   - 206.9 -> 40
      #   - 540 -> 100
      on_value_range:
        - above: ${max_power}
          then:
            - switch.turn_off: relay
            - homeassistant.service:
                service: persistent_notification.create
                data:
                  title: Message from ${devicename}
                data_template:
                  message: Switch turned off because power exceeded ${max_power}W
    update_interval: 10s
  - platform: total_daily_energy
    name: "${devicename} daily energy"
    power_id: power
    filters:
      # Multiplication factor from W to kW is 0.001
      - multiply: 0.001
    unit_of_measurement: kWh