Need help with making a dumb fan smart

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)')
5 Likes