Add bathroom-fan.yaml
This commit is contained in:
231
bathroom-fan.yaml
Normal file
231
bathroom-fan.yaml
Normal file
@@ -0,0 +1,231 @@
|
||||
substitutions:
|
||||
deviceName: "Bathroom Fan"
|
||||
deviceLowerCaseName: "bathroom-fan"
|
||||
deviceComment: "ElectroDragon Extractor Fan"
|
||||
# Onboard status LED
|
||||
pinStatusLED: "10"
|
||||
# The pins controlling the RGBW terminals
|
||||
pinWhite: "04"
|
||||
pinBlue: "05"
|
||||
pinGreen: "06"
|
||||
pinRed: "07"
|
||||
# One pin can be switched to 5v out signalling, which we use for the Fan PWM signalling
|
||||
pinWS28xx: "09"
|
||||
# We need pins for: IR sensor, Fan RPM sensor, and i2c (SDA+SCL)
|
||||
pinPIR: "01"
|
||||
pinRPM: "03"
|
||||
pinSDA: "02"
|
||||
pinSCL: "08"
|
||||
|
||||
########################################################
|
||||
## General setup of device, network etc ##
|
||||
########################################################
|
||||
|
||||
esphome:
|
||||
name: "${deviceLowerCaseName}"
|
||||
friendly_name: "${deviceName}"
|
||||
comment: "${deviceComment}"
|
||||
|
||||
esp32:
|
||||
board: esp32-c3-devkitm-1
|
||||
framework:
|
||||
type: arduino
|
||||
|
||||
# Enable logging
|
||||
logger:
|
||||
|
||||
# Enable Home Assistant API
|
||||
api:
|
||||
encryption:
|
||||
key: !secret api_enckey
|
||||
|
||||
ota:
|
||||
password: !secret ota_password
|
||||
platform: esphome
|
||||
|
||||
wifi:
|
||||
ssid: !secret wifi_ssid # Set your SSID in ESPHome's Secret file
|
||||
password: !secret wifi_password # Set your WiFi password in ESPHome's Secret file
|
||||
|
||||
# Enable fallback hotspot (captive portal) in case wifi connection fails
|
||||
# Note: ESP32-C3s can get stuck in boot-loop if this or captive_portal is removed (known issue)
|
||||
ap:
|
||||
ssid: "AP-${deviceName}"
|
||||
password: "ESPHOME" # Consider changing this
|
||||
|
||||
captive_portal:
|
||||
|
||||
|
||||
#####################################################
|
||||
## Setup of Status Light ##
|
||||
## Off when running, blinks in case or error ##
|
||||
#####################################################
|
||||
|
||||
light:
|
||||
- platform: status_led # Oboard status_led indicates errors/warnings during boot + operation
|
||||
id: statusled
|
||||
name: "Status LED"
|
||||
pin: ${pinStatusLED}
|
||||
disabled_by_default: True # No need to reflect in Home Assistant
|
||||
|
||||
|
||||
|
||||
#####################################################
|
||||
## Setup of Fan ##
|
||||
## ##
|
||||
#####################################################
|
||||
|
||||
power_supply: # Optional control of fan to switch off power completely
|
||||
- id: fanPower
|
||||
pin: ${pinBlue}
|
||||
|
||||
output: # PMW control of fan using the LEDC platform
|
||||
- platform: ledc
|
||||
pin: ${pinWS28xx}
|
||||
id: fanPin
|
||||
power_supply: fanPower # Which pin to use to turn off Fan completely
|
||||
frequency: 19531Hz # Higher frequency, but only 12-bit resolution (4096 gradiant steps)
|
||||
|
||||
fan: # Very basic fan with no oscilation etc control
|
||||
- platform: speed
|
||||
output: fanPin
|
||||
#oscillation:
|
||||
#direction_output:
|
||||
speed_count: 100
|
||||
name: "Extractor Fan"
|
||||
id: Extractor
|
||||
restore_mode: ALWAYS_ON # Default to turning on, to help with installation
|
||||
icon: mdi:fan
|
||||
|
||||
|
||||
#####################################################
|
||||
## Setup of Sensors: ##
|
||||
## Motion (IR), Humidity, Temperatur ##
|
||||
#####################################################
|
||||
|
||||
# Need i2c bus to control the humidity+temperature sensor
|
||||
i2c:
|
||||
sda: ${pinSDA}
|
||||
scl: ${pinSCL}
|
||||
scan: true
|
||||
id: bus_a
|
||||
|
||||
## PIR Sensor AM312
|
||||
binary_sensor:
|
||||
- platform: gpio
|
||||
name: "Motion" # IR Presense detection, halves fan speed
|
||||
id: pirSensor # ToDo: Call script to trigger immediately
|
||||
pin:
|
||||
number: ${pinPIR}
|
||||
mode:
|
||||
input: True
|
||||
pulldown: True
|
||||
device_class: motion
|
||||
filters:
|
||||
- delayed_off: 180s
|
||||
|
||||
sensor:
|
||||
- platform: pulse_meter # Warning: Not been tested, TACHO impulses fried ESP32 somehow
|
||||
name: "RPM"
|
||||
id: rpmSensor
|
||||
unit_of_measurement: 'RPM'
|
||||
state_class: measurement
|
||||
accuracy_decimals: 0
|
||||
pin:
|
||||
number: ${pinRPM}
|
||||
inverted: true
|
||||
mode:
|
||||
input: true
|
||||
pullup: true
|
||||
filters:
|
||||
- multiply: 0.5 # 2 impulses per rotation, /2 to get RPM
|
||||
- throttle_average: 10s # Only update every 10 seconds
|
||||
- filter_out: nan
|
||||
- delta: 10% # And further reduce updates if change is small
|
||||
|
||||
- platform: sht3xd # Temp + Humidity sensor
|
||||
address: 0x44
|
||||
update_interval: 60s # Faster interval gives smoother fan speed changes, but also spams logs
|
||||
temperature:
|
||||
name: "Temperature" # We only use Temp for information. SHT3x uses it for Relative Humidity
|
||||
id: temp
|
||||
humidity:
|
||||
name: "Humidity"
|
||||
id: humid
|
||||
filters:
|
||||
- clamp: # Clamp to get rid of bad readings
|
||||
min_value: 0.1
|
||||
max_value: 99.9
|
||||
ignore_out_of_range: true
|
||||
- delta: 2.0 # Don't react to every small change
|
||||
on_value:
|
||||
then:
|
||||
if:
|
||||
condition:
|
||||
sensor.in_range: # We're always in range due to the Clamp above
|
||||
id: humid
|
||||
above: 0
|
||||
below: 100
|
||||
then:
|
||||
- lambda: |- # ToDo: Convert to script and call it
|
||||
float cutoff = id(lowHumCutoff).state;
|
||||
|
||||
// Doing linear transform here because we need the id(lowHumCutoff) variable
|
||||
// Max is 100 at 80%
|
||||
// Min is 25 at cutoff%
|
||||
// linear equation y = mx + c
|
||||
// = ((100-25) / (80 - $C$5)) * B8 + (100 - (((100-25) / (80 - $C$5))*80))
|
||||
float speed = (75/(80-cutoff)) * x + (100-((75/ (80-cutoff))*80));
|
||||
|
||||
// Clamp between 25 and 100
|
||||
if( x <= cutoff )
|
||||
speed = 25;
|
||||
if( x >= 80)
|
||||
speed = 100;
|
||||
|
||||
// Test if we need to go slow
|
||||
if( id(quietModeSwitch).state || id(pirSensor).state )
|
||||
speed = speed / 2;
|
||||
|
||||
// Turn the fan on and set the speed, or turn off
|
||||
if( x >= cutoff )
|
||||
{
|
||||
auto call = id(Extractor).turn_on();
|
||||
call.set_speed(speed);
|
||||
call.perform();
|
||||
}
|
||||
else
|
||||
{
|
||||
auto call = id(Extractor).turn_off();
|
||||
call.perform();
|
||||
}
|
||||
|
||||
|
||||
#####################################################
|
||||
## Setup of Home Assistant controls ##
|
||||
## "Quiet Mode", "Low Humidity Cutoff" ##
|
||||
#####################################################
|
||||
|
||||
switch:
|
||||
- platform: template
|
||||
name: "Quiet Mode" # Quiet Mode halves the fan-speed, similar to Presence Detection
|
||||
id: quietModeSwitch
|
||||
optimistic: True
|
||||
# turn_on_action: # ToDo: Allow switch to control fan speed immediately via script
|
||||
# - switch.turn_on: switch2
|
||||
# turn_off_action:
|
||||
# - switch.turn_on: switch1
|
||||
|
||||
number:
|
||||
- platform: template # Control in Home Assistant to set point where fan should turn off
|
||||
id: lowHumCutoff
|
||||
name: "Low Humidity Cutoff"
|
||||
icon: mdi:waterpercent
|
||||
disabled_by_default: True # User has to activate the control in the HASS UI
|
||||
entity_category: ""
|
||||
optimistic: True
|
||||
min_value: 1
|
||||
max_value: 100
|
||||
step: 1
|
||||
initial_value: 35 # 35% rel humidity is slightly high as low cutoff
|
||||
restore_value: True
|
||||
Reference in New Issue
Block a user