Skip to content

Instantly share code, notes, and snippets.

@grischard
Created July 14, 2021 10:16
Show Gist options
  • Save grischard/831e3c0d083527aa7b7ba2e12ef7520b to your computer and use it in GitHub Desktop.
Save grischard/831e3c0d083527aa7b7ba2e12ef7520b to your computer and use it in GitHub Desktop.
Hob2Hood for esphome with four relays. Works with esphome 1.16.0, needs updating for more recent versions. Three push buttons: light, fan up, fan down. Four relays: light, fan 1, fan 2, fan 3.
substitutions:
device: smarthood
name: Smart Hood
reboot_timeout: 1h
update_interval: 60s
delayed_on_off: 20ms
pin_relay_lamp: D0
pin_relay_fan1: D3
pin_relay_fan2: D2
pin_relay_fan3: D1
pin_button_lamp: D4
pin_button_up: D5
pin_button_down: D6
pin_IR: D7
# D8 empty, output only, and locks on start if I connect it to a relay (pulled high)
esphome:
name: ${device}
platform: ESP8266
board: nodemcuv2
# Boilerplate: wifi, api, ota, web server, text sensors
<<: !include common/common.yaml
# Boilerplate: logging
<<: !include common/logger.yaml
# Boilerplate: wifi signal, uptime
<<: !include common/sensors.yaml
remote_receiver:
pin:
number: ${pin_IR}
# Don't invert, despite what the log says
mode: INPUT_PULLUP
# dump: all
switch:
- platform: gpio
id: fan_low_relay
pin:
number: ${pin_relay_fan1}
inverted: yes
restore_mode: ALWAYS_OFF
interlock: &interlock_group [fan_low, fan_med, fan_high]
interlock_wait_time: 100ms
- platform: gpio
id: fan_med_relay
pin:
number: ${pin_relay_fan2}
inverted: yes
restore_mode: ALWAYS_OFF
interlock: *interlock_group
interlock_wait_time: 100ms
- platform: gpio
id: fan_high_relay
pin:
number: ${pin_relay_fan3}
inverted: yes
restore_mode: ALWAYS_OFF
interlock: *interlock_group
interlock_wait_time: 100ms
- platform: gpio
id: relay_light
name: Light
restore_mode: ALWAYS_OFF
pin:
inverted: yes
number: ${pin_relay_lamp}
- platform: template
id: fan_off
lambda: |-
if (id(fan_hood).state){
return false;
} else {
return true;
}
turn_on_action:
- fan.turn_off:
id: fan_hood
- platform: template
id: fan_low
turn_on_action:
- fan.turn_on:
id: fan_hood
speed: LOW
- platform: template
id: fan_med
turn_on_action:
- fan.turn_on:
id: fan_hood
speed: MEDIUM
- platform: template
id: fan_high
turn_on_action:
- fan.turn_on:
id: fan_hood
speed: HIGH
binary_sensor:
- !include common/binary_sensor/status.yaml
- platform: gpio
pin:
number: ${pin_button_up}
mode: INPUT_PULLUP
inverted: yes
id: button_up
filters:
- delayed_on_off: ${delayed_on_off}
on_press:
then:
- lambda: |-
if (id(fan_hood).state) {
if (id(fan_hood).speed == 0) {
id(fan_med).turn_on();
ESP_LOGD("main", "Fan set to Medium");
} else {
if (id(fan_hood).speed == 1){
id(fan_high).turn_on();
ESP_LOGD("main", "Fan set to High");
} else {
ESP_LOGD("main", "Captain, I'm giving her all she's got!");
}
}
} else {
id(fan_low).turn_on();
ESP_LOGD("main", "Fan set to Low");
}
- platform: gpio
pin:
number: ${pin_button_down}
mode: INPUT_PULLUP
inverted: yes
filters:
- delayed_on_off: ${delayed_on_off}
id: button_down
on_press:
then:
- lambda: |-
if (id(fan_hood).state) {
if (id(fan_hood).speed == 0) {
id(fan_off).turn_on();
ESP_LOGD("main", "Fan set to Off");
} else {
if (id(fan_hood).speed == 1){
id(fan_low).turn_on();
ESP_LOGD("main", "Fan set to Low");
} else {
id(fan_med).turn_on();
ESP_LOGD("main", "Fan set to Medium");
}
}
} else {
ESP_LOGD("main", "He's dead, Jim");
}
- platform: gpio
pin:
number: ${pin_button_lamp}
mode: INPUT_PULLUP
inverted: yes
id: button_light
filters:
- delayed_on_off: ${delayed_on_off}
on_press:
then:
- switch.toggle: relay_light
# IR codes from https://github.com/JameZUK/hob2hood-RAW-IR-Codes
- platform: remote_receiver
id: Hob2Hood_Speed_Off
raw:
code: [-720, 1468, -722, 1470, -2114, 1472, -722, 1470, -1416, 2218, -724, 1470, -724, 720, -698]
on_press:
then:
- fan.turn_off:
id: fan_hood
- platform: remote_receiver
id: Hob2Hood_Speed_Low
raw:
code: [-1416, 1494, -722, 1570, -1974, 1510, -722, 1468, -726, 718, -724, 1468, -724, 2216, -696]
on_press:
then:
- fan.turn_on:
id: fan_hood
speed: LOW
- platform: remote_receiver
id: Hob2Hood_Speed_Medium
raw:
code: [-1440, 1472, -724, 2936, -752, 2190, -3530, 2224, -2114]
on_press:
then:
- fan.turn_on:
id: fan_hood
speed: MEDIUM
- platform: remote_receiver
id: Hob2Hood_Speed_High
raw:
code: [-696, 2240, -2784, 2968, -2116, 750, -724, 2216, -2114]
on_press:
then:
- fan.turn_on:
id: fan_hood
speed: HIGH
- platform: remote_receiver
id: Hob2Hood_Speed_Turbo
raw:
code: [-1416, 2244, -1418, 722, -1418, 2216, -1418, 1470, -724, 2216, -722, 722, -1392]
on_press:
then:
- fan.turn_on:
id: fan_hood
speed: HIGH
- platform: remote_receiver
id: Hob2Hood_Light_On
raw:
#code: [-654, 1525, -626, 802, -1330, 802, -626, 1524, -627, 774, -1354, 2975, -626, 800, -627, 800, -1327]
code: [-718, 1472, -720, 726, -1388, 752, -718, 1472, -694, 750, -1390, 2994, -720, 724, -720, 726, -1386]
on_press:
then:
- switch.turn_on:
id: relay_light
- platform: remote_receiver
id: Hob2Hood_Light_Off
raw:
code: [-684, 1488, -658, 778, -684, 758, -686, 2278, -660, 788, -628, 1532, -688, 1504, -686, 786, -658]
on_press:
then:
- switch.turn_off:
id: relay_light
output:
- platform: template
id: fanoutput
type: float
write_action:
- if:
condition:
lambda: return ((state < 0.33));
then:
# action for off
- switch.turn_off: fan_low_relay
- switch.turn_off: fan_med_relay
- switch.turn_off: fan_high_relay
- if:
condition:
lambda: return ((state > 0) && (state < .34));
then:
# action for low
- switch.turn_off: fan_med_relay
- switch.turn_off: fan_high_relay
- switch.turn_on: fan_low_relay
- if:
condition:
lambda: return ((state > .34) && (state < .7));
then:
# action for medium
- switch.turn_off: fan_low_relay
- switch.turn_off: fan_high_relay
- switch.turn_on: fan_med_relay
- if:
condition:
lambda: return ((state > 0.99));
then:
# action for high
- switch.turn_off: fan_low_relay
- switch.turn_off: fan_med_relay
- switch.turn_on: fan_high_relay
fan:
- platform: speed
output: fanoutput
id: fan_hood
name: "Fan"
@maartenaalbers
Copy link

