diff --git a/projector_3.yaml b/projector_3.yaml index 5007ae1..630a346 100644 --- a/projector_3.yaml +++ b/projector_3.yaml @@ -1,11 +1,12 @@ substitutions: 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_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: "10.0" + duct_fan_lo_spd: "1.0" duct_fan_hi_spd: "100.0" prjpwr_pin: GPIO19 prjpwr_name: Prj3 Pwr @@ -99,56 +100,69 @@ sensor: number: - platform: template - id: duct_fan_spd_target_in - name: ${duct_fan_spd_target_in_name} + 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_spd_target_out - name: ${duct_fan_spd_target_out_name} + 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; - float hi; + float lo_temp; + float hi_temp; float curtemp; + float off_spd; + float lo_spd; + float hi_spd; 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)) { + 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 id(duct_fan_off_spd); + return off_spd; } - if (curtemp > hi) { - newspd = id(duct_fan_hi_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 = id(duct_fan_lo_spd) + (id(duct_fan_hi_spd) * (curtemp - lo) / (hi - lo)); + 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_out_id - name: Prj3 Out + 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: 75 °F + default_target_temperature_low: 78 °F default_target_temperature_high: 160 °F min_cooling_off_time: 60s min_cooling_run_time: 60s diff --git a/rack_2.yaml b/rack_2.yaml index 55db22d..f068419 100644 --- a/rack_2.yaml +++ b/rack_2.yaml @@ -1,12 +1,12 @@ 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_name: R2 Duct Fan Spd + duct_fan_tgt_spd_in_name: R2 DF Tgt Spd In + duct_fan_tgt_spd_out_name: R2 DF Tgt Spd Out # duct_fan_channel: "0" duct_fan_pwmfreq: 5000Hz duct_fan_off_spd: "0.0" - duct_fan_lo_spd: "10.0" + duct_fan_lo_spd: "1.0" duct_fan_hi_spd: "100.0" wall_fan_pwr_pin: GPIO21 wall_fan_pwr_name: Rack 2 Wall Fan Power @@ -121,38 +121,44 @@ sensor: number: - platform: template - id: duct_fan_spd_target_in - name: ${duct_fan_spd_target_in_name} + id: duct_fan_tgt_spd_in + name: ${duct_fan_tgt_spd_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} + id: duct_fan_tgt_spd_out + name: ${duct_fan_tgt_spd_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 lo_temp; + float hi_temp; float curtemp; + float off_spd; + float lo_spd; + float hi_spd; float newspd; - lo = id(thermostat_out_id).target_temperature_low; - hi = id(thermostat_out_id).target_temperature_high; + lo_temp = id(thermostat_out_id).target_temperature_low; + hi_temp = id(thermostat_out_id).target_temperature_high; curtemp = id(dallas_out_id).state; - if ((curtemp < lo) || (id(thermostat_on_id).state == false)) { + 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 id(duct_fan_off_spd); + return off_spd; } - if (curtemp > hi) { - newspd = id(duct_fan_hi_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 = id(duct_fan_lo_spd) + (id(duct_fan_hi_spd) * (curtemp - lo) / (hi - lo)); + 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); diff --git a/rack_3.yaml b/rack_3.yaml index 1a87aff..1ae6a3e 100644 --- a/rack_3.yaml +++ b/rack_3.yaml @@ -1,11 +1,11 @@ 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_name: R3 Duct Fan Spd + duct_fan_tgt_spd_in_name: Rack 3 Duct Fan Target Spd In + duct_fan_tgt_spd_out_name: Rack 3 Duct Fan Target Spd Out duct_fan_pwmfreq: 5000Hz duct_fan_off_spd: "0.0" - duct_fan_lo_spd: "10.0" + duct_fan_lo_spd: "1.0" duct_fan_hi_spd: "100.0" amppwr_pin: GPIO19 amppwr_name: "Denon Pwr" @@ -91,38 +91,44 @@ sensor: number: - platform: template - id: duct_fan_spd_target_in_id - name: ${duct_fan_spd_target_in_name} + id: duct_fan_tgt_spd_in_id + name: ${duct_fan_tgt_spd_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_id - name: ${duct_fan_spd_target_out_name} + id: duct_fan_tgt_spd_out_id + name: ${duct_fan_tgt_spd_out_name} min_value: ${duct_fan_lo_spd} max_value: ${duct_fan_hi_spd} step: 1 set_action: then: lambda: |- - float lo; - float hi; + float lo_temp; + float hi_temp; float curtemp; + float off_spd; + float lo_spd; + float hi_spd; float newspd; - lo = id(thermostat_out_id).target_temperature_low; - hi = id(thermostat_out_id).target_temperature_high; + lo_temp = id(thermostat_out_id).target_temperature_low; + hi_temp = id(thermostat_out_id).target_temperature_high; curtemp = id(dallas_out_id).state; - if ((curtemp < lo) || (id(thermostat_on_id).state == false)) { + 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 id(duct_fan_off_spd); + return off_spd; } - if (curtemp > hi) { - newspd = id(duct_fan_hi_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 = id(duct_fan_lo_spd) + (id(duct_fan_hi_spd) * (curtemp - lo) / (hi - lo)); + 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);