Modern Forms Smart Fans - Integration

If you read back through this thread, you’ll find out that you are not alone with the MFFs locking up after a period of time. It appears as if it’s a wide-spread issue.

It has gotten better with my fans over the last 9 or so months, which I attribute to the firmware updates, as well as apparently very well written HA core integration.

1 Like

When I first got the fan the remote and HA controls worked fine. But something happened now I can’t use the physical remote any more. It seems like WAC wants me to power cycle the fan to repair the remote.

But I don’t really want to turn the circuit off outside to do that. Anyone know another way?

Unpairing it by holding the light + and the fan + then repairing it by holding the light button and the fan button does not work.

Are you saying that your fan doesn’t have a physical wall switch to simply turn off and then back on?

Curious how stable this integration is… anyone provide an update on if restarts are still required? Is it on the fan side or HA?

100% stable now. I haven’t had issues for the past two years and I have 4 fans.

1 Like

I have been using this for over six months now with two fans.

Disconnecting several times. The last one kept disconnected for several hours and required powering off the fan.
It has nothing to do with the integration. It simply loses wifi connection. Signal is not that strong but what can you expect when the fan wifi is in a metal enclosure?

image

I own two of WAC’s smart fans. I specifically purchased these for their smart capabilities as I read they work well with Home Assistant via the Modern Forms integration. After installing them, I encountered an issue where the fan connects and everything works fine for about a week, and then stops responding and appears offline. The fan is still connected to my WiFi (I can see it on my router) but it won’t respond to pings or commands to operate the fan. I had to shut off the power to the fan for a few seconds and turn it back on to force it to reboot, and then the fan will come back online and will work perfectly fine for about another week. Both of my fans did this same thing at random times, so I know it’s a firmware issue and not something with my network. Working with support was tedious. It took 8 months and 73 emails but finally the issue has been resolved by way of them releasing a firmware update around March 2024. The fans have now been stable and I am pleased with them again. If anyone is still having issues with them, make sure your firmware on the fan is up to date.

3 Likes

TLDR: No more network disconnects… Thank you

I can’t believe I finely found the answer to solve this issue where my MF fans drop wifi and needi to be rebooted daily…

I got a instant dopamine release when I plugged this code into my YAML file and ran the RESTful command and saw my fans disconnect & reconnect to the network.

Thank you guys so much… You have no idea how many hundreds of google searches I’ve done regarding this issue.

I have no idea what update the guy above me got but my MF fans have been disconnecting for years and no updates have come close to fixing it. Currently I’m on Firmware Version: 20.00.0040

Here is the code I’m running in July 2024

configuration.yaml :

rest_command:
  reboot_mf_lr_fan:
    url: "http://192.168.50.10/mf"
    method: POST
    headers:
      content_type: "application/json; charset=utf-8"
    payload: '{"reboot": true}'

automations.yaml:

alias: Reboot MF Fans
description: ""
trigger:
  - platform: time_pattern
    hours: /8
condition: []
action:
  - service: rest_command.reboot_mf_lr_fan
    data: {}
mode: single

I also had to disable “polling for updates” under system options for each fan in the UI and make an automation to poll each fan every 5 minutes.

automations.yaml:

alias: "Homeassistant Polling: Moderforms Fans"
description: Custom poll interval.
trigger:
  - platform: time_pattern
    minutes: /5
condition: []
action:
  - action: homeassistant.update_entity
    metadata: {}
    data:
      entity_id:
        - fan.living_room_fan
        - fan.master_bedroom_fan
        - fan.guest_bedroom_fan
mode: single

And as a bonus…
Incase anyone is also looking for an answer to Modern Forms Breeze Mode through Home Assistant, I found that too.

Breeze Mode On:

  breeze_on_mf_lr:
    url: "http://192.168.50.10/mf"
    method: POST
    headers:
      content_type: "application/json; charset=utf-8"
    payload: '{"wind": true}'

Breeze Mode Off:

  breeze_off_mf_lr:
    url: "http://192.168.50.10/mf"
    method: POST
    headers:
      content_type: "application/json; charset=utf-8"
    payload: '{"wind": false}'

Ah! This cleared up my code. However, I still am having problems putting this into a restful toggle switch to turn Breeze Mode on and off. Do you have any suggestions for this? Thanks!

