Skip to content

Instantly share code, notes, and snippets.

@quazzie
Last active April 12, 2021 17:54
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save quazzie/09ee3ef2c419ecbcf979a7410062481b to your computer and use it in GitHub Desktop.
Save quazzie/09ee3ef2c419ecbcf979a7410062481b to your computer and use it in GitHub Desktop.
esphome ifan02 cookbook info
#include "esphome.h"
using namespace esphome;
class IFan02Output : public Component, public FloatOutput {
public:
void write_state(float state) override {
if (state < 0.3) {
// OFF
digitalWrite(5, LOW);
digitalWrite(4, LOW);
digitalWrite(15, LOW);
} else if (state < 0.6) {
// low speed
digitalWrite(5, HIGH);
digitalWrite(4, LOW);
digitalWrite(15, LOW);
} else if (state < 0.9) {
// medium speed
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
digitalWrite(15, LOW);
} else {
// high speed
digitalWrite(5, HIGH);
digitalWrite(4, LOW);
digitalWrite(15, HIGH);
}
}
};
esphome:
name: ifan02
platform: ESP8266
board: esp8285
includes:
- ifan02.h
on_boot:
priority: 225
# turn off the light as early as possible
then:
- light.turn_off: ifan02_light
wifi:
ssid: <YOUR_SSID>
password: <YOUR_PASSWORD>
api:
logger:
ota:
binary_sensor:
- platform: gpio
id: vbutton_light
pin:
number: GPIO0
inverted: True
on_press:
then:
- light.toggle: ifan02_light
- platform: gpio
id: vbutton_relay_1
pin:
number: GPIO9
inverted: True
on_press:
then:
- switch.toggle: fan_relay1
- switch.turn_on: update_fan_speed
- platform: gpio
id: vbutton_relay_2
pin:
number: GPIO10
inverted: True
on_press:
then:
- switch.toggle: fan_relay2
- switch.turn_on: update_fan_speed
- platform: gpio
id: vbutton_relay_3
pin:
number: GPIO14
inverted: True
on_press:
then:
- switch.toggle: fan_relay3
- switch.turn_on: update_fan_speed
output:
- platform: custom
type: float
outputs:
id: fanoutput
lambda: |-
auto ifan02_fan = new IFan02Output();
App.register_component(ifan02_fan);
return {ifan02_fan};
- platform: gpio
pin: GPIO12
id: light_output
light:
- platform: binary
name: "iFan02 Light"
output: light_output
id: ifan02_light
switch:
- platform: template
id: update_fan_speed
optimistic: True
turn_on_action:
then:
- delay: 200ms
- if:
condition:
and:
- switch.is_off: fan_relay1
- switch.is_off: fan_relay2
- switch.is_off: fan_relay3
then:
- fan.turn_off: ifan02_fan
- if:
condition:
and:
- switch.is_on: fan_relay1
- switch.is_off: fan_relay2
- switch.is_off: fan_relay3
then:
- fan.turn_on:
id: ifan02_fan
speed: LOW
- if:
condition:
and:
- switch.is_on: fan_relay1
- switch.is_on: fan_relay2
- switch.is_off: fan_relay3
then:
- fan.turn_on:
id: ifan02_fan
speed: MEDIUM
- if:
condition:
and:
- switch.is_on: fan_relay1
- switch.is_off: fan_relay2
- switch.is_on: fan_relay3
then:
- fan.turn_on:
id: ifan02_fan
speed: HIGH
- switch.turn_off: update_fan_speed
- platform: gpio
pin: GPIO5
id: fan_relay1
- platform: gpio
pin: GPIO4
id: fan_relay2
- platform: gpio
pin: GPIO15
id: fan_relay3
fan:
- platform: speed
output: fanoutput
id: ifan02_fan
name: "iFan02 Fan"
@DeeBeeKay
Copy link

Hi @rishabmehta7. I'm glad things are working out for you.

Unfortunately, MQTT is a little more complicated than simply swapping API for MQTT. Explaining the MQTT protocol is a little outside my paygrade; but there really are lots of very helpful videos on youtube by people more clever than I am.

But basically, here's how it works in a nutshell. With MQTT, devices don't talk directly to each other. Instead, they all talk to one central MQTT broker, a server component that manages these conversations in Topics - very much like threads here on github. Devices can post into topics, but they can also subscribe to topics, to be notified about changes.

So you need to be running a Broker, and there's one in the Integrations list of Home Assistant, called Mosquitto.

You can think of the broker like a bulletin board, and the devices are all posting into their own threads. So your fan might have a thread on the broker called house\lounge\fan1. When it turns on, it makes a post in the thread saying, "hey guys, I'm turning on now".

If you have a power failure, then when the power comes back on, everything that uses MQTT gets reset back to whatever the last post in each thread was.

Long story short, every device (like your fan) needs to be configured with its own Topic, and you will also need to define what messages, when posted to that topic, will be used to turn things on and off.

This is kind of why I suggested using Tasmota for this, not just because it already has iFan compatibility built in, but because it comes pre-configured with MQTT, so you just need to give the fan a topic name in the Tasmota settings window. After that, you enable discovery (HA discovery is not on by default in Tasmota), and HA will just pick it up after a few minutes.

Best of luck!

@CallMeAreks
Copy link

CallMeAreks commented Apr 14, 2020

Sometimes when I have a power outage it takes a really long time for the fan to be available in home assistant and sadly I have to bear with the heat until it comes back which annoys the hell out of my girlfriend. How can I make it turn on in high at boot? That way after a power outage at least I have it working until it comes online again. @quazzie

I think I can add it like this :

  on_boot:
    priority: 225
    # turn off the light as early as possible
    then:
      - light.turn_off: light_relay
      - switch.turn_on: fan_relay1
      - switch.turn_on: fan_relay3

But I'm unsure whether I need to do anything with update_fan_speed or not.

EDIT:

Ok I think I figured it out. For people that want to turn the fan on right after boot:

esphome:
  name: bedroom_fan
  platform: ESP8266
  board: esp8285
  includes:
    - ifan02.h
  on_boot:
    priority: 225
    # turn off the light as early as possible
    then:
      - light.turn_off: light_relay
      - switch.turn_on: fan_relay1
      - switch.turn_on: fan_relay3

The relevant parts are the relay1 and 3 being turned on at boot. That turns the fan at high speed but doesn't update home assistant.

From here there are two options. Either you add switch.turn_on: update_fan_speed at the bottomof the on_boot actions (which in my case it doesn't work because in case of a power outage HA isn't available yet due to the router being resetting), or find another place to make the update. I opted for the latter:

For that I added a binary sensor of platform status and made the on_state event check if the API is connected and then push the update to HA.

  - platform: status
    id: node_status
    on_state:
      if:
        condition:
          api.connected:
        then:
          - switch.turn_on: update_fan_speed

@docvipul
Copy link

'esp8266_restore_from_flash' option can help to restore settings after power failure and 'api.connected' condition can be used to prevent the early turning on of light component. Has anyone succeded in turing this code 'power failure resistant'?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment