Files

188 lines
5.3 KiB
YAML

esphome:
name: pool
friendly_name: "Pool"
area: "Backyard"
project:
name: dasfoo.pool
version: "1.0"
on_boot:
- priority: 600
then:
- output.turn_on: water_sensor_power
- output.turn_off: water_sensor_com
globals:
- id: temperature_published
type: bool
restore_value: false
initial_value: "false"
- id: water_presence_published
type: bool
restore_value: false
initial_value: "false"
script:
- id: check_and_sleep
then:
- if:
condition:
- lambda: "return id(temperature_published);"
- lambda: "return id(water_presence_published);"
- switch.is_off: stay_awake
then:
- deep_sleep.enter: chip_deep_sleep
esp32:
# ESP32 has lower power consumption during deep sleep, which is the mode
# we spend most time in.
#
# This board has an LED on GPIO16.
board: esp32doit-devkit-v1
framework:
type: esp-idf
packages:
wifi: !include templates/wifi.yaml
ota: !include templates/ota.yaml
mqtt: !include templates/mqtt.yaml
switch:
- platform: template
name: "Stay awake"
id: stay_awake
optimistic: true
entity_category: diagnostic
turn_on_action:
- deep_sleep.prevent: chip_deep_sleep
turn_off_action:
# Sleep once we reach run_duration uptime, or immediately if already did.
- deep_sleep.allow: chip_deep_sleep
# Do not want any turn_on/turn_off actions on boot, only MQTT *commands*.
restore_mode: DISABLED
retain: false
# Disable availability to make switch available even when chip is asleep.
availability: null
# Enable retention so that chip gets the value once it is online again.
command_retain: true
# State in MQTT will be confusing because esphome won't update it until it
# is online. This will be confusing in HA, so we drop this.
assumed_state: true
ota:
- platform: esphome
on_end:
then:
# If we did an OTA, likely don't need to stay awake anymore.
- switch.turn_off: stay_awake
logger:
# Higher log level to reduce power consumption and awake duration.
level: INFO
# If you have to reflash, do one of the following:
# - set "Keep awake" to ON (lightning) and wait until next wake up, then OTA.
# - reset (EN) 10 times to trigger SAFE MODE, then OTA or flash.
# - hold BOOT and press EN, then release BOOT to enter bootloader mode, then
# flash. If using web.esphome.io, just hold the BOOT button before INSTALL.
deep_sleep:
id: chip_deep_sleep
# Keep in sync with expire_after of important sensors.
sleep_duration: 10min
# If we couldn't send data within this interval, sleep anyway.
run_duration: 30s
# Sleep even if WiFi or MQTT never became ready. Also means that run_duration
# starts at boot.
setup_priority: 799
one_wire:
- platform: gpio
pin: GPIO27
sensor:
- platform: dallas_temp
# We only have one sensor, but maybe it's faster when addr is known.
address: 0x4c0000006a0a5d28
resolution: 10 # 0.25C accuracy, <200ms wait time.
# We update manually, this is a backup in case a measurement fails.
update_interval: 5s
id: temperature
name: "Temperature" # remember to update MQTT topic below
# DS18B20 datasheet indicates 85C as an error reading. In general it makes
# little sense to yield values out of reasonable range.
filters:
- clamp:
min_value: 10
max_value: 40
ignore_out_of_range: true
# Keep the latest value available in HA.
availability: null
# But not in MQTT (we subscribe to this topic to know update is delivered).
retain: false
expire_after: 11min
- platform: uptime
type: seconds
name: "Wakeup time"
id: wakeup_time
accuracy_decimals: 3
# Keep the latest value available in HA.
availability: null
# We call for update manually.
update_interval: never
expire_after: 11min
wifi:
fast_connect: true
manual_ip: # For faster connection.
static_ip: 10.26.160.236
gateway: 10.26.160.1
subnet: 255.255.255.0
binary_sensor:
- platform: gpio
pin: GPIO18 # yellow
name: "Water level dropped" # remember to update MQTT topic below
device_class: problem
filters:
# XKC-Y25 datasheet: 500ms response time.
- delayed_on_off: 500ms
# Keep the latest value available in HA.
availability: null
# But not in MQTT (we subscribe to this topic to know update is delivered).
retain: false
output:
- platform: gpio
pin: GPIO19 # black
id: water_sensor_com
- platform: gpio
pin: GPIO5 # brown
id: water_sensor_power
mqtt:
on_connect:
# Not on_boot: if we update before MQTT is ready, that message is lost.
- component.update: wakeup_time
- component.update: temperature
on_message:
# This is a reflect subscription to our own sensors - when we get a message,
# it means that we're done with measurement.
#
# You can look up the topic in "MQTT INFO" of HA device page.
- topic: pool/sensor/temperature/state
then:
- globals.set:
id: temperature_published
value: "true"
- script.execute: check_and_sleep
- topic: pool/binary_sensor/water_level_dropped/state
then:
- globals.set:
id: water_presence_published
value: "true"
- script.execute: check_and_sleep