Here are all the required parts for the Template Fan solution.
Inputs
input_boolean:
status_fan_power:
name: Status Fan Power
input_text:
status_fan_speed:
name: Status Fan Speed
Template Fan
fan:
- platform: template
fans:
my_fan:
value_template: "{{ states('input_boolean.status_fan_power') }}"
speed_template: "{{ states('input_text.status_fan_speed') }}"
speeds: ['1', '2', '3', '4', '5', '6', '7', '8']
turn_on:
- condition: state
entity_id: input_boolean.status_fan_power
state: 'off'
- service: broadlink.send
data:
host: '192.168.1.10'
packet: 'JgBQAAABJZMSExE3EhMRExE4ETgRExERfODAAAAAAAAAA='
- service: input_boolean.turn_on
entity_id: input_boolean.status_fan_power
turn_off:
- service: broadlink.send
data:
host: '192.168.1.10'
packet: 'JgBQAAABJZMSExE3EhMRExE4ETgRExERfODAAAAAAAAAA='
- service: input_boolean.turn_off
entity_id: input_boolean.status_fan_power
set_speed:
- service: python_script.fan_speed_control
data_template:
fan_speed: "{{ speed }}"
- service: input_text.set_value
data_template:
entity_id: input_text.status_fan_speed
value: "{{ speed }}"
Python_script
fan_speed_control.py
# Set code to whatever RF code your fan uses for increasing speed.
code = 'JgBQAAISEjcSEhISEhISExETETgRNhMTETgROBAAAAAAAAAA='
speed = data.get('fan_speed')
status_speed = hass.states.get('input_text.status_fan_speed')
if speed is not None:
speed = int(speed)
last_speed = int(status_speed.state) if status_speed.state else 1
if 1 <= speed <= 8:
if speed > last_speed:
loop = speed - last_speed
else:
loop = (8 - last_speed) + speed
# Set the IP address to match the one used by your Broadlink device
service_data = {'host':'192.168.1.10', 'packet':'{}'.format(code)}
for i in range(loop):
hass.services.call('broadlink', 'send', service_data, False)
time.sleep(0.5)
else:
logger.warning('<fan_speed_control> Received fan speed is invalid ({})'.format(fan_speed))
else:
logger.warning('<fan_speed_control> Received fan speed is invalid (None)')