185 lines
5.2 KiB
YAML
185 lines
5.2 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
|
|
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
|
|
|
|
- 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
|
|
|
|
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
|