diff --git a/esphome/archive/downstairs-bathroom-towelrail.yaml b/esphome/archive/downstairs-bathroom-towelrail.yaml deleted file mode 100644 index 4637fb2..0000000 --- a/esphome/archive/downstairs-bathroom-towelrail.yaml +++ /dev/null @@ -1,30 +0,0 @@ -esphome: - name: downstairs-bathroom-towelrail - friendly_name: Downstairs Bathroom Towelrail - -esp8266: - board: esp01_1m - -# Enable logging -logger: - -# Enable Home Assistant API -api: - encryption: - key: "LQNFgCf7ZydoK09V22GidNeAJSlFbbHk6rny0UHv/fQ=" - -ota: - - platform: esphome - password: "0a368f636bbb37d7195e93edac50f44b" - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password - - # Enable fallback hotspot (captive portal) in case wifi connection fails - ap: - ssid: "Downstairs-Bathroom-Towelrail" - password: "kOc1t2CEXxgo" - -captive_portal: - \ No newline at end of file diff --git a/esphome/archive/downstairs-kitchen-lights.yaml b/esphome/archive/downstairs-kitchen-lights.yaml deleted file mode 100644 index 2c7394a..0000000 --- a/esphome/archive/downstairs-kitchen-lights.yaml +++ /dev/null @@ -1,30 +0,0 @@ -esphome: - name: downstairs-kitchen-lights - friendly_name: Downstairs Kitchen Lights - -esp8266: - board: esp01_1m - -# Enable logging -logger: - -# Enable Home Assistant API -api: - encryption: - key: "/ZwmBVlWvNzvYBgg7l7kt/gegaUxbej0Qg0CRyl5M/I=" - -ota: - - platform: esphome - password: "b692f015ebcd06236fd2a805050e32df" - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password - - # Enable fallback hotspot (captive portal) in case wifi connection fails - ap: - ssid: "Downstairs-Kitchen-Lights" - password: "cAFaKcl5z7I2" - -captive_portal: - \ No newline at end of file diff --git a/esphome/archive/esp-datapower-b copy.yaml.old b/esphome/archive/esp-datapower-b copy.yaml.old deleted file mode 100644 index c036c47..0000000 --- a/esphome/archive/esp-datapower-b copy.yaml.old +++ /dev/null @@ -1,504 +0,0 @@ -esphome/esp-datapower-b.yaml############################################# -############################################# -# Data Cupboard Power Monitor B -# Athom Smart Plug Power Monitor ESP32-C3 -# -# V1.0 2025-03-13 Initial Version -# -# based on https://github.com/athom-tech/esp32-configs/blob/main/athom-smart-plug.yaml -# -# SUMMARY -# Smart plug with power moniroting. It has limited ability to -# accidentally turn it off as it powers equipment in a data cupboard. -# It does have the ability to turn off and back on automatically -# a short time later, just in case a remote system reset is needed. -# Also, the button on the side can't be bumped, you have to hold -# it down for a few seconds to power it off. -# The yaml code also calculates various power use summaries. -# -############################################# -############################################# - -substitutions: - ############################################# - # SPECIFIC DEVICE VARIABLE SUBSTITUTIONS - # If NOT using a secrets file, just replace these with the passwords etc (in quotes) - ############################################# - devicename: "esp-datapower-b" - friendly_name: "Data Cupboard Power Monitor B" - description_comment: "Smart plug power Monitor B, Data Cupboard" - room: "Data Cupboard" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. - - api_key: !secret esp-datapower-b_api_key # unfortunately you can't use substitutions inside secrets names - ota_pass: !secret esp-datapower-b_ota_pass # unfortunately you can't use substitutions inside secrets names - static_ip_address: !secret esp-datapower-b_ip - - log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE - - update_interval: 10s # update time for for general sensors etc - - # Project Details - project_name: "Athom Technology.Smart Plug V3" - project_version: "v1.0.7" # Project V denotes release of yaml file, allowing checking of deployed vs latest version - - # Restore the relay (GPO switch) upon reboot to state: - relay_restore_mode: RESTORE_DEFAULT_ON - - # Current Limit in Amps. AU Plug = 10. IL, BR, EU, UK, US Plug = 16. - current_limit : "10" - - # Hide the ENERGY sensor that shows kWh consumed, but with no time period associated with it. Resets when device restarted and reflashed. - hide_energy_sensor: "true" - # Enable or disable the use of IPv6 networking on the device - ipv6_enable: "false" - # Power plug icon selection. Change to reflect the type/country of powr plug in use, this will update the power plug icon shown next to the switch - power_plug_type: "power-socket-au" # Options: power-socket-au | power-socket-ch | power-socket-de | power-socket-eu | power-socket-fr | power-socket-it | power-socket-jp | power-socket-uk | power-socket-us | - - - -############################################# -# SYSTEM SPECIFIC VARIABLE SUBSTITUTIONS -############################################# - - timezone: "Pacific/Auckland" - sntp_update_interval: 6h # Set the duration between the sntp service polling - # Network time servers https://www.ntppool.org/zone/@ - sntp_server_1: !secret ntp_server_1 - sntp_server_2: !secret ntp_server_2 - sntp_server_3: !secret ntp_server_3 - - 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" - - # 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 - - mqtt_server: !secret ha_mqtt_server - mqtt_username: !secret ha_mqtt_username - mqtt_password: !secret ha_mqtt_password - mqtt_topic: "esphome" #main topic for the mqtt server, call it what you like - - # Add these if we are using the internal web server (this is pretty processor intensive) - #web_server_username: !secret web_server_username - #web_server_password: !secret web_server_password - - -############################################# -# ESPHome -# https://esphome.io/components/esphome.html -############################################# -esphome: - name: ${devicename} - friendly_name: ${friendly_name} - comment: ${description_comment} #Appears on the esphome page in HA - area: "${room}" - name_add_mac_suffix: "${add_mac_suffix}" - min_version: 2024.6.0 - project: - name: "${project_name}" - version: "${project_version}" - platformio_options: - board_build.mcu: esp32c3 - board_build.variant: esp32c3 - board_build.flash_mode: dio - -############################################# -# ESP Platform and Framework -# https://esphome.io/components/esp32.html -############################################# -#esp8266: -# board: esp01_1m # The original sonoff basic -esp32: - board: esp32-c3-devkitm-1 - flash_size: 4MB - variant: ESP32C3 - framework: - type: arduino - version: recommended - -preferences: - flash_write_interval: 5min - -############################################# -# ESPHome Logging Enable -# https://esphome.io/components/logger.html -############################################# -logger: - level: ${log_level} #INFO Level suggested, or DEBUG for testing - baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) - #esp8266_store_log_strings_in_flash: false - #tx_buffer_size: 64 - -############################################# -# Enable the Home Assistant API -# https://esphome.io/components/api.html -############################################# -api: - encryption: - key: ${api_key} - -############################################# -# Enable Over the Air Update Capability -# https://esphome.io/components/ota.html?highlight=ota -############################################# -ota: - - platform: esphome - password: ${ota_pass} - -############################################# -# Safe Mode -# Safe mode will detect boot loops -# https://esphome.io/components/safe_mode -############################################# -safe_mode: - -############################################# -# 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: - ssid: ${wifi_ssid} - password: ${wifi_password} - #power_save_mode: LIGHT # https://esphome.io/components/wifi.html#wifi-power-save-mode - manual_ip: # optional static IP address - static_ip: ${static_ip_address} - gateway: ${static_ip_gateway} - subnet: ${static_ip_subnet} - ap: # Details for fallback hotspot in case wifi connection fails https://esphome.io/components/wifi.html#access-point-mode - ssid: ${devicename} AP - password: ${fallback_ap_password} - ap_timeout: 30min # Time until it brings up fallback AP. default is 1min - # Allow rapid re-connection to previously connect WiFi SSID, skipping scan of all SSID - fast_connect: "${wifi_fast_connect}" - # Define dns domain / suffix to add to hostname - domain: "${dns_domain}" - -captive_portal: # extra fallback mechanism for when connecting if the configured WiFi fails - -############################################# -# Real time clock time source for ESPHome -# If it's invalid, we fall back to an internal clock -# https://esphome.io/components/time/index.html -# https://esphome.io/components/time/sntp -############################################# -time: - - platform: sntp - id: sntp_time - # Define the timezone of the device - timezone: "${timezone}" - # Change sync interval from default 5min to 6 hours (or as set in substitutions) - update_interval: ${sntp_update_interval} - # Set specific sntp servers to use - servers: - - "${sntp_server_1}" - - "${sntp_server_2}" - - "${sntp_server_3}" - # Publish the time the device was last restarted - on_time_sync: - then: - # Update last restart time, but only once. - - if: - condition: - lambda: 'return id(device_last_restart).state == "";' - then: - - text_sensor.template.publish: - id: device_last_restart - state: !lambda 'return id(sntp_time).now().strftime("%a %d %b %Y - %I:%M:%S %p");' - -############################################# -# MQTT Monitoring -# https://esphome.io/components/mqtt.html?highlight=mqtt -# MUST also have api enabled if you enable MQTT -############################################# -mqtt: - broker: ${mqtt_server} - topic_prefix: ${mqtt_topic}/${devicename} - username: ${mqtt_username} - password: ${mqtt_password} - discovery: False # enable entity discovery (true is default, we don't want two HA Instances) - -############################################# -# Web Portal for display and monitoring -# Turning this off is maybe a good idea to save resources, -# especially on an esp8266. -# https://esphome.io/components/web_server.html -############################################# -#web_server: -# port: 80 -# auth: -# username: ${web_server_username} # probably a good idea to secure it -# password: ${web_server_password} - - - - -network: - enable_ipv6: ${ipv6_enable} - -esp32_improv: - authorizer: none - -dashboard_import: - package_import_url: github://athom-tech/esp32-configs/athom-smart-plug.yaml - -uart: - rx_pin: GPIO20 - baud_rate: 4800 - data_bits: 8 - stop_bits: 1 - parity: EVEN - -globals: - - id: total_energy - type: float - restore_value: yes - initial_value: '0.0' - -# - id: restore_mode -# type: int -# restore_value: yes -# initial_value: "2" # 0 = Always_Off. 1 = Restore_Power_Off. 2 = Always_On. - -binary_sensor: - - platform: status - name: "Status" - icon: mdi:check-network-outline - entity_category: diagnostic - - - platform: gpio - pin: - number: GPIO3 - mode: INPUT_PULLUP - inverted: true - name: "Power Button" - id: power_button - disabled_by_default: true - on_multi_click: - - timing: - - ON for at most 10s - - OFF for at least 2s - then: - - switch.toggle: relay -# - timing: -# - ON for at least 4s -# then: -# - button.press: Reset - - - platform: template - name: "Relay Status" - lambda: |- - return id(relay).state; - -sensor: - - platform: uptime - name: "Uptime Sensor" - id: uptime_sensor - entity_category: diagnostic - internal: true - - - platform: wifi_signal - name: "WiFi Signal dB" - id: wifi_signal_db - update_interval: 60s - entity_category: "diagnostic" - - - platform: copy - source_id: wifi_signal_db - name: "WiFi Signal Percent" - filters: - - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0); - unit_of_measurement: "Signal %" - entity_category: "diagnostic" - device_class: "" - - - platform: cse7766 - id: athom_cse7766 - current: - name: "Current" - icon: mdi:current-ac - filters: - - throttle_average: ${update_interval} - - lambda: if (x < 0.060) return 0.0; else return x; #For the chip will report less than 3w power when no load is connected - on_value_range: - - above: ${current_limit} - then: - - switch.turn_off: relay - - voltage: - name: "Voltage" - icon: mdi:sine-wave - filters: - - throttle_average: ${update_interval} - - power: - name: "Power" - id: power_sensor - icon: mdi:power - filters: - - throttle_average: ${update_interval} - - lambda: if (x < 3.0) return 0.0; else return x; #For the chip will report less than 3w power when no load is connected - - energy: - name: "Energy" - id: energy - icon: mdi:lightning-bolt - unit_of_measurement: kWh - filters: - - throttle: ${update_interval} - # Multiplication factor from W to kW is 0.001 - - multiply: 0.001 - on_value: - then: - - lambda: |- - static float previous_energy_value = 0.0; - float current_energy_value = id(energy).state; - id(total_energy) += current_energy_value - previous_energy_value; - previous_energy_value = current_energy_value; - id(total_energy_sensor).update(); - - apparent_power: - name: "Apparent Power" - icon: mdi:power - filters: - - throttle_average: ${update_interval} - - reactive_power: - name: "Reactive Power" - icon: mdi:flash - filters: - - throttle_average: ${update_interval} - - power_factor: - name: "Power Factor" - icon: mdi:percent-outline - filters: - - throttle_average: ${update_interval} - - - platform: template - name: "Total Energy" - id: total_energy_sensor - unit_of_measurement: kWh - device_class: "energy" - state_class: "total_increasing" - icon: mdi:lightning-bolt - accuracy_decimals: 3 - lambda: |- - return id(total_energy); - update_interval: ${update_interval} - - - platform: total_daily_energy - name: "Total Daily Energy" - restore: true - power_id: power_sensor - unit_of_measurement: kWh - icon: mdi:hours-24 - accuracy_decimals: 3 - filters: - - multiply: 0.001 - -button: -# - platform: restart -# name: "Restart" -# entity_category: config - -# - platform: factory_reset -# name: "Factory Reset" -# id: Reset -# entity_category: config - -# - platform: safe_mode -# name: "Safe Mode" -# internal: false -# entity_category: config - - - platform: template - name: "Turn Off Relay Temporarily" - on_press: - then: - - switch.turn_off: relay - - delay: 5s - - switch.turn_on: relay - -switch: - - platform: gpio - name: "Switch" - pin: GPIO5 - id: relay - restore_mode: ALWAYS_ON # Ensures the relay is on at boot - internal: true # Hides the switch from Home Assistant - #icon: mdi:${power_plug_type} # Don't need an icon if we can't see it... - -light: - - platform: status_led - name: "Status LED" - id: blue_led - icon: mdi:lightbulb-outline - disabled_by_default: false - pin: - inverted: true - number: GPIO6 - -text_sensor: - - platform: wifi_info - ip_address: - name: "IP Address" - icon: mdi:ip-network - entity_category: diagnostic - ssid: - name: "Connected SSID" - icon: mdi:wifi-strength-2 - entity_category: diagnostic - mac_address: - name: "Mac Address" - icon: mdi:network-pos - entity_category: diagnostic - - # Creates a sensor showing when the device was last restarted - - platform: template - name: 'Last Restart' - id: device_last_restart - icon: mdi:clock - entity_category: diagnostic -# device_class: timestamp - - # Creates a sensor of the uptime of the device, in formatted days, hours, minutes and seconds - - platform: template - name: "Uptime" - entity_category: diagnostic - lambda: |- - int seconds = (id(uptime_sensor).state); - int days = seconds / (24 * 3600); - seconds = seconds % (24 * 3600); - int hours = seconds / 3600; - seconds = seconds % 3600; - int minutes = seconds / 60; - seconds = seconds % 60; - if ( days > 3650 ) { - return { "Starting up" }; - } else if ( days ) { - return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() }; - } else if ( hours ) { - return { (String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() }; - } else if ( minutes ) { - return { (String(minutes) +"m "+ String(seconds) +"s").c_str() }; - } else { - return { (String(seconds) +"s").c_str() }; - } - icon: mdi:clock-start \ No newline at end of file diff --git a/esphome/archive/esp-downstbathtowelrail copy.yaml.old b/esphome/archive/esp-downstbathtowelrail copy.yaml.old deleted file mode 100644 index 7c0e928..0000000 --- a/esphome/archive/esp-downstbathtowelrail copy.yaml.old +++ /dev/null @@ -1,656 +0,0 @@ -########################################################################################## -########################################################################################## -# DOWNSTAIRS BATHROOM HEATED TOWEL RAIL -# Controlled by a Sonoff Basic -# -# V2.0 2025-06-11 Added select and button to chose modes, added countdown & startup to boost -# V2.0 2025-06-05 YAML Tidyups -# V1.1 2025-04-12 Fixes to timers and offline modes -# V1.0 2025-02-14 Initial Version -# -# INSTRUCTIONS -# - It allows a heated towel rail device to work in a standalone operation -# - On startup, it will turn on for (startup_duration) hours then go into timer mode (this allows you to just turn it on to get some heat immediately) -# - The timer has a morning and evening time (but no weekday/weekend setting) -# - Default values are 5am-7am and 9pm-Midnight (as this suits our use case) -# - It uses SNTP for time setting (but obviously only if wifi & networking are working) -# - It will default to an internal timer if no wifi. To reset internal timer, reboot the device at 12pm (noon) -# - If on a network and there is a MQTT server, you can set the 4 on/off times via MQTT (See below commands) -# - You can set 4 modes ON/OFF/TIMER/STARTUP via MQTT. That way, you can set to STARTUP for a short boost -# - Any new timer times set via MQTT will be remembered though a reboot -# - On a reboot, the device will always turn on for the Startup Duration (STARTUP mode, default 2 hours) -# - TIMER mode will always be switched on after startup mode is complete -# - If you need it ON continuously with no MQTT, toggle power ON/OFF 4 times within 30 seconds (with ~2 secs in between to allow it to boot) -# -# MQTT Commands -# Values will be set in place on the update_interval time, not immediately -# Use 00:00 in 24hr format for time setting. Note there is no weekday/weekend setting -# mqtt_timer_topic/morning-on/06:00 : Time device will go on -# mqtt_timer_topic/morning-off/08:00 : Time device will go off -# mqtt_timer_topic/evening-on/09:00 : Time device will go on -# mqtt_timer_topic/evening-off/00:00 : Time device will go off -# mqtt_timer_topic/boost-time/0000 : Time in minutes device will temporarily go on for -# mqtt_timer_topic/operation/ON : Device permanently on -# mqtt_timer_topic/operation/OFF : Device permanently off -# mqtt_timer_topic/operation/TIMER : Device will obey timer settings -# mqtt_timer_topic/operation/BOOST : Turn on for (startup_duration) hours then BOOST (also on startup) -# -########################################################################################## -########################################################################################## - -########################################################################################## -# SPECIFIC DEVICE VARIABLE SUBSTITUTIONS -# If NOT using a secrets file, just replace these with the passwords etc (in quotes) -########################################################################################## -substitutions: - # Device Naming - device_name: "esp-downstbathtowelrail" - friendly_name: "Downstairs Bathroom Towelrail" - description_comment: "Sonoff Basic controlling ON/OFF/Timer for the Heated Towel Rail in the Downstairs Bathroom" - device_area: "Downstairs Bathroom" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. - - # Project Naming - project_name: "Sonoff Technologies.Sonoff Basic V1" # Project Details - project_version: "v2.0" # Project V denotes release of yaml file, allowing checking of deployed vs latest version - - # Passwords - api_key: !secret esp-api_key # unfortunately you can't use substitutions inside secrets names - ota_pass: !secret esp-ota_pass # unfortunately you can't use substitutions inside secrets names - static_ip_address: !secret esp-downstbathtowelrail_ip - - # Device Settings - log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE - update_interval: "60s" # update time for for general sensors etc - - # Timer Settings - mqtt_timer_topic: "viewroad-commands/downstbath-towelrail" # Topics you will use to change stuff - startup_duration: "120" # Minutes to stay ON in STARTUP mode before reverting to TIMER - morning_on_default: "420" # Default in minutes from midnight. Default 07:00 => 420 - morning_off_default: "450" # Default in minutes from midnight. Default 07:30 => 450 - evening_on_default: "1260" # Default in minutes from midnight. Default 21:00 => 1260 - evening_off_default: "1320" # Default in minutes from midnight. Default 22:00 => 1320 => 1440 is midnight - -############################################# -# Included Common Packages -# https://esphome.io/components/esphome.html -############################################# -packages: - common_wifi: !include - file: common/network_common.yaml - vars: - local_static_ip_address: "${static_ip_address}" - local_ota_pass: "${ota_pass}" - common_api: !include - file: common/api_common.yaml - vars: - local_api_key: "${api_key}" -# common_webportal: !include -# file: common/webportal_common.yaml - common_mqtt: !include - file: common/mqtt_common.yaml - common_sntp: !include - file: common/sntp_common.yaml - common_general_sensors: !include - file: common/sensors_common.yaml - vars: - local_friendly_name: "${friendly_name}" - local_update_interval: "${update_interval}" - -############################################# -# ESPHome -# https://esphome.io/components/esphome.html -############################################# -esphome: - name: "${device_name}" - friendly_name: "${friendly_name}" - comment: "${description_comment}" # Appears on the esphome page in HA - area: "${device_area}" - on_boot: - priority: 900 # High priority to run after globals are initialized - then: - - lambda: |- - // 1) Figure out the current time in "seconds from midnight" - // using SNTP if available, otherwise current_mins * 60. - bool have_sntp = id(sntp_time).now().is_valid(); - int current_time_s = 0; - - if (have_sntp) { - auto now = id(sntp_time).now(); - current_time_s = now.hour * 3600 + now.minute * 60 + now.second; - } else { - // current_mins is in minutes; convert to seconds - current_time_s = id(current_mins) * 60; - } - - // 2) Compare with the last boot time - int diff = current_time_s - id(last_boot_time_s); - - // If within 30 seconds, increment boot_count; otherwise reset to 1 - if (diff >= 0 && diff <= 30) { - id(boot_count)++; - } else { - id(boot_count) = 1; - } - - // Update stored last boot time - id(last_boot_time_s) = current_time_s; - - // 3) If we've booted 4+ times in 20s => force ON mode - if (id(boot_count) >= 4) { - id(operation_mode) = 1; // ON - ESP_LOGI("power_cycle", "Detected 4 power cycles in 20s => Forcing ON mode"); - } else { - // Otherwise do your normal startup logic: - id(operation_mode) = 3; // on_boot -> sets operation_mode = 3 (STARTUP) - id(startup_timer) = 0; // and reset startup_timer = 0 (for time sync if no sntp) - ESP_LOGI("power_cycle", "Boot count=%d => STARTUP mode", id(boot_count)); - } - -############################################# -# ESP Platform and Framework -# https://esphome.io/components/esp32.html -############################################# -esp8266: - board: esp01_1m # The original sonoff basic - restore_from_flash: true # restore some values on reboot - -preferences: - flash_write_interval: 5min - -mdns: - disabled: false - -############################################# -# ESPHome Logging Enable -# https://esphome.io/components/logger.html -############################################# -logger: - level: "${log_level}" #INFO Level suggested, or DEBUG for testing - #baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) - #esp8266_store_log_strings_in_flash: false - #tx_buffer_size: 64 - -############################################# -# Global Variables for use in automations etc -# https://esphome.io/guides/automations.html?highlight=globals#global-variables -############################################# -globals: - - # Tracks the time (in seconds from midnight) at the previous boot - - id: last_boot_time_s - type: int - restore_value: true - initial_value: "0" - - # Counts how many consecutive boots have occurred (within X seconds) - - id: boot_count - type: int - restore_value: true - initial_value: "0" - - # Morning On time (minutes from midnight), - - id: morning_on - type: int - restore_value: true - initial_value: "${morning_on_default}" - - # Morning Off time (minutes from midnight), - - id: morning_off - type: int - restore_value: true - initial_value: "${morning_off_default}" - - # Evening On time (minutes from midnight), - - id: evening_on - type: int - restore_value: true - initial_value: "${morning_off_default}" - - # Evening Off time (minutes from midnight), - - id: evening_off - type: int - restore_value: true - initial_value: "${morning_off_default}" - - #################################################### - # operation_mode: - # 0 = OFF - # 1 = ON - # 2 = TIMER - # 3 = STARTUP - #################################################### - - id: operation_mode - type: int - restore_value: false - initial_value: "3" - - #################################################### - # current_mins is set if SNTP is invalid. - # We assume user powers on the device at 12:00 noon - # => 12 * 60 = 720 minutes from midnight. - # Not restored, so it resets each boot. - #################################################### - - id: current_mins - type: int - restore_value: false - initial_value: "720" # 720 is 12:00 Noon - - #################################################### - # startup_timer: counts minutes in STARTUP mode - # After 'startup_duration' minutes, revert to TIMER. - # Not restored, so each boot starts fresh at 0. - #################################################### - - id: startup_timer - type: int - restore_value: false - initial_value: "0" - -############################################# -# Text Sensors -# https://esphome.io/components/text_sensor/index.html -############################################# -text_sensor: - -############################ -# MQTT Subscriptions -############################ - #################################################### - # Subscribe to the Morning On time, format "HH:MM" - # We check x.size() == 5 and x[2] == ':', - # then parse x.substr(0,2) and x.substr(3,2) - # std::string uses 'substr', not 'substring'. - #################################################### - - platform: mqtt_subscribe - name: "Morning On Time Setting" - id: morning_on_topic - topic: "${mqtt_timer_topic}/morning-on" # Stored in the format HH:MM - internal: True - on_value: - then: - - lambda: |- - // Expect "HH:MM" => total length = 5, with ':' - if (x.size() == 5 && x[2] == ':') { - int hour = atoi(x.substr(0, 2).c_str()); // "HH" - int minute = atoi(x.substr(3, 2).c_str()); // "MM" - id(morning_on) = hour * 60 + minute; - ESP_LOGI("timer","Received new Morning On: %02d:%02d", hour, minute); - } else { - ESP_LOGW("timer","Invalid Morning On format: %s", x.c_str()); - } - #################################################### - # Morning Off time => "HH:MM" - #################################################### - - platform: mqtt_subscribe - name: "Morning Off Time Setting" - id: morning_off_topic - topic: "${mqtt_timer_topic}/morning-off" # Stored in the format HH:MM - internal: True # No need to show this in Home Assistant as there is a sensor that shows the set value - on_value: - then: - - lambda: |- - if (x.size() == 5 && x[2] == ':') { - int hour = atoi(x.substr(0, 2).c_str()); - int minute = atoi(x.substr(3, 2).c_str()); - id(morning_off) = hour * 60 + minute; - ESP_LOGI("timer","Received new Morning Off: %02d:%02d", hour, minute); - } else { - ESP_LOGW("timer","Invalid Morning Off format: %s", x.c_str()); - } - #################################################### - # Evening On time => "HH:MM" - #################################################### - - platform: mqtt_subscribe - name: "Evening On Time Setting" - id: evening_on_topic - topic: "${mqtt_timer_topic}/evening-on" # Stored in the format HH:MM - internal: True # No need to show this in Home Assistant as there is a sensor that shows the set value - on_value: - then: - - lambda: |- - if (x.size() == 5 && x[2] == ':') { - int hour = atoi(x.substr(0, 2).c_str()); - int minute = atoi(x.substr(3, 2).c_str()); - id(evening_on) = hour * 60 + minute; - ESP_LOGI("timer","Received new Evening On: %02d:%02d", hour, minute); - } else { - ESP_LOGW("timer","Invalid Evening On format: %s", x.c_str()); - } - #################################################### - # Evening Off time => "HH:MM" - #################################################### - - platform: mqtt_subscribe - name: "Evening Off Time Setting" - id: evening_off_topic - topic: "${mqtt_timer_topic}/evening-off" # Stored in the format HH:MM - internal: True # No need to show this in Home Assistant as there is a sensor that shows the set value - on_value: - then: - - lambda: |- - if (x.size() == 5 && x[2] == ':') { - int hour = atoi(x.substr(0, 2).c_str()); - int minute = atoi(x.substr(3, 2).c_str()); - id(evening_off) = hour * 60 + minute; - ESP_LOGI("timer","Received new Evening Off: %02d:%02d", hour, minute); - } else { - ESP_LOGW("timer","Invalid Evening Off format: %s", x.c_str()); - } - #################################################### - # Subscribe to operation mode: - # OFF, ON, TIMER, STARTUP - # We do case-insensitive compare using strcasecmp - # (Requires typically included in ESPHome) - #################################################### - - platform: mqtt_subscribe - name: "Operation Mode Setting" - id: timer_operation_mode_topic - topic: "${mqtt_timer_topic}/operation" # STARTUP,ON,OFF,TIMER - internal: True # No need to show this in Home Assistant as there is a sensor that shows the set value - on_value: - then: - - lambda: |- - /* - * In standard C++ (ESPHome), no 'equalsIgnoreCase()'. - * We use 'strcasecmp' for case-insensitive compare. - * Returns 0 if they match ignoring case. - */ - if (strcasecmp(x.c_str(), "TIMER") == 0) { - id(operation_mode) = 2; - ESP_LOGI("timer","Operation mode set to TIMER"); - } else if (strcasecmp(x.c_str(), "ON") == 0) { - id(operation_mode) = 1; - ESP_LOGI("timer","Operation mode set to ON"); - } else if (strcasecmp(x.c_str(), "OFF") == 0) { - id(operation_mode) = 0; - ESP_LOGI("timer","Operation mode set to OFF"); - } else if (strcasecmp(x.c_str(), "STARTUP") == 0) { - id(operation_mode) = 3; - id(startup_timer) = 0; // Reset the startup timer to zero - ESP_LOGI("timer","Operation mode set to STARTUP"); - } else { - ESP_LOGW("timer","Invalid operation mode: %s", x.c_str()); - } - - ###################################################### - # Expose the current operation mode (OFF, ON, TIMER, STARTUP) - ###################################################### - - platform: template - name: "Operation Mode State" - lambda: |- - // 0=OFF, 1=ON, 2=TIMER, 3=STARTUP - switch (id(operation_mode)) { - case 0: return {"OFF"}; - case 1: return {"ON"}; - case 2: return {"TIMER"}; - case 3: return {"STARTUP"}; - default: return {"UNKNOWN"}; - } - update_interval: 5s - - ###################################################### - # Expose the "Morning On" time as a text (HH:MM) - ###################################################### - - platform: template - name: "Timeclock: Morning On Time" - lambda: |- - int hour = id(morning_on) / 60; - int minute = id(morning_on) % 60; - // Increase to 16 for safety - char buff[16]; - snprintf(buff, sizeof(buff), "%02d:%02d", hour, minute); - return { std::string(buff) }; - update_interval: "${update_interval}" - - ###################################################### - # Expose the "Morning Off" time as a text (HH:MM) - ###################################################### - - platform: template - name: "Timeclock: Morning Off Time" - lambda: |- - int hour = id(morning_off) / 60; - int minute = id(morning_off) % 60; - // Increase buffer size to 8 just to be safe - // Increase to 16 for safety - char buff[16]; - snprintf(buff, sizeof(buff), "%02d:%02d", hour, minute); - return { std::string(buff) }; - update_interval: "${update_interval}" - - ###################################################### - # Expose the "Evening On" time as a text (HH:MM) - ###################################################### - - platform: template - name: "Timeclock: Evening On Time" - lambda: |- - int hour = id(evening_on) / 60; - int minute = id(evening_on) % 60; - // Increase buffer size to 8 just to be safe - // Increase to 16 for safety - char buff[16]; - snprintf(buff, sizeof(buff), "%02d:%02d", hour, minute); - return { std::string(buff) }; - update_interval: "${update_interval}" - - ###################################################### - # Expose the "Evening Off" time as a text (HH:MM) - ###################################################### - - platform: template - name: "Timeclock: Evening Off Time" - lambda: |- - int hour = id(evening_off) / 60; - int minute = id(evening_off) % 60; - // Increase buffer size to 8 just to be safe - // Increase to 16 for safety - char buff[16]; - snprintf(buff, sizeof(buff), "%02d:%02d", hour, minute); - return { std::string(buff) }; - update_interval: "${update_interval}" - -############################################# -# Sensors -# https://esphome.io/components/text_sensor/index.html -############################################# -sensor: - - platform: template - name: "Mins from Midnight" - unit_of_measurement: "mins" - accuracy_decimals: 0 - update_interval: "${update_interval}" - internal: True - lambda: |- - return id(current_mins); - - # A value in mins if a timer is running showing how many mins left - - platform: template - name: "Timer Minutes Remaining" - id: timer_minutes_remaining - unit_of_measurement: "Mins" - update_interval: 5s - accuracy_decimals: "0" - lambda: |- - // always zero if relay is off - if (!id(relay).state) { - return 0; - } - int rem = 0; - // only calculate for mode 2 (scheduled) or mode 3 (startup) - if (id(operation_mode) == 2) { - int a = id(morning_off) - id(current_mins); - int b = id(evening_off) - id(current_mins); - // if a is negative, use b; otherwise pick the smaller of a or b - rem = (a < 0) ? b : (a < b ? a : b); - } - else if (id(operation_mode) == 3) { - rem = ${startup_duration} - id(startup_timer); - } - // never return negative - return rem > 0 ? rem : 0; - -#################################################### -# Relay Switch (Sonoff Basic Relay on GPIO12) -#################################################### -switch: - - platform: gpio - name: "Towel Rail Power" - pin: GPIO12 - id: relay - restore_mode: RESTORE_DEFAULT_OFF - -################################################################################################# -# BUTTON COMPONENT -# https://esphome.io/components/button/index.html -################################################################################################# -button: - - platform: template - name: "Startup: ${startup_duration} Minutes" - id: startup_button - icon: "mdi:play-circle-outline" # optional, pick any MaterialDesign icon you like - on_press: - then: - # 1) set the mode to STARTUP (3) - - lambda: |- - id(startup_timer) = 0; // Reset the startup timer to zero - id(operation_mode) = 3; // Set to STARTUP - ESP_LOGD("main", "operation_mode set to %d via STARTUP button", id(operation_mode)); - # 2) turn on the relay switch - - switch.turn_on: - id: relay - -################################################################################################# -# SELECT COMPONENT -# https://esphome.io/components/select/index.html -################################################################################################# -select: - - platform: template - name: "Operation Mode" - id: operation_mode_select - update_interval: 5s # poll every 5 s for external changes - options: - - "OFF" - - "ON" - - "TIMER" - - "STARTUP" - - # Getter: maps your integer into one of the four strings - lambda: |- - switch (id(operation_mode)) { - case 1: return std::string("ON"); - case 2: return std::string("TIMER"); - case 3: return std::string("STARTUP"); - default: return std::string("OFF"); - } - - # set_action: called when you pick an option in HA - set_action: - - lambda: |- - if (x == "OFF") id(operation_mode) = 0; - else if (x == "ON") id(operation_mode) = 1; - else if (x == "TIMER") id(operation_mode) = 2; - else { - id(startup_timer) = 0; // Reset the startup timer to zero - id(operation_mode) = 3; /* STARTUP */ - } - ESP_LOGD("main", "operation_mode set to %d", id(operation_mode)); - -#################################################### -# Check every minute to decide relay state -#################################################### -interval: - - interval: "1min" # Must be 1min as this is used to calculate times - then: - - lambda: |- - - // Do we have correct time from SNTP? If not... - if (!id(time_sync).has_state()) { - // Set minutes since midnight - id(current_mins) = id(current_mins) +1 ; - - // wrap around at 1440 => next day - if (id(current_mins) >= 1440) { - id(current_mins) = 0; - } - - // If we do have proper SNMP time... - } else { - // Use real time from SNTP - auto now = id(sntp_time).now(); - id(current_mins) = now.hour * 60 + now.minute; - } - - // operation_mode: - // 0 = OFF - // 1 = ON - // 2 = TIMER - // 3 = STARTUP - int mode = id(operation_mode); - - ////////////////////////////////////////////////// - // STARTUP MODE: Relay ON for 'startup_duration' - // minutes, then automatically revert to TIMER. - ////////////////////////////////////////////////// - if (mode == 3) { - id(startup_timer) = id(startup_timer) + 1 ; // works as long as update_interval in seconds - // Compare with the substitution startup_duration - if (id(startup_timer) < (int) ${startup_duration}) { - // Still within the STARTUP period => turn relay on - id(relay).turn_on(); - } else { - // After 'startup_duration' minutes => switch to TIMER - id(operation_mode) = 2; - id(mqtt_client).publish("${mqtt_timer_topic}/operation", "TIMER"); - } - // Skip the rest of the logic - ESP_LOGI("startup_timer", "startup_timer=%d", id(startup_timer)); - return; - } - - ////////////////////////////////////////////////// - // OFF MODE => always off - ////////////////////////////////////////////////// - if (mode == 0) { - id(relay).turn_off(); - return; - } - - ////////////////////////////////////////////////// - // ON MODE => always on - ////////////////////////////////////////////////// - if (mode == 1) { - id(relay).turn_on(); - return; - } - - ////////////////////////////////////////////////// - // TIMER MODE => follow morning/evening schedule - // using SNTP if valid, else current_mins - ////////////////////////////////////////////////// - if (mode == 2) - { - - bool should_on = false; - - // Check morning window - // Example: morning_on=360 => 06:00, morning_off=480 => 08:00 - // If current_mins in [360..480), should_on = true - if (id(current_mins) >= id(morning_on) && id(current_mins) < id(morning_off) ) - { - should_on = true; - } - - // Check evening window - // Example: evening_on=1260 => 21:00, evening_off=1440 => midnight - if (id(current_mins) >= id(evening_on) && id(current_mins) < id(evening_off) ) - { - should_on = true; - } - - // Final relay state based on schedule - if (should_on) { - id(relay).turn_on(); - } else { - id(relay).turn_off(); - } - } - - - - diff --git a/esphome/archive/esp-generic-startfile.yaml.trmp b/esphome/archive/esp-generic-startfile.yaml.trmp deleted file mode 100644 index 7e4a16a..0000000 --- a/esphome/archive/esp-generic-startfile.yaml.trmp +++ /dev/null @@ -1,205 +0,0 @@ - -# This is a generic starter yaml file for -# espHome, by zorruno 2024 -# would be something like loungefancontroller -# yaml file would then be esp-loungefancontroller.yaml - -############################################# -############################################# -# TITLE -# Details of what the device is plus -# any relevant web links -############################################# -############################################# - -############################################# -# SECRETS -# Secrets file is usually at config/secrets.yaml -# or config/esphome/secrets.yaml -# depending on your setup with HA -############################################# -# SECRETS FILE needs these specific secrets: -# esp-_api_key -# esp-_ota_pass -# esp-_static_ip (Optional) -# esp-_gateway (Optional) -# esp-_subnet (Optional) -# -# SECRETS FILE needs these generic Secrets: -# wifi_ssid -# wifi_password -# fallback_ap_password -# mqtt_server -# mqtt_username -# mqtt_password -# web_server_username (Optional) -# web_server_password (Optional) -############################################# - -############################################# -# VARIABLE SUBSTITUTIONS -# Give the device a useful name & description here -# and change values accordingly. -############################################# -substitutions: - device_name: esp- - friendly_name: "Device friendly name" - description_comment: "A Description of this device" - - # if NOT using a secrets file, just replace these with the passwords etc (in quotes) - api_key: !secret esp-_api_key # unfortunately you can't use substitutions in secrets names - ota_pass: !secret esp-_ota_pass # unfortunately you can't use substitutions in secrets names - wifi_ssid: !secret wifi_ssid - wifi_password: !secret wifi_password - fallback_ap_password: !secret fallback_ap_password - - # Add these if we are giving it a static ip, or remove them in the Wifi section - #static_ip_address: !secret esp-_static_ip - #static_ip_gateway: !secret esp-_gateway - #static_ip_subnet: !secret esp-_subnet - - mqtt_server: !secret mqtt_server - mqtt_username: !secret mqtt_username - mqtt_password: !secret mqtt_password - mqtt_topic: "esphome" # main topic for the mqtt server, call it what you like - - web_server_username: !secret web_server_username - web_server_password: !secret web_server_password - - update_time: 60s # update time for for general temp sensors etc - -############################################# -# ESPHome -# https://esphome.io/components/esphome.html -############################################# -esphome: - name: ${device_name} - friendly_name: ${friendly_name} # appears as main name on the esphome page in HA - comment: ${description_comment} # appears as comment on the esphome page in HA - #min_version: 2024.6.0 - -############################################# -# ESP Platform and Framework -# https://esphome.io/components/esp32.html -############################################# -esp32: - board: - framework: - type: esp-idf # Suggest using the ESP-IDF Framework. Changing from 'arduino' to 'esp-idf' needs a cabled flash to correct partitions - version: recommended # recommended, latest or dev - -############################################# -# ESPHome Logging Enabl -# https://esphome.io/components/logger.html -############################################# -logger: - level: INFO # INFO Level suggested, or DEBUG for testing - #baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) - #esp8266_store_log_strings_in_flash: false - #tx_buffer_size: 64 - -############################################# -# Enable the Home Assistant API -# https://esphome.io/components/api.html -############################################# -api: - encryption: - key: ${api_key} - -############################################# -# Enable Over the Air Update Capability -# https://esphome.io/components/ota.html?highlight=ota -############################################# -ota: - - platform: esphome - password: ${ota_pass} - -############################################# -# Safe Mode -# Safe mode will detect boot loops -# https://esphome.io/components/safe_mode -############################################# -safe_mode: - -############################################# -# 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: - ssid: ${wifi_ssid} - password: ${wifi_password} - #power_save_mode: LIGHT #https://esphome.io/components/wifi.html#wifi-power-save-mode - #manual_ip: #optional static IP address - #static_ip: ${static_ip_address} - #gateway: ${static_ip_gateway} - #subnet: ${static_ip_subnet} - ap: # Details for fallback hotspot in case wifi connection fails https://esphome.io/components/wifi.html#access-point-mode - ssid: ${device_name} fallback AP - password: ${fallback_ap_password} - ap_timeout: 30min # Time until it brings up fallback AP. default is 1min - -############################################# -# Web Portal for display and monitoring -# Turning this off is probably a good idea to save resources. -# https://esphome.io/components/web_server.html -############################################# -#web_server: -# port: 80 -# auth: -# username: ${web_server_username} #probably a good idea to secure it -# password: ${web_server_password} - -############################################# -# MQTT Monitoring -# https://esphome.io/components/mqtt.html?highlight=mqtt -# MUST also have api enabled if you enable MQTT -############################################# -mqtt: - broker: ${mqtt_server} - topic_prefix: ${mqtt_topic}/${device_name} - username: ${mqtt_username} - password: ${mqtt_password} - -############################################# -# Time Component -# https://esphome.io/components/time/index.html#time-component -# Sync with HA Time. Probably not really necessary. -############################################# -#time: -# - platform: homeassistant -# id: homeassistant_time - -############################################# -# Text Sensors -# https://esphome.io/components/text_sensor/index.html -############################################# -text_sensor: - - platform: version - name: ${friendly_name} Version - - platform: wifi_info - ip_address: - name: ${friendly_name} IP Address - -############################################# -# General Sensors -# https://esphome.io/components/sensor/index.html -############################################# -sensor: - - platform: uptime # Uptime for this device - name: ${friendly_name} Uptime - update_interval: ${update_time} - - platform: wifi_signal # Wifi Strength - name: ${friendly_name} Wifi Signal - update_interval: ${update_time} - - ############################################# -# Binary Sensors -# https://esphome.io/components/binary_sensor/index.html -############################################# -#binary_sensor: - diff --git a/esphome/archive/esp-laundrylights copy.yaml.old b/esphome/archive/esp-laundrylights copy.yaml.old deleted file mode 100644 index 2eb374c..0000000 --- a/esphome/archive/esp-laundrylights copy.yaml.old +++ /dev/null @@ -1,154 +0,0 @@ -############################################# -############################################# -# LAUNDRY MAIN LIGHTSWITCH -# V1.0 2025-05-30 Initial Version -############################################# -# Zemismart KS-811 Triple push button -# pinout/schematic https://community.home-assistant.io/t/zemismart-ks-811-working-with-esphome/ -# -# NOTES -# - -# -############################################# -############################################# - -############################################# -# SPECIFIC DEVICE VARIABLE SUBSTITUTIONS -# If NOT using a secrets file, just replace these with the passwords etc (in quotes) -############################################# -substitutions: - device_name: "esp-laundrylights" - project_name: "Zemismart Technologies.KS-811 Triple" # Project Details - project_version: "v1" # Project V denotes release of yaml file, allowing checking of deployed vs latest version - entity_prefix: "Laundry" # Simple device name where we want to prefix a sensor or switch, eg "Load" Current. - friendly_name: "Laundry Main Lightswitch (3)" - description_comment: "Laundry Main Lightswitch using a Zemismart KS-811 Triple Push Button. Laundry Lights (1), Spare (2), Laundry Power Signal (3)" - device_area: "Laundry" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. - api_key: !secret esp-laundrylights_api_key # unfortunately you can't use substitutions inside secrets names - ota_pass: !secret esp-laundrylights_ota_pass # unfortunately you can't use substitutions inside secrets names - static_ip_address: !secret esp-laundrylights_ip - log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE - update_interval: "60s" # update time for for general sensors etc - -############################################# -# Included Common Packages -# https://esphome.io/components/esphome.html -############################################# -packages: - common_wifi: !include - file: common/network_common.yaml - vars: - local_static_ip_address: ${static_ip_address} - local_ota_pass: ${ota_pass} - common_api: !include - file: common/api_common.yaml - vars: - local_api_key: ${api_key} -# common_webportal: !include -# file: common/webportal_common.yaml - common_mqtt: !include - file: common/mqtt_common.yaml - common_sntp: !include - file: common/sntp_common.yaml - common_general_sensors: !include - file: common/sensors_common.yaml - vars: - local_friendly_name: ${friendly_name} - local_update_interval: ${update_interval} - -############################################# -# ESPHome -# https://esphome.io/components/esphome.html -############################################# -esphome: - name: ${device_name} - friendly_name: ${friendly_name} - comment: ${description_comment} #Appears on the esphome page in HA - area: ${device_area} - project: - name: "${project_name}" - version: "${project_version}" - on_boot: - priority: 200 - then: - - switch.turn_on: Relay_3 - -############################################# -# ESP Platform and Framework -# https://esphome.io/components/esp32.html -############################################# -esp8266: - board: esp01_1m - early_pin_init: False # Initialise pins early to known values. Recommended false where switches are involved. Defaults to True. - board_flash_mode: dout # Default is dout - -############################################# -# ESPHome Logging Enable -# https://esphome.io/components/logger.html -############################################# -logger: - level: ${log_level} #INFO Level suggested, or DEBUG for testing - #baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) - #esp8266_store_log_strings_in_flash: false - #tx_buffer_size: 64 - -############################################# -# STATUS LED -# https://esphome.io/components/status_led.html -############################################# -status_led: - pin: - number: GPIO2 - inverted: yes - -############################################# -# BINARY SENSORS -# https://esphome.io/components/binary_sensor/ -############################################# -binary_sensor: - - platform: gpio - pin: - number: GPIO16 - mode: INPUT - inverted: True - name: "Button 1: Light Switch (Laundry)" - on_press: - - switch.toggle: Relay_1 - - - platform: gpio - pin: - number: GPIO05 - mode: INPUT - inverted: True - name: "Button 2: Spare" - on_press: - - switch.toggle: Relay_2 - - - platform: gpio - pin: - number: GPIO4 - mode: INPUT - inverted: True - name: "Button 3: Laundry Power Enable" - on_press: - - switch.toggle: Relay_3 - -############################################# -# SWITCH COMPONENT -# https://esphome.io/components/switch/ -############################################# -switch: - - platform: gpio - name: "Relay 1: Laundry Lights" - pin: GPIO13 - id: Relay_1 - - platform: gpio - name: "Relay 2: Spare" - pin: GPIO12 - id: Relay_2 - - platform: gpio - name: "Relay 3: Laundry Power Enable Signal" - pin: GPIO14 - id: Relay_3 - - diff --git a/esphome/archive/esp-laundrylights copy.yaml.old2 b/esphome/archive/esp-laundrylights copy.yaml.old2 deleted file mode 100644 index 7202292..0000000 --- a/esphome/archive/esp-laundrylights copy.yaml.old2 +++ /dev/null @@ -1,154 +0,0 @@ -############################################# -############################################# -# LAUNDRY MAIN LIGHTSWITCH -# V1.0 2025-05-30 Initial Version -############################################# -# Zemismart KS-811 Triple push button -# pinout/schematic https://community.home-assistant.io/t/zemismart-ks-811-working-with-esphome/ -# -# NOTES -# - -# -############################################# -############################################# - -############################################# -# SPECIFIC DEVICE VARIABLE SUBSTITUTIONS -# If NOT using a secrets file, just replace these with the passwords etc (in quotes) -############################################# -substitutions: - device_name: "esp-laundrylights" - project_name: "Zemismart Technologies.KS-811 Triple" # Project Details - project_version: "v1" # Project V denotes release of yaml file, allowing checking of deployed vs latest version - entity_prefix: "Laundry" # Simple device name where we want to prefix a sensor or switch, eg "Load" Current. - friendly_name: "Main Bathroom Lightswitch (3)" - description_comment: "Main Bathroom Lightswitch using a Zemismart KS-811 Triple Push Button. Main Lights (1), Shower Lights (2), Cabinet Lights (3)" - device_area: "Laundry" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. - api_key: !secret esp-mainbathlights_api_key # unfortunately you can't use substitutions inside secrets names - ota_pass: !secret esp-mainbathlights_ota_pass # unfortunately you can't use substitutions inside secrets names - static_ip_address: !secret esp-mainbathlights_ip - log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE - update_interval: "60s" # update time for for general sensors etc - -############################################# -# Included Common Packages -# https://esphome.io/components/esphome.html -############################################# -packages: - common_wifi: !include - file: common/network_common.yaml - vars: - local_static_ip_address: ${static_ip_address} - local_ota_pass: ${ota_pass} - common_api: !include - file: common/api_common.yaml - vars: - local_api_key: ${api_key} -# common_webportal: !include -# file: common/webportal_common.yaml - common_mqtt: !include - file: common/mqtt_common.yaml - common_sntp: !include - file: common/sntp_common.yaml - common_general_sensors: !include - file: common/sensors_common.yaml - vars: - local_friendly_name: ${friendly_name} - local_update_interval: ${update_interval} - -############################################# -# ESPHome -# https://esphome.io/components/esphome.html -############################################# -esphome: - name: ${device_name} - friendly_name: ${friendly_name} - comment: ${description_comment} #Appears on the esphome page in HA - area: ${device_area} - project: - name: "${project_name}" - version: "${project_version}" -# on_boot: -# priority: 200 -# then: -# - switch.turn_on: Relay_3 - -############################################# -# ESP Platform and Framework -# https://esphome.io/components/esp32.html -############################################# -esp8266: - board: esp01_1m - early_pin_init: False # Initialise pins early to known values. Recommended false where switches are involved. Defaults to True. - board_flash_mode: dout # Default is dout - -############################################# -# ESPHome Logging Enable -# https://esphome.io/components/logger.html -############################################# -logger: - level: ${log_level} #INFO Level suggested, or DEBUG for testing - #baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) - #esp8266_store_log_strings_in_flash: false - #tx_buffer_size: 64 - -############################################# -# STATUS LED -# https://esphome.io/components/status_led.html -############################################# -status_led: - pin: - number: GPIO2 - inverted: yes - -############################################# -# BINARY SENSORS -# https://esphome.io/components/binary_sensor/ -############################################# -binary_sensor: - - platform: gpio - pin: - number: GPIO16 - mode: INPUT - inverted: True - name: "Button 1: Main Lights" - on_press: - - switch.toggle: Relay_1 - - - platform: gpio - pin: - number: GPIO05 - mode: INPUT - inverted: True - name: "Button 2: Shower Lights" - on_press: - - switch.toggle: Relay_2 - - - platform: gpio - pin: - number: GPIO4 - mode: INPUT - inverted: True - name: "Button 3: Cabinet Lights" - on_press: - - switch.toggle: Relay_3 - -############################################# -# SWITCH COMPONENT -# https://esphome.io/components/switch/ -############################################# -switch: - - platform: gpio - name: "Relay 1: Main Lights" - pin: GPIO13 - id: Relay_1 - - platform: gpio - name: "Relay 2: Shower Lights" - pin: GPIO12 - id: Relay_2 - - platform: gpio - name: "Relay 3: Cabinet Lights" - pin: GPIO14 - id: Relay_3 - - diff --git a/esphome/archive/esp-laundrylights2 copy.yaml.old3 b/esphome/archive/esp-laundrylights2 copy.yaml.old3 deleted file mode 100644 index cfb8581..0000000 --- a/esphome/archive/esp-laundrylights2 copy.yaml.old3 +++ /dev/null @@ -1,157 +0,0 @@ -############################################# -############################################# -# LAUNDRY MAIN LIGHTSWITCH -# V2.0 2025-06-01 Was initially a 3 button switch, now 2 -# V1.0 2025-05-30 Initial Version -############################################# -# Zemismart KS-811 Triple push button -# pinout/schematic https://community.home-assistant.io/t/zemismart-ks-811-working-with-esphome/ -# -# NOTES -# - -# -############################################# -############################################# - -############################################# -# SPECIFIC DEVICE VARIABLE SUBSTITUTIONS -# If NOT using a secrets file, just replace these with the passwords etc (in quotes) -############################################# -substitutions: - device_name: "esp-laundrylights2" - project_name: "Zemismart Technologies.KS-811 Double" # Project Details - project_version: "v2" # Project V denotes release of yaml file, allowing checking of deployed vs latest version - entity_prefix: "Laundry" # Simple device name where we want to prefix a sensor or switch, eg "Load" Current. - friendly_name: "Laundry Main Lightswitch (2)" - description_comment: "Laundry Main Lightswitch using a Zemismart KS-811 Double Push Button. Laundry Lights (1), Laundry Power Signal (2)" - device_area: "Laundry" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. - api_key: !secret esp-laundrylights_api_key # unfortunately you can't use substitutions inside secrets names - ota_pass: !secret esp-laundrylights_ota_pass # unfortunately you can't use substitutions inside secrets names - static_ip_address: !secret esp-laundrylights2_ip - log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE - update_interval: "60s" # update time for for general sensors etc - -############################################# -# Included Common Packages -# https://esphome.io/components/esphome.html -############################################# -packages: - common_wifi: !include - file: common/network_common.yaml - vars: - local_static_ip_address: ${static_ip_address} - local_ota_pass: ${ota_pass} - common_api: !include - file: common/api_common.yaml - vars: - local_api_key: ${api_key} -# common_webportal: !include -# file: common/webportal_common.yaml - common_mqtt: !include - file: common/mqtt_common.yaml - common_sntp: !include - file: common/sntp_common.yaml - common_general_sensors: !include - file: common/sensors_common.yaml - vars: - local_friendly_name: ${friendly_name} - local_update_interval: ${update_interval} - -############################################# -# ESPHome -# https://esphome.io/components/esphome.html -############################################# -esphome: - name: ${device_name} - friendly_name: ${friendly_name} - comment: ${description_comment} #Appears on the esphome page in HA - area: ${device_area} - project: - name: "${project_name}" - version: "${project_version}" - on_boot: - priority: 200 - then: - - switch.turn_on: Relay_2 - -############################################# -# ESP Platform and Framework -# https://esphome.io/components/esp32.html -############################################# -esp8266: - board: esp01_1m - early_pin_init: False # Initialise pins early to known values. Recommended false where switches are involved. Defaults to True. - board_flash_mode: dout # Default is dout - -############################################# -# ESPHome Logging Enable -# https://esphome.io/components/logger.html -############################################# -logger: - level: ${log_level} #INFO Level suggested, or DEBUG for testing - #baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) - #esp8266_store_log_strings_in_flash: false - #tx_buffer_size: 64 - -############################################# -# STATUS LED -# https://esphome.io/components/status_led.html -############################################# -status_led: - pin: - number: GPIO2 - inverted: yes - -############################################# -# BINARY SENSORS -# https://esphome.io/components/binary_sensor/ -############################################# -binary_sensor: - - platform: gpio - pin: - number: GPIO16 - mode: INPUT - inverted: True - name: "Button 1: Light Switch (Laundry)" - on_press: - - switch.toggle: Relay_1 - - - platform: gpio - pin: - number: GPIO05 - mode: INPUT - inverted: True - name: "Button 2: Laundry Power Enable" - on_press: - - switch.toggle: Relay_2 - -# ONLY ON A KS-811-3 -# - platform: gpio -# pin: -# number: GPIO4 -# mode: INPUT -# inverted: True -# name: "Button 3: " -# on_press: -# - switch.toggle: Relay_3 - -############################################# -# SWITCH COMPONENT -# https://esphome.io/components/switch/ -############################################# -switch: - - platform: gpio - name: "Relay 1: Laundry Lights" - pin: GPIO13 - id: Relay_1 - - platform: gpio - name: "Relay 2: Laundry Power Enable Signal" - pin: GPIO12 - id: Relay_2 -# ONLY ON A KS-811-3 -# - platform: gpio -# name: "Relay 3: " -# pin: GPIO14 -# id: Relay_3 - - diff --git a/esphome/archive/esp-mainbathlights copy.yaml b/esphome/archive/esp-mainbathlights copy.yaml deleted file mode 100644 index 1c26c9f..0000000 --- a/esphome/archive/esp-mainbathlights copy.yaml +++ /dev/null @@ -1,157 +0,0 @@ -############################################# -############################################# -# LAUNDRY MAIN LIGHTSWITCH -# V1.0 2025-05-30 Initial Version -############################################# -# Zemismart KS-811 Triple push button -# pinout/schematic https://community.home-assistant.io/t/zemismart-ks-811-working-with-esphome/ -# -# NOTES -# - -# -############################################# -############################################# - -############################################# -# SPECIFIC DEVICE VARIABLE SUBSTITUTIONS -# If NOT using a secrets file, just replace these with the passwords etc (in quotes) -############################################# -substitutions: - device_name: "esp-mainbathlights" - project_name: "Zemismart Technologies.KS-811 Triple" # Project Details - project_version: "v1" # Project V denotes release of yaml file, allowing checking of deployed vs latest version - entity_prefix: "Laundry" # Simple device name where we want to prefix a sensor or switch, eg "Load" Current. - friendly_name: "Main Bathroom Lightswitch (3)" - description_comment: "Main Bathroom Lightswitch using a Zemismart KS-811 Triple Push Button. Main Lights (1), Shower Lights (2), Cabinet Lights (3)" - device_area: "Laundry" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. - api_key: !secret esp-mainbathlights_api_key # unfortunately you can't use substitutions inside secrets names - ota_pass: !secret esp-mainbathlights_ota_pass # unfortunately you can't use substitutions inside secrets names - static_ip_address: !secret esp-mainbathlights_ip - log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE - update_interval: "60s" # update time for for general sensors etc - -############################################# -# Included Common Packages -# https://esphome.io/components/esphome.html -############################################# -packages: - common_wifi: !include - file: common/network_common.yaml - vars: - device_name: ${device_name} - local_static_ip_address: ${static_ip_address} - local_ota_pass: ${ota_pass} - common_api: !include - file: common/api_common.yaml - vars: - local_api_key: ${api_key} -# common_webportal: !include -# file: common/webportal_common.yaml - common_mqtt: !include - file: common/mqtt_common.yaml - vars: - device_name: ${device_name} - common_sntp: !include - file: common/sntp_common.yaml - common_general_sensors: !include - file: common/sensors_common.yaml - vars: - local_friendly_name: ${friendly_name} - local_update_interval: ${update_interval} - -############################################# -# ESPHome -# https://esphome.io/components/esphome.html -############################################# -esphome: - name: ${device_name} - friendly_name: ${friendly_name} - comment: ${description_comment} #Appears on the esphome page in HA - area: ${device_area} - project: - name: "${project_name}" - version: "${project_version}" -# on_boot: -# priority: 200 -# then: -# - switch.turn_on: Relay_3 - -############################################# -# ESP Platform and Framework -# https://esphome.io/components/esp32.html -############################################# -esp8266: - board: esp01_1m - early_pin_init: False # Initialise pins early to known values. Recommended false where switches are involved. Defaults to True. - board_flash_mode: dout # Default is dout - -############################################# -# ESPHome Logging Enable -# https://esphome.io/components/logger.html -############################################# -logger: - level: ${log_level} #INFO Level suggested, or DEBUG for testing - #baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) - #esp8266_store_log_strings_in_flash: false - #tx_buffer_size: 64 - -############################################# -# STATUS LED -# https://esphome.io/components/status_led.html -############################################# -status_led: - pin: - number: GPIO2 - inverted: yes - -############################################# -# BINARY SENSORS -# https://esphome.io/components/binary_sensor/ -############################################# -binary_sensor: - - platform: gpio - pin: - number: GPIO16 - mode: INPUT - inverted: True - name: "Button 1: Main Lights" - on_press: - - switch.toggle: Relay_1 - - - platform: gpio - pin: - number: GPIO05 - mode: INPUT - inverted: True - name: "Button 2: Shower Lights" - on_press: - - switch.toggle: Relay_2 - - - platform: gpio - pin: - number: GPIO4 - mode: INPUT - inverted: True - name: "Button 3: Cabinet Lights" - on_press: - - switch.toggle: Relay_3 - -############################################# -# SWITCH COMPONENT -# https://esphome.io/components/switch/ -############################################# -switch: - - platform: gpio - name: "Relay 1: Main Lights" - pin: GPIO13 - id: Relay_1 - - platform: gpio - name: "Relay 2: Shower Lights" - pin: GPIO12 - id: Relay_2 - - platform: gpio - name: "Relay 3: Cabinet Lights" - pin: GPIO14 - id: Relay_3 - - diff --git a/esphome/archive/esp-occupancyoffice copy.yaml.bak b/esphome/archive/esp-occupancyoffice copy.yaml.bak deleted file mode 100644 index 50b1258..0000000 --- a/esphome/archive/esp-occupancyoffice copy.yaml.bak +++ /dev/null @@ -1,437 +0,0 @@ -############################################# -############################################# -# HiLink LD1125H mmWave sensor, with BME280 Temp/Hum/Pres Sensor on an ESP32 -# https://zorruno.com/2024/mmwave-occupancy-with-esp32-ld1125h/ -# -# https://github.com/patrick3399/Hi-Link_mmWave_Radar_ESPHome/tree/main -# https://github.com/patrick3399/Hi-Link_mmWave_Radar_ESPHome/blob/main/LD1125H/ESP32-LD1125H-Complete.yaml -# -# mth1: 0 to 2.8m sensitive -# mth2: 2.8 to 8m sensitive -# mth3: above 8m sensitive -# rmax: max distance -# Clearance Time: Mov/Occ to Clearance waiting time -# Movement Time: Mov to Occ waiting time -# -############################################# -############################################# - -############################################# -# SPECIFIC DEVICE VARIABLE SUBSTITUTIONS -# If NOT using a secrets file, just replace these with the passwords etc (in quotes) -############################################# -substitutions: - devicename: "esp-occupancyoffice" - friendly_name: "Office Occupancy & Environment" - description_comment: "D1 Mini ESP32 with LD1125H mmWave and environment sensors for downstairs office" - api_key: !secret esp-occupancyoffice_api_key #unfortunately you can't use substitutions inside secrets names - ota_pass: !secret esp-occupancyoffice_ota_pass #unfortunately you can't use substitutions inside secrets names - static_ip_address: !secret esp-occupancyoffice_ip - log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE - update_interval: "60s" # update time for for general sensors etc - room: "Office" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. - - ############################################# - # SPECIFIC PROJECT VARIABLE SUBSTITUTIONS - ############################################# - # - # - -############################################# -# Included Common Packages -# https://esphome.io/components/esphome.html -############################################# -packages: - common_wifi: !include - file: common/network_common.yaml - vars: - local_static_ip_address: ${static_ip_address} - local_ota_pass: ${ota_pass} -# common_api: !include -# file: common/api_common.yaml -# vars: -# local_api_key: ${api_key} - common_webportal: !include - file: common/webportal_common.yaml - common_mqtt: !include - file: common/mqtt_common.yaml - common_sntp: !include - file: common/sntp_common.yaml - common_general_sensors: !include - file: common/sensors_common.yaml - vars: - local_friendly_name: ${friendly_name} - local_update_interval: ${update_interval} - -############################################# -# ESPHome -# https://esphome.io/components/esphome.html -############################################# -esphome: - name: ${devicename} - friendly_name: ${friendly_name} - comment: ${description_comment} #appears on the esphome page in HA - min_version: 2024.6.0 - area: "${room}" - on_boot: #LD1125H Initial Setting, will remember previous values (if set) - priority: -200 - then: - - uart.write: - id: LD1125H_UART_BUS - data: !lambda |- - std::string th1st = "mth1=" + str_sprintf("%.0f",id(LD1125H_mth1).state) +"\r\n"; - return std::vector(th1st.begin(), th1st.end()); - - uart.write: - id: LD1125H_UART_BUS - data: !lambda |- - std::string th2st = "mth2=" + str_sprintf("%.0f",id(LD1125H_mth2).state) +"\r\n"; - return std::vector(th2st.begin(), th2st.end()); - - uart.write: - id: LD1125H_UART_BUS - data: !lambda |- - std::string th3st = "mth3=" + str_sprintf("%.0f",id(LD1125H_mth3).state) +"\r\n"; - return std::vector(th3st.begin(), th3st.end()); - - uart.write: - id: LD1125H_UART_BUS - data: !lambda |- - std::string rmaxst = "rmax=" + str_sprintf("%.1f",id(LD1125H_rmax).state) +"\r\n"; - return std::vector(rmaxst.begin(), rmaxst.end()); - -############################################# -# ESP Platform and Framework -# https://esphome.io/components/esp32.html -############################################# -esp32: - board: esp32dev - framework: - #type: arduino - type: esp-idf #Suggest using the ESP-IDF Framework. Changing from arduino to esp-idf needs a cabled download to change partitions - version: recommended #recommended, latest or dev - -############################################# -# ESPHome external or custom components to use -# https://esphome.io/components/external_components.html -# https://github.com/ssieb/esphome_components/tree/master/components/serial -############################################# -external_components: - - source: - type: git - url: https://github.com/ssieb/custom_components #Thanks for @ssieb components. - components: [ serial ] #text_sensor that reads lines for a uart. Also, a sensor that reads single binary values from the uart. - -############################################# -# ESPHome Logging Enable -# https://esphome.io/components/logger.html -############################################# -logger: - level: ${log_level} #INFO Level suggested, or DEBUG for testing - baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) - #esp8266_store_log_strings_in_flash: false - #tx_buffer_size: 64 - -############################################# -# Enable the Home Assistant API -# https://esphome.io/components/api.html -############################################# -api: - encryption: - key: ${api_key} - on_client_connected: - - esp32_ble_tracker.start_scan: - continuous: true - on_client_disconnected: - - esp32_ble_tracker.stop_scan: - - - -############################################# -# i2c bus -# https://esphome.io/components/i2c.html -# 10, 50, 100, 200, 800 are possible settings -# for frequency, 50kHz is default -############################################# -i2c: - sda: GPIO19 - scl: GPIO21 - scan: True #look for devices on boot up and report - frequency: 50kHz - -############################################# -# UART Serial -# hardware on EPS32, but software, and can be glitchy on ESP8266 -# https://esphome.io/components/uart.html -############################################# -uart: - id: LD1125H_UART_BUS - rx_pin: GPIO16 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang - tx_pin: GPIO17 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang - baud_rate: 115200 - data_bits: 8 - stop_bits: 1 - parity: NONE - -############################################# -# Bluetooth -# https://esphome.io/components/bluetooth_proxy.html -# https://esphome.io/components/esp32_ble_tracker.html -# Remember that this takes a LOT of processing. On the -# ESP32, enable the IDF framework, and disable the -# Web server component. Changing to the IDF framework -# needs to be via cable not OTA to change the -# partition setup. -############################################# -bluetooth_proxy: - active: true - cache_services: true - -esp32_ble_tracker: - scan_parameters: - continuous: false - -############################################# -# Global Variables for use in automations etc -# https://esphome.io/guides/automations.html?highlight=globals#global-variables -############################################# -globals: - - id: LD1125H_Last_Time - type: time_t - restore_value: no - #initial_value: time(NULL) - #initial_value: !lambda 'return ::time(nullptr);' - initial_value: "0" - - id: LD1125H_Last_Mov_Time - type: time_t - restore_value: no - #initial_value: time(NULL) - #initial_value: !lambda 'return ::time(nullptr);' - initial_value: "0" - - id: LD1125H_Clearence_Status - type: bool - restore_value: no - initial_value: "false" - -############################################# -# General esp status LED -# https://esphome.io/components/status_led.html -############################################# -status_led: - pin: - number: GPIO2 #ESP32 Onboard LED - ignore_strapping_warning: True #https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins - inverted: false - -############################################# -# Interval Automations -# https://esphome.io/guides/automations.html -############################################# -interval: - - interval: 1s #Clearance Scan Time - setup_priority: -200 - then: - lambda: |- - if ((time(NULL)-id(LD1125H_Last_Time))>id(LD1125H_Clear_Time).state) { - if ((id(LD1125H_Clearence_Status) == false) || (id(LD1125H_Occupancy).state != "Clearance")) { - id(LD1125H_Occupancy).publish_state("Clearance"); - id(LD1125H_Clearence_Status) = true; - } - if (id(LD1125H_MovOcc_Binary).state == true) { - id(LD1125H_MovOcc_Binary).publish_state(false); - } - if (id(LD1125H_Mov_Binary).state == true) { - id(LD1125H_Mov_Binary).publish_state(false); - } - } - -############################################# -# Number Sensors (custom component) -# refer https://github.com/ssieb/esphome_components/tree/master/components/serial -############################################# -number: - - platform: template - name: ${friendly_name} LD1125H mth1 #mth1 is 0~2.8m Sensitivity. - id: LD1125H_mth1 - icon: "mdi:cogs" - optimistic: true - restore_value: true #If you don't want to store the setting at ESP, set it to false. - initial_value: "60.0" #Default mth1 Setting - min_value: 10.0 - max_value: 600.0 - step: 5.0 - set_action: - then: - - uart.write: - id: LD1125H_UART_BUS - data: !lambda |- - std::string th1st = "mth1=" + str_sprintf("%.0f",x) +"\r\n"; - return std::vector(th1st.begin(), th1st.end()); - - platform: template - name: ${friendly_name} LD1125H mth2 #mth2 is 2.8~8m Sensitivity. - id: LD1125H_mth2 - icon: "mdi:cogs" - optimistic: true - restore_value: true #If you don't want to store the setting at ESP, set it to false. - initial_value: "30" #Default mth2 Setting - min_value: 5 - max_value: 300 - step: 5 - set_action: - then: - - uart.write: - id: LD1125H_UART_BUS - data: !lambda |- - std::string th2st = "mth2=" + str_sprintf("%.0f",x) +"\r\n"; - return std::vector(th2st.begin(), th2st.end()); - - platform: template - name: ${friendly_name} LD1125H mth3 #mth3 is above 8m Sensitivity. - id: LD1125H_mth3 - icon: "mdi:cogs" - optimistic: true - restore_value: true #If you don't want to store the setting at ESP, set it to false. - initial_value: "20" #Default mth3 Setting - min_value: 5 - max_value: 200 - step: 5 - set_action: - then: - - uart.write: - id: LD1125H_UART_BUS - data: !lambda |- - std::string th3st = "mth3=" + str_sprintf("%.0f",x) +"\r\n"; - return std::vector(th3st.begin(), th3st.end()); - - platform: template - name: ${friendly_name} LD1125H rmax #rmax is max detection distance. - id: LD1125H_rmax - icon: "mdi:cogs" - optimistic: true - restore_value: true #If you don't want to store the setting at ESP, set it to false. - initial_value: "8" #Default rmax Setting - min_value: 0.4 - max_value: 12 - step: 0.1 - set_action: - then: - - uart.write: - id: LD1125H_UART_BUS - data: !lambda |- - std::string rmaxst = "rmax=" + str_sprintf("%.1f",x) +"\r\n"; - return std::vector(rmaxst.begin(), rmaxst.end()); - - platform: template - name: ${friendly_name} LD1125H Clearence Time - id: LD1125H_Clear_Time - icon: "mdi:cogs" - optimistic: true - restore_value: true #If you don't want to store the setting at ESP, set it to false. - initial_value: "5" #LD1125H Mov/Occ > Clearence Time Here - min_value: 0.5 - max_value: 20 - step: 0.5 - - platform: template - name: ${friendly_name} LD1125H Movement Time - id: LD1125H_Mov_Time - icon: "mdi:cogs" - optimistic: true - restore_value: true #If you don't want to store the setting at ESP, set it to false. - initial_value: "1" #LD1125H Mov > Occ Time Here - min_value: 0.5 - max_value: 10 - step: 0.5 - -############################################# -# General Sensors -# https://esphome.io/components/sensor/index.html -############################################# -sensor: - - platform: bme280_i2c - temperature: - name: "Temperature" - accuracy_decimals: 1 - oversampling: 2x - pressure: - name: "Pressure" - oversampling: 2x - humidity: - name: "Humidity" - accuracy_decimals: 1 - oversampling: 2x - address: 0x76 - update_interval: ${update_interval} - - - platform: template - name: "mmWave Distance" - id: LD1125H_Distance - icon: "mdi:signal-distance-variant" - unit_of_measurement: "m" - accuracy_decimals: 2 - filters: # Use Fliter To Debounce - - sliding_window_moving_average: - window_size: 8 - send_every: 2 - - heartbeat: 0.2s - -############################################# -# Text Sensors -# refer https://esphome.io/components/text_sensor/index.html -############################################# -text_sensor: - - platform: serial - uart_id: LD1125H_UART_BUS - name: ${friendly_name} LD1125H UART Text - id: LD1125H_UART_Text - icon: "mdi:format-text" - internal: True #If Don't Want to See UART Receive Data, Set To True - on_value: - lambda: |- - if (id(LD1125H_UART_Text).state.substr(0,3) == "occ") { - id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str())); - if ((time(NULL)-id(LD1125H_Last_Mov_Time))>id(LD1125H_Mov_Time).state) { - id(LD1125H_Occupancy).publish_state("Occupancy"); - if (id(LD1125H_MovOcc_Binary).state == false) { - id(LD1125H_MovOcc_Binary).publish_state(true); - } - if (id(LD1125H_Mov_Binary).state == true) { - id(LD1125H_Mov_Binary).publish_state(false); - } - } - if (id(LD1125H_MovOcc_Binary).state == false) { - id(LD1125H_MovOcc_Binary).publish_state(true); - } - id(LD1125H_Last_Time) = time(NULL); - if (id(LD1125H_Clearence_Status) == true) { - id(LD1125H_Clearence_Status) = false; - } - } - else if (id(LD1125H_UART_Text).state.substr(0,3) == "mov") { - id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str())); - id(LD1125H_Occupancy).publish_state("Movement"); - if (id(LD1125H_MovOcc_Binary).state == false) { - id(LD1125H_MovOcc_Binary).publish_state(true); - } - if (id(LD1125H_Mov_Binary).state == false) { - id(LD1125H_Mov_Binary).publish_state(true); - } - id(LD1125H_Last_Mov_Time) = time(NULL); - id(LD1125H_Last_Time) = time(NULL); - if (id(LD1125H_Clearence_Status) == true) { - id(LD1125H_Clearence_Status) = false; - } - } - - platform: template - name: "mmWave Occupancy" - id: LD1125H_Occupancy - icon: "mdi:motion-sensor" - -############################################# -# Binary Sensors -# https://esphome.io/components/binary_sensor/index.html -############################################# -binary_sensor: - - platform: status - name: ${friendly_name} Status - - platform: template - name: "mmWave Occupancy or Movement" - id: LD1125H_MovOcc_Binary - device_class: occupancy - - platform: template - name: "mmWave Movement" - id: LD1125H_Mov_Binary - device_class: motion \ No newline at end of file diff --git a/esphome/archive/esp-occupancystair.yaml b/esphome/archive/esp-occupancystair.yaml deleted file mode 100644 index 4d764ac..0000000 --- a/esphome/archive/esp-occupancystair.yaml +++ /dev/null @@ -1,456 +0,0 @@ -############################################# -############################################# -# HiLink LD2410 mmWave sensor, with BME280 Temp/Hum/Pres Sensor and PIR on an ESP32 -# https://github.com/patrick3399/Hi-Link_mmWave_Radar_ESPHome/tree/main -# https://github.com/patrick3399/Hi-Link_mmWave_Radar_ESPHome/blob/main/LD1125H/ESP32-LD1125H-Complete.yaml -# -# https://esphome.io/components/sensor/ld2410.html -# https://www.simplysmart.house/blog/presence-detection-ld2410-home-assistant -# -# The B and c versions of this device can use Bluetooth, but we are not using it here. -############################################# -############################################# - -############################################# -# VARIABLE SUBSTITUTIONS -# Give the device a useful name & description here -# and change values accordingly. -############################################# -substitutions: - devicename: "esp-occupancystair" - friendly_name: "Stair Occupancy and Underhouse Environment" - description_comment: "D1 Mini ESP32 with LD2410 mmWave for internal stairwell and environment sensors for under house" - #wifi_ssid: !secret wifi_ssid - #wifi_password: !secret wifi_password - #fallback_ap_password: !secret fallback_ap_password - #Add these if we are giving it a static ip, or remove them in the Wifi section - #static_ip_address: !secret esp-occupancystair_static_ip - #static_ip_gateway: !secret esp-occupancystair_gateway - #static_ip_subnet: !secret esp-occupancystair_subnet - api_key: !secret esp-occupancystair_api_key # unfortunately you can't use substitutions inside secrets names - ota_pass: !secret esp-occupancystair_ota_pass # unfortunately you can't use substitutions inside secrets names - static_ip_address: !secret esp-occupancystair_ip - - mqtt_server: !secret mqtt_server - mqtt_username: !secret mqtt_username - mqtt_password: !secret mqtt_password - mqtt_topic: "esphome" #main topic for the mqtt server, call it what you like - - #web_server_username: !secret web_server_username - #web_server_password: !secret web_server_password - - update_time: 30s #update time for for general temp sensors etc - -############################################# -# Included Common Packages -# https://esphome.io/components/esphome.html -############################################# -packages: - common_wifi: !include - file: common/network_common.yaml - vars: - local_static_ip_address: ${static_ip_address} - local_api_key: ${api_key} - local_ota_pass: ${ota_pass} - -############################################# -# ESPHome -# https://esphome.io/components/esphome.html -############################################# -esphome: - name: ${devicename} - friendly_name: ${friendly_name} - comment: ${description_comment} #appears on the esphome page in HA - min_version: 2024.6.0 - #on_boot: #Initial Setting, will remember previous values (if set) - #priority: -200 - #then: - -############################################# -# ESP Platform and Framework -# https://esphome.io/components/esp32.html -############################################# -esp32: - board: esp32dev - framework: - #type: arduino - type: esp-idf #Suggested Use ESP-IDF Framework, or Plug Out the UART Cable Might Cause ESP32 Hang. - version: recommended #recommended, latest or dev - -############################################# -# i2s bus -# https://esphome.io/components/i2c.html -############################################# -i2c: - sda: GPIO19 - scl: GPIO21 - scan: True - frequency: 100kHz #10, 50, 100, 200, 800 are possible settings, 100kHz was reliable for me - -############################################# -# ESPHome Logging Enable -# https://esphome.io/components/logger.html -############################################# -logger: - level: INFO #INFO Level suggested, or DEBUG for testing - baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) - #esp8266_store_log_strings_in_flash: false - #tx_buffer_size: 64 - -############################################# -# Enable the Home Assistant API -# https://esphome.io/components/api.html -############################################# -#api: -# encryption: -# key: ${api_key} - -############################################# -# Enable Over the Air Update Capability -# https://esphome.io/components/ota.html?highlight=ota -############################################# -#ota: -# - platform: esphome -# password: ${ota_pass} - -############################################# -# Safe Mode -# Safe mode will detect boot loops -# https://esphome.io/components/safe_mode -############################################# -#safe_mode: - -############################################# -# 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: -# ssid: ${wifi_ssid} -# password: ${wifi_password} - #power_save_mode: LIGHT #https://esphome.io/components/wifi.html#wifi-power-save-mode - #manual_ip: #optional static IP address - #static_ip: ${static_ip_address} - #gateway: ${static_ip_gateway} - #subnet: ${static_ip_subnet} -# ap: #Details for fallback hotspot in case wifi connection fails https://esphome.io/components/wifi.html#access-point-mode -# ssid: ${devicename} fallback AP -# password: ${fallback_ap_password} -# ap_timeout: 30min #Time until it brings up fallback AP. default is 1min - -############################################# -# Web Portal for display and monitoring -# Turning this off is probably a good idea to save resources. -# https://esphome.io/components/web_server.html -############################################# -#web_server: -# port: 80 -# auth: -# username: ${web_server_username} #probably a good idea to secure it -# password: ${web_server_password} - -############################################# -# MQTT Monitoring -# https://esphome.io/components/mqtt.html?highlight=mqtt -# MUST also have api enabled if you enable MQTT -############################################# -mqtt: - broker: ${mqtt_server} - topic_prefix: ${mqtt_topic}/${devicename} - username: ${mqtt_username} - password: ${mqtt_password} - discovery: False # enable entity discovery (true is default) - discover_ip: False # enable device discovery (true is default) - -############################################# -# Bluetooth -# https://esphome.io/components/bluetooth_proxy.html -# https://esphome.io/components/esp32_ble_tracker.html -# Remember that this takes a LOT of processing. On the -# ESP32, enable the IDF framework, and disable the -# Web server component. Changing to the IDF framework -# needs to be via cable not OTA to change the -# partition setup. -############################################# -#bluetooth_proxy: - -#esp32_ble_tracker: - -############################################# -# UART Serial -# hardware on EPS32, but software, and can be glitchy on ESP8266 -# https://esphome.io/components/uart.html?highlight=uart -############################################# -uart: - id: ld2410_uart - rx_pin: GPIO16 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang - tx_pin: GPIO17 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang - baud_rate: 256000 # default for LD2410 is 25600, 8, 0, NONE - data_bits: 8 - stop_bits: 1 - parity: NONE - -############################################# -# General esp status LED -# https://esphome.io/components/status_led.html -############################################# -status_led: - pin: - number: GPIO2 #ESP32 Onboard LED - ignore_strapping_warning: True #https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins - inverted: false - -############################################# -# LD2410 Sensors -# https://esphome.io/components/sensor/ld2410.html -# https://www.hlktech.net/index.php?id=988 -############################################# -ld2410: - uart_id: ld2410_uart - #uart_id (Optional, ID): Manually specify the ID of the UART Component if you want to use multiple UART buses. - #throttle (Optional, int): Time in milliseconds to control the rate of data updates. Defaults to 1000ms. - #id (Optional, ID): Manually specify the ID for this LD2410 Sensor component if you need multiple components. - -# light (Optional, int): When in engineering mode, indicates the light sensitivity, otherwise unknown. Value between 0 and 255 inclusive. Though it seems that the value 85 is the lowest value at complete darkness. All options from Sensor. -# moving_distance (Optional, int): Distance in cm of detected moving target. All options from Sensor. -# still_distance (Optional, int): Distance in cm of detected still target. All options from Sensor. -# moving_energy (Optional, int): Energy for moving target. Value between 0 and 100 inclusive. All options from Sensor. -# still_energy (Optional, int): Energy for still target. Value between 0 and 100 inclusive. All options from Sensor. -# detection_distance (Optional, int): Distance in cm of target. All options from Sensor. -# gX (Optional): Energies for the Xth gate (X => 0 to 8). - # move_energy (Optional, int): When in engineering mode, the move energy of the gate, otherwise unknown. Value between 0 and 100 inclusive. All options from Sensor. - #still_energy (Optional, int): When in engineering mode, the still energy of the gate, otherwise unknown. Value between 0 and 100 inclusive. All options from Sensor. -#ld2410_id (Optional, ID): Manually specify the ID for the LD2410 Sensor component if you are using multiple components. - -#The ld2410 number values for setting thresholds -# timeout: 5s -# max_move_distance: 2.25m -# max_still_distance: 2.25m -# g0_move_threshold: 40 # 0m / 0' -# g0_still_threshold: 10 # 0m / 0' -# g1_move_threshold: 40 # 0 - 0.75m / 0 - 2.46' -# g1_still_threshold: 10 # 0 - 0.75m / 0 - 2.46' -# g2_move_threshold: 40 # 0.75 - 1.5m / 2.46' - 4.92' -# g2_still_threshold: 10 # 0.75 - 1.5m / 2.46' - 4.92' -# g3_move_threshold: 40 # 1.5 - 2.25m / 4.92' - 7.38' -# g3_still_threshold: 10 # 1.5 - 2.25m / 4.92' - 7.38' -# g4_move_threshold: 40 # 2.25 - 3m' / 7.38' - 9.84' -# g4_still_threshold: 40 # 2.25 - 3m' / 7.38' - 9.84' -# g5_move_threshold: 40 # 3 - 3.75 / 9.84' - 12.30' -# g5_still_threshold: 40 # 3 - 3.75 / 9.84' - 12.30' -# g6_move_threshold: 30 # 3.75 - 4.5m / 12.30' - 14.76' -# g6_still_threshold: 15 # 3.75 - 4.5m / 12.30' - 14.76' -# g7_move_threshold: 30 # 4.5 - 5.25m / 14.76' - 17.22' -# g7_still_threshold: 15 # 4.5 - 5.25m / 14.76' - 17.22' -# g8_move_threshold: 30 # 5.25 - 6m / 17.22' - 19.68' -# g8_still_threshold: 15 # 5.25 - 6m / 17.22' - 19.68' -number: - - platform: ld2410 - timeout: - name: Timeout - light_threshold: - name: Light Threshold - max_move_distance_gate: - name: Max Move Distance Gate - max_still_distance_gate: - name: Max Still Distance Gate - g0: - move_threshold: - name: g0 move threshold - still_threshold: - name: g0 still threshold - g1: - move_threshold: - name: g1 move threshold - still_threshold: - name: g1 still threshold - g2: - move_threshold: - name: g2 move threshold - still_threshold: - name: g2 still threshold - g3: - move_threshold: - name: g3 move threshold - still_threshold: - name: g3 still threshold - g4: - move_threshold: - name: g4 move threshold - still_threshold: - name: g4 still threshold - g5: - move_threshold: - name: g5 move threshold - still_threshold: - name: g5 still threshold - g6: - move_threshold: - name: g6 move threshold - still_threshold: - name: g6 still threshold - g7: - move_threshold: - name: g7 move threshold - still_threshold: - name: g7 still threshold - g8: - move_threshold: - name: g8 move threshold - still_threshold: - name: g8 still threshold - -#The ld2410 select allows you to control your LD2410 Sensor. -#distance_resolution (Optional): Control the gates distance resolution. Can be 0.75m or 0.2m. Defaults to 0.75m. All options from Select. -#baud_rate (Optional): Control the serial port baud rate. Defaults to 256000. Once changed, all sensors will stop working until a fresh install with an updated UART Component configuration. All options from Select. -#light_function (Optional): If set, will affect the OUT pin value, based on light threshold. Can be off, low or above. Defaults to off. All options from Select. -#out_pin_level (Optional): Control OUT pin away value. Can be low or high. Defaults to low. All options from Select. -#ld2410_id (Optional, ID): Manually specify the ID for the LD2410 Sensor component if you are using multiple components. -select: - - platform: ld2410 - distance_resolution: - name: ${friendly_name} LD2140 Distance Resolution - baud_rate: - name: ${friendly_name} LD2140 Baud Rate - light_function: - name: ${friendly_name} LD2140 Light Function - out_pin_level: - name: ${friendly_name} LD2140 Out Pin Level - -############################################# -# General Sensors -# https://esphome.io/components/sensor/index.html -############################################# -sensor: - - platform: bme280_i2c - temperature: - name: ${friendly_name} BME280 Temp - accuracy_decimals: 1 - oversampling: 2x - pressure: - name: ${friendly_name} BME280 Pressure - oversampling: 2x - humidity: - name: ${friendly_name} BME280 Humidity - accuracy_decimals: 1 - oversampling: 2x - address: 0x76 - update_interval: ${update_time} - - platform: uptime - name: ${friendly_name} Uptime -#The ld2410 sensor values - - platform: ld2410 - light: - name: Light - moving_distance: - name : Moving Distance - still_distance: - name: Still Distance - moving_energy: - name: Move Energy - still_energy: - name: Still Energy - detection_distance: - name: Detection Distance - g0: - move_energy: - name: g0 move energy - still_energy: - name: g0 still energy - g1: - move_energy: - name: g1 move energy - still_energy: - name: g1 still energy - g2: - move_energy: - name: g2 move energy - still_energy: - name: g2 still energy - g3: - move_energy: - name: g3 move energy - still_energy: - name: g3 still energy - g4: - move_energy: - name: g4 move energy - still_energy: - name: g4 still energy - g5: - move_energy: - name: g5 move energy - still_energy: - name: g5 still energy - g6: - move_energy: - name: g6 move energy - still_energy: - name: g6 still energy - g7: - move_energy: - name: g7 move energy - still_energy: - name: g7 still energy - g8: - move_energy: - name: g8 move energy - still_energy: - name: g8 still energy - -# The ld2410 switch allows you to control your LD2410 Sensor. -#Bluetooth switch is only useful of you have a B or C model -switch: - - platform: ld2410 - engineering_mode: - name: ${friendly_name} LD2140 Engineering Mode - #bluetooth: - #name: ${friendly_name} LD2140 Control Bluetooth - -#The ld2410 binary sensors to get presence notification -binary_sensor: - - platform: ld2410 - has_target: - name: ${friendly_name} Presence - has_moving_target: - name: ${friendly_name} Moving Target - has_still_target: - name: ${friendly_name} Still Target - out_pin_presence_status: - name: ${friendly_name} LD2140 Out Pin Presence Status - -#Standard PIR Sensor - - platform: gpio - pin: - number: GPIO13 - mode: - input: true - pullup: true - inverted: true - name: ${friendly_name} PIR Sensor - device_class: motion - -#The ld2410 button allows resetting -button: - - platform: ld2410 - factory_reset: - name: ${friendly_name} LD2140 Factory reset" - restart: - name: ${friendly_name} LD2140 Restart - query_params: - name: Query Parameters - -#The ld2410 text sensor allows you to get information about your LD2410 Sensor. -#Bluetooth sensor is only useful of you have a B or C model -text_sensor: - - platform: ld2410 - version: - name: ${friendly_name} LD2140 Firmware Version - #mac_address: - #name: ${friendly_name} LD2140 BT MAC Address - - diff --git a/esphome/archive/laundry-washer-power.yaml b/esphome/archive/laundry-washer-power.yaml deleted file mode 100644 index 46e8c83..0000000 --- a/esphome/archive/laundry-washer-power.yaml +++ /dev/null @@ -1,30 +0,0 @@ -esphome: - name: laundry-washer-power - friendly_name: Laundry Washer Power - -esp8266: - board: esp01_1m - -# Enable logging -logger: - -# Enable Home Assistant API -api: - encryption: - key: "24fFKajbAkapEa24hpnFOpNrM2uJ11WM9k5E3sI4AGU=" - -ota: - - platform: esphome - password: "32516b91a48d43b4cdf0f13fc145752e" - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password - - # Enable fallback hotspot (captive portal) in case wifi connection fails - ap: - ssid: "Laundry-Washer-Power" - password: "tSoGV9xt4c2n" - -captive_portal: - \ No newline at end of file diff --git a/esphome/archive/old2.multiclick_pushbutton_common copy.yaml.old2 b/esphome/archive/old2.multiclick_pushbutton_common copy.yaml.old2 deleted file mode 100644 index 0a67520..0000000 --- a/esphome/archive/old2.multiclick_pushbutton_common copy.yaml.old2 +++ /dev/null @@ -1,76 +0,0 @@ -#substitutions: -# local_gpioinvert: "True" -# local_singleclick_duration: "300000" # 5 minutes in ms -# local_doubleclick_duration: "1800000" # 30 minutes in ms -# local_tripleclick_duration: "7200000" # 2 hours in ms - -#globals: -# - id: single_click_delay -# type: long -# restore_value: no -# initial_value: ${local_singleclick_duration} -# - id: double_click_delay -# type: long -# restore_value: no -# initial_value: ${local_doubleclick_duration} -# - id: triple_click_delay -# type: long -# restore_value: no -# initial_value: ${local_tripleclick_duration} - -binary_sensor: - - platform: gpio - pin: - number: ${local_gpio} - mode: INPUT - inverted: True - name: ${local_name} - on_multi_click: - # Single Click: one press (short press/release) - - timing: - - ON for at most 1s - - OFF for at least 0.5s - then: - - lambda: |- - if (id(local_relay_id).state) { - ESP_LOGD(id(local_gpio},"Single click: ",id(local_relay_id)," is on, turning it off."); - id(local_relay_id).turn_off(); - } else { - ESP_LOGD(id(local_gpio), "Single click: ",id(local_relay_id)," is off, turning it on for %d ms.", id(local_singleclick_duraton)); - id(local_relay_id).turn_on(); - delay(id(local_singleclick_duration)); - id(local_relay_id).turn_off(); - } - # Double Click: two quick press/release cycles - - timing: - - ON for at most 1s - - OFF for at most 1s - - ON for at most 1s - - OFF for at least 0.5s - then: - - lambda: |- - ESP_LOGD(id(local_gpio), "Double click detected: turning ",id(local_relay_id)," on for %d ms.", id(local_doubleclick_duration)); - id(local_relay_id).turn_on(); - delay(id(local_doubleclick_duration)); - id(local_relay_id).turn_off(); - # Triple Click: three quick press/release cycles - - timing: - - ON for at most 1s - - OFF for at most 1s - - ON for at most 1s - - OFF for at most 1s - - ON for at most 1s - - OFF for at least 0.5s - then: - - lambda: |- - ESP_LOGD(id(local_gpio), "Triple click detected: turning ",id(local_relay_id)," on for %d ms.", id(local_tripleclick_duration)); - id(local_relay_id).turn_on(); - delay(id(local_tripleclick_duration)); - id(local_relay_id).turn_off(); - # Hold: button held for at least 4 seconds - - timing: - - ON for at least 4s - then: - - lambda: |- - ESP_LOGD(id(local_gpio), "Hold detected: turning ",id(local_relay_id)," on indefinitely."); - id(local_relay_id).turn_on(); diff --git a/esphome/archive/old_multiold_click_pushbutton_common copy.yaml.copy b/esphome/archive/old_multiold_click_pushbutton_common copy.yaml.copy deleted file mode 100644 index a1a7e62..0000000 --- a/esphome/archive/old_multiold_click_pushbutton_common copy.yaml.copy +++ /dev/null @@ -1,76 +0,0 @@ -defaults: - local_gpioinvert: "True" - local_singleclick_duration: "300000" # 5 minutes in ms - local_doubleclick_duration: "1800000" # 30 minutes in ms - local_tripleclick_duration: "7200000" # 2 hours in ms - -#globals: -# - id: single_click_delay -# type: long -# restore_value: no -# initial_value: ${local_singleclick_duration} -# - id: double_click_delay -# type: long -# restore_value: no -# initial_value: ${local_doubleclick_duration} -# - id: triple_click_delay -# type: long -# restore_value: no -# initial_value: ${local_tripleclick_duration} - -binary_sensor: - - platform: gpio - pin: - number: ${local_gpio} - mode: INPUT - inverted: ${local_gpioinvert} - name: ${local_name} - on_multi_click: - # Single Click: one press (short press/release) - - timing: - - ON for at most 1s - - OFF for at least 0.5s - then: - - lambda: |- - if (id(${local_relay_id}).state) { - ESP_LOGD("${local_gpio}", "Single click: ${local_relay_id} is on, turning it off."); - id(${local_relay_id}).turn_off(); - } else { - ESP_LOGD("${local_gpio}", "Single click: ${local_relay_id} is off, turning it on for %d ms.", id(single_click_delay)); - id(${local_relay_id}).turn_on(); - delay(id(single_click_delay)); - id(${local_relay_id}).turn_off(); - } - # Double Click: two quick press/release cycles - - timing: - - ON for at most 1s - - OFF for at most 1s - - ON for at most 1s - - OFF for at least 0.5s - then: - - lambda: |- - ESP_LOGD(${local_gpio}, "Double click detected: turning ",${local_relay_id}," on for %d ms.", id(double_click_delay)); - id(${local_relay_id}).turn_on(); - delay(id(double_click_delay)); - id(${local_relay_id}).turn_off(); - # Triple Click: three quick press/release cycles - - timing: - - ON for at most 1s - - OFF for at most 1s - - ON for at most 1s - - OFF for at most 1s - - ON for at most 1s - - OFF for at least 0.5s - then: - - lambda: |- - ESP_LOGD(${local_gpio}, "Triple click detected: turning ",${local_relay_id}," on for %d ms.", id(triple_click_delay)); - id(${local_relay_id}).turn_on(); - delay(id(triple_click_delay)); - id(${local_relay_id}).turn_off(); - # Hold: button held for at least 4 seconds - - timing: - - ON for at least 4s - then: - - lambda: |- - ESP_LOGD(${local_gpio}, "Hold detected (threshold %d ms): turning ",${local_relay_id}," on indefinitely."); - id(${local_relay_id}).turn_on(); diff --git a/esphome/archive/sntp_common copy.yaml b/esphome/archive/sntp_common copy.yaml deleted file mode 100644 index 90dad8c..0000000 --- a/esphome/archive/sntp_common copy.yaml +++ /dev/null @@ -1,66 +0,0 @@ -############################################## -# SPECIFIC DEVICE VARIABLE SUBSTITUTIONS -# If NOT using a secrets file, just replace -# these with the values (in quotes) -############################################# -substitutions: - timezone: "Pacific/Auckland" - sntp_update_interval: 6h # Set the duration between the sntp service polling - # Network time servers https://www.ntppool.org/zone/@ - sntp_server_1: !secret ntp_server_1 - sntp_server_2: !secret ntp_server_2 - sntp_server_3: !secret ntp_server_3 - -############################################# -# Real time clock time source for ESPHome -# If it's invalid, we fall back to an internal clock -# https://esphome.io/components/time/index.html -# https://esphome.io/components/time/sntp -############################################# -time: - - platform: sntp - id: sntp_time - # Define the timezone of the device - timezone: "${timezone}" - # Change sync interval from default 5min to 6 hours (or as set in substitutions) - update_interval: ${sntp_update_interval} - # Set specific sntp servers to use - servers: - - "${sntp_server_1}" - - "${sntp_server_2}" - - "${sntp_server_3}" - # Publish the time the device was last restarted - on_time_sync: - then: - # Update last restart time, but only once. - - if: - condition: - lambda: 'return id(device_last_restart).state == "";' - then: - - text_sensor.template.publish: - id: device_last_restart - state: !lambda 'return id(sntp_time).now().strftime("%a %d %b %Y - %I:%M:%S %p");' - -text_sensor: - # Creates a sensor showing when the device was last restarted - - platform: template - name: 'Last Restart' - id: device_last_restart - icon: mdi:clock - entity_category: diagnostic -# device_class: timestamp - - - platform: template - name: "Internal Time" - id: time_text - update_interval: "1min" - entity_category: diagnostic - lambda: |- - auto time_text = id(sntp_time).now().strftime("%H:%M:%S - %d-%m-%Y"); - return { time_text }; - - - platform: template - name: "Time Sync Status" - id: time_sync - update_interval: "1min" - entity_category: diagnostic \ No newline at end of file diff --git a/esphome/esp-downstbathtowelrail.yaml b/esphome/esp-downstbathtowelrail.yaml index 54357ac..16dc4f7 100644 --- a/esphome/esp-downstbathtowelrail.yaml +++ b/esphome/esp-downstbathtowelrail.yaml @@ -66,6 +66,7 @@ substitutions: static_ip_address: !secret esp-downstbathtowelrail_ip # Device Settings + relay_icon: "mdi:heating-coil" log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE update_interval: "20s" # update time for for general sensors etc @@ -167,20 +168,33 @@ preferences: mdns: disabled: false -############################################# +########################################################################################## # ESPHome Logging Enable # https://esphome.io/components/logger.html -############################################# +########################################################################################## logger: level: "${log_level}" #INFO Level suggested, or DEBUG for testing - #baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) + baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) #esp8266_store_log_strings_in_flash: false #tx_buffer_size: 64 -############################################# +#################################################### +# SWITCH COMPONENT +# https://esphome.io/components/switch/ +# Relay Switch (Sonoff Basic Relay on GPIO12) +#################################################### +switch: + - platform: gpio + name: "Towel Rail Power" + pin: GPIO12 + id: relay + restore_mode: RESTORE_DEFAULT_OFF + icon: "${relay_icon}" + +########################################################################################## # Global Variables for use in automations etc # https://esphome.io/guides/automations.html?highlight=globals#global-variables -############################################# +########################################################################################## globals: # Tracks the time (in seconds from midnight) at the previous boot @@ -198,19 +212,19 @@ globals: # Morning On time (minutes from midnight), - id: morning_on type: int - restore_value: true + restore_value: False initial_value: "${morning_on_default}" # Morning Off time (minutes from midnight), - id: morning_off type: int - restore_value: true + restore_value: False initial_value: "${morning_off_default}" # Evening On time (minutes from midnight), - id: evening_on type: int - restore_value: true + restore_value: False initial_value: "${morning_off_default}" # Evening Off time (minutes from midnight), @@ -222,7 +236,7 @@ globals: # Boost Duration (minutes), - id: boost_duration type: int - restore_value: true + restore_value: False initial_value: "${boost_duration_default}" #################################################### @@ -235,7 +249,7 @@ globals: - id: operation_mode type: int restore_value: false - initial_value: "3" + initial_value: "2" #################################################### # current_mins is set if SNTP is invalid. @@ -258,10 +272,10 @@ globals: restore_value: false initial_value: "0" -############################################# +########################################################################################## # Text Sensors # https://esphome.io/components/text_sensor/index.html -############################################# +########################################################################################## text_sensor: ############################ @@ -375,19 +389,14 @@ text_sensor: # We do case-insensitive compare using strcasecmp # (Requires typically included in ESPHome) #################################################### + # MQTT subscription: set mode, then immediately re-evaluate relay - platform: mqtt_subscribe - name: "Operation Mode Setting" id: timer_operation_mode_topic - topic: "${mqtt_timer_topic}/operation" # BOOST,ON,OFF,TIMER + topic: "${mqtt_timer_topic}/operation" internal: True # No need to show this in Home Assistant as there is a sensor that shows the set value on_value: then: - lambda: |- - /* - * In standard C++ (ESPHome), no 'equalsIgnoreCase()'. - * We use 'strcasecmp' for case-insensitive compare. - * Returns 0 if they match ignoring case. - */ if (strcasecmp(x.c_str(), "TIMER") == 0) { id(operation_mode) = 2; ESP_LOGI("timer","Operation mode set to TIMER"); @@ -399,11 +408,12 @@ text_sensor: ESP_LOGI("timer","Operation mode set to OFF"); } else if (strcasecmp(x.c_str(), "BOOST") == 0) { id(operation_mode) = 3; - id(boost_timer) = 0; // Reset the BOOST timer to zero + id(boost_timer) = 0; ESP_LOGI("timer","Operation mode set to BOOST"); } else { ESP_LOGW("timer","Invalid operation mode: %s", x.c_str()); } + - script.execute: evaluate_relay_state ###################################################### # Expose the current operation mode (OFF, ON, TIMER, BOOST) @@ -480,27 +490,61 @@ text_sensor: return { std::string(buff) }; update_interval: "${update_interval}" - ###################################################### - # Expose the "Boost time" time as text (HH:MM) - ###################################################### +########################################################################################## +# BINARY SENSORS +# https://esphome.io/components/binary_sensor/ +########################################################################################## +binary_sensor: + - platform: gpio + pin: + number: GPIO3 + mode: INPUT_PULLUP + inverted: true + name: "Power Button" + id: power_button + filters: + - delayed_on: 20ms + on_click: + - min_length: 20ms + max_length: 500ms + then: + - lambda: |- + if (id(relay).state) { + // Relay is ON: turn it OFF and set mode to 0 (TIMER) + id(relay).turn_off(); + id(operation_mode) = 2; + } else { + // Relay is OFF: turn it ON and set mode to 3 (BOOST) + id(relay).turn_on(); + id(operation_mode) = 3; + } + - platform: template - name: "Timeclock: Boost Time" + name: "Relay Status" lambda: |- - // e.g. "120 Mins" - return std::to_string(id(boost_duration)) + " Mins"; - update_interval: "${update_interval}" + return id(relay).state; -############################################# +########################################################################################## # Sensors # https://esphome.io/components/text_sensor/index.html -############################################# +########################################################################################## sensor: - platform: template - name: "Mins from Midnight" + name: "Timeclock: Boost Duration" + id: boost_duration_time unit_of_measurement: "mins" - accuracy_decimals: 0 + accuracy_decimals: "0" update_interval: "${update_interval}" - internal: True + lambda: |- + return id(boost_duration); + + - platform: template + name: "Mins from Midnight" + id: mins_from_midnight + unit_of_measurement: "mins" + accuracy_decimals: "0" + update_interval: "${update_interval}" + internal: True # No need to show this in Home Assistant lambda: |- return id(current_mins); @@ -530,16 +574,7 @@ sensor: // never return negative return rem > 0 ? rem : 0; -#################################################### -# Relay Switch (Sonoff Basic Relay on GPIO12) -#################################################### -switch: - - platform: gpio - name: "Towel Rail Power" - pin: GPIO12 - id: relay - restore_mode: RESTORE_DEFAULT_OFF - + ################################################################################################# # BUTTON COMPONENT # https://esphome.io/components/button/index.html @@ -548,17 +583,14 @@ button: - platform: template name: "Boost now" id: boost_button - icon: "mdi:play-circle-outline" # optional, pick any MaterialDesign icon you like + icon: "mdi:play-circle-outline" on_press: - then: - # 1) set the mode to BOOST (3) - - lambda: |- - id(boost_timer) = 0; // Reset the BOOST timer to zero - id(operation_mode) = 3; // Set to BOOST - ESP_LOGD("main", "operation_mode set to %d via BOOST button", id(operation_mode)); - # 2) turn on the relay switch - - switch.turn_on: - id: relay + # 1) reset BOOST timer and set mode + - lambda: |- + id(boost_timer) = 0; + id(operation_mode) = 3; + # 2) immediately re-evaluate relay state + - script.execute: evaluate_relay_state ################################################################################################# # SELECT COMPONENT @@ -568,125 +600,99 @@ select: - platform: template name: "Operation Mode" id: operation_mode_select - update_interval: 5s # poll every 5 s for external changes + update_interval: 5s options: - "OFF" - "ON" - "TIMER" - "BOOST" - # Getter: maps your integer into one of the four strings + # show the current mode lambda: |- switch (id(operation_mode)) { - case 1: return std::string("ON"); - case 2: return std::string("TIMER"); - case 3: return std::string("BOOST"); + case 1: return std::string("ON"); + case 2: return std::string("TIMER"); + case 3: return std::string("BOOST"); default: return std::string("OFF"); } - # set_action: called when you pick an option in HA + # when changed in HA, set mode & re-evaluate set_action: - lambda: |- - if (x == "OFF") id(operation_mode) = 0; - else if (x == "ON") id(operation_mode) = 1; - else if (x == "TIMER") id(operation_mode) = 2; - else { - id(boost_timer) = 0; // Reset the BOOST timer to zero - id(operation_mode) = 3; /* BOOST */ - } - ESP_LOGD("main", "operation_mode set to %d", id(operation_mode)); + if (x == "OFF") { id(operation_mode) = 0; } + else if (x == "ON") { id(operation_mode) = 1; } + else if (x == "TIMER") { id(operation_mode) = 2; } + else { // BOOST + id(boost_timer) = 0; + id(operation_mode) = 3; + } + - script.execute: evaluate_relay_state -#################################################### -# Check every minute to decide relay state -#################################################### -interval: - - interval: "1min" # Must be 1min as this is used to calculate times +################################################################################################# +# SCRIPT COMPONENT +# https://esphome.io/components/script.html +################################################################################################# +# Script: evaluate and drive the relay +script: + - id: evaluate_relay_state then: - lambda: |- - // Do we have correct time from SNTP? If not... + int mode = id(operation_mode); + + // BOOST just forces the relay on + if (mode == 3) { + id(relay).turn_on(); + return; + } + + // OFF → always off + if (mode == 0) { + id(relay).turn_off(); + return; + } + + // ON → always on + if (mode == 1) { + id(relay).turn_on(); + return; + } + + // TIMER → follow schedule windows + { + bool should_on = false; + if (id(current_mins) >= id(morning_on) && id(current_mins) < id(morning_off)) + should_on = true; + if (id(current_mins) >= id(evening_on) && id(current_mins) < id(evening_off)) + should_on = true; + if (should_on) id(relay).turn_on(); + else id(relay).turn_off(); + } + +################################################################################################# +# INTERVAL COMPONENT +# https://esphome.io/components/interval.html +################################################################################################# +# Interval: bumps time (even if no SNTP), then calls the script to evaluate relay state +interval: + - interval: "1min" + then: + - lambda: |- + // — update current_mins via SNTP or fallback if (!id(sntp_time).now().is_valid()) { - id(current_mins) += 1; + id(current_mins)++; if (id(current_mins) >= 1440) id(current_mins) = 0; } else { auto now = id(sntp_time).now(); id(current_mins) = now.hour * 60 + now.minute; } - // operation_mode: - // 0 = OFF - // 1 = ON - // 2 = TIMER - // 3 = BOOST - int mode = id(operation_mode); - - ////////////////////////////////////////////////// - // BOOST MODE: Relay ON for 'boost_duration' - // minutes, then automatically revert to TIMER. - ////////////////////////////////////////////////// - if (mode == 3) { - id(boost_timer) = id(boost_timer) + 1 ; // works as long as update_interval in seconds - // Compare with the substitution boost_duration - if (id(boost_timer) < id(boost_duration)) { - // Still within the BOOST period => turn relay on - id(relay).turn_on(); - } else { - // After 'boost_duration' minutes => switch to TIMER + // — if in BOOST, advance boost_timer and expire when done + if (id(operation_mode) == 3) { + id(boost_timer)++; + if (id(boost_timer) >= id(boost_duration)) { id(operation_mode) = 2; - id(mqtt_client).publish("${mqtt_timer_topic}/operation", "TIMER"); - } - // Skip the rest of the logic - ESP_LOGI("boost_timer", "boost_timer=%d", id(boost_timer)); - return; - } - - ////////////////////////////////////////////////// - // OFF MODE => always off - ////////////////////////////////////////////////// - if (mode == 0) { - id(relay).turn_off(); - return; - } - - ////////////////////////////////////////////////// - // ON MODE => always on - ////////////////////////////////////////////////// - if (mode == 1) { - id(relay).turn_on(); - return; - } - - ////////////////////////////////////////////////// - // TIMER MODE => follow morning/evening schedule - // using SNTP if valid, else current_mins - ////////////////////////////////////////////////// - if (mode == 2) - { - - bool should_on = false; - - // Check morning window - // Example: morning_on=360 => 06:00, morning_off=480 => 08:00 - // If current_mins in [360..480), should_on = true - if (id(current_mins) >= id(morning_on) && id(current_mins) < id(morning_off) ) - { - should_on = true; - } - - // Check evening window - // Example: evening_on=1260 => 21:00, evening_off=1440 => midnight - if (id(current_mins) >= id(evening_on) && id(current_mins) < id(evening_off) ) - { - should_on = true; - } - - // Final relay state based on schedule - if (should_on) { - id(relay).turn_on(); - } else { - id(relay).turn_off(); + //id(mqtt_client).publish("${mqtt_timer_topic}/operation", "TIMER"); } } - - - + - script.execute: evaluate_relay_state diff --git a/esphome/esp-downstdishwasher.yaml b/esphome/esp-downstdishwpower.yaml similarity index 66% rename from esphome/esp-downstdishwasher.yaml rename to esphome/esp-downstdishwpower.yaml index ebc29f7..ea910f3 100644 --- a/esphome/esp-downstdishwasher.yaml +++ b/esphome/esp-downstdishwpower.yaml @@ -1,36 +1,35 @@ ########################################################################################## ########################################################################################## # DOWNSTAIRS DISHWASHER POWER MONITOR -# Controlled by a Athom Smart Plug V3 # -# dashboard_import: -# package_import_url: github://athom-tech/esp32-configs/athom-smart-plug.yaml +# Controlled by a Athom Smart Plug V1 +# package_import_url: github://athom-tech/athom-configs/athom-smart-plug.yaml # +# V1.2 2025-06-15 Changed to Athom V1 # V1.1 2025-06-12 Tidyups and packages added # ########################################################################################## ########################################################################################## - -############################################# +########################################################################################## # SPECIFIC DEVICE VARIABLE SUBSTITUTIONS # If NOT using a secrets file, just replace these with the passwords etc (in quotes) -############################################# +########################################################################################## substitutions: # Device Naming - device_name: "esp-downstdishwasher" + device_name: "esp-downstdishwpower" friendly_name: "Downstairs Dishwasher Power" - description_comment: "Downstairs Dishwasher Power :: Athom Smart Plug Power V3" + description_comment: "Downstairs Dishwasher Power :: Athom Smart Plug Power V1" device_area: "Downstairs Kitchen" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. - + # Project Naming - project_name: "Athom Technology.Smart Plug V3" # Project Details - project_version: "v1.1" # Project V denotes release of yaml file, allowing checking of deployed vs latest version + project_name: "Athom Technology.Smart Plug V1" # Project Details + project_version: "v1.2" # Project V denotes release of yaml file, allowing checking of deployed vs latest version # Passwords - api_key: !secret esp-downstdishwasher_api_key # unfortunately you can't use substitutions inside secrets names - ota_pass: !secret esp-downstdishwasher_ota_pass # unfortunately you can't use substitutions inside secrets names - static_ip_address: !secret esp-downstdishwasher_ip + api_key: !secret esp-api_key # unfortunately you can't use substitutions inside secrets names + ota_pass: !secret esp-ota_pass # unfortunately you can't use substitutions inside secrets names + static_ip_address: !secret esp-downstdishwpower_ip # Device Settings log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE @@ -40,10 +39,10 @@ substitutions: relay_icon: "mdi:power-socket-au" current_limit : "10" # Current Limit in Amps. AU Plug = 10. IL, BR, EU, UK, US Plug = 16. -############################################# -# Included Common Packages +########################################################################################## +# PACKAGES # https://esphome.io/components/esphome.html -############################################# +########################################################################################## packages: common_wifi: !include file: common/network_common.yaml @@ -69,15 +68,16 @@ packages: file: common/mqtt_common.yaml # Device Specific included packages - common_athompowermonV3: !include - file: common/athompowermonv3_common.yaml + common_athompowermonV1: !include + file: common/athompowermonv1_common.yaml vars: + local_friendly_name: "${friendly_name}" local_current_limit: "${current_limit}" -############################################# +########################################################################################## # ESPHome # https://esphome.io/components/esphome.html -############################################# +########################################################################################## esphome: name: "${device_name}" friendly_name: "${friendly_name}" @@ -88,33 +88,25 @@ esphome: project: name: "${project_name}" version: "${project_version}" - platformio_options: - board_build.mcu: esp32c3 - board_build.variant: esp32c3 - board_build.flash_mode: dio -############################################# +########################################################################################## # ESP Platform and Framework # https://esphome.io/components/esp32.html -############################################# -esp32: - board: esp32-c3-devkitm-1 - flash_size: 4MB - variant: ESP32C3 - framework: - type: esp-idf # "esp-idf" OR "arduino". Suggested ESP-IDF Framework, or Plug Out the UART Cable Might Cause ESP32 Hang. - version: recommended # recommended, latest or dev +########################################################################################## +esp8266: + board: esp8285 + restore_from_flash: true # mainly for calculating cumulative energy, but not that important here preferences: - flash_write_interval: 5min + flash_write_interval: 10min -esp32_improv: - authorizer: none +mdns: + disabled: false -############################################# -# ESPHome Logging Enable +########################################################################################## +# ESPHome LOGGING # https://esphome.io/components/logger.html -############################################# +########################################################################################## logger: level: "${log_level}" #INFO Level suggested, or DEBUG for testing baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) @@ -149,14 +141,9 @@ binary_sensor: switch: - platform: gpio name: "Power Output" - pin: GPIO5 + pin: GPIO14 id: relay - restore_mode: RESTORE_DEFAULT_OFF # Ensures the relay is restored (or off) at boot + restore_mode: RESTORE_DEFAULT_ON # Ensures the relay is restored (or off) at boot #internal: true # Hides the switch from Home Assistant icon: "${relay_icon}" - - - - - diff --git a/esphome/esp-poollightpower.yaml b/esphome/esp-poollightspower.yaml similarity index 79% rename from esphome/esp-poollightpower.yaml rename to esphome/esp-poollightspower.yaml index 1a96da6..f21014b 100644 --- a/esphome/esp-poollightpower.yaml +++ b/esphome/esp-poollightspower.yaml @@ -1,9 +1,12 @@ ########################################################################################## ########################################################################################## -# POOL LIGHT POWER AND TIMER -# Controlled by a Athom Smart Plug V1 -# package_import_url: github://athom-tech/athom-configs/athom-smart-plug.yaml +# POOL LIGHTS POWER AND TIMER +# Controlled by a Athom Smart Plug V3 # +# dashboard_import: +# package_import_url: github://athom-tech/esp32-configs/athom-smart-plug.yaml +# +# V2.3 2025-06-15 Changed to an Athom V3 (esp32) # V2.2 2025-06-14 Fixes to offline time when sntp/network unavailable # V2.1 2025-06-12 Added select and button to chose modes, added countdown & startup to boost # V2.0 2025-06-05 YAML Tidyups @@ -44,34 +47,35 @@ ########################################################################################## ########################################################################################## + ########################################################################################## # SPECIFIC DEVICE VARIABLE SUBSTITUTIONS # If NOT using a secrets file, just replace these with the passwords etc (in quotes) ########################################################################################## substitutions: # Device Naming - device_name: "esp-poollightpower" - friendly_name: "Pool Light Power" - description_comment: "Pool Light Power :: Athom Smart Plug Power V1" - device_area: "Downstairs Kitchen" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. + device_name: "esp-poollightspower" + friendly_name: "Pool Lights Power" + description_comment: "Pool Lights Power :: Athom Smart Plug Power V3" + device_area: "Outside" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. # Project Naming - project_name: "Athom Technology.Smart Plug V1" # Project Details - project_version: "v2.2" # Project V denotes release of yaml file, allowing checking of deployed vs latest version + project_name: "Athom Technology.Smart Plug V3" # Project Details + project_version: "v2.3" # Project V denotes release of yaml file, allowing checking of deployed vs latest version # Passwords - api_key: !secret esp-api_key # unfortunately you can't use substitutions inside secrets names - ota_pass: !secret esp-ota_pass # unfortunately you can't use substitutions inside secrets names - static_ip_address: !secret esp-poollightpower_ip + api_key: !secret esp-poollightspower_api_key # unfortunately you can't use substitutions inside secrets names + ota_pass: !secret esp-poollightspower_ota_pass # unfortunately you can't use substitutions inside secrets names + static_ip_address: !secret esp-poollightspower_ip # Device Settings log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE - update_interval: "60s" # update time for for general sensors etc + update_interval: "10s" # update time for for general sensors etc # Device and Timer Settings relay_icon: "mdi:light-flood-up" current_limit : "10" # Current Limit in Amps. AU Plug = 10. IL, BR, EU, UK, US Plug = 16. - mqtt_timer_topic: "viewroad-commands/poollight-timer" # Topics you will use to change stuff + mqtt_timer_topic: "viewroad-commands/poollights-timer" # Topics you will use to change stuff boost_duration_default: "180" # Minutes to stay ON in BOOST mode before reverting to TIMER morning_on_default: "450" # Default in minutes from midnight. Default 07:30 => 450 morning_off_default: "450" # Default in minutes from midnight. Default 07:30 => 450 (same as ON as no need for morning schedule) @@ -79,7 +83,7 @@ substitutions: evening_off_default: "1350" # Default in minutes from midnight. Default 22:30 => 1350 => 1440 is midnight ########################################################################################## -# PACKAGES +# Included Common Packages # https://esphome.io/components/esphome.html ########################################################################################## packages: @@ -107,10 +111,9 @@ packages: file: common/mqtt_common.yaml # Device Specific included packages - common_athompowermonV1: !include - file: common/athompowermonv1_common.yaml + common_athompowermonV3: !include + file: common/athompowermonv3_common.yaml vars: - local_friendly_name: "${friendly_name}" local_current_limit: "${current_limit}" ########################################################################################## @@ -127,26 +130,31 @@ esphome: project: name: "${project_name}" version: "${project_version}" + platformio_options: + board_build.mcu: esp32c3 + board_build.variant: esp32c3 + board_build.flash_mode: dio ########################################################################################## # ESP Platform and Framework # https://esphome.io/components/esp32.html ########################################################################################## -esp8266: - board: esp8285 - restore_from_flash: true # mainly for calculating cumulative energy, but not that important here +esp32: + board: esp32-c3-devkitm-1 + flash_size: 4MB + variant: ESP32C3 + framework: + type: esp-idf # "esp-idf" OR "arduino". Suggested ESP-IDF Framework, or Plug Out the UART Cable Might Cause ESP32 Hang. + version: recommended # recommended, latest or dev preferences: - flash_write_interval: 10min + flash_write_interval: 5min -mdns: - disabled: false - -#dashboard_import: -# package_import_url: github://athom-tech/esp32-configs/athom-smart-plug.yaml +esp32_improv: + authorizer: none ########################################################################################## -# ESPHome LOGGING +# ESPHome Logging Enable # https://esphome.io/components/logger.html ########################################################################################## logger: @@ -176,19 +184,19 @@ globals: # Morning On time (minutes from midnight), - id: morning_on type: int - restore_value: true + restore_value: False initial_value: "${morning_on_default}" # Morning Off time (minutes from midnight), - id: morning_off type: int - restore_value: true + restore_value: False initial_value: "${morning_off_default}" # Evening On time (minutes from midnight), - id: evening_on type: int - restore_value: true + restore_value: False initial_value: "${morning_off_default}" # Evening Off time (minutes from midnight), @@ -200,7 +208,7 @@ globals: # Boost Duration (minutes), - id: boost_duration type: int - restore_value: true + restore_value: False initial_value: "${boost_duration_default}" #################################################### @@ -353,19 +361,14 @@ text_sensor: # We do case-insensitive compare using strcasecmp # (Requires typically included in ESPHome) #################################################### + # MQTT subscription: set mode, then immediately re-evaluate relay - platform: mqtt_subscribe - name: "Operation Mode Setting" id: timer_operation_mode_topic - topic: "${mqtt_timer_topic}/operation" # BOOST,ON,OFF,TIMER + topic: "${mqtt_timer_topic}/operation" internal: True # No need to show this in Home Assistant as there is a sensor that shows the set value on_value: then: - lambda: |- - /* - * In standard C++ (ESPHome), no 'equalsIgnoreCase()'. - * We use 'strcasecmp' for case-insensitive compare. - * Returns 0 if they match ignoring case. - */ if (strcasecmp(x.c_str(), "TIMER") == 0) { id(operation_mode) = 2; ESP_LOGI("timer","Operation mode set to TIMER"); @@ -377,11 +380,12 @@ text_sensor: ESP_LOGI("timer","Operation mode set to OFF"); } else if (strcasecmp(x.c_str(), "BOOST") == 0) { id(operation_mode) = 3; - id(boost_timer) = 0; // Reset the BOOST timer to zero + id(boost_timer) = 0; ESP_LOGI("timer","Operation mode set to BOOST"); } else { ESP_LOGW("timer","Invalid operation mode: %s", x.c_str()); } + - script.execute: evaluate_relay_state ###################################################### # Expose the current operation mode (OFF, ON, TIMER, BOOST) @@ -465,7 +469,7 @@ text_sensor: binary_sensor: - platform: gpio pin: - number: 3 + number: GPIO3 mode: INPUT_PULLUP inverted: true name: "Power Button" @@ -478,7 +482,7 @@ binary_sensor: then: - lambda: |- if (id(relay).state) { - // Relay is ON: turn it OFF and set mode to 0 (Timer) + // Relay is ON: turn it OFF and set mode to 0 (TIMER) id(relay).turn_off(); id(operation_mode) = 2; } else { @@ -498,7 +502,7 @@ binary_sensor: ########################################################################################## sensor: - platform: template - name: "Boost Duration" + name: "Timeclock: Boost Duration" id: boost_duration_time unit_of_measurement: "mins" accuracy_decimals: "0" @@ -550,7 +554,7 @@ sensor: switch: - platform: gpio name: "Power Output" - pin: GPIO14 + pin: GPIO5 id: relay restore_mode: RESTORE_DEFAULT_OFF # Ensures the relay is restored (or off) at boot #internal: true # Hides the switch from Home Assistant @@ -564,17 +568,14 @@ button: - platform: template name: "Boost now" id: boost_button - icon: "mdi:play-circle-outline" # optional, pick any MaterialDesign icon you like + icon: "mdi:play-circle-outline" on_press: - then: - # 1) set the mode to BOOST (3) - - lambda: |- - id(boost_timer) = 0; // Reset the BOOST timer to zero - id(operation_mode) = 3; // Set to BOOST - ESP_LOGD("main", "operation_mode set to %d via BOOST button", id(operation_mode)); - # 2) turn on the relay switch - - switch.turn_on: - id: relay + # 1) reset BOOST timer and set mode + - lambda: |- + id(boost_timer) = 0; + id(operation_mode) = 3; + # 2) immediately re-evaluate relay state + - script.execute: evaluate_relay_state ################################################################################################# # SELECT COMPONENT @@ -584,126 +585,99 @@ select: - platform: template name: "Operation Mode" id: operation_mode_select - update_interval: 5s # poll every 5 s for external changes + update_interval: 5s options: - "OFF" - "ON" - "TIMER" - "BOOST" - # Getter: maps your integer into one of the four strings + # show the current mode lambda: |- switch (id(operation_mode)) { - case 1: return std::string("ON"); - case 2: return std::string("TIMER"); - case 3: return std::string("BOOST"); + case 1: return std::string("ON"); + case 2: return std::string("TIMER"); + case 3: return std::string("BOOST"); default: return std::string("OFF"); } - # set_action: called when you pick an option in HA + # when changed in HA, set mode & re-evaluate set_action: - lambda: |- - if (x == "OFF") id(operation_mode) = 0; - else if (x == "ON") id(operation_mode) = 1; - else if (x == "TIMER") id(operation_mode) = 2; - else { - id(boost_timer) = 0; // Reset the BOOST timer to zero - id(operation_mode) = 3; /* BOOST */ - } - ESP_LOGD("main", "operation_mode set to %d", id(operation_mode)); + if (x == "OFF") { id(operation_mode) = 0; } + else if (x == "ON") { id(operation_mode) = 1; } + else if (x == "TIMER") { id(operation_mode) = 2; } + else { // BOOST + id(boost_timer) = 0; + id(operation_mode) = 3; + } + - script.execute: evaluate_relay_state - -#################################################### -# Check every minute to decide relay state -#################################################### -interval: - - interval: "1min" # Must be 1min as this is used to calculate times +################################################################################################# +# SCRIPT COMPONENT +# https://esphome.io/components/script.html +################################################################################################# +# Script: evaluate and drive the relay +script: + - id: evaluate_relay_state then: - lambda: |- - // Do we have correct time from SNTP? If not... + int mode = id(operation_mode); + + // BOOST just forces the relay on + if (mode == 3) { + id(relay).turn_on(); + return; + } + + // OFF → always off + if (mode == 0) { + id(relay).turn_off(); + return; + } + + // ON → always on + if (mode == 1) { + id(relay).turn_on(); + return; + } + + // TIMER → follow schedule windows + { + bool should_on = false; + if (id(current_mins) >= id(morning_on) && id(current_mins) < id(morning_off)) + should_on = true; + if (id(current_mins) >= id(evening_on) && id(current_mins) < id(evening_off)) + should_on = true; + if (should_on) id(relay).turn_on(); + else id(relay).turn_off(); + } + +################################################################################################# +# INTERVAL COMPONENT +# https://esphome.io/components/interval.html +################################################################################################# +# Interval: bumps time (even if no SNTP), then calls the script to evaluate relay state +interval: + - interval: "1min" + then: + - lambda: |- + // — update current_mins via SNTP or fallback if (!id(sntp_time).now().is_valid()) { - id(current_mins) += 1; + id(current_mins)++; if (id(current_mins) >= 1440) id(current_mins) = 0; } else { auto now = id(sntp_time).now(); id(current_mins) = now.hour * 60 + now.minute; } - // operation_mode: - // 0 = OFF - // 1 = ON - // 2 = TIMER - // 3 = BOOST - int mode = id(operation_mode); - - ////////////////////////////////////////////////// - // BOOST MODE: Relay ON for 'boost_duration' - // minutes, then automatically revert to TIMER. - ////////////////////////////////////////////////// - if (mode == 3) { - id(boost_timer) = id(boost_timer) + 1 ; // works as long as update_interval in seconds - // Compare with the substitution boost_duration - if (id(boost_timer) < id(boost_duration)) { - // Still within the BOOST period => turn relay on - id(relay).turn_on(); - } else { - // After 'boost_duration' minutes => switch to TIMER + // — if in BOOST, advance boost_timer and expire when done + if (id(operation_mode) == 3) { + id(boost_timer)++; + if (id(boost_timer) >= id(boost_duration)) { id(operation_mode) = 2; - id(mqtt_client).publish("${mqtt_timer_topic}/operation", "TIMER"); - } - // Skip the rest of the logic - ESP_LOGI("boost_timer", "boost_timer=%d", id(boost_timer)); - return; - } - - ////////////////////////////////////////////////// - // OFF MODE => always off - ////////////////////////////////////////////////// - if (mode == 0) { - id(relay).turn_off(); - return; - } - - ////////////////////////////////////////////////// - // ON MODE => always on - ////////////////////////////////////////////////// - if (mode == 1) { - id(relay).turn_on(); - return; - } - - ////////////////////////////////////////////////// - // TIMER MODE => follow morning/evening schedule - // using SNTP if valid, else current_mins - ////////////////////////////////////////////////// - if (mode == 2) - { - - bool should_on = false; - - // Check morning window - // Example: morning_on=360 => 06:00, morning_off=480 => 08:00 - // If current_mins in [360..480), should_on = true - if (id(current_mins) >= id(morning_on) && id(current_mins) < id(morning_off) ) - { - should_on = true; - } - - // Check evening window - // Example: evening_on=1260 => 21:00, evening_off=1440 => midnight - if (id(current_mins) >= id(evening_on) && id(current_mins) < id(evening_off) ) - { - should_on = true; - } - - // Final relay state based on schedule - if (should_on) { - id(relay).turn_on(); - } else { - id(relay).turn_off(); + //id(mqtt_client).publish("${mqtt_timer_topic}/operation", "TIMER"); } } - - - + - script.execute: evaluate_relay_state diff --git a/esphome/esp-poolpumppower.yaml b/esphome/esp-poolpumppower.yaml index 9ae7a9f..1025ce7 100644 --- a/esphome/esp-poolpumppower.yaml +++ b/esphome/esp-poolpumppower.yaml @@ -84,6 +84,10 @@ substitutions: # PACKAGES # https://esphome.io/components/esphome.html ########################################################################################## +########################################################################################## +# Included Common Packages +# https://esphome.io/components/esphome.html +########################################################################################## packages: common_wifi: !include file: common/network_common.yaml @@ -112,10 +116,8 @@ packages: common_athompowermonV3: !include file: common/athompowermonv3_common.yaml vars: - local_friendly_name: "${friendly_name}" local_current_limit: "${current_limit}" - ########################################################################################## # ESPHome # https://esphome.io/components/esphome.html @@ -148,13 +150,13 @@ esp32: version: recommended # recommended, latest or dev preferences: - flash_write_interval: 10min + flash_write_interval: 5min esp32_improv: authorizer: none ########################################################################################## -# ESPHome LOGGING +# ESPHome Logging Enable # https://esphome.io/components/logger.html ########################################################################################## logger: @@ -164,7 +166,7 @@ logger: #tx_buffer_size: 64 ########################################################################################## -# GLOBAL VARIABLES +# Global Variables for use in automations etc # https://esphome.io/guides/automations.html?highlight=globals#global-variables ########################################################################################## globals: @@ -184,31 +186,31 @@ globals: # Morning On time (minutes from midnight), - id: morning_on type: int - restore_value: true + restore_value: False initial_value: "${morning_on_default}" # Morning Off time (minutes from midnight), - id: morning_off type: int - restore_value: true + restore_value: False initial_value: "${morning_off_default}" # Evening On time (minutes from midnight), - id: evening_on type: int - restore_value: true - initial_value: "${evening_on_default}" + restore_value: False + initial_value: "${morning_off_default}" # Evening Off time (minutes from midnight), - id: evening_off type: int restore_value: true - initial_value: "${evening_off_default}" + initial_value: "${morning_off_default}" # Boost Duration (minutes), - id: boost_duration type: int - restore_value: true + restore_value: False initial_value: "${boost_duration_default}" #################################################### @@ -234,7 +236,7 @@ globals: restore_value: false initial_value: "720" # 720 is 12:00 Noon - #################################################### + #################################################### # boost_timer: counts minutes in BOOST mode # After 'boost_duration' minutes, revert to TIMER. # Not restored, so each boot starts fresh at 0. @@ -244,7 +246,6 @@ globals: restore_value: false initial_value: "0" - ########################################################################################## # Text Sensors # https://esphome.io/components/text_sensor/index.html @@ -355,25 +356,21 @@ text_sensor: } else { id(boost_duration) = static_cast(v); } + #################################################### # Subscribe to operation mode: # OFF, ON, TIMER, BOOST # We do case-insensitive compare using strcasecmp # (Requires typically included in ESPHome) #################################################### + # MQTT subscription: set mode, then immediately re-evaluate relay - platform: mqtt_subscribe - name: "Operation Mode Setting" id: timer_operation_mode_topic - topic: "${mqtt_timer_topic}/operation" # BOOST,ON,OFF,TIMER + topic: "${mqtt_timer_topic}/operation" internal: True # No need to show this in Home Assistant as there is a sensor that shows the set value on_value: then: - lambda: |- - /* - * In standard C++ (ESPHome), no 'equalsIgnoreCase()'. - * We use 'strcasecmp' for case-insensitive compare. - * Returns 0 if they match ignoring case. - */ if (strcasecmp(x.c_str(), "TIMER") == 0) { id(operation_mode) = 2; ESP_LOGI("timer","Operation mode set to TIMER"); @@ -385,11 +382,12 @@ text_sensor: ESP_LOGI("timer","Operation mode set to OFF"); } else if (strcasecmp(x.c_str(), "BOOST") == 0) { id(operation_mode) = 3; - id(boost_timer) = 0; // Reset the BOOST timer to zero + id(boost_timer) = 0; ESP_LOGI("timer","Operation mode set to BOOST"); } else { ESP_LOGW("timer","Invalid operation mode: %s", x.c_str()); } + - script.execute: evaluate_relay_state ###################################################### # Expose the current operation mode (OFF, ON, TIMER, BOOST) @@ -506,7 +504,7 @@ binary_sensor: ########################################################################################## sensor: - platform: template - name: "Boost Duration" + name: "Timeclock: Boost Duration" id: boost_duration_time unit_of_measurement: "mins" accuracy_decimals: "0" @@ -550,6 +548,7 @@ sensor: // never return negative return rem > 0 ? rem : 0; + ################################################################################################# # SWITCH COMPONENT # https://esphome.io/components/switch/ @@ -562,7 +561,7 @@ switch: restore_mode: RESTORE_DEFAULT_OFF # Ensures the relay is restored (or off) at boot #internal: true # Hides the switch from Home Assistant icon: "${relay_icon}" - + ################################################################################################# # BUTTON COMPONENT # https://esphome.io/components/button/index.html @@ -571,17 +570,14 @@ button: - platform: template name: "Boost now" id: boost_button - icon: "mdi:play-circle-outline" # optional, pick any MaterialDesign icon you like + icon: "mdi:play-circle-outline" on_press: - then: - # 1) set the mode to BOOST (3) - - lambda: |- - id(boost_timer) = 0; // Reset the BOOST timer to zero - id(operation_mode) = 3; // Set to BOOST - ESP_LOGD("main", "operation_mode set to %d via BOOST button", id(operation_mode)); - # 2) turn on the relay switch - - switch.turn_on: - id: relay + # 1) reset BOOST timer and set mode + - lambda: |- + id(boost_timer) = 0; + id(operation_mode) = 3; + # 2) immediately re-evaluate relay state + - script.execute: evaluate_relay_state ################################################################################################# # SELECT COMPONENT @@ -591,122 +587,99 @@ select: - platform: template name: "Operation Mode" id: operation_mode_select - update_interval: 5s # poll every 5 s for external changes + update_interval: 5s options: - "OFF" - "ON" - "TIMER" - "BOOST" - # Getter: maps your integer into one of the four strings + # show the current mode lambda: |- switch (id(operation_mode)) { - case 1: return std::string("ON"); - case 2: return std::string("TIMER"); - case 3: return std::string("BOOST"); + case 1: return std::string("ON"); + case 2: return std::string("TIMER"); + case 3: return std::string("BOOST"); default: return std::string("OFF"); } - # set_action: called when you pick an option in HA + # when changed in HA, set mode & re-evaluate set_action: - lambda: |- - if (x == "OFF") id(operation_mode) = 0; - else if (x == "ON") id(operation_mode) = 1; - else if (x == "TIMER") id(operation_mode) = 2; - else { - id(boost_timer) = 0; // Reset the BOOST timer to zero - id(operation_mode) = 3; /* BOOST */ - } - ESP_LOGD("main", "operation_mode set to %d", id(operation_mode)); + if (x == "OFF") { id(operation_mode) = 0; } + else if (x == "ON") { id(operation_mode) = 1; } + else if (x == "TIMER") { id(operation_mode) = 2; } + else { // BOOST + id(boost_timer) = 0; + id(operation_mode) = 3; + } + - script.execute: evaluate_relay_state -#################################################### -# Check every minute to decide relay state -#################################################### -interval: - - interval: "1min" # Must be 1min as this is used to calculate times +################################################################################################# +# SCRIPT COMPONENT +# https://esphome.io/components/script.html +################################################################################################# +# Script: evaluate and drive the relay +script: + - id: evaluate_relay_state then: - lambda: |- - // Do we have correct time from SNTP? If not... + int mode = id(operation_mode); + + // BOOST just forces the relay on + if (mode == 3) { + id(relay).turn_on(); + return; + } + + // OFF → always off + if (mode == 0) { + id(relay).turn_off(); + return; + } + + // ON → always on + if (mode == 1) { + id(relay).turn_on(); + return; + } + + // TIMER → follow schedule windows + { + bool should_on = false; + if (id(current_mins) >= id(morning_on) && id(current_mins) < id(morning_off)) + should_on = true; + if (id(current_mins) >= id(evening_on) && id(current_mins) < id(evening_off)) + should_on = true; + if (should_on) id(relay).turn_on(); + else id(relay).turn_off(); + } + +################################################################################################# +# INTERVAL COMPONENT +# https://esphome.io/components/interval.html +################################################################################################# +# Interval: bumps time (even if no SNTP), then calls the script to evaluate relay state +interval: + - interval: "1min" + then: + - lambda: |- + // — update current_mins via SNTP or fallback if (!id(sntp_time).now().is_valid()) { - id(current_mins) += 1; + id(current_mins)++; if (id(current_mins) >= 1440) id(current_mins) = 0; } else { auto now = id(sntp_time).now(); id(current_mins) = now.hour * 60 + now.minute; } - // operation_mode: - // 0 = OFF - // 1 = ON - // 2 = TIMER - // 3 = BOOST - int mode = id(operation_mode); - - ////////////////////////////////////////////////// - // BOOST MODE: Relay ON for 'boost_duration' - // minutes, then automatically revert to TIMER. - ////////////////////////////////////////////////// - if (mode == 3) { - id(boost_timer) = id(boost_timer) + 1 ; // works as long as update_interval in seconds - // Compare with the substitution boost_duration - if (id(boost_timer) < id(boost_duration)) { - // Still within the BOOST period => turn relay on - id(relay).turn_on(); - } else { - // After 'boost_duration' minutes => switch to TIMER + // — if in BOOST, advance boost_timer and expire when done + if (id(operation_mode) == 3) { + id(boost_timer)++; + if (id(boost_timer) >= id(boost_duration)) { id(operation_mode) = 2; - id(mqtt_client).publish("${mqtt_timer_topic}/operation", "TIMER"); - } - // Skip the rest of the logic - ESP_LOGI("boost_timer", "boost_timer=%d", id(boost_timer)); - return; - } - - ////////////////////////////////////////////////// - // OFF MODE => always off - ////////////////////////////////////////////////// - if (mode == 0) { - id(relay).turn_off(); - return; - } - - ////////////////////////////////////////////////// - // ON MODE => always on - ////////////////////////////////////////////////// - if (mode == 1) { - id(relay).turn_on(); - return; - } - - ////////////////////////////////////////////////// - // TIMER MODE => follow morning/evening schedule - // using SNTP if valid, else current_mins - ////////////////////////////////////////////////// - if (mode == 2) - { - - bool should_on = false; - - // Check morning window - // Example: morning_on=360 => 06:00, morning_off=480 => 08:00 - // If current_mins in [360..480), should_on = true - if (id(current_mins) >= id(morning_on) && id(current_mins) < id(morning_off) ) - { - should_on = true; - } - - // Check evening window - // Example: evening_on=1260 => 21:00, evening_off=1440 => midnight - if (id(current_mins) >= id(evening_on) && id(current_mins) < id(evening_off) ) - { - should_on = true; - } - - // Final relay state based on schedule - if (should_on) { - id(relay).turn_on(); - } else { - id(relay).turn_off(); + //id(mqtt_client).publish("${mqtt_timer_topic}/operation", "TIMER"); } } - + - script.execute: evaluate_relay_state + diff --git a/packages/pool_light_boost_switch.yaml b/packages/pool_light_boost_switch.yaml index bd4a5f2..f716c49 100644 --- a/packages/pool_light_boost_switch.yaml +++ b/packages/pool_light_boost_switch.yaml @@ -1,12 +1,12 @@ -# packages/poollight_operation.yaml +# packages/pool_light_boost_switch.yaml homeassistant: customize: - input_boolean.poollight_mode_switch: - icon: mdi:spotlight + input_boolean.poollights_mode_switch: + icon: mdi:light-flood-up input_boolean: - poollight_mode_switch: + poollights_mode_switch: name: "Pool Light Operation" initial: false @@ -15,40 +15,40 @@ input_boolean: initial: false automation: - - alias: "Pool Light → send BOOST when user turns UI switch ON" + - alias: "Pool Lights → send BOOST when user turns UI switch ON" trigger: platform: state - entity_id: input_boolean.poollight_mode_switch + entity_id: input_boolean.poollights_mode_switch to: "on" condition: condition: state - entity_id: switch.esp_poollightpower_power_output + entity_id: switch.esp_poollightspower_power_output state: "off" action: - service: mqtt.publish data: - topic: "viewroad-commands/poollight-timer/operation" + topic: "viewroad-commands/poollights-timer/operation" payload: "BOOST" - - alias: "Pool Light → send OFF & schedule TIMER when user turns UI switch OFF" + - alias: "Pool Lights → send OFF & schedule TIMER when user turns UI switch OFF" trigger: platform: state - entity_id: input_boolean.poollight_mode_switch + entity_id: input_boolean.poollights_mode_switch to: "off" condition: condition: state - entity_id: switch.esp_poollightpower_power_output + entity_id: switch.esp_poollightspower_power_output state: "on" action: - service: mqtt.publish data: - topic: "viewroad-commands/poollight-timer/operation" + topic: "viewroad-commands/poollights-timer/operation" payload: "OFF" - service: input_boolean.turn_on data: entity_id: input_boolean.timer_light_midnight_pending - - alias: "Pool Light → send TIMER at midnight" + - alias: "Pool Lights → send TIMER at midnight" trigger: platform: time at: "00:00:00" @@ -59,37 +59,37 @@ automation: action: - service: mqtt.publish data: - topic: "viewroad-commands/poollight-timer/operation" + topic: "viewroad-commands/poollights-timer/operation" payload: "TIMER" - service: input_boolean.turn_off data: entity_id: input_boolean.timer_light_midnight_pending - - alias: "Pool Light → sync UI switch with real output (no MQTT)" + - alias: "Pool Lights → sync UI switch with real output (no MQTT)" trigger: platform: state - entity_id: switch.esp_poollightpower_power_output + entity_id: switch.esp_poollightspower_power_output action: - choose: - conditions: - condition: state - entity_id: switch.esp_poollightpower_power_output + entity_id: switch.esp_poollightspower_power_output state: "on" sequence: - service: input_boolean.turn_on data: - entity_id: input_boolean.poollight_mode_switch + entity_id: input_boolean.poollights_mode_switch - service: input_boolean.turn_off data: entity_id: input_boolean.timer_light_midnight_pending - conditions: - condition: state - entity_id: switch.esp_poollightpower_power_output + entity_id: switch.esp_poollightspower_power_output state: "off" sequence: - service: input_boolean.turn_off data: - entity_id: input_boolean.poollight_mode_switch + entity_id: input_boolean.poollights_mode_switch - service: input_boolean.turn_on data: entity_id: input_boolean.timer_light_midnight_pending diff --git a/packages/pool_light_switch_sync.yaml b/packages/pool_light_switch_sync.yaml deleted file mode 100644 index 11b0581..0000000 --- a/packages/pool_light_switch_sync.yaml +++ /dev/null @@ -1,60 +0,0 @@ -automation: - - id: poollight_sync_tasmo_on - alias: "Sync TASMO → Pool Light (turn ON)" - trigger: - - platform: state - entity_id: switch.tasmo_ks811t_0707_downstloun_2c - to: "on" - condition: - - condition: state - entity_id: switch.esp_poollightpower_power_output - state: "off" - action: - - service: switch.turn_on - target: - entity_id: switch.esp_poollightpower_power_output - - - id: poollight_sync_tasmo_off - alias: "Sync TASMO → Pool Light (turn OFF)" - trigger: - - platform: state - entity_id: switch.tasmo_ks811t_0707_downstloun_2c - to: "off" - condition: - - condition: state - entity_id: switch.esp_poollightpower_power_output - state: "on" - action: - - service: switch.turn_off - target: - entity_id: switch.esp_poollightpower_power_output - - - id: poollight_sync_athplug_on - alias: "Sync Pool Light → TASMO (turn ON)" - trigger: - - platform: state - entity_id: switch.esp_poollightpower_power_output - to: "on" - condition: - - condition: state - entity_id: switch.tasmo_ks811t_0707_downstloun_2c - state: "off" - action: - - service: switch.turn_on - target: - entity_id: switch.tasmo_ks811t_0707_downstloun_2c - - - id: poollight_sync_athplug_off - alias: "Sync Pool Light → TASMO (turn OFF)" - trigger: - - platform: state - entity_id: switch.esp_poollightpower_power_output - to: "off" - condition: - - condition: state - entity_id: switch.tasmo_ks811t_0707_downstloun_2c - state: "on" - action: - - service: switch.turn_off - target: - entity_id: switch.tasmo_ks811t_0707_downstloun_2c