Files
zorruno-homeassistant/packages/room_fan_control.yaml
T
2026-02-16 22:13:42 +13:00

182 lines
6.5 KiB
YAML

##########################################################################################
# MASTER BEDROOM FAN (Tasmota / Sonoff iFan02)
# Improvements:
# - Numeric speed entity (0-3) reflecting actual device state via MQTT
# - Button to cycle speed 1,2,3,0
# - Keep input_select in sync with actual FanSpeed (incl after reboots)
##########################################################################################
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
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
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
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 - Unchanged
########################################################################################
- id: set_bedroom_2_fan
initial_state: true
alias: Set Bedroom 2 Fan Speed
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 - Unchanged
########################################################################################
- id: set_bedroom_3_fan
initial_state: true
alias: Set Bedroom 3 Fan Speed
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] }}
'