diff --git a/projector_3.yaml b/projector_3.yaml index 6453190..5007ae1 100644 --- a/projector_3.yaml +++ b/projector_3.yaml @@ -1,37 +1,52 @@ substitutions: - duct_fan_pin: GPIO14 - duct_fan_id: duct_fan_id - duct_fan_pwmfreq: 5000Hz - duct_fan_spd_id: duct_fan_spd_id - duct_fan_spd_name: pj_3_duct_fan_spd - # heat_pin: GPIO19 - # heat_name: "Denon Pwr" + duct_fan_pin: GPIO14 + duct_fan_spd_name: Prj3 Duct Fan Speed + duct_fan_spd_target_in_name: Prj3 Duct Fan Target Speed In + duct_fan_spd_target_out_name: Prj3 Duct Fan Target Speed Out + duct_fan_pwmfreq: 5000Hz + duct_fan_off_spd: "0.0" + duct_fan_lo_spd: "10.0" + duct_fan_hi_spd: "100.0" + prjpwr_pin: GPIO19 + prjpwr_name: Prj3 Pwr dallas_pin: GPIO32 - dallas_1_addr: "0x1F3C01D0756F0928" - dallas_1_name: pj_3_temp_cold - dallas_2_addr: "0x873C01D0756D4B28" - dallas_2_name: pj_3_temp_prj_exh - dallas_3_addr: "0xA901143295610E28" - dallas_3_name: pj_3_temp_box_exh + 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: pj_3 + name: prj3 platform: ESP32 - board: esp32doit-devkit-v1 + board: esp32doit-devkit-v1 wifi: - ssid: "kungle-oss" - password: "hcfU8@gG&8Hm" + 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 + gateway: 192.168.35.1 + subnet: 255.255.255.0 # Enable fallback hotspot (captive portal) in case wifi connection fails ap: - ssid: "Projector 3 Fallback Hotspot" + ssid: "Prj3 Fallback Hotspot" password: "xfPfYSP3N0C3" captive_portal: @@ -44,63 +59,116 @@ api: ota: +switch: + - platform: template + name: Thermostat On + id: thermostat_on_id + optimistic: true + output: - platform: ledc pin: ${duct_fan_pin} - id: ${duct_fan_id} + id: duct_fan_output_id frequency: ${duct_fan_pwmfreq} fan: - platform: speed - id: ${duct_fan_spd_id} - output: ${duct_fan_id} + id: duct_fan_spd_id + output: duct_fan_output_id name: ${duct_fan_spd_name} - # speed: - # low: 0.2 - # medium: 0.6 - # high: 1.0 dallas: - pin: number: ${dallas_pin} mode: INPUT_PULLUP - update_interval: 10s + update_interval: ${dallas_update_interval} sensor: - platform: dallas - address: ${dallas_1_addr} - name: ${dallas_1_name} + address: ${dallas_in_addr} + name: ${dallas_in_name} + id: dallas_in_id - platform: dallas - address: ${dallas_2_addr} - name: ${dallas_2_name} + address: ${dallas_prj_addr} + name: ${dallas_prj_name} + id: dallas_prj_id - platform: dallas - address: ${dallas_3_addr} - name: ${dallas_3_name} + address: ${dallas_out_addr} + name: ${dallas_out_name} + id: dallas_out_id -# # Sense when receiver is turned on -# binary_sensor: -# - platform: gpio -# pin: ${heat_pin} -# name: ${heat_name} -# device_class: power -# # on_press: -# # then: -# # - if: -# # condition: -# # lambda: 'return id(${duct_fan_spd_id}).state == "OFF";' -# # then: -# # - logger.log: "${duct_fan_spd_name} was off. Turning on as ${heat_name} turned on." -# # - fan.turn_on: -# # id: ${duct_fan_spd_id} -# # speed: LOW -# # else: -# # - logger.log: "${heat_name} turned on, but not turning on ${duct_fan_spd_name} as already on." +number: + - platform: template + id: duct_fan_spd_target_in + name: ${duct_fan_spd_target_in_name} + optimistic: true + min_value: ${duct_fan_lo_spd} + max_value: ${duct_fan_hi_spd} + step: 1 + - platform: template + id: duct_fan_spd_target_out + name: ${duct_fan_spd_target_out_name} + min_value: ${duct_fan_off_spd} + max_value: ${duct_fan_hi_spd} + step: 1 + set_action: + then: + lambda: |- + float lo; + float hi; + float curtemp; + float newspd; + lo = id(thermostat_out_id).target_temperature_low; + hi = id(thermostat_out_id).target_temperature_high; + curtemp = id(dallas_out_id).state; + if ((curtemp < lo) || (id(thermostat_on_id).state == false)) { + auto call = id(duct_fan_spd_id).turn_off(); + call.perform(); + return id(duct_fan_off_spd); + } + if (curtemp > hi) { + newspd = id(duct_fan_hi_spd); + } else { + // Set newspd to same linear proportion of spd range as current temp is of temp range + newspd = id(duct_fan_lo_spd) + (id(duct_fan_hi_spd) * (curtemp - lo) / (hi - lo)); + } + auto call = id(duct_fan_spd_id).turn_on(); + call.set_speed(newspd); + call.perform(); + return newspd; -# # on_release: -# # then: -# # - fan.turn_on: -# # id: ${duct_fan_spd_id} -# # speed: LOW +# Dual-point thermostat +climate: + - platform: thermostat + id: thermostat_out_id + name: Prj3 Out + sensor: dallas_prj_id + visual: + min_temperature: 60 °F + max_temperature: 160 °F + temperature_step: 1 + default_mode: auto + default_target_temperature_low: 75 °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 -# # - lambda: |- -# # if (id(${duct_fan_spd_id}).is_off) { +# Sense when projector is turned on +binary_sensor: + - platform: gpio + pin: ${prjpwr_pin} + name: ${prjpwr_name} + device_class: power diff --git a/rack_2.yaml b/rack_2.yaml index 2be9c3f..55db22d 100644 --- a/rack_2.yaml +++ b/rack_2.yaml @@ -1,8 +1,13 @@ substitutions: duct_fan_pin: GPIO13 duct_fan_name: Rack 2 Duct Fan Speed + duct_fan_spd_target_in_name: Rack 2 Duct Fan Target Speed In + duct_fan_spd_target_out_name: Rack 2 Duct Fan Target Speed Out # duct_fan_channel: "0" duct_fan_pwmfreq: 5000Hz + duct_fan_off_spd: "0.0" + duct_fan_lo_spd: "10.0" + duct_fan_hi_spd: "100.0" wall_fan_pwr_pin: GPIO21 wall_fan_pwr_name: Rack 2 Wall Fan Power wall_fan_spd_pin: GPIO22 @@ -14,9 +19,21 @@ substitutions: wall_fan_tach_name: Rack 2 Wall Fan Tach dallas_pin: GPIO32 dallas_in_addr: "0x1D02131D6063AA28" - dallas_in_name: Rack 3 Temp In + dallas_in_name: Rack 2 Temp In dallas_out_addr: "0x1D01143296570128" - dallas_out_name: Rack 3 Temp Out + dallas_out_name: Rack 2 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: rack_2 @@ -39,10 +56,23 @@ wifi: captive_portal: +# Enable logging +logger: + level: DEBUG + +# Enable Home Assistant API +api: + +ota: + switch: - platform: gpio pin: ${wall_fan_pwr_pin} name: ${wall_fan_pwr_name} + - platform: template + name: Thermostat On + id: thermostat_on_id + optimistic: true output: - platform: ledc @@ -69,7 +99,7 @@ dallas: - pin: number: ${dallas_pin} mode: INPUT_PULLUP - update_interval: 10s + update_interval: ${dallas_update_interval} sensor: - platform: pulse_counter @@ -88,49 +118,51 @@ sensor: address: ${dallas_out_addr} name: ${dallas_out_name} id: dallas_out_id - on_value: - then: - number.set: - id: duct_fan_speed_target_out - value: !lambda |- - float lo; - float hi; - lo = id(thermostat_rack2_out).target_temperature_low; - hi = id(thermostat_rack2_out).target_temperature_high; - if (x < lo) { - return 0.0; - } - if (x > hi) { - return 100.0; - } - return 100 * (x - lo) / (hi - lo); + number: - platform: template - id: duct_fan_speed_target_in - name: Duct Fan Speed Target In + id: duct_fan_spd_target_in + name: ${duct_fan_spd_target_in_name} optimistic: true - min_value: 0 - max_value: 100 + min_value: ${duct_fan_lo_spd} + max_value: ${duct_fan_hi_spd} step: 1 - platform: template - id: duct_fan_speed_target_out - name: Duct Fan Speed Target Out - optimistic: true - min_value: 0 - max_value: 100 + id: duct_fan_spd_target_out + name: ${duct_fan_spd_target_out_name} + min_value: ${duct_fan_off_spd} + max_value: ${duct_fan_hi_spd} step: 1 - on_value_range: - above: 25.0 + set_action: then: - fan.turn_on: - id: duct_fan_spd_id - speed: !lambda |- - return x; + lambda: |- + float lo; + float hi; + float curtemp; + float newspd; + lo = id(thermostat_out_id).target_temperature_low; + hi = id(thermostat_out_id).target_temperature_high; + curtemp = id(dallas_out_id).state; + if ((curtemp < lo) || (id(thermostat_on_id).state == false)) { + auto call = id(duct_fan_spd_id).turn_off(); + call.perform(); + return id(duct_fan_off_spd); + } + if (curtemp > hi) { + newspd = id(duct_fan_hi_spd); + } else { + // Set newspd to same linear proportion of spd range as current temp is of temp range + newspd = id(duct_fan_lo_spd) + (id(duct_fan_hi_spd) * (curtemp - lo) / (hi - lo)); + } + auto call = id(duct_fan_spd_id).turn_on(); + call.set_speed(newspd); + call.perform(); + return newspd; # Dual-point thermostat climate: - platform: thermostat - id: thermostat_rack2_out + id: thermostat_out_id name: Rack2 Out sensor: dallas_out_id visual: @@ -147,19 +179,12 @@ climate: min_idle_time: 60s heat_action: - logger.log: "Turning off Rack2 Thermostat" - - fan.turn_off: - id: duct_fan_spd_id + - switch.turn_off: thermostat_on_id idle_action: - logger.log: "Turning on Rack2 Thermostat" + - switch.turn_on: thermostat_on_id cool_action: - logger.log: "WARNING: Rack2 Thermostat has hit high temp!" + - switch.turn_on: thermostat_on_id #TODO - provide some kind of warning / action here -# Enable logging -logger: - level: DEBUG - -# Enable Home Assistant API -api: - -ota: diff --git a/rack_3.yaml b/rack_3.yaml index 75e1a7f..1a87aff 100644 --- a/rack_3.yaml +++ b/rack_3.yaml @@ -1,7 +1,12 @@ substitutions: duct_fan_pin: GPIO13 + duct_fan_name: Rack 3 Duct Fan Speed + duct_fan_spd_target_in_name: Rack 3 Duct Fan Target Speed In + duct_fan_spd_target_out_name: Rack 3 Duct Fan Target Speed Out duct_fan_pwmfreq: 5000Hz - duct_fan_spd_name: rack_3_duct_fan_spd + duct_fan_off_spd: "0.0" + duct_fan_lo_spd: "10.0" + duct_fan_hi_spd: "100.0" amppwr_pin: GPIO19 amppwr_name: "Denon Pwr" dallas_pin: GPIO32 @@ -9,6 +14,18 @@ substitutions: dallas_in_name: Rack 3 Temp In dallas_out_addr: "0xB801143296ED7B28" dallas_out_name: Rack 3 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: rack_3 @@ -31,6 +48,20 @@ wifi: 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} @@ -41,13 +72,13 @@ fan: - platform: speed id: duct_fan_spd_id output: duct_fan_output_id - name: ${duct_fan_spd_name} + name: ${duct_fan_name} dallas: - pin: number: ${dallas_pin} mode: INPUT_PULLUP - update_interval: 10s + update_interval: ${dallas_update_interval} sensor: - platform: dallas @@ -57,49 +88,51 @@ sensor: address: ${dallas_out_addr} name: ${dallas_out_name} id: dallas_out_id - on_value: - then: - number.set: - id: fan_speed_target_out - value: !lambda |- - float lo; - float hi; - lo = id(thermostat_rack3_out).target_temperature_low; - hi = id(thermostat_rack3_out).target_temperature_high; - if (x < lo) { - return 0.0; - } - if (x > hi) { - return 100.0; - } - return 100 * (x - lo) / (hi - lo); + number: - platform: template - id: fan_speed_target_in - name: Fan Speed Target In + id: duct_fan_spd_target_in_id + name: ${duct_fan_spd_target_in_name} optimistic: true - min_value: 0 - max_value: 100 + min_value: ${duct_fan_lo_spd} + max_value: ${duct_fan_hi_spd} step: 1 - platform: template - id: fan_speed_target_out - name: Fan Speed Target Out - optimistic: true - min_value: 0 - max_value: 100 + id: duct_fan_spd_target_out_id + name: ${duct_fan_spd_target_out_name} + min_value: ${duct_fan_lo_spd} + max_value: ${duct_fan_hi_spd} step: 1 - on_value_range: - above: 25.0 + set_action: then: - fan.turn_on: - id: duct_fan_spd_id - speed: !lambda |- - return x; + lambda: |- + float lo; + float hi; + float curtemp; + float newspd; + lo = id(thermostat_out_id).target_temperature_low; + hi = id(thermostat_out_id).target_temperature_high; + curtemp = id(dallas_out_id).state; + if ((curtemp < lo) || (id(thermostat_on_id).state == false)) { + auto call = id(duct_fan_spd_id).turn_off(); + call.perform(); + return id(duct_fan_off_spd); + } + if (curtemp > hi) { + newspd = id(duct_fan_hi_spd); + } else { + // Set newspd to same linear proportion of spd range as current temp is of temp range + newspd = id(duct_fan_lo_spd) + (id(duct_fan_hi_spd) * (curtemp - lo) / (hi - lo)); + } + auto call = id(duct_fan_spd_id).turn_on(); + call.set_speed(newspd); + call.perform(); + return newspd; # Dual-point thermostat climate: - platform: thermostat - id: thermostat_rack3_out + id: thermostat_out_id name: Rack3 Out sensor: dallas_out_id visual: @@ -116,12 +149,13 @@ climate: min_idle_time: 60s heat_action: - logger.log: "Turning off Rack3 Thermostat" - - fan.turn_off: - id: duct_fan_spd_id + - switch.turn_off: thermostat_on_id idle_action: - logger.log: "Turning on Rack3 Thermostat" + - switch.turn_on: thermostat_on_id cool_action: - logger.log: "WARNING: Rack3 Thermostat has hit high temp!" + - switch.turn_on: thermostat_on_id #TODO - provide some kind of warning / action here # Sense when receiver is turned on @@ -130,11 +164,3 @@ binary_sensor: pin: ${amppwr_pin} name: ${amppwr_name} device_class: power - -# Enable logging -logger: - -# Enable Home Assistant API -api: - -ota: