Files
zorruno-homeassistant/packages/room_fan_control.yaml
T
2026-07-21 13:40:06 +12:00

233 lines
8.3 KiB
YAML

##########################################################################################
# Room Fan Control
##########################################################################################
#
# TITLE:
# Room Fan Control
#
# FILE:
# packages/room_fan_control.yaml
#
# VERSION:
# V1.1 2026-07-20
#
# VERSION HISTORY:
# V1.1 2026-07-20
# - Added structured documentation for all three bedroom fans.
# - Documented the master-bedroom feedback loop and command-only controls.
#
# V1.0
# - Initial Tasmota and Sonoff iFan02 fan controls.
#
# PURPOSE:
# Controls the master-bedroom, Bedroom 2, and Bedroom 3 ceiling-fan speeds
# through Tasmota MQTT commands and Home Assistant dropdown helpers.
#
# SPEED MAPPING:
# - 0 = Off
# - 1 = Low
# - 2 = Medium
# - 3 = High
#
# MASTER BEDROOM:
# - Queries FanSpeed when Home Assistant starts.
# - Listens to Tasmota RESULT and STATE topics for device feedback.
# - Synchronizes the numeric and dropdown helpers with actual device state.
# - Uses optimistic local updates until MQTT feedback corrects the helpers.
# - Provides a button that cycles through speeds 1, 2, 3, and 0.
#
# BEDROOMS 2 AND 3:
# - Dropdown changes publish FanSpeed commands to each Tasmota device.
# - These controls are command-only and do not synchronize from feedback.
# - Their displayed dropdown state may not reflect physical or external changes.
#
# MQTT COMMAND TOPICS:
# - Master bedroom: cmnd/tasmo-ifan02-3793-bedrm1-1/FanSpeed
# - Bedroom 2: cmnd/tasmo-ifan02-7042-bedrm2/FanSpeed
# - Bedroom 3: cmnd/tasmo-ifan02-3497-bedrm3/FanSpeed
#
# DEPENDENCIES:
# - The three Tasmota devices must accept FanSpeed values from 0 through 3.
# - Master-bedroom feedback uses its RESULT and STATE MQTT topics.
#
##########################################################################################
input_select:
master_bedroom_fan_set:
name: Master Bedroom Fan Speed
initial: "Off"
options:
- "Off"
- "Low"
- "Medium"
- "High"
bedroom_2_fan_set:
name: Bedroom 2 Fan Speed
initial: "Off"
options:
- "Off"
- "Low"
- "Medium"
- "High"
bedroom_3_fan_set:
name: Bedroom 3 Fan Speed
initial: "Off"
options:
- "Off"
- "Low"
- "Medium"
- "High"
##########################################################################################
# MASTER BEDROOM FAN - Helpers
##########################################################################################
input_number:
master_bedroom_fan_speed_numeric:
name: Master Bedroom Fan Speed (Numeric)
min: 0
max: 3
step: 1
mode: box
template:
- button:
- name: Bedroom 1 Fan Speed Change
unique_id: bedroom_1_fan_speed_change
icon: mdi:fan
press:
- variables:
cur: "{{ states('input_number.master_bedroom_fan_speed_numeric') | int(0) }}"
nxt: "{{ (cur + 1) if (cur < 3) else 0 }}"
- service: mqtt.publish
data:
topic: cmnd/tasmo-ifan02-3793-bedrm1-1/FanSpeed
payload: "{{ nxt }}"
# Optimistic local update (MQTT will correct if needed)
- service: input_number.set_value
data:
entity_id: input_number.master_bedroom_fan_speed_numeric
value: "{{ nxt }}"
- service: input_select.select_option
data:
entity_id: input_select.master_bedroom_fan_set
option: >-
{% set m = {0:'Off',1:'Low',2:'Medium',3:'High'} %}
{{ m[nxt] }}
automation:
########################################################################################
# MASTER BEDROOM FAN - Query on HA start (fixes wrong value after reboots)
########################################################################################
- id: master_bedroom_fan_query_on_ha_start
initial_state: true
alias: Master Bedroom Fan - Query FanSpeed on HA Start
description: "Requests the current master-bedroom FanSpeed when Home Assistant starts."
trigger:
- platform: homeassistant
event: start
action:
- service: mqtt.publish
data:
topic: cmnd/tasmo-ifan02-3793-bedrm1-1/FanSpeed
payload: ""
########################################################################################
# MASTER BEDROOM FAN - Sync helpers from Tasmota MQTT
########################################################################################
- id: master_bedroom_fan_sync_from_mqtt
initial_state: true
alias: Master Bedroom Fan - Sync Helpers From MQTT FanSpeed
description: "Synchronizes the master-bedroom fan helpers from Tasmota MQTT feedback."
trigger:
- platform: mqtt
topic: stat/tasmo-ifan02-3793-bedrm1-1/RESULT
- platform: mqtt
topic: tele/tasmo-ifan02-3793-bedrm1-1/STATE
condition:
- condition: template
value_template: "{{ trigger.payload_json is defined and (trigger.payload_json.FanSpeed is defined) }}"
action:
- variables:
spd: "{{ trigger.payload_json.FanSpeed | int(0) }}"
opt: >-
{% set m = {0:'Off',1:'Low',2:'Medium',3:'High'} %}
{{ m[spd] }}
- service: input_number.set_value
data:
entity_id: input_number.master_bedroom_fan_speed_numeric
value: "{{ spd }}"
# Only update dropdown if it differs (avoid loops)
- condition: template
value_template: "{{ states('input_select.master_bedroom_fan_set') != opt }}"
- service: input_select.select_option
data:
entity_id: input_select.master_bedroom_fan_set
option: "{{ opt }}"
########################################################################################
# MASTER BEDROOM FAN - Set speed from dropdown (improved)
########################################################################################
- id: set_the_master_bedroom_fan
initial_state: true
alias: Set the Master Bedroom Fan
description: "Publishes master-bedroom fan speed changes and updates the numeric helper optimistically."
trigger:
- platform: state
entity_id: input_select.master_bedroom_fan_set
variables:
desired: >-
{% set mapping = { 'Off':0, 'Low':1, 'Medium':2, 'High':3 } %}
{{ mapping.get(trigger.to_state.state, 0) }}
current: "{{ states('input_number.master_bedroom_fan_speed_numeric') | int(0) }}"
condition:
- condition: template
value_template: "{{ desired != current }}"
action:
- service: mqtt.publish
data:
topic: cmnd/tasmo-ifan02-3793-bedrm1-1/FanSpeed
payload: "{{ desired }}"
# Optimistic local update (MQTT will correct if needed)
- service: input_number.set_value
data:
entity_id: input_number.master_bedroom_fan_speed_numeric
value: "{{ desired }}"
########################################################################################
# BEDROOM 2 FAN - Command Only
########################################################################################
- id: set_bedroom_2_fan
initial_state: true
alias: Set Bedroom 2 Fan Speed
description: "Publishes Bedroom 2 fan speed dropdown changes to Tasmota."
trigger:
entity_id: input_select.bedroom_2_fan_set
platform: state
action:
service: mqtt.publish
data:
topic: cmnd/tasmo-ifan02-7042-bedrm2/FanSpeed
payload: '{% set mapping = { "Off":"0", "Low":"1",
"Medium":"2", "High":"3" } %} {% set dta = trigger.to_state.state %}
{{ mapping[dta] }}
'
########################################################################################
# BEDROOM 3 FAN - Command Only
########################################################################################
- id: set_bedroom_3_fan
initial_state: true
alias: Set Bedroom 3 Fan Speed
description: "Publishes Bedroom 3 fan speed dropdown changes to Tasmota."
trigger:
entity_id: input_select.bedroom_3_fan_set
platform: state
action:
service: mqtt.publish
data:
topic: cmnd/tasmo-ifan02-3497-bedrm3/FanSpeed
payload: '{% set mapping = { "Off":"0", "Low":"1",
"Medium":"2", "High":"3" } %} {% set dta = trigger.to_state.state %}
{{ mapping[dta] }}
'