ESP32 Battery Powered Temperature/Humidity/AtmosphericPressure

ESP32 Battery Powered Temperature/Humidity/AtmosphericPressure

Device Type: misc
Electrical Standard: global
Board: esp32

How to use Deep Sleep with bme280 and esp32. This sensor is very power efficient only drawing a few uA when idle and a couple of mA when being read. No GPIOs need to be linked on ESP32 to enable deep sleep like they do on ESP8266.

The device wakes up reads the values from the bme280 and sends them via MQTT. I used MQTT rather than API because this will be in a remote location and I was not sure API would work with the Home Assistant server behind one NAT firewall and the ESP32 behind another with the internet in the middle. Yes I know its a security risk, thats why MQTT is on a non standard port to reduce likelyhood of people constantly hitting my Mosquitto server.

I use fast_connect and reduced logging to INFO rather than the default DEBUG in the hope of shaving off a second or so from the wake time. Boot to Sleep time is around two seconds, most of which is connecting to wifi, this could be shortened by setting a static IP. My battery should last a long time. None of my multimeters was able to measure the current drawn by the ESP32 in deep sleep mode.

Setting the MQTT Birth and Will message to blank stops the device from going Unavailable while it is asleep which messes with history graphs, you get lots of dots/broken lines

oversampling on BME280 is set to 2X to speed up reads. The i2c address for bme280 and bmp280 have to be set to 0x76, the default of 0x77 does not work with either of the devices I have.

This sample only use ESPHome global variable and MQTT to trigger deep sleep, no need to set other automations in Home Assistant.

run_duration is calculated from from when MQTT is connected it is commented because we want the esp to go to sleep as quickly as possible, rather than estimate the time needed which could be a bit variable over internet we send the esp to sleep as quickly as possible use on_message together with an HA automation. If you need to disable sleep can publish an MQTT message setting ota_mode then OTA can be done and when that is done ota_mode can be turned OFF and the automation enabled again.

Log Output

[16:13:53]ets Jun 8 2016 00:22:57
[16:13:53]rst:0x5 (DEEPSLEEP_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
[16:13:53]configsip: 0, SPIWP:0xee
[16:13:53]mode:DIO, clock div:2
[16:13:53]ho 0 tail 12 room 4
[16:13:53]entry 0x40080698
[16:13:53][I][logger:116]: Log initialized
[16:13:53][I][app:028]: Running through setup()...
[16:13:53][I][wifi:164]: WiFi Connecting to 'home'...
[16:13:55][I][wifi:380]: WiFi connected!
[16:13:55][I][mqtt:162]: Connecting to MQTT...
[16:13:55][I][mqtt:202]: MQTT Connected!
[16:13:55][I][app:060]: setup() finished successfully!
[16:13:55][I][deep_sleep:067]: Beginning Deep Sleep

Basic Configuration

name: bedford
platform: ESP32
board: esp32dev
ssid: 'home'
password: 'fileybay'
fast_connect: true
- id: ota_mode
type: bool
initial_value: 'false'
broker: *redacted*
port: 23046
username: *redacted*
password: *redacted*
- topic: bedford/ota_mode
payload: 'ON'
- globals.set:
id: ota_mode
value: 'true'
- topic: bedford/ota_mode
payload: 'OFF'
- globals.set:
id: ota_mode
value: 'false'
- topic: bedford/sensor/bford_temp/state
- if:
lambda: 'return !id(ota_mode);'
- deep_sleep.enter: deep_sleep_1
level: INFO
password: *redacted*
sda: 16
scl: 17
- platform: bme280
name: "bford temp"
oversampling: 2x
name: "bford pres"
oversampling: 2x
name: "bford humi"
oversampling: 2x
address: 0x76
id: deep_sleep_1
# run_duration: 10s
sleep_duration: 60min
Edit this page on GitHub