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
)
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