From 51bff34d2e42cba42b89d0c9c746e2a6c3d8aafa Mon Sep 17 00:00:00 2001 From: root Date: Sat, 4 Apr 2026 22:36:00 +1300 Subject: [PATCH] hallway esphome devices and fixes --- .../_placeholder/dark_icon@2x.png | Bin 0 -> 5709 bytes .../integrations/lovelace/dark_icon.png | Bin 0 -> 273 bytes .../brands/integrations/tasmota/dark_logo.png | Bin 0 -> 15193 bytes .ha_run.lock | 2 +- ...s1.yaml => esp-mainhallwaymainlights.yaml} | 153 +++++--- ...2.yaml => esp-mainhallwaynightlights.yaml} | 86 ++++- esphome/esp-mainhallwaynorthlightswitch.yaml | 329 ++++++++++++++++++ packages/simulation_lights.yaml | 2 +- 8 files changed, 506 insertions(+), 66 deletions(-) create mode 100644 .cache/brands/integrations/_placeholder/dark_icon@2x.png create mode 100644 .cache/brands/integrations/lovelace/dark_icon.png create mode 100644 .cache/brands/integrations/tasmota/dark_logo.png rename esphome/{esp-mainhallwaylights1.yaml => esp-mainhallwaymainlights.yaml} (64%) rename esphome/{esp-mainhallwaylights2.yaml => esp-mainhallwaynightlights.yaml} (75%) create mode 100644 esphome/esp-mainhallwaynorthlightswitch.yaml diff --git a/.cache/brands/integrations/_placeholder/dark_icon@2x.png b/.cache/brands/integrations/_placeholder/dark_icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9f54693a93e49f9a961127a8e9400fe089d3ee81 GIT binary patch literal 5709 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 V60$EI^G4n3E6A$Ilu8--{tqnBI4=MI literal 0 HcmV?d00001 diff --git a/.cache/brands/integrations/lovelace/dark_icon.png b/.cache/brands/integrations/lovelace/dark_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e5267faf87e8a854d86f303afeace192332cabea GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58CaNs)Vi3hp+Jg1z$e5NNHeVc#<2P)!|ESE zbmho%exL|TNswPKgGK0Sd1c1KAQhf2jv*Dd-rn8Fdq6>e<>32+x;q%V`E-7*@9b%4 z5$|9*8)op*ReX|)ClDo@-j(0GeHq9mJYWa+1|hig0m%cwmu|Ac`G%{P{5E6!4RSLC n+(5{|givX326kSs^_goJPb;bI(^37y22$ba>gTe~DWM4fN#i|K literal 0 HcmV?d00001 diff --git a/.cache/brands/integrations/tasmota/dark_logo.png b/.cache/brands/integrations/tasmota/dark_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2f97df33955fbe4ee459f7ebd1239584e11935a3 GIT binary patch literal 15193 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 literal 0 HcmV?d00001 diff --git a/.ha_run.lock b/.ha_run.lock index 3a45f89..91305ea 100644 --- a/.ha_run.lock +++ b/.ha_run.lock @@ -1 +1 @@ -{"pid": 67, "version": 1, "ha_version": "2026.4.0", "start_ts": 1775105928.9191253} \ No newline at end of file +{"pid": 67, "version": 1, "ha_version": "2026.4.1", "start_ts": 1775275075.484253} \ No newline at end of file diff --git a/esphome/esp-mainhallwaylights1.yaml b/esphome/esp-mainhallwaymainlights.yaml similarity index 64% rename from esphome/esp-mainhallwaylights1.yaml rename to esphome/esp-mainhallwaymainlights.yaml index 5b8b800..fefcefd 100644 --- a/esphome/esp-mainhallwaylights1.yaml +++ b/esphome/esp-mainhallwaymainlights.yaml @@ -1,25 +1,26 @@ #:########################################################################################:# -# TITLE: MAIN HALLWAY LIGHTSWITCH 1 (BK7231N) +# TITLE: MAIN HALLWAY LIGHTSWITCH # zorruno.com layout v1.1 2026 #:########################################################################################:# # REPO: -# https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-mainhallwaylights1.yaml +# https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-mainhallwaylights.yaml #:########################################################################################:# # VERSIONS: -# V1.1 2026-04-03 Updated yaml to zorruno layout V1.1; corrected KS-811 single naming and operation notes; updated BK7231N single-switch pin mapping +# V1.2 2026-04-03 Fixed local button logic so physical press toggles relay; moved custom MQTT +# status publish to relay state changes; corrected ESP8266 notes and wording +# V1.1 2026-04-03 Updated yaml to zorruno layout V1.1; corrected KS-811 single naming and +# operation notes # V1.0 2026-04-03 Initial #:########################################################################################:# # HARDWARE: # - Zemismart KS-811 Single push button -# - BK7231N based switch -# - BK72XX board: generic-bk7231n-qfn32-tuya -# - BK7231N single-switch pin mapping checked against KS-811 BK references #:########################################################################################:# # OPERATION NOTES: # - Main hallway switch with 1 output: # 1) Main Hallway Lights -# - A single press of the physical button toggles Relay 1 ON/OFF -# - Status LED uses P22 +# - A single press of the physical button toggles Relay 1 ON/OFF locally +# - Relay state is published to the custom MQTT status topic for remote sync +# - Status LED uses GPIO2 #:########################################################################################:# # MQTT COMMANDS: # - None @@ -42,21 +43,21 @@ #:########################################################################################:# substitutions: # Device Naming - device_name: "esp-mainhallwaylights1" + device_name: "esp-mainhallwaylights" friendly_name: "Main Hallway Lightswitch (1)" - description_comment: "BK7231N - Main Hallway Lightswitch using a Zemismart KS-811 Single Push Button. Main Hallway Lights (1) (Layout V1.1)" + description_comment: "Main Hallway Lightswitch using a Zemismart KS-811 Single Push Button. Main Hallway Lights (1) (Layout V1.1)" device_area: "Main Hallway" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. # Project Naming - project_name: "Zemismart Technologies.KS-811 Single BK7231N" # Project Details + project_name: "Zemismart Technologies.KS-811 Single" # Project Details project_version: "v1.1" # 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-mainhallwaylights1_ip + static_ip_address: !secret esp-mainhallwaylights_ip mqtt_command_main_topic: !secret mqtt_command_main_topic - #mqtt_status_main_topic: !secret mqtt_status_main_topic + mqtt_status_main_topic: !secret mqtt_status_main_topic # If we are changing IP addresses, you must update the current IP address here, otherwise it remains # Don't forget to switch it back when changed. @@ -66,11 +67,14 @@ substitutions: 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 - # Default relay restore mode - # Options: RESTORE_DEFAULT_OFF, RESTORE_DEFAULT_ON, ALWAYS_ON, ALWAYS_OFF - relay_restore_mode: "RESTORE_DEFAULT_OFF" + # MQTT REMOTE Controls + mqtt_this_device_function1: "mainhallway-mainlights" + mqtt_this_device_command_topic1: "${mqtt_command_main_topic}/${mqtt_this_device_function1}" + mqtt_this_device_status_topic1: "${mqtt_status_main_topic}/${mqtt_this_device_function1}" + mqtt_command_on: "On" + mqtt_command_off: "Off" - # Switch Naming + # Switch/Relay/Button Naming & Icons switch_1_name: "Main Hallway Lights" #:########################################################################################:# @@ -113,18 +117,7 @@ packages: #diag_resetcount: !include common/include_resetcount_diag_sensors.yaml #:########################################################################################:# -# PACKAGE ITEM REMOVALS / OVERRIDES: -#:########################################################################################:# -wifi: - min_auth_mode: !remove # The WPA2 only works on esp32/8266 - reboot_timeout: 15min # override the selection from the common package - fast_connect: false # optional; force off in case package vars change - -mqtt: - keepalive: 15s # overriding the value from the common package - -#:########################################################################################:# -# ESPHOME: +# ESPHOME # https://esphome.io/components/esphome.html #:########################################################################################:# esphome: @@ -137,57 +130,111 @@ esphome: version: "${project_version}" #:########################################################################################:# -# BUILD FOR BK CHIPSET: -# bk72xx -# https://devices.esphome.io/board/bk72xx/ +# ESP PLATFORM AND FRAMEWORK +# https://esphome.io/components/esp8266.html #:########################################################################################:# -bk72xx: - board: generic-bk7231n-qfn32-tuya +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 #:########################################################################################:# -# LOGGER: +# 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) - id: logger_id + level: "${log_level}" + #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: +# MQTT: Device-specific MQTT command triggers +# This adds device-specific MQTT command triggers to the common MQTT configuration. +#:########################################################################################:# +mqtt: + on_connect: + - mqtt.publish: + topic: "${mqtt_this_device_status_topic1}" + payload: !lambda |- + return id(Relay_1).state ? "${mqtt_command_on}" : "${mqtt_command_off}"; + retain: true + + on_message: + - topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_on}" + then: + - delay: 50ms + - if: + condition: + lambda: 'return !id(Relay_1).state;' + then: + - switch.turn_on: Relay_1 + + - topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_off}" + then: + - delay: 50ms + - if: + condition: + lambda: 'return id(Relay_1).state;' + then: + - switch.turn_off: Relay_1 + +#:########################################################################################:# +# STATUS LED # https://esphome.io/components/status_led.html #:########################################################################################:# status_led: pin: - number: P22 # GPIO22 - inverted: true + number: GPIO02 + inverted: yes #:########################################################################################:# -# BINARY SENSORS: +# BINARY SENSORS # https://esphome.io/components/binary_sensor/ #:########################################################################################:# binary_sensor: - platform: gpio - id: button_1 - internal: true pin: - number: P24 # GPIO24 - mode: - input: true - pullup: true + number: GPIO0 + mode: INPUT inverted: true + name: "Button 1: ${switch_1_name}" filters: - - delayed_on: 20ms + - delayed_on: 10ms + - delayed_off: 10ms on_press: - - switch.toggle: Relay_1 + - if: + condition: + switch.is_on: Relay_1 + then: + - switch.turn_off: Relay_1 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_off}" + else: + - switch.turn_on: Relay_1 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_on}" #:########################################################################################:# -# SWITCH COMPONENT: +# SWITCH # https://esphome.io/components/switch/ #:########################################################################################:# switch: - platform: gpio name: "Relay 1: ${switch_1_name}" - pin: P16 # GPIO16 + pin: GPIO12 id: Relay_1 - restore_mode: ${relay_restore_mode} \ No newline at end of file + on_turn_on: + - mqtt.publish: + topic: "${mqtt_this_device_status_topic1}" + payload: "${mqtt_command_on}" + retain: true + on_turn_off: + - mqtt.publish: + topic: "${mqtt_this_device_status_topic1}" + payload: "${mqtt_command_off}" + retain: true \ No newline at end of file diff --git a/esphome/esp-mainhallwaylights2.yaml b/esphome/esp-mainhallwaynightlights.yaml similarity index 75% rename from esphome/esp-mainhallwaylights2.yaml rename to esphome/esp-mainhallwaynightlights.yaml index 73368b1..ca2948e 100644 --- a/esphome/esp-mainhallwaylights2.yaml +++ b/esphome/esp-mainhallwaynightlights.yaml @@ -42,7 +42,7 @@ #:########################################################################################:# substitutions: # Device Naming - device_name: "esp-mainhallwaylights2" + device_name: "esp-mainhallwaynightlights" friendly_name: "Main Hallway Nightlights (1)" description_comment: "BK7231N - Main Hallway Nightlights using a Zemismart KS-811 Single Push Button. Main Hallway Nightlights (1) (Layout V1.1)" device_area: "Main Hallway" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. @@ -54,9 +54,9 @@ substitutions: # 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-mainhallwaylights2_ip + static_ip_address: !secret esp-mainhallwaynightlights_ip mqtt_command_main_topic: !secret mqtt_command_main_topic - #mqtt_status_main_topic: !secret mqtt_status_main_topic + mqtt_status_main_topic: !secret mqtt_status_main_topic # If we are changing IP addresses, you must update the current IP address here, otherwise it remains # Don't forget to switch it back when changed. @@ -66,11 +66,18 @@ substitutions: 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 + # MQTT REMOTE Controls + mqtt_this_device_function1: "mainhallway-nightlights" + mqtt_this_device_command_topic1: "${mqtt_command_main_topic}/${mqtt_this_device_function1}" + mqtt_this_device_status_topic1: "${mqtt_status_main_topic}/${mqtt_this_device_function1}" + mqtt_command_on: "On" + mqtt_command_off: "Off" + # Default relay restore mode # Options: RESTORE_DEFAULT_OFF, RESTORE_DEFAULT_ON, ALWAYS_ON, ALWAYS_OFF relay_restore_mode: "RESTORE_DEFAULT_OFF" - # Switch Naming + # Switch/Relay/Button Naming & Icons switch_1_name: "Main Hallway Nightlights" #:########################################################################################:# @@ -120,8 +127,8 @@ wifi: reboot_timeout: 15min # override the selection from the common package fast_connect: false # optional; force off in case package vars change -mqtt: - keepalive: 15s # overriding the value from the common package +#mqtt: +# keepalive: 15s # overriding the value from the common package #:########################################################################################:# # ESPHOME: @@ -153,6 +160,39 @@ logger: baud_rate: 0 # set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) id: logger_id +#:########################################################################################:# +# MQTT: Device-specific MQTT command triggers +# This adds device-specific MQTT command triggers to the common MQTT configuration. +#:########################################################################################:# +mqtt: + on_connect: + - mqtt.publish: + topic: "${mqtt_this_device_status_topic1}" + payload: !lambda |- + return id(Relay_1).state ? "${mqtt_command_on}" : "${mqtt_command_off}"; + retain: true + + on_message: + - topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_on}" + then: + - delay: 50ms + - if: + condition: + lambda: 'return !id(Relay_1).state;' + then: + - switch.turn_on: Relay_1 + + - topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_off}" + then: + - delay: 50ms + - if: + condition: + lambda: 'return id(Relay_1).state;' + then: + - switch.turn_off: Relay_1 + #:########################################################################################:# # STATUS LED: # https://esphome.io/components/status_led.html @@ -171,15 +211,29 @@ binary_sensor: id: button_1 internal: true pin: - number: P24 # GPIO24 + number: P24 mode: input: true pullup: true inverted: true + name: "Button 1: ${switch_1_name}" filters: - - delayed_on: 20ms + - delayed_on: 10ms + - delayed_off: 10ms on_press: - - switch.toggle: Relay_1 + - if: + condition: + switch.is_on: Relay_1 + then: + - switch.turn_off: Relay_1 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_off}" + else: + - switch.turn_on: Relay_1 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_on}" #:########################################################################################:# # SWITCH COMPONENT: @@ -188,6 +242,16 @@ binary_sensor: switch: - platform: gpio name: "Relay 1: ${switch_1_name}" - pin: P16 # GPIO16 + pin: P16 id: Relay_1 - restore_mode: ${relay_restore_mode} \ No newline at end of file + restore_mode: ${relay_restore_mode} + on_turn_on: + - mqtt.publish: + topic: "${mqtt_this_device_status_topic1}" + payload: "${mqtt_command_on}" + retain: true + on_turn_off: + - mqtt.publish: + topic: "${mqtt_this_device_status_topic1}" + payload: "${mqtt_command_off}" + retain: true \ No newline at end of file diff --git a/esphome/esp-mainhallwaynorthlightswitch.yaml b/esphome/esp-mainhallwaynorthlightswitch.yaml new file mode 100644 index 0000000..2d742da --- /dev/null +++ b/esphome/esp-mainhallwaynorthlightswitch.yaml @@ -0,0 +1,329 @@ +#:########################################################################################:# +# TITLE: MAIN HALLWAY NORTH LIGHTSWITCH +# zorruno.com layout v1.1 2026 +#:########################################################################################:# +# REPO: +# https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-mainhallwaynorthlightswitch.yaml +#:########################################################################################:# +# VERSIONS: +# V1.1 2026-04-04 Updated yaml to zorruno layout V1.1; checked KS-811 dual ESP8266 GPIO mapping; +# corrected Relay 2 naming; added MQTT state republish on reconnect; added +# GPIO16 polling for Button 1 compatibility; expanded notes/comments +# V1.0 2026-04-03 Initial +#:########################################################################################:# +# HARDWARE: +# - Zemismart KS-811 Double Push Button +# - ESP8266 variant +# - Community-traced dual-button pinout matches: +# - Button 1 (top): GPIO16 +# - Button 2 (bottom): GPIO5 +# - Relay 1: GPIO13 +# - Relay 2: GPIO12 +# - Status LED: GPIO2 (inverted) +#:########################################################################################:# +# OPERATION NOTES: +# - Button 1 toggles Relay 1 locally. +# - Button 2 toggles Relay 2 locally. +# - MQTT command topics can also turn each relay On or Off. +# - Custom MQTT status topics publish the actual relay state after local or MQTT changes. +# - Current relay states are also republished whenever MQTT reconnects, helping late subscribers. +# - GPIO16 on ESP8266 does not support normal GPIO interrupts, so Button 1 uses polling mode. +#:########################################################################################:# +# MQTT COMMANDS: +# - ${mqtt_this_device_command_topic1} +# Payloads: ${mqtt_command_on}, ${mqtt_command_off} +# - ${mqtt_this_device_command_topic2} +# Payloads: ${mqtt_command_on}, ${mqtt_command_off} +# - Status topics: +# - ${mqtt_this_device_status_topic1} +# - ${mqtt_this_device_status_topic2} +# Payloads mirror the actual relay state and are published retained. +#:########################################################################################:# +# OFFLINE NOTES: +# a) HA offline (network and MQTT still online) +# - Local button control continues. +# - MQTT command/status operation continues. +# +# b) MQTT offline (or HA and MQTT offline) +# - Local button control continues. +# - If Home Assistant is online and connected by native ESPHome API, HA control can still work. +# - Custom MQTT commands/status are unavailable until MQTT returns. +# +# c) Entire WiFi/network offline +# - Local wall-switch button control continues for both relays. +# - Accurate time is not needed. SNTP is not used for this device. +#:########################################################################################:# + +#:########################################################################################:# +# SUBSTITUTIONS: 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-mainhallwaynorthlightswitch" + friendly_name: "Main Hallway North Lightswitch (2)" + description_comment: "Main Hallway Lightswitch using a Zemismart KS-811 Double Push Button. Main Hallway Lights (1), Night Lights (2) (Layout V1.1)" + device_area: "Main Hallway" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant. + + # Project Naming + project_name: "Zemismart Technologies.KS-811 Double" + project_version: "v1.1" # 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-mainhallwaynorthlightswitch_ip + mqtt_command_main_topic: !secret mqtt_command_main_topic + mqtt_status_main_topic: !secret mqtt_status_main_topic + + # If we are changing IP addresses, you must update the current IP address here, otherwise it remains + # Don't forget to switch it back when changed. + current_ip_address: ${static_ip_address} + + # Device Settings + log_level: "INFO" # NONE, ERROR, WARN, INFO, DEBUG, VERBOSE, VERY_VERBOSE + update_interval: "60s" # General sensor update interval + + # MQTT Remote Controls + mqtt_this_device_function1: "mainhallway-mainlights" + mqtt_this_device_command_topic1: "${mqtt_command_main_topic}/${mqtt_this_device_function1}" + mqtt_this_device_status_topic1: "${mqtt_status_main_topic}/${mqtt_this_device_function1}" + mqtt_command_on: "On" + mqtt_command_off: "Off" + + mqtt_this_device_function2: "mainhallway-nightlights" + mqtt_this_device_command_topic2: "${mqtt_command_main_topic}/${mqtt_this_device_function2}" + mqtt_this_device_status_topic2: "${mqtt_status_main_topic}/${mqtt_this_device_function2}" + + # Switch/Relay/Button Naming + switch_1_name: "Main Hallway Lights" + switch_2_name: "Main Hallway Nightlights" + +#:########################################################################################:# +# PACKAGES: Included Common Packages +# https://esphome.io/components/packages.html +#:########################################################################################:# +packages: + #### WIFI, Network (Static/DHCP/IPV6 etc), Fallback AP, Safemode #### + common_wifi: !include + file: common/network_common.yaml + vars: + local_device_name: "${device_name}" + local_static_ip_address: "${static_ip_address}" + local_ota_pass: "${ota_pass}" + local_current_ip_address: "${current_ip_address}" + + #### HOME ASSISTANT API (choose encryption or no encryption options) #### + common_api: !include + file: common/api_common.yaml + #file: common/api_common_noencryption.yaml + vars: + local_api_key: "${api_key}" + + #### MQTT #### + common_mqtt: !include + file: common/mqtt_common.yaml + vars: + local_device_name: "${device_name}" + + #### WEB PORTAL #### + #common_webportal: !include common/webportal_common.yaml + + #### SNTP (Only use if you want/need accurate timeclocks) #### + #common_sntp: !include common/sntp_common.yaml + + #### DIAGNOSTICS Sensors #### + diag_basic: !include common/include_basic_diag_sensors.yaml + #diag_more: !include common/include_more_diag_sensors.yaml + #diag_debug: !include common/include_debug_diag_sensors.yaml + #diag_resetcount: !include common/include_resetcount_diag_sensors.yaml + +#:########################################################################################:# +# 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}" + +#:########################################################################################:# +# ESP PLATFORM AND FRAMEWORK +# https://esphome.io/components/esp8266.html +#:########################################################################################:# +esp8266: + board: esp01_1m + early_pin_init: false # Recommended false where relays/switches are involved + board_flash_mode: dout + +#:########################################################################################:# +# LOGGING +# https://esphome.io/components/logger.html +#:########################################################################################:# +logger: + level: "${log_level}" + #baud_rate: 0 # Set to 0 for no logging via UART if UART is needed elsewhere + #esp8266_store_log_strings_in_flash: false + #tx_buffer_size: 64 + +#:########################################################################################:# +# MQTT: Device-specific MQTT command triggers +# This extends the common MQTT package with local custom command/status topics. +#:########################################################################################:# +mqtt: + # Republish current relay states whenever MQTT reconnects so retained status stays accurate + # for subscribers that reconnect later. + on_connect: + - mqtt.publish: + topic: "${mqtt_this_device_status_topic1}" + payload: !lambda |- + return id(Relay_1).state ? "${mqtt_command_on}" : "${mqtt_command_off}"; + retain: true + - mqtt.publish: + topic: "${mqtt_this_device_status_topic2}" + payload: !lambda |- + return id(Relay_2).state ? "${mqtt_command_on}" : "${mqtt_command_off}"; + retain: true + + on_message: + # Mirror remote state onto Relay_1, but only if a real state change is needed. + - topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_on}" + then: + - if: + condition: + lambda: "return !id(Relay_1).state;" + then: + - switch.turn_on: Relay_1 + + - topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_off}" + then: + - if: + condition: + lambda: "return id(Relay_1).state;" + then: + - switch.turn_off: Relay_1 + + # Mirror remote state onto Relay_2, but only if a real state change is needed. + - topic: "${mqtt_this_device_command_topic2}" + payload: "${mqtt_command_on}" + then: + - if: + condition: + lambda: "return !id(Relay_2).state;" + then: + - switch.turn_on: Relay_2 + + - topic: "${mqtt_this_device_command_topic2}" + payload: "${mqtt_command_off}" + then: + - if: + condition: + lambda: "return id(Relay_2).state;" + then: + - switch.turn_off: Relay_2 + +#:########################################################################################:# +# STATUS LED +# https://esphome.io/components/status_led.html +#:########################################################################################:# +status_led: + pin: + number: GPIO2 + inverted: true + +#:########################################################################################:# +# BINARY SENSORS +# https://esphome.io/components/binary_sensor/ +#:########################################################################################:# +binary_sensor: + - platform: gpio + pin: + number: GPIO16 + mode: + input: true + inverted: true + name: "Button 1: ${switch_1_name}" + use_interrupt: false + filters: + - delayed_on: 10ms + - delayed_off: 10ms + on_press: + - if: + condition: + switch.is_on: Relay_1 + then: + - switch.turn_off: Relay_1 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_off}" + else: + - switch.turn_on: Relay_1 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_on}" + + - platform: gpio + pin: + number: GPIO5 + mode: + input: true + inverted: true + name: "Button 2: ${switch_2_name}" + filters: + - delayed_on: 10ms + - delayed_off: 10ms + on_press: + - if: + condition: + switch.is_on: Relay_2 + then: + - switch.turn_off: Relay_2 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic2}" + payload: "${mqtt_command_off}" + else: + - switch.turn_on: Relay_2 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic2}" + payload: "${mqtt_command_on}" + +#:########################################################################################:# +# SWITCH +# https://esphome.io/components/switch/ +#:########################################################################################:# +switch: + - platform: gpio + name: "Relay 1: ${switch_1_name}" + pin: GPIO13 + id: Relay_1 + on_turn_on: + - mqtt.publish: + topic: "${mqtt_this_device_status_topic1}" + payload: "${mqtt_command_on}" + retain: true + on_turn_off: + - mqtt.publish: + topic: "${mqtt_this_device_status_topic1}" + payload: "${mqtt_command_off}" + retain: true + + - platform: gpio + name: "Relay 2: ${switch_2_name}" + pin: GPIO12 + id: Relay_2 + on_turn_on: + - mqtt.publish: + topic: "${mqtt_this_device_status_topic2}" + payload: "${mqtt_command_on}" + retain: true + on_turn_off: + - mqtt.publish: + topic: "${mqtt_this_device_status_topic2}" + payload: "${mqtt_command_off}" + retain: true \ No newline at end of file diff --git a/packages/simulation_lights.yaml b/packages/simulation_lights.yaml index 15decd2..86eef4f 100644 --- a/packages/simulation_lights.yaml +++ b/packages/simulation_lights.yaml @@ -9,7 +9,7 @@ group: - switch.esp_entrancelightswitch_relay_1_entrance_lights - switch.esp_mainkitchenlights_relay_1_main_lights - switch.esp_mainkitchenlights_relay_2_benchtop_lights - - switch.main_hallway_lightswitch_tasmo_ks811s_2940_hallway_1a + - switch.main_hallway_lightswitch_relay_1_main_hallway_lights - light.esp_lounge6chdimmer_lounge_downlights_centre - light.esp_lounge6chdimmer_lounge_downlights_south - light.esp_lounge6chdimmer_lounge_rafter_buttons