substitutions: device_name: rack-2 dn: rack_2 sn: R2 friendly_name: Rack 2 ts_wants_name: ${friendly_name} Thermostat Wants df_attic_pin: GPIO13 df_attic_name: ${friendly_name} Attic Duct Fan df_attic_ovrr_spd_name: ${friendly_name} Attic Duct Fan Override Spd df_attic_ovrr_sw_name: ${friendly_name} Attic Duct Fan Override df_attic_pwmfreq: 5000Hz df_attic_off_spd: "0.0" df_attic_lo_spd: "1.0" df_attic_init_spd: "60.0" df_attic_hi_spd: "100.0" df_attic_tach_pin: GPIO12 df_attic_tach_id: df_attic_tach_id df_attic_tach_name: ${friendly_name} Attic Duct Fan Tach # AC Infiniti S8 seems to get up to 9300, so lets divide by 100 df_attic_tach_multiplier: "0.01" df_lndry_pin: GPIO19 df_lndry_name: ${friendly_name} Laundry Duct Fan df_lndry_ovrr_spd_name: ${friendly_name} Laundry Duct Fan Override Spd df_lndry_ovrr_sw_name: ${friendly_name} Laundry Duct Fan Override df_lndry_pwmfreq: 5000Hz df_lndry_off_spd: "0.0" df_lndry_lo_spd: "20.0" df_lndry_init_spd: "40.0" df_lndry_hi_spd: "100.0" df_lndry_tach_pin: GPIO18 df_lndry_tach_id: df_lndry_tach_id df_lndry_tach_name: ${friendly_name} Laundry Duct Fan Tach # AC Infiniti S6 seems to get up to 43,000 at 90% so lets divide by 500 df_lndry_tach_multiplier: "0.002" # wall_fan_pwr_pin: GPIO21 # wall_fan_pwr_name: ${friendly_name} Wall Fan Power # wall_fan_spd_pin: GPIO22 # wall_fan_spd_pwmfreq: 25000Hz # wall_fan_spd_name: ${friendly_name} Wall Fan Speed # wall_fan_tach_pin: GPIO23 # wall_fan_tach_id: wall_fan_tach_id # wall_fan_tach_name: ${friendly_name} Wall Fan Tach dallas_pin: GPIO32 dallas_in_addr: "0x1D02131D6063AA28" dallas_in_name: ${friendly_name} Temp In dallas_out_addr: "0x1D01143296570128" dallas_out_name: ${friendly_name} Temp Out dallas_update_interval: 30s globals: - id: df_attic_off_spd_id type: float initial_value: ${df_attic_off_spd} - id: df_attic_lo_spd_id type: float initial_value: ${df_attic_lo_spd} - id: df_attic_hi_spd_id type: float initial_value: ${df_attic_hi_spd} - id: df_lndry_off_spd_id type: float initial_value: ${df_lndry_off_spd} - id: df_lndry_lo_spd_id type: float initial_value: ${df_lndry_lo_spd} - id: df_lndry_hi_spd_id type: float initial_value: ${df_lndry_hi_spd} <<: !include .common.yaml <<: !include .wifi-oss.yaml esphome: name: ${dn} platform: ESP32 board: esp32doit-devkit-v1 on_boot: - priority: 200.0 then: # - output.set_level: # id: df_attic_output_id # level: ${df_attic_init_spd}% - output.set_level: id: df_lndry_output_id level: ${df_lndry_init_spd}% output: - platform: ledc pin: ${df_attic_pin} id: df_attic_output_id channel: 0 frequency: ${df_attic_pwmfreq} - platform: ledc pin: ${df_lndry_pin} id: df_lndry_output_id channel: 2 frequency: ${df_lndry_pwmfreq} # - platform: ledc # pin: ${wall_fan_spd_pin} # id: wall_fan_spd_id # channel: 2 # frequency: ${wall_fan_spd_pwmfreq} fan: - platform: speed id: df_attic_spd_id output: df_attic_output_id name: ${df_attic_name} - platform: speed id: df_lndry_spd_id output: df_lndry_output_id name: ${df_lndry_name} # - platform: speed # output: wall_fan_spd_id # name: ${wall_fan_spd_name} dallas: - pin: number: ${dallas_pin} mode: INPUT_PULLUP update_interval: ${dallas_update_interval} sensor: - platform: pulse_counter pin: number: ${df_attic_tach_pin} mode: INPUT_PULLUP unit_of_measurement: '%' name: ${df_attic_tach_name} update_interval: 10s filters: - multiply: ${df_attic_tach_multiplier} - platform: pulse_counter pin: number: ${df_lndry_tach_pin} mode: INPUT_PULLUP unit_of_measurement: '%' name: ${df_lndry_tach_name} update_interval: 10s filters: - multiply: ${df_lndry_tach_multiplier} # - platform: pulse_counter # pin: # number: ${wall_fan_tach_pin} # mode: INPUT_PULLUP # unit_of_measurement: 'RPM' # name: ${wall_fan_tach_name} # update_interval: 10s # filters: # - multiply: 0.5 - platform: dallas address: ${dallas_in_addr} name: ${dallas_in_name} - platform: dallas address: ${dallas_out_addr} name: ${dallas_out_name} id: dallas_out_id binary_sensor: - platform: homeassistant name: "Ventilate House" entity_id: binary_sensor.ventilate_house id: ventilate_house - platform: homeassistant name: "Windows Open" entity_id: binary_sensor.windows_open id: windows_open switch: # - platform: gpio # pin: ${wall_fan_pwr_pin} # name: ${wall_fan_pwr_name} - platform: template name: ${df_attic_ovrr_sw_name} id: df_attic_ovrr optimistic: true on_turn_on: then: lambda: |- ESP_LOGD("speed_fan", "Setting Attic Fan per Override: %f", id(df_attic_ovrr_spd_id).state); auto call = id(df_attic_spd_id).turn_on(); call.set_speed(id(df_attic_ovrr_spd_id).state); call.perform(); on_turn_off: then: - logger.log: "Attic Fan Override turned off." - fan.turn_off: df_attic_spd_id - platform: template name: ${df_lndry_ovrr_sw_name} id: df_lndry_ovrr optimistic: true on_turn_on: then: lambda: |- ESP_LOGD("speed_fan", "Setting Laundry Fan per Override: %f", id(df_attic_ovrr_spd_id).state); auto call = id(df_lndry_spd_id).turn_on(); call.set_speed(id(df_lndry_ovrr_spd_id).state); call.perform(); on_turn_off: then: - logger.log: "Laundry Fan Override turned off." - fan.turn_off: df_lndry_spd_id number: - platform: template id: df_attic_ovrr_spd_id name: ${df_attic_ovrr_spd_name} optimistic: true min_value: 0.0 max_value: ${df_attic_hi_spd} step: 10 initial_value: ${df_attic_init_spd} on_value: then: if: condition: switch.is_on: df_attic_ovrr then: lambda: |- auto call = id(df_attic_spd_id).turn_on(); call.set_speed(x); call.perform(); - platform: template id: df_lndry_ovrr_spd_id name: ${df_lndry_ovrr_spd_name} optimistic: true min_value: 0.0 max_value: ${df_lndry_hi_spd} step: 10 initial_value: ${df_lndry_init_spd} on_value: then: if: condition: switch.is_on: df_lndry_ovrr then: lambda: |- auto call = id(df_lndry_spd_id).turn_on(); call.set_speed(x); call.perform(); - platform: template id: ts_wants_id name: ${ts_wants_name} optimistic: true min_value: 0 max_value: 100 step: 1 time: platform: sntp on_time: - seconds: /10 then: - logger.log: "...on_time..." - number.set: id: ts_wants_id value: !lambda |- float lo_temp; float hi_temp; float curtemp; float newpct; curtemp = id(dallas_out_id).state; lo_temp = id(ts_out_id).target_temperature_low; hi_temp = id(ts_out_id).target_temperature_high; newpct = ((curtemp - lo_temp) / (hi_temp - lo_temp)) * 100; if (newpct < 0) { newpct = 0; } if (newpct > 100) { newpct = 100; } ESP_LOGD("cron", "DEBUG Thermostat Wants percent: %f", newpct); return newpct; - if: condition: and: - binary_sensor.is_on: ventilate_house - switch.is_off: df_attic_ovrr then: # Set Attic fan to at least Ventilate Speed # Turn Laundry fan off - lambda: |- float lo_spd; float hi_spd; float ovrr_spd; float ts_wants_pct; float ts_wants_spd; float new_spd; lo_spd = id(df_attic_lo_spd_id); hi_spd = id(df_attic_hi_spd_id); ovrr_spd = id(df_attic_ovrr_spd_id).state; ts_wants_pct = id(ts_wants_id).state; ts_wants_spd = lo_spd + ((hi_spd - lo_spd) * ts_wants_pct / 100); ESP_LOGD("cron", "DEBUG Thermostat Wants Attic Fan Speed: %f", ts_wants_spd); ESP_LOGD("cron", "DEBUG Ventilate Wants Attic Fan Speed: %f", ovrr_spd); if (ovrr_spd > ts_wants_spd) { new_spd = ovrr_spd; } else { new_spd = ts_wants_spd; } ESP_LOGD("cron", "DEBUG Setting Attic Fan Speed: %f", new_spd); auto call = id(df_attic_spd_id).turn_on(); call.set_speed(new_spd); call.perform(); - if: condition: and: - binary_sensor.is_off: ventilate_house - switch.is_off: df_lndry_ovrr then: # Set Laundry fan per thermostat - lambda: |- float lo_spd; float hi_spd; float ts_wants_pct; float ts_wants_spd; lo_spd = id(df_lndry_lo_spd_id); hi_spd = id(df_lndry_hi_spd_id); ts_wants_pct = id(ts_wants_id).state; ts_wants_spd = lo_spd + ((hi_spd - lo_spd) * ts_wants_pct / 100); ESP_LOGD("cron", "DEBUG Thermostat Wants Laundry Fan Speed: %f", ts_wants_spd); ESP_LOGD("cron", "DEBUG Setting Laundry Fan Speed: %f", ts_wants_spd); auto call = id(df_lndry_spd_id).turn_on(); call.set_speed(ts_wants_spd); call.perform(); # Dual-point thermostat climate: - platform: thermostat id: ts_out_id name: ${friendly_name} Out sensor: dallas_out_id visual: min_temperature: 60 °F max_temperature: 100 °F temperature_step: 1 default_preset: Default preset: - name: Default mode: auto default_target_temperature_low: 75 °F default_target_temperature_high: 100 °F min_cooling_off_time: 60s min_cooling_run_time: 60s min_heating_off_time: 60s min_heating_run_time: 60s min_idle_time: 60s heat_action: - logger.log: "Turning off ${friendly_name} Thermostat" - number.set: id: ts_wants_id value: 0 idle_action: - logger.log: "Turning on ${friendly_name} Thermostat" - number.set: id: ts_wants_id value: !lambda |- float lo_temp; float hi_temp; float curtemp; float newpct; curtemp = id(dallas_out_id).state; lo_temp = id(ts_out_id).target_temperature_low; hi_temp = id(ts_out_id).target_temperature_high; newpct = ((curtemp - lo_temp) / (hi_temp - lo_temp)) * 100; ESP_LOGD("thermostat", "DEBUG Thermostat Wants: %f", newpct); return newpct; cool_action: - logger.log: "WARNING: ${friendly_name} Thermostat has hit high temp!" - number.set: id: ts_wants_id value: 100 #TODO - provide some kind of warning / action here