I’ve tried making a RESTfull Switch according to the documentation but I can’t get the entity to show up if my life depended on it.

Hopefully someone else can help us there.

OK, so I have completed a toggle that turns “Wind Mode” “On” and “Off” for the Modern Forms fan. It ain’t pretty but it works. Several site-specific changes have to be made:

  1. You have to create specific Yaml code for each fan in your home because I hard-coded each fan’s IP address.
  2. The card component I use is custom:button-card, so if you do not have that installed (hacs installed) you will have to come up with the switch or button component on your own.

This change is cosmetic:
3) For a more seamless button appearance, I use card_mod. This is NOT needed for functionality.

Here is the code to add to your Yaml code in the location that makes the most sense for you. For clarity, I will pretend it is in configuration.yaml. This version looks for the fan at IP: 192.168.20.11. Change this to reflect the respective IP for your fan. Also change the switch name to reflect your environment. The command_line switch looks like this:

command_line:
  - switch:
      name: "windmode_paul_office"
      command_on: curl -d '{"wind":true}' -X POST http://192.168.20.11/mf
      command_off: curl -d '{"wind":false}' -X POST http://192.168.20.11/mf

Next add the button using a custom:button-card in a vertical grid with other components. For my use, I hard-coded colors so “Off” would look greyed out and “On” (wind mode) would be light blue. Here is the entity information:

      - type: custom:button-card
        entity: switch.windmode_paul_office
        name: Windy Mode
        layout: icon_name_state
        size: 15%
        styles:
          icon:
            - color: >
                [[[ if (entity.state == "on") return "#01A9F4" ; else return
                "#7F7F7F"; ]]]
        state:
          - value: 'off'
            icon: mdi:scent-off
          - value: 'on'
            icon: mdi:weather-windy

I used card_mod to remove the button border. The card _mod changes are TOTALLY optional and a cleaner look can be accomplished in other ways.

        card_mod:
          style: |
            ha-card {
              border-bottom: 0px;
              margin-bottom: -10px;
              border-top: none;
              border-bottom: none;
              border-left: none;
              border-right: none;
              }

My Fan & Fan Light with the “Windy” button:

WindMode

Paul

Thank you so much for this. I’m giving it a try. For those interested I’ve parameterized the URL so that I can have a single rest_command for all my fans:

rest_command:
  reboot_wac_fan:
    url: http://{{ip_address}}/mf
    method: POST
    payload: '{"reboot": true}'
    content_type: application/json; charset=utf-8

and my automation looks like this:

alias: Fans Reboot - WAC
description: ""
triggers:
  - trigger: time
    at: "00:07:00"
conditions: []
actions:
  - action: rest_command.reboot_wac_fan
    metadata: {}
    data:
      ip_addres: 192.168.1.75
  - action: rest_command.reboot_wac_fan
    metadata: {}
    data:
      ip_addres: 192.168.1.76
  - action: rest_command.reboot_wac_fan
    metadata: {}
    data:
      ip_addres: 192.168.1.77
mode: single

I’m curious though if it would make sense to add a reboot button or service/action to the official modern forms fan integration since this seems to be a useful thing for non-technical users to use as well (thinking of those that would prefer to use a “built-in” service/action instead of searching forums to find this rest_command and writing it).

Love the addition of breeze mode, thank you!

Curious if anyone has figured out how to integrate direction of fanrotation with HA? I’d like to have a simple automation that sets direction based on winter/summer conditions.

Just use action: fan.set_direction with direction: forward or reverse

1 Like

I finely got a switch for breeze mode to work too but i had a different more complicated method.

