Flashing Sonoff POW R3 to ESPHome

Not sure if this is helpful, but I recently set up a Sonoff POW R3 with ESPHome for use with a hot water tank immersion heater.

Took various bits of code from various sources locally and online. In my case, I’ve added 3 Dallas temperature sensors connecting to GPIO4 so I can monitor the tank temperature.

I’m using this to utilise spare solar power after the car is charged. (better than selling to the grid for 4p a kWh :stuck_out_tongue: )

I initially used GPIO15 for the temperature sensors but that stopped everything from working.

substitutions:
  esphome_name: hotwatersonoff
  esphome_friendly_name: Hot Water Sonoff

esphome:
  name: ${esphome_name}
  friendly_name: Hot Water Heater Sonoff

esp8266:
  board: esp8285

# Enable logging
logger:
  baud_rate: 0

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxx"

ota:
  password: "xxxxxxxxx"

wifi:
  output_power: 18db
  power_save_mode: light
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Hot-Water-Heater-Sonoff"
    password: "xxxxxxxxx"

captive_portal:

dallas:
  - pin: GPIO4

# Enable web server
web_server:
  port: 80

time:
  - platform: homeassistant
    timezone: Europe/London

#GPIO0 Button (inverted)
#GPIO12 Relay and Red LED
#GPIO13 Blue LED (inverted)


uart:
  rx_pin: RX
  baud_rate: 4800

binary_sensor:
  - platform: gpio
    pin:
      number: GPIO0
      mode: INPUT_PULLUP
      inverted: True
    name: "${esphome_friendly_name} Button"
    on_press:
      - switch.toggle: fakebutton

switch:
  - platform: template
    name: "Hot Water Relay"
    optimistic: true
    id: fakebutton
    turn_on_action:
    - switch.turn_on: relay
    - light.turn_on: led
    turn_off_action:
    - switch.turn_off: relay
    - light.turn_off: led
  - platform: gpio
    id: relay
    inverted: yes
    pin: GPIO12
    restore_mode: RESTORE_DEFAULT_ON

output:
  - platform: esp8266_pwm
    id: pow_blue_led
    pin:
      number: GPIO13
      inverted: True

light:
  - platform: monochromatic
    name: "${esphome_friendly_name} Blue LED"
    output: pow_blue_led
    id: led
    internal: true

sensor:
  - platform: wifi_signal
    name: "${esphome_friendly_name} WiFi Signal"
    update_interval: 60s
  - platform: uptime
    name: "${esphome_friendly_name} Uptime"
  - platform: cse7766
    update_interval: 2s
    current:
      name: "${esphome_friendly_name} Current"
    voltage:
      name: "${esphome_friendly_name} Voltage"
    power:
      name: "${esphome_friendly_name} Power"
    energy:
      name: "${esphome_friendly_name} Energy"
  - platform: dallas
    address: 0xb60000001284c428
    name: "${esphome_friendly_name} Temperature Sensor 1"
    id: temp_1
    icon: "mdi:water-thermometer"
    filters:
      - filter_out: nan
  - platform: dallas
    address: 0x4f00000012821c28
    name: "${esphome_friendly_name} Temperature Sensor 2"
    id: temp_2
    icon: "mdi:water-thermometer"
    filters:
      - filter_out: nan
  - platform: dallas
    address: 0xb10000001483f228
    name: "${esphome_friendly_name} Temperature Sensor 3"
    id: temp_3
    icon: "mdi:water-thermometer"
    filters:
      - filter_out: nan
  - platform: template
    name: "{esphome_friendly_name} Average Tank Temperature"
    icon: "mdi:water-thermometer"
    unit_of_measurement: "°C"
    lambda: |-
      return (id(temp_1).state + id(temp_2).state + id(temp_3).state)/3;
    update_interval: 60s
  - platform: template
    name: "{esphome_friendly_name} Max Tank Temperature"
    icon: "mdi:water-thermometer"
    unit_of_measurement: "°C"
    lambda: |-
      return ((id(temp_1).state > id(temp_2).state) ? ((id(temp_1).state > id(temp_3).state) ? id(temp_1).state : id(temp_3).state) : (id(temp_2).state > id(temp_3).state) ? id(temp_2).state : id(temp_3).state);
    update_interval: 60s
  - platform: template
    name: "{esphome_friendly_name} Min Tank Temperature"
    icon: "mdi:water-thermometer"
    unit_of_measurement: "°C"
    lambda: |-
      return ((id(temp_1).state < id(temp_2).state) ? ((id(temp_1).state < id(temp_3).state) ? id(temp_1).state : id(temp_3).state) : (id(temp_2).state < id(temp_3).state) ? id(temp_2).state : id(temp_3).state);
    update_interval: 60s
    
1 Like