-
-
Save quazzie/09ee3ef2c419ecbcf979a7410062481b to your computer and use it in GitHub Desktop.
#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" |
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
'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'?
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!