changes to esphome devices and packages to start removing node red dependencies
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
# https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-laundrylights.yaml
|
||||
#:########################################################################################:#
|
||||
# VERSIONS:
|
||||
# V3.7 2026-04-24 Reviewed MQTT timer control, corrected notes, added local MQTT status publishing
|
||||
# V3.6 2026-03-11 Updated yaml to zorruno layout V1.1
|
||||
# V3.5 2025-07-24 YAML tidyups
|
||||
# V3.0 2025-06-05 YAML tidyups
|
||||
@@ -25,38 +26,43 @@
|
||||
#:########################################################################################:#
|
||||
# OPERATION NOTES:
|
||||
# - Button 1 toggles Relay 1 for the laundry lights
|
||||
# - Button 2 supports two actions:
|
||||
# - Single click toggles Relay 2 locally
|
||||
# - Hold for 2 seconds or more sends MQTT ON/OFF to the remote device
|
||||
# - Button 2 single click toggles Relay 2 locally
|
||||
# - Relay 2 is turned ON at boot
|
||||
# - Remote MQTT status is subscribed to and normalised to ON/OFF/TRUE/FALSE/1/0
|
||||
# - If the remote state is unknown, a hold on Button 2 defaults to sending ON
|
||||
# - MQTT command topic supports external control of Relay 1, such as from an occupancy sensor
|
||||
# - MQTT payload On turns Relay 1 ON and cancels any active timer
|
||||
# - MQTT payload Off turns Relay 1 OFF and cancels any active timer
|
||||
# - MQTT numeric payloads from 1 to 3600 turn Relay 1 ON for that many seconds
|
||||
# - Any MQTT payload outside 1 to 3600 seconds is ignored
|
||||
# - Relay 1 status is published to the local MQTT status topic as On or Off
|
||||
# - This switch is used for:
|
||||
# - Laundry Lights (1)
|
||||
# - Laundry Power Enable (2)
|
||||
#:########################################################################################:#
|
||||
# MQTT COMMANDS:
|
||||
# - Remote device command topic:
|
||||
# - ${mqtt_remote1_command_topic}
|
||||
# - Remote device status topic:
|
||||
# - ${mqtt_remote1_status_topic}
|
||||
# - Hold Button 2:
|
||||
# - Sends OFF if remote state is known and currently ON
|
||||
# - Sends ON otherwise
|
||||
# - Local command topic:
|
||||
# - ${mqtt_local_command1_topic}
|
||||
# - Accepted command payloads:
|
||||
# - On
|
||||
# - Off
|
||||
# - 1 to 3600 seconds
|
||||
# - Local status topic:
|
||||
# - ${mqtt_local_status_topic}
|
||||
# - Published status payloads:
|
||||
# - On
|
||||
# - Off
|
||||
#:########################################################################################:#
|
||||
# OFFLINE NOTES:
|
||||
# a) Home Assistant offline (network and MQTT online):
|
||||
# - Local buttons and local relays continue to work
|
||||
# - Remote MQTT control/status for Button 2 hold still works if the MQTT broker is online
|
||||
# - MQTT control and MQTT timer commands continue to work if the MQTT broker is online
|
||||
#
|
||||
# b) MQTT offline (or HA/MQTT offline):
|
||||
# - Local buttons and local relays continue to work
|
||||
# - Button 2 single click still toggles Relay 2 locally
|
||||
# - Button 2 hold cannot control the remote MQTT device
|
||||
# - MQTT control, MQTT timer commands, and MQTT status publishing are unavailable
|
||||
#
|
||||
# c) Entire WiFi/Network offline:
|
||||
# - Local buttons and local relays continue to work
|
||||
# - Remote MQTT control/status is unavailable
|
||||
# - MQTT control, MQTT timer commands, and MQTT status publishing are unavailable
|
||||
# - Accurate time is not needed; SNTP is not required for operation
|
||||
#:########################################################################################:#
|
||||
|
||||
@@ -74,35 +80,32 @@ substitutions:
|
||||
|
||||
# Project Naming
|
||||
project_name: "Zemismart Technologies.KS-811 Double" # Project Details
|
||||
project_version: "v3.6" # Project V denotes release of yaml file, allowing checking of deployed vs latest version
|
||||
project_version: "v3.7" # Project V denotes release of yaml file, allowing checking of deployed vs latest version
|
||||
|
||||
# Passwords & Secrets
|
||||
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-laundrylights_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}
|
||||
|
||||
mqtt_command_main_topic: !secret mqtt_command_main_topic
|
||||
mqtt_status_main_topic: !secret mqtt_status_main_topic
|
||||
|
||||
# Device Settings
|
||||
#relay_icon: "mdi:lightbulb-group"
|
||||
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_remote1_device_name: "3dprinter-power"
|
||||
mqtt_remote1_command_topic: "${mqtt_command_main_topic}/${mqtt_remote1_device_name}" # Topic we will use to command this locally without HA
|
||||
mqtt_remote1_status_topic: "${mqtt_status_main_topic}/${mqtt_remote1_device_name}" # Topic we will use to view status locally without HA
|
||||
# MQTT LOCAL Controls
|
||||
mqtt_local_device1_name: "laundry-lights"
|
||||
mqtt_local_command1_topic: "${mqtt_command_main_topic}/${mqtt_local_device1_name}" # Topic that remote things will use to command this locally without HA
|
||||
mqtt_local_status_topic: "${mqtt_status_main_topic}/${mqtt_local_device1_name}" # Topic that remote things will use to view local Relay 1 status without HA
|
||||
|
||||
# Switch Naming
|
||||
switch_1_name: "Laundry Lights"
|
||||
switch_2_name: "Laundry Power Enable" # This is virtual only, no power connected to 3rd relay
|
||||
#switch_3_name: "Fan 3 Relay"
|
||||
#switch_4_name: "Fan 4 Relay"
|
||||
switch_2_name: "Laundry Power Enable"
|
||||
|
||||
#:########################################################################################:#
|
||||
# PACKAGES:
|
||||
@@ -175,8 +178,8 @@ esp8266:
|
||||
# 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)
|
||||
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
|
||||
|
||||
@@ -189,20 +192,6 @@ status_led:
|
||||
number: GPIO2
|
||||
inverted: true
|
||||
|
||||
#:########################################################################################:#
|
||||
# GLOBAL VARIABLES:
|
||||
#:########################################################################################:#
|
||||
globals:
|
||||
- id: remote1_state
|
||||
type: bool
|
||||
restore_value: false
|
||||
initial_value: "false"
|
||||
|
||||
- id: remote1_known
|
||||
type: bool
|
||||
restore_value: false
|
||||
initial_value: "false"
|
||||
|
||||
#:########################################################################################:#
|
||||
# BINARY SENSORS:
|
||||
# https://esphome.io/components/binary_sensor/
|
||||
@@ -213,6 +202,7 @@ binary_sensor:
|
||||
number: GPIO16
|
||||
mode: INPUT
|
||||
inverted: true
|
||||
use_interrupt: false # This device GPIO pin doesn't support them
|
||||
name: "Button 1: ${switch_1_name}"
|
||||
on_press:
|
||||
- switch.toggle: Relay_1
|
||||
@@ -224,7 +214,7 @@ binary_sensor:
|
||||
inverted: true
|
||||
name: "Button 2: ${switch_2_name}"
|
||||
on_multi_click:
|
||||
# SINGLE CLICK: quick tap -> toggle Relay_2
|
||||
# SINGLE CLICK: quick tap toggles Relay_2
|
||||
- timing:
|
||||
- ON for at most 0.5s
|
||||
- OFF for at least 0.5s
|
||||
@@ -238,64 +228,66 @@ binary_sensor:
|
||||
else:
|
||||
- switch.turn_on: Relay_2
|
||||
|
||||
# HOLD: pressed for 2s or more -> toggle remote; default to ON if unknown
|
||||
- timing:
|
||||
- ON for at least 2s
|
||||
then:
|
||||
- if:
|
||||
condition:
|
||||
lambda: |-
|
||||
return id(remote1_known) && id(remote1_state); // known AND currently ON
|
||||
then:
|
||||
- mqtt.publish:
|
||||
topic: "${mqtt_remote1_command_topic}"
|
||||
payload: "OFF"
|
||||
retain: false
|
||||
else:
|
||||
- mqtt.publish:
|
||||
topic: "${mqtt_remote1_command_topic}"
|
||||
payload: "ON"
|
||||
retain: false
|
||||
#:########################################################################################:#
|
||||
# MQTT COMPONENT:
|
||||
# Device-specific MQTT command triggers
|
||||
# https://esphome.io/components/mqtt.html
|
||||
#:########################################################################################:#
|
||||
mqtt:
|
||||
on_message:
|
||||
- topic: "${mqtt_local_command1_topic}"
|
||||
payload: "On"
|
||||
then:
|
||||
- script.stop: relay_1_timer_script
|
||||
- switch.turn_on: Relay_1
|
||||
|
||||
#:########################################################################################:#
|
||||
# TEXT SENSORS:
|
||||
#:########################################################################################:#
|
||||
text_sensor:
|
||||
- platform: mqtt_subscribe
|
||||
id: remote1_status
|
||||
internal: true
|
||||
topic: "${mqtt_remote1_status_topic}"
|
||||
on_value:
|
||||
- topic: "${mqtt_local_command1_topic}"
|
||||
payload: "Off"
|
||||
then:
|
||||
- script.stop: relay_1_timer_script
|
||||
- switch.turn_off: Relay_1
|
||||
|
||||
- topic: "${mqtt_local_command1_topic}"
|
||||
then:
|
||||
- lambda: |-
|
||||
// copy, trim whitespace, uppercase
|
||||
std::string s = x;
|
||||
|
||||
// trim leading/trailing whitespace
|
||||
auto notspace = [](int ch) { return !std::isspace(ch); };
|
||||
s.erase(s.begin(), std::find_if(s.begin(), s.end(), notspace));
|
||||
s.erase(std::find_if(s.rbegin(), s.rend(), notspace).base(), s.end());
|
||||
|
||||
for (auto &c : s) c = (char) toupper(c);
|
||||
|
||||
bool recognized = false;
|
||||
if (s == "ON" || s == "1" || s == "TRUE") {
|
||||
id(remote1_state) = true;
|
||||
id(remote1_known) = true;
|
||||
recognized = true;
|
||||
} else if (s == "OFF" || s == "0" || s == "FALSE") {
|
||||
id(remote1_state) = false;
|
||||
id(remote1_known) = true;
|
||||
recognized = true;
|
||||
} else {
|
||||
// unknown payload (e.g. "ONLINE", "OFFLINE", JSON, etc.)
|
||||
id(remote1_known) = false;
|
||||
if (x.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
ESP_LOGI("remote1_status", "Parsed status='%s' -> known=%s state=%s",
|
||||
s.c_str(),
|
||||
id(remote1_known) ? "true" : "false",
|
||||
id(remote1_state) ? "ON" : "OFF");
|
||||
bool numeric_payload = true;
|
||||
for (char c : x) {
|
||||
if (c < '0' || c > '9') {
|
||||
numeric_payload = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!numeric_payload) {
|
||||
return;
|
||||
}
|
||||
|
||||
const int timer_seconds = atoi(x.c_str());
|
||||
if (timer_seconds < 1 || timer_seconds > 3600) {
|
||||
return;
|
||||
}
|
||||
|
||||
id(relay_1_timer_script)->execute(timer_seconds * 1000);
|
||||
|
||||
#:########################################################################################:#
|
||||
# SCRIPT COMPONENT:
|
||||
# Relay 1 timer script
|
||||
# mode: restart means a new valid timer value restarts the timer from zero
|
||||
# https://esphome.io/components/script.html
|
||||
#:########################################################################################:#
|
||||
script:
|
||||
- id: relay_1_timer_script
|
||||
mode: restart
|
||||
parameters:
|
||||
timer_duration_ms: int
|
||||
then:
|
||||
- switch.turn_on: Relay_1
|
||||
- delay: !lambda "return timer_duration_ms;"
|
||||
- switch.turn_off: Relay_1
|
||||
|
||||
#:########################################################################################:#
|
||||
# SWITCH COMPONENT:
|
||||
@@ -306,6 +298,14 @@ switch:
|
||||
name: "Relay 1: ${switch_1_name}"
|
||||
pin: GPIO13
|
||||
id: Relay_1
|
||||
on_turn_on:
|
||||
- mqtt.publish:
|
||||
topic: "${mqtt_local_status_topic}"
|
||||
payload: "On"
|
||||
on_turn_off:
|
||||
- mqtt.publish:
|
||||
topic: "${mqtt_local_status_topic}"
|
||||
payload: "Off"
|
||||
|
||||
- platform: gpio
|
||||
name: "Relay 2: ${switch_2_name}"
|
||||
|
||||
Reference in New Issue
Block a user