configs/sthome-ut6.yaml
2025-08-23 17:02:53 +02:00

235 lines
6.1 KiB
YAML

substitutions:
name: sthome-ut6
friendly_name: "sthome-ut6"
esphome:
name: "${name}"
friendly_name: "${friendly_name}"
on_boot:
- priority: 600
then:
- lambda: |-
id(restore_remote_lock).execute();
globals:
- id: remote_lock_status
type: bool
restore_value: yes
initial_value: 'false'
esp8266:
board: esp01_1m
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "K3yXQthpXVNknD4RCLZX66gglNgDEFtj3H0r85VLBNs="
ota:
- platform: esphome
password: "5956a60f6cf40cf4b6b172e23f236572"
wifi:
#ssid: !secret wifi_ssid
#password: !secret wifi_password
# we will use local dns server for local dns resolution
domain: ".sthome.org"
networks:
- ssid: !secret wifi_ssid1
password: !secret wifi_password1
- ssid: !secret wifi_ssid2
password: !secret wifi_password2
- ssid: !secret wifi_ssid3
password: !secret wifi_password3
- ssid: !secret wifi_ssid4
password: !secret wifi_password4
- ssid: !secret wifi_ssid5
password: !secret wifi_password5
manual_ip:
# For faster connection startup, set a static IP address
# Set this to the IP of the ESP
static_ip: 10.0.2.6
gateway: 10.0.0.2
subnet: 255.255.240.0
dns1: 10.0.0.1
dns2: 10.0.0.2
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "${name} Fallback Hotspot"
password: "HIjEc5P2BJhz"
captive_portal:
#####################################################################################
# Minimal flash writes, once per hour
preferences:
flash_write_interval: 60min
sun:
id: sun_sensor
latitude: !secret latitude
longitude: !secret longitude
# Sync time with Home Assistant
time:
- platform: homeassistant
id: homeassistant_time
# Blink LED for status, and also expose to HA as switch
#light:
# - platform: status_led
# name: "${friendly_name} status light"
# id: blueled
# pin:
# number: GPIO2
# inverted: yes
# restore_mode: RESTORE_DEFAULT_OFF
#
#script:
# - id: heartbeat
# mode: single
# then:
# - light.toggle: blueled
# - delay: 20 ms
# - light.toggle: blueled
#
# Heartbeat while connected to HA
#interval:
# - interval: 5s
# then:
# if:
# condition:
# api.connected:
# then:
# - script.execute: heartbeat
#
switch:
# Switch to restart the ESP
- platform: restart
name: ${friendly_name} Restart
# depending on current state of gate, it will open, close or stop closing / opening
- platform: gpio
pin: GPIO0
name: "Gate Remote Trigger"
inverted: false
id: gate_remote_trigger
restore_mode: RESTORE_DEFAULT_OFF
on_turn_on:
- delay: 1000ms
- switch.turn_off: gate_remote_trigger
# this is a latching relay, so each pulse toggles the state of the relay
- platform: gpio
pin: GPIO1
name: "Gate Remote Lock Toggle"
inverted: false
id: gate_remote_lock_toggle
restore_mode: RESTORE_DEFAULT_OFF
on_turn_on:
# - lambda: |-
# ESP_LOGD("info", "1: Remote lock status: %d [%d]", id(remote_lock_status), id(gate_remote_lock_sensor).state);
- delay: 200ms
- switch.turn_off: gate_remote_lock_toggle
- delay: 100ms
- lambda: |-
id(remote_lock_status) = id(gate_remote_lock_sensor).state;
// ESP_LOGD("info", "2: Remote lock status: %d [%d]", id(remote_lock_status), id(gate_remote_lock_sensor).state);
binary_sensor:
- platform: status
# Status platform provides a connectivity sensor
name: "${friendly_name} Status"
device_class: connectivity
- platform: gpio
pin:
number: GPIO3
inverted: false
id: gate_remote_lock_sensor
name: Gate Remote Lock Sensor
device_class: lock
sensor:
# Report wifi signal strength every 5 min if changed
- platform: wifi_signal
name: ${friendly_name} WiFi Signal
update_interval: 300s
filters:
- delta: 10%
# human readable uptime sensor output to the text sensor above
- platform: uptime
name: ${friendly_name} Uptime in Days
id: uptime_sensor_days
update_interval: 60s
on_raw_value:
then:
- text_sensor.template.publish:
id: uptime_human
state: !lambda |-
int seconds = round(id(uptime_sensor_days).raw_state);
int days = seconds / (24 * 3600);
seconds = seconds % (24 * 3600);
int hours = seconds / 3600;
seconds = seconds % 3600;
int minutes = seconds / 60;
seconds = seconds % 60;
return (
(days ? String(days) + "d " : "") +
(hours ? String(hours) + "h " : "") +
(minutes ? String(minutes) + "m " : "") +
(String(seconds) + "s")
).c_str();
text_sensor:
# Expose WiFi information as sensors
- platform: wifi_info
ip_address:
name: ${friendly_name} IP
mac_address:
name: ${friendly_name} Mac Address
# human readable update text sensor from sensor:uptime
- platform: template
name: Uptime
id: uptime_human
icon: mdi:clock-start
script:
- id: restore_remote_lock
then:
- lambda: |-
bool restore_value = id(remote_lock_status);
id(set_remote_lock).execute(restore_value);
- delay: 250ms
# make double sure after delay
- lambda: |-
bool restore_value = id(remote_lock_status);
id(set_remote_lock).execute(restore_value);
- id: set_remote_lock
parameters:
on_state: bool
then:
- lambda: |-
bool lockstate = id(gate_remote_lock_sensor).state;
// next statement is XOR; causes a skip if states are the same
if((on_state && !lockstate) || (!on_state && lockstate)) {
// toggle
id(gate_remote_lock_toggle).turn_on();
}
# Pin assignments for ESP-01
# https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/
# 3v3 | | RX/GPIO3 - high at boot
# RST | | GPIO0 - pulled up, flash if low on boot
# EN | | GPIO2 - pulled up, blue led on if pulled down, must be high at boot
# TX | | GND
# ^ TX/GPIO1 - high at boot