substitutions: duct_fan_pin: GPIO14 duct_fan_spd_name: Prj3 Duct Fan Speed duct_fan_target_spd_in_name: Prj3 Duct Fan Target Speed In duct_fan_target_spd_prj_name: Prj3 Duct Fan Target Speed Prj duct_fan_target_spd_out_name: Prj3 Duct Fan Target Speed Out duct_fan_pwmfreq: 5000Hz duct_fan_off_spd: "0.0" duct_fan_lo_spd: "1.0" duct_fan_hi_spd: "100.0" prjpwr_pin: GPIO19 prjpwr_name: Prj3 Pwr dallas_pin: GPIO32 dallas_in_addr: "0x1F3C01D0756F0928" dallas_in_name: Prj3 Temp In dallas_prj_addr: "0x873C01D0756D4B28" dallas_prj_name: Prj3 Temp Prj dallas_out_addr: "0xA901143295610E28" dallas_out_name: Prj3 Temp Out dallas_update_interval: 30s globals: - id: duct_fan_off_spd type: float initial_value: ${duct_fan_off_spd} - id: duct_fan_lo_spd type: float initial_value: ${duct_fan_lo_spd} - id: duct_fan_hi_spd type: float initial_value: ${duct_fan_hi_spd} esphome: name: prj3 platform: ESP32 board: esp32doit-devkit-v1 wifi: ssid: "kungle-oss" password: "hcfU8@gG&8Hm" fast_connect: true manual_ip: static_ip: 192.168.35.192 gateway: 192.168.35.1 subnet: 255.255.255.0 # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Prj3 Fallback Hotspot" password: "xfPfYSP3N0C3" captive_portal: # Enable logging logger: # Enable Home Assistant API api: ota: switch: - platform: template name: Thermostat On id: thermostat_on_id optimistic: true output: - platform: ledc pin: ${duct_fan_pin} id: duct_fan_output_id frequency: ${duct_fan_pwmfreq} fan: - platform: speed id: duct_fan_spd_id output: duct_fan_output_id name: ${duct_fan_spd_name} dallas: - pin: number: ${dallas_pin} mode: INPUT_PULLUP update_interval: ${dallas_update_interval} sensor: - platform: dallas address: ${dallas_in_addr} name: ${dallas_in_name} id: dallas_in_id - platform: dallas address: ${dallas_prj_addr} name: ${dallas_prj_name} id: dallas_prj_id - platform: dallas address: ${dallas_out_addr} name: ${dallas_out_name} id: dallas_out_id number: - platform: template id: duct_fan_target_spd_in name: ${duct_fan_target_spd_in_name} optimistic: true min_value: ${duct_fan_lo_spd} max_value: ${duct_fan_hi_spd} step: 1 - platform: template id: duct_fan_target_spd_prj name: ${duct_fan_target_spd_prj_name} min_value: ${duct_fan_off_spd} max_value: ${duct_fan_hi_spd} step: 1 set_action: then: lambda: |- float lo_temp; float hi_temp; float curtemp; float off_spd; float lo_spd; float hi_spd; float newspd; lo_temp = id(thermostat_prj_id).target_temperature_low; hi_temp = id(thermostat_prj_id).target_temperature_high; curtemp = id(dallas_prj_id).state; off_spd = id(duct_fan_off_spd); lo_spd = id(duct_fan_lo_spd); hi_spd = id(duct_fan_hi_spd); if ((curtemp < lo_temp) || (id(thermostat_on_id).state == false)) { auto call = id(duct_fan_spd_id).turn_off(); call.perform(); return off_spd; } if (curtemp > hi_temp) { newspd = hi_spd; } else { // Set newspd to same linear proportion of spd range as current temp is of temp range newspd = lo_spd + ((hi_spd - lo_spd) * (curtemp - lo_temp) / (hi_temp - lo_temp)); } auto call = id(duct_fan_spd_id).turn_on(); call.set_speed(newspd); call.perform(); return newspd; - platform: template id: duct_fan_target_spd_out name: ${duct_fan_target_spd_out_name} optimistic: true min_value: ${duct_fan_off_spd} max_value: ${duct_fan_hi_spd} step: 1 # Dual-point thermostat climate: - platform: thermostat id: thermostat_prj_id name: Prj3 Prj sensor: dallas_prj_id visual: min_temperature: 60 °F max_temperature: 160 °F temperature_step: 1 default_mode: auto default_target_temperature_low: 78 °F default_target_temperature_high: 160 °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 Prj3 Thermostat" - switch.turn_off: thermostat_on_id idle_action: - logger.log: "Turning on Prj3 Thermostat" - switch.turn_on: thermostat_on_id cool_action: - logger.log: "WARNING: Prj3 Thermostat has hit high temp!" - switch.turn_on: thermostat_on_id #TODO - provide some kind of warning / action here # Sense when projector is turned on binary_sensor: - platform: gpio pin: ${prjpwr_pin} name: ${prjpwr_name} device_class: power