Solution Steps

  1. Started with Rest Commands:
  • Defined rest_command.breeze_on_mf_lr and breeze_off_mf_lr to send POST requests to http://192.168.50.10/mf with {“wind”: true} and {“wind”: false} payloads, respectively.

  • Tested these manually to confirm they worked (fan responded with state like wind: true).

  1. Tried a REST Switch:
  • Attempted a rest switch (Modern Forms Wind), but it didn’t create an entity because the fan rejected GET requests for state polling, returning a 405 error.

  • Added is_on_template, but it still failed due to the GET requirement.

  1. Switched to Template Switch:
  • Moved to a template switch (fan_breeze_mode_lr) using an input_boolean for state tracking, avoiding the rest switch’s polling issues.

  • Used rest_command services to control the fan, with input_boolean to keep the UI state in sync.

  1. Added Sensor for Monitoring:
  • Created sensor.fan_breeze_status_lr to monitor the fan’s state every 15 minutes (scan_interval: 900) and updated it after switch toggles.

  • Used a POST request with the payload {“wind”: null} to the fan’s /mf endpoint (e.g., http://192.168.50.10/mf) via rest_command and rest sensor, discovering it retrieves the fan’s full state (e.g., wind, fanSpeed) without altering it, enabling state monitoring for the LR fan in Home Assistant.

  1. Fixed Case Sensitivity:
  • Encountered an issue where method: POST (uppercase), in rest_command stopped the fan from responding.

  • Changed it back to method: post (lowercase), which resolved the control problem.

  1. Wrote a single automation with ID sync_fan_breeze_state_lr, alias “Sync Fan Breeze State LR”, a state trigger on sensor.fan_breeze_status_lr, and a conditional service action targeting input_boolean.fan_breeze_state_lr, to keep the switch’s UI state in sync with the fan’s actual Breeze Mode state.

Final Config

Here’s the working config for switch.fan_breeze_mode_lr:

yaml

input_boolean.yaml

input_boolean:
  fan_breeze_state_lr:
    name: "Fan Breeze State LR"
    initial: false

rest_command.yaml


breeze_on_mf_lr:
  url: "http://192.168.50.10/mf"
  method: post   # lowercase only
  headers:
    content_type: "application/json"
  payload: '{"wind": true}'
breeze_off_mf_lr:
  url: "http://192.168.50.10/mf"
  method: post   # lowercase only
  headers:
    content_type: "application/json"
  payload: '{"wind": false}'

sensors.yaml

sensor:
  - platform: rest
    name: "Fan Breeze Status LR"
    resource: "http://192.168.50.10/mf"
    method: POST
    headers:
      content_type: "application/json"
    payload: '{"wind": null}'
    value_template: "{{ value_json.wind | string | lower }}"
    scan_interval: 900  # 15 minutes
    json_attributes:
      - wind
      - fanSpeed
      - fanOn
      - lightOn
      - lightBrightness
      - fanDirection

switches.yaml


- platform: template
  switches:
    fan_breeze_mode_lr:
      friendly_name: "Fan Breeze Mode LR"
      value_template: "{{ is_state('input_boolean.fan_breeze_state_lr', 'on') }}"
      turn_on:
        - service: rest_command.breeze_on_mf_lr
        - service: input_boolean.turn_on
          target:
            entity_id: input_boolean.fan_breeze_state_lr
      turn_off:
        - service: rest_command.breeze_off_mf_lr
        - service: input_boolean.turn_off
          target:
            entity_id: input_boolean.fan_breeze_state_lr
      icon_template: >-
        {% if is_state('input_boolean.fan_breeze_state_lr', 'on') %}
          mdi:fan
        {% else %}
          mdi:fan-off
        {% endif %}

automations.yaml


- id: "sync_fan_breeze_state_lr"
  alias: Sync Fan Breeze State LR
  trigger:
    - platform: state
      entity_id: sensor.fan_breeze_status_lr
  action:
    - service: "input_boolean.turn_{{ 'on' if trigger.to_state.state == 'true' else 'off' }}"
      target:
        entity_id: input_boolean.fan_breeze_state_lr


  1. Entities card using card mod to overwrite the icon_template and use mdi:weather-windy with color change for on/off like the Modern Forms app.
entities:
  - entity: fan.living_room_fan
  - entity: switch.fan_breeze_mode_lr
    name: Breeze Mode LR
    icon: mdi:weather-windy
    card_mod:
      style: |
        :host {
          --paper-item-icon-color: 
            {% if is_state('switch.fan_breeze_mode_lr', 'on') %}
              #1E90FF; /* Blue for on */
            {% else %}
              #808080; /* Gray for off */
            {% endif %}
        }
title: MODERN FORMS
state_color: false
show_header_toggle: false
card_mod:
  style: |
    ha-card .card-header {
      font-family: 'Orbitron', cursive !important;
      font-size: 25px !important; /* Header size */
    }