substitutions:
  ############################################################################################
  # SPECIFIC DEVICE VARIABLE SUBSTITUTIONS
  # If NOT using a secrets file, just replace these with the passwords etc (in quotes)
  ###########################################################################################
  wifi_ssid: !secret ha_wifi_ssid
  wifi_password: !secret ha_wifi_password
  fallback_ap_password: !secret fallback_ap_password

  # Enables faster network connections, with last connected SSID being connected to and no full scan for SSID being undertaken
  wifi_fast_connect: "false"

  # Define a domain for this device to use. i.e. iot.home.lan (so device will appear as athom-smart-plug-v2.iot.home.lan in DNS/DHCP logs)
  dns_domain: ".local"

  # Automatically add the mac address to the name
  # eg so you can use a single firmware for all devices
  add_mac_suffix: "false"

  # Enable or disable the use of IPv6 networking on the device
  ipv6_enable: "false"
  
  # Add these if we are giving it a static ip, or remove them in the Wifi section
  static_ip_subnet: !secret ha_wifi_subnet
  static_ip_gateway: !secret ha_wifi_gateway
  static_ip_dns1: !secret ha_wifi_dns1
  static_ip_dns2: !secret ha_wifi_dns2
  
  # Network reconnect every x hours to ensure best access point
  base_interval_hours: "23"    # Base interval in hours
  random_offset_max_minutes: "59"   # Max random offset in minutes

###########################################################################################
# Common Wifi Settings
# https://esphome.io/components/wifi.html
#
# Power Save mode (can reduce wifi reliability)
# NONE (least power saving, Default for ESP8266)
# LIGHT (Default for ESP32)
# HIGH (most power saving)
###########################################################################################
wifi:
  networks:
    - ssid: ${wifi_ssid}
      password: ${wifi_password}
      manual_ip: # optional static IP address
        static_ip: ${local_static_ip_address}
        gateway: ${static_ip_gateway}
        subnet: ${static_ip_subnet}
        dns1: ${static_ip_dns1}
        dns2: ${static_ip_dns2}

  #enable_rrm: true           # (ESP32 only) enable 802.11k Radio Resource Management
  #enable_btm: true           # (ESP32 only) enable 802.11v BSS Transition Management
  power_save_mode: none       # https://esphome.io/components/wifi.html#wifi-power-save-mode
  use_address: ${local_current_ip_address}
  ap: # Details for fallback hotspot in case wifi connection fails https://esphome.io/components/wifi.html#access-point-mode
    ssid: ${local_device_name}
    password: ${fallback_ap_password}
    ap_timeout: 10min # Time until it brings up fallback AP. default is 1min

  # Allow rapid re-connection to previously connected WiFi SSID, skipping scan of all SSIDs
  fast_connect: ${wifi_fast_connect}

  # Define dns domain / suffix to add to hostname
  domain: ${dns_domain}
  min_auth_mode: WPA2

  # Reboot eventually when Wi-Fi is down (default is 15min)
  reboot_timeout: 56h

captive_portal: # extra fallback mechanism for when connecting if the configured WiFi fails

###########################################################################################
# Enable Over the Air Update Capability
# https://esphome.io/components/ota.html?highlight=ota
###########################################################################################
ota:
  - platform: esphome
    password: ${local_ota_pass}
    version: 2
  #- platform: web_server # Uncomment if you want to be able to do OTA with the web interface

###########################################################################################
# Safe Mode
# Safe mode will detect boot loops
# https://esphome.io/components/safe_mode
###########################################################################################
safe_mode:

###########################################################################################
# Network
# global configuration for all types of networks
# https://esphome.io/components/network.html
###########################################################################################
network:
  enable_ipv6: ${ipv6_enable}

##########################################################################################
# Interval
# Restart Networking every x hours + rand mins
# This ensure that the device is connected to the best AP
##########################################################################################
#script:
#  - id: random_reconnect
#    mode: restart
#    then:
#      - lambda: |-
#          // Compute total delay: base hours + random offset minutes
#          uint32_t extra;
#          #if defined(ESP32)
#          // ESP32 (both Arduino & IDF builds) uses esp_random()
#          extra = esp_random() % (${random_offset_max_minutes} + 1);
#          #elif defined(ESP8266)
#          // ESP8266 Arduino core
#          extra = os_random() % (${random_offset_max_minutes} + 1);
#          #else
#         // Fallback to esp_random() on other platforms
#          extra = esp_random() % (${random_offset_max_minutes} + 1);
#          #endif
#          uint32_t total_s = ${base_interval_hours} * 3600 + extra * 60;
#          ESP_LOGI("random_reconnect", "Next reconnect in %u seconds", total_s);
#          // Delay inside lambda (blocks script execution but OK for reconnect timing)
#          delay(total_s * 1000);
#      - logger.log: "network_check: performing reconnect"
#      - wifi.disable: {}
#      - delay: 1s
#      - wifi.enable: {}
#      - script.execute: random_reconnect