Hi, thanks for the nice config!
One small question: which kind of IR receiver are you using with ESPHOME? I've a HX1838 laying around here, would that be an option?
Thanks in advance!

@grischard
Copy link
Author

Hi Maarten! Glad it looks useful to you. The HX1838 looks a lot fancier than what I used, which was a simple Vishay TSOP38438. The receiver on your kit, the VS1838, didn't give me good results with bright lights, which you tend to have in a kitchen. As always, your mileage may vary.

https://www.analysir.com/blog/2014/12/08/infrared-receiver-showdown-tsop34438-vs-vs1838b-winner-revealed/ has a comparison. The TSOP38438 is a successor of the TSOP34438 in that test, but whatever you can get should work well.

@maartenaalbers
Copy link

Hi, thanks for the response!
I ordered a TSOP38438 at a local supplier. I will fork the code to make it sensor only, my actual hood is already controlled over wifi.

@grischard
Copy link
Author

Oh cool! Were you able to reverse engineer the wifi protocol it uses?

@mihaimdinca
Copy link

This would definitely be a different thread, but, as you obviously have a good understanding on how esphome works with the hob2hood protocol, do you mind attempting making a yaml for a hob2hood ir transmitter? I would be more than happy to test it if required. Thank you!

@grischard
Copy link
Author

@mihaimdinca unfortunately I don't have a transmitter to test anymore. You should be able to ask chatgpt to convert https://github.com/JameZUK/hob2hood-RAW-IR-Codes for you.

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