Last active
January 28, 2022 06:32
-
-
Save patrickdk77/c8ede78a8345ae17c5931053d6de7110 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #0 boot (not used) | |
| #1 tx (not used) | |
| #2 led status (not used) | |
| #3 rx (not used) | |
| #4 status neopixel | |
| #5 dallas | |
| #16 thermostat O | |
| #17 thermostat Y | |
| #18 (not used) | |
| #19 outdoor W | |
| #21 i2c sda | |
| #22 i2c scl | |
| #23 water overflow | |
| #25 thermostat G | |
| #26 (not used) | |
| #27 thermostat W | |
| #32 adc4 (not used) | |
| #33 adc5 (not used) | |
| #34 adc6 (not used) | |
| #35 adc7 (not used) | |
| substitutions: | |
| display_name: "Upstairs HVAC" | |
| name: upstairs_hvac | |
| heartbeat: 900s | |
| tempature_delta: "0.1" | |
| humidity_delta: "0.1" | |
| pressure_diff_delta: "5" | |
| pressure_hpa_delta: "0.2" | |
| tempature_diff_delta: "0.5" | |
| btu_delta: "100" | |
| defaulttxrssi: "-72" | |
| maxdistance: "5.0" | |
| room: "guest room" | |
| channel: "room_presence" | |
| tele: "presense_nodes/${name}/tele" | |
| availability: "presense_nodes/${room}" | |
| #old | |
| # dallas_gpio: "23" | |
| #new | |
| status_bright: "35" | |
| dallas_gpio: "5" | |
| neopixel: "GPIO4" | |
| thermostat_y: "GPIO17" | |
| thermostat_o: "GPIO16" | |
| thermostat_w: "GPIO27" | |
| thermostat_g: "GPIO25" | |
| outdoor_w: "GPIO19" | |
| overflow: "GPIO23" | |
| heatpump_fanspeed: "fan_high" | |
| constant_fanspeed: "fan_low" | |
| dry_fanspeed: "fan_med" | |
| low_temp: "20" | |
| high_temp: "25" | |
| low_away: "12" | |
| high_away: "35" | |
| min_temp: "10" | |
| max_temp: "35" | |
| esphome: | |
| name: "${name}" | |
| platform: ESP32 | |
| board: mhetesp32minikit | |
| #arduino_version: latest | |
| platformio_options: | |
| board_build.flash_mode: qout | |
| board_build.f_flash: 80000000L | |
| build_flags: | |
| # - -DCONFIG_ARDUINO_LOOP_STACK_SIZE=32768 | |
| # - -DCONFIG_ARDUINO_LOOP_STACK_SIZE=16384 | |
| - -DCONFIG_ARDUINO_LOOP_STACK_SIZE=49152 | |
| on_boot: | |
| - priority: 300 | |
| then: | |
| - binary_sensor.template.publish: | |
| id: overflow_lockout | |
| state: OFF | |
| - binary_sensor.template.publish: | |
| id: freeze_lockout | |
| state: OFF | |
| - binary_sensor.template.publish: | |
| id: freeze_warn | |
| state: OFF | |
| - priority: -100 | |
| then: | |
| - climate.control: | |
| id: hvac | |
| fan_mode: AUTO | |
| mode: HEAT_COOL | |
| on_shutdown: | |
| then: | |
| - switch.turn_off: outside_y | |
| - switch.turn_off: electric_heat | |
| - switch.turn_off: fan_low | |
| - switch.turn_off: fan_med | |
| - switch.turn_off: fan_high | |
| wifi: | |
| ssid: !secret wifi_ssid | |
| password: !secret wifi_pass | |
| fast_connect: off | |
| #power_save_mode: none | |
| manual_ip: | |
| static_ip: !secret ip_upstairs_hvac | |
| gateway: !secret ip_gateway | |
| subnet: !secret ip_subnet | |
| dns1: !secret ip_dns1 | |
| dns2: !secret ip_dns2 | |
| logger: | |
| # baud_rate: 0 | |
| # level: VERY_VERBOSE | |
| web_server: | |
| port: 80 | |
| #api: | |
| # reboot_timeout: 0s | |
| ota: | |
| mqtt: | |
| id: mqttid | |
| reboot_timeout: 2000s | |
| log_topic: | |
| broker: !secret mqtt_broker | |
| port: !secret mqtt_port | |
| username: !secret mqtt_user | |
| password: !secret mqtt_pass | |
| discovery: true | |
| discovery_retain: true | |
| topic_prefix: "${tele}" | |
| birth_message: | |
| topic: "${availability}" | |
| payload: "CONNECTED" | |
| will_message: | |
| topic: "${availability}" | |
| payload: "DISCONNECTED" | |
| shutdown_message: | |
| topic: "${availability}" | |
| payload: "DISCONNECTED" | |
| on_json_message: | |
| # topic: zigbee2mqtt/Upstairs | |
| # then: | |
| # if: | |
| # condition: | |
| # - lambda: |- | |
| # return (x.containsKey("temperature")); | |
| # then: | |
| # - sensor.template.publish: | |
| # id: thermastat_temperature | |
| # state: !lambda |- | |
| # return (x["temperature"]); | |
| topic: tele/tasmota_blerry/upstairs_atc | |
| then: | |
| if: | |
| condition: | |
| - lambda: |- | |
| return (x.containsKey("Temperature")); | |
| then: | |
| - sensor.template.publish: | |
| id: thermastat_temperature | |
| state: !lambda |- | |
| return (x["Temperature"]); | |
| - sensor.template.publish: | |
| id: thermastat_humidity | |
| state: !lambda |- | |
| return (x["Humidity"]); | |
| globals: | |
| - id: schedule_disabled | |
| type: bool | |
| restore_value: true | |
| initial_value: 'false' | |
| #sun: | |
| # latitude: !secret latitude | |
| # longitude: !secret longitude | |
| time: | |
| - platform: sntp | |
| timezone: !secret timezone | |
| servers: | |
| - !secret ip_ntp1 | |
| - !secret ip_ntp2 | |
| id: ntp_time | |
| on_time: | |
| - seconds: 0 | |
| minutes: 0 | |
| hours: 21 | |
| then: | |
| - if: | |
| condition: | |
| - switch.is_off: schedule_override | |
| then: | |
| - climate.control: | |
| id: hvac | |
| preset: HOME | |
| - seconds: 0 | |
| minutes: 0 | |
| hours: 9 | |
| days_of_week: MON-FRI | |
| then: | |
| - if: | |
| condition: | |
| - switch.is_off: schedule_override | |
| then: | |
| - climate.control: | |
| id: hvac | |
| preset: AWAY | |
| - seconds: 0 | |
| minutes: 0 | |
| hours: 10 | |
| days_of_week: SAT,SUN | |
| then: | |
| - if: | |
| condition: | |
| - switch.is_off: schedule_override | |
| then: | |
| - climate.control: | |
| id: hvac | |
| preset: AWAY | |
| i2c: | |
| - id: bmei2c | |
| sda: 21 | |
| scl: 22 | |
| scan: true | |
| # frequency: 50000 | |
| # frequency: 400000 | |
| pcf8574: | |
| - id: 'gpiohub' | |
| pcf8575: false | |
| address: 0x20 | |
| i2c_id: bmei2c | |
| dallas: | |
| - pin: ${dallas_gpio} | |
| update_interval: 16s | |
| id: dallas_bus_01 | |
| status_led: | |
| id: statusled | |
| pin: | |
| number: GPIO2 | |
| inverted: true | |
| #esp32_ble_tracker: | |
| sensor: | |
| - platform: template | |
| name: "${display_name} Thermastat Temperature" | |
| id: thermastat_temperature | |
| accuracy_decimals: 1 | |
| unit_of_measurement: "°C" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${tempature_delta} | |
| - platform: template | |
| name: "${display_name} Thermastat Humidity" | |
| id: thermastat_humidity | |
| accuracy_decimals: 1 | |
| unit_of_measurement: "%" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${tempature_delta} | |
| # - platform: pvvx_mithermometer | |
| # mac_address: "A4:C1:38:0E:CC:CF" | |
| # temperature: | |
| # id: xiaomi_upstairs_temperature | |
| # name: "LYWSD03MMC Temperature" | |
| # accuracy_decimals: 1 | |
| # humidity: | |
| # id: xiaomi_upstairs_humidity | |
| # name: "LYWSD03MMC Humidity" | |
| # accuracy_decimals: 0 | |
| # battery_level: | |
| # name: "Xiaomi Upstairs Battery Level" | |
| # battery_voltage: | |
| # name: "Xiaomi Upstairs Battery Voltage" | |
| - platform: uptime | |
| name: ${display_name} Uptime Sensor | |
| id: uptime_sensor | |
| update_interval: 60s | |
| on_raw_value: | |
| then: | |
| - text_sensor.template.publish: | |
| id: uptime_human | |
| state: !lambda |- | |
| int seconds = round(id(uptime_sensor).raw_state); | |
| int days = seconds / (24 * 3600); | |
| seconds = seconds % (24 * 3600); | |
| int hours = seconds / 3600; | |
| seconds = seconds % 3600; | |
| int minutes = seconds / 60; | |
| seconds = seconds % 60; | |
| return ( | |
| (days ? String(days) + "d " : "") + | |
| (hours ? String(hours) + "h " : "") + | |
| (minutes ? String(minutes) + "m " : "") + | |
| (String(seconds) + "s") | |
| ).c_str(); | |
| - platform: dallas | |
| dallas_id: dallas_bus_01 | |
| address: 0x2E3C01B5562F1C28 | |
| id: lineset_vapor_temperature | |
| name: "${display_name} Lineset Vapor Temperature" | |
| accuracy_decimals: 1 | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${tempature_delta} | |
| - platform: dallas | |
| dallas_id: dallas_bus_01 | |
| address: 0xE53C01B556296628 | |
| id: lineset_liquid_temperature | |
| name: "${display_name} Lineset Liquid Temperature" | |
| accuracy_decimals: 1 | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${humidity_delta} | |
| # - platform: dallas | |
| # dallas_id: dallas_bus_01 | |
| # address: 0x7E3C01B5561C7F28 | |
| # id: duct_supply_temperature | |
| # name: "${display_name} Duct Supply Temperature" | |
| # accuracy_decimals: 1 | |
| # filters: | |
| # - or: | |
| # - heartbeat: ${heartbeat} | |
| # - delta: ${tempature_delta} | |
| # - platform: dallas | |
| # dallas_id: dallas_bus_01 | |
| # address: 0x8E3C01B556795828 | |
| # id: duct_return_temperature | |
| # name: "${display_name} Duct Return Temperature" | |
| # accuracy_decimals: 1 | |
| # filters: | |
| # - or: | |
| # - heartbeat: ${heartbeat} | |
| # - delta: ${tempature_delta} | |
| - platform: dallas | |
| dallas_id: dallas_bus_01 | |
| address: 0x063C01B5568B3A28 | |
| id: coil_temperature | |
| name: "${display_name} Evaporator Coil Temperature" | |
| accuracy_decimals: 1 | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${tempature_delta} | |
| on_value_range: | |
| - below: -5 | |
| then: | |
| if: | |
| condition: | |
| switch.is_on: outside_o | |
| then: | |
| - switch.turn_off: outside_y | |
| - binary_sensor.template.publish: | |
| id: freeze_lockout | |
| state: ON | |
| - switch.turn_on: fan_high | |
| - below: 1 | |
| above: -1 | |
| then: | |
| if: | |
| condition: | |
| switch.is_on: outside_o | |
| then: | |
| - binary_sensor.template.publish: | |
| id: freeze_warn | |
| state: ON | |
| # - if: | |
| # condition: | |
| # switch.is_on: fan_high | |
| # then: | |
| # - switch.turn_off: outside_y | |
| # - binary_sensor.template.publish: | |
| # id: freeze_lockout | |
| # state: ON | |
| - if: | |
| condition: | |
| - switch.is_on: fan_med | |
| then: | |
| - switch.turn_on: fan_high | |
| - if: | |
| condition: | |
| - switch.is_on: fan_low | |
| then: | |
| - switch.turn_on: fan_high | |
| - if: | |
| condition: | |
| - switch.is_on: outside_y | |
| - switch.is_off: fan_high | |
| - switch.is_off: fan_med | |
| - switch.is_off: fan_low | |
| then: | |
| - script.execute: fan_heatpump | |
| - above: 10 | |
| then: | |
| - if: | |
| condition: | |
| - binary_sensor.is_on: freeze_lockout | |
| then: | |
| - binary_sensor.template.publish: | |
| id: freeze_lockout | |
| state: OFF | |
| - if: | |
| condition: | |
| - switch.is_off: outside_y | |
| - switch.is_off: electric_heat | |
| then: | |
| - script.execute: fan_ramp_off | |
| - delay: 900s | |
| - switch.turn_on: outside_y | |
| - above: 3 | |
| below: 10 | |
| then: | |
| - if: | |
| condition: | |
| - binary_sensor.is_on: freeze_warn | |
| then: | |
| - binary_sensor.template.publish: | |
| id: freeze_warn | |
| state: OFF | |
| - above: 40 | |
| then: | |
| - if: | |
| condition: | |
| - switch.is_on: outside_y | |
| - switch.is_off: outside_o | |
| - switch.is_off: ${heatpump_fanspeed} | |
| then: | |
| - script.execute: fan_heatpump | |
| - platform: bme280 | |
| i2c_id: bmei2c | |
| address: 0x76 | |
| update_interval: 13s | |
| temperature: | |
| name: "${display_name} Supply Temperature" | |
| oversampling: 4x | |
| unit_of_measurement: "°C" | |
| id: bme280_supply_temperature | |
| accuracy_decimals: 1 | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${tempature_delta} | |
| pressure: | |
| name: "${display_name} Supply Pressure" | |
| oversampling: 16x | |
| unit_of_measurement: "hPa" | |
| id: bme280_supply_pressure | |
| accuracy_decimals: 2 | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${pressure_hpa_delta} | |
| humidity: | |
| name: "${display_name} Supply Humidity" | |
| oversampling: 16x | |
| unit_of_measurement: "%" | |
| id: bme280_supply_humidity | |
| accuracy_decimals: 1 | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${humidity_delta} | |
| # - offset: -5.0 | |
| #on_value_range: | |
| # - above: 80 | |
| # then: | |
| # - if: | |
| # condition: | |
| # - lambda: 'return id(ntp_time).now().hour < 23;' | |
| # - lambda: 'return id(ntp_time).now().hour > 06;' | |
| # then: | |
| # - switch.turn_on: fan | |
| # - below: 75 | |
| # then: | |
| # - switch.turn_off: fan | |
| - platform: template | |
| name: "${display_name} Supply Wetbulb" | |
| id: bme280_supply_wetbulb | |
| lambda: |- | |
| return (-5.806+0.672*id(bme280_supply_temperature).state-0.006*id(bme280_supply_temperature).state*id(bme280_supply_temperature).state+ | |
| (0.061+0.004*id(bme280_supply_temperature).state+0.000099*id(bme280_supply_temperature).state*id(bme280_supply_temperature).state)*id(bme280_supply_temperature).state+ | |
| (-0.000033-0.000005*id(bme280_supply_temperature).state-0.0000001*id(bme280_supply_temperature).state*id(bme280_supply_temperature).state)*id(bme280_supply_humidity).state*id(bme280_supply_humidity).state); | |
| accuracy_decimals: 1 | |
| update_interval: 15s | |
| unit_of_measurement: "°C" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${tempature_delta} | |
| - platform: template | |
| name: "${display_name} Supply Dewpoint" | |
| id: bme280_supply_dewpoint | |
| lambda: |- | |
| const float temp = id(bme280_supply_temperature).state; | |
| const float logRH = log(id(bme280_supply_humidity).state /100.0); | |
| const float alpha = 6.112; | |
| const float beta = 17.62; | |
| const float theta = 243.12; | |
| return (theta * (logRH + ((beta * temp) /(243.04 + temp)) ) ) / (beta - (logRH - ((beta * temp)/(theta + temp)) ) ); | |
| accuracy_decimals: 1 | |
| update_interval: 18s | |
| unit_of_measurement: "°C" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${tempature_delta} | |
| - platform: template | |
| name: "${display_name} Supply Absolute Humidity" | |
| id: bme280_supply_abs_hum | |
| lambda: |- | |
| const float mw = 18.01534; // molar mass of water g/mol | |
| const float r = 8.31447215; // Universal gas constant J/mol/K | |
| return (6.112 * powf(2.718281828, (17.67 * id(bme280_supply_temperature).state) / | |
| (id(bme280_supply_temperature).state + 243.5)) * id(bme280_supply_humidity).state * mw) / | |
| ((273.15 + id(bme280_supply_temperature).state) * r); // in grams/m^3 | |
| accuracy_decimals: 2 | |
| update_interval: 22s | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: 0.1 | |
| - platform: template | |
| name: "${display_name} Supply Enthalpy" | |
| id: bme280_supply_enthalpy | |
| lambda: |- | |
| const float tempf = (id(bme280_supply_temperature).state *9.0/5.0) +32.0; | |
| const float psi = id(bme280_supply_pressure).state * 0.0145037738; | |
| const float kelvinf = tempf + 459.67; | |
| const float logkelvinf = log(kelvinf); | |
| const float l = -10440.4/kelvinf - 11.29465-0.02702235 * kelvinf +1.289036E-005 * pow(kelvinf,2) -2.478068E-009 * pow(kelvinf,3) +6.545967 * logkelvinf; | |
| const float s = exp(l); | |
| const float p = id(bme280_supply_humidity).state / 100.0 * s; | |
| const float w = 0.62198 * p / (psi - p); | |
| return 0.24 * tempf + w * (1061.0+0.444 * kelvinf); | |
| accuracy_decimals: 3 | |
| update_interval: 24s | |
| unit_of_measurement: "btu/lb" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: 0.001 | |
| - platform: bme280 | |
| i2c_id: bmei2c | |
| address: 0x77 | |
| update_interval: 13s | |
| temperature: | |
| name: "${display_name} Return Temperature" | |
| oversampling: 4x | |
| unit_of_measurement: "°C" | |
| id: bme280_return_temperature | |
| accuracy_decimals: 1 | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${tempature_delta} | |
| pressure: | |
| name: "${display_name} Return Pressure" | |
| oversampling: 16x | |
| unit_of_measurement: "hPa" | |
| id: bme280_return_pressure | |
| accuracy_decimals: 2 | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${pressure_hpa_delta} | |
| humidity: | |
| name: "${display_name} Return Humidity" | |
| oversampling: 16x | |
| unit_of_measurement: "%" | |
| id: bme280_return_humidity | |
| accuracy_decimals: 1 | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${humidity_delta} | |
| # - offset: +2.0 | |
| #on_value_range: | |
| # - above: 80 | |
| # then: | |
| # - if: | |
| # condition: | |
| # - lambda: 'return id(ntp_time).now().hour < 23;' | |
| # - lambda: 'return id(ntp_time).now().hour > 06;' | |
| # then: | |
| # - switch.turn_on: fan | |
| # - below: 75 | |
| # then: | |
| # - switch.turn_off: fan | |
| - platform: template | |
| name: "${display_name} Return Wetbulb" | |
| id: bme280_return_wetbulb | |
| lambda: |- | |
| return (-5.806+0.672*id(bme280_return_temperature).state-0.006*id(bme280_return_temperature).state*id(bme280_return_temperature).state+ | |
| (0.061+0.004*id(bme280_return_temperature).state+0.000099*id(bme280_return_temperature).state*id(bme280_return_temperature).state)*id(bme280_return_temperature).state+ | |
| (-0.000033-0.000005*id(bme280_return_temperature).state-0.0000001*id(bme280_return_temperature).state*id(bme280_return_temperature).state)*id(bme280_return_humidity).state*id(bme280_return_humidity).state); | |
| accuracy_decimals: 1 | |
| update_interval: 16s | |
| unit_of_measurement: "°C" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${tempature_delta} | |
| - platform: template | |
| name: "${display_name} Return Dewpoint" | |
| id: bme280_return_dewpoint | |
| lambda: |- | |
| const float temp = id(bme280_return_temperature).state; | |
| const float logRH = log(id(bme280_return_humidity).state /100.0); | |
| const float alpha = 6.112; | |
| const float beta = 17.62; | |
| const float theta = 243.12; | |
| return (theta * (logRH + ((beta * temp) /(243.04 + temp)) ) ) / (beta - (logRH - ((beta * temp)/(theta + temp)) ) ); | |
| accuracy_decimals: 1 | |
| update_interval: 21s | |
| unit_of_measurement: "°C" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${tempature_delta} | |
| - platform: template | |
| name: "${display_name} Return Absolute Humidity" | |
| id: bme280_return_abs_hum | |
| lambda: |- | |
| const float mw = 18.01534; // molar mass of water g/mol | |
| const float r = 8.31447215; // Universal gas constant J/mol/K | |
| return (6.112 * powf(2.718281828, (17.67 * id(bme280_return_temperature).state) / | |
| (id(bme280_return_temperature).state + 243.5)) * id(bme280_return_humidity).state * mw) / | |
| ((273.15 + id(bme280_return_temperature).state) * r); // in grams/m^3 | |
| accuracy_decimals: 2 | |
| update_interval: 24s | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${tempature_delta} | |
| - platform: template | |
| name: "${display_name} Return Enthalpy" | |
| id: bme280_return_enthalpy | |
| lambda: |- | |
| const float tempf = (id(bme280_return_temperature).state *9.0/5.0) +32.0; | |
| const float psi = id(bme280_return_pressure).state * 0.0145037738; | |
| const float kelvinf = tempf + 459.67; | |
| const float logkelvinf = log(kelvinf); | |
| const float l = -10440.4/kelvinf - 11.29465-0.02702235 * kelvinf +1.289036E-005 * pow(kelvinf,2) -2.478068E-009 * pow(kelvinf,3) +6.545967 * logkelvinf; | |
| const float s = exp(l); | |
| const float p = id(bme280_return_humidity).state / 100.0 * s; | |
| const float w = 0.62198 * p / (psi - p); | |
| return 0.24 * tempf + w * (1061.0+0.444 * kelvinf); | |
| accuracy_decimals: 3 | |
| update_interval: 26s | |
| unit_of_measurement: "btu/lb" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: 0.001 | |
| - platform: template | |
| name: "${display_name} Total BTU/h" | |
| id: total_btu_hour | |
| # Black (Hi) 165pa difference, 21.4td 1 bank electric, 644.5cfm | |
| # Blue (Med) 150pa difference, 22.8td 1 bank electric, 605cfm | |
| # Red (Low) 130pa difference, 23.5td 1 bank electric, 586cfm | |
| lambda: |- | |
| const float cfm = 644.0; | |
| if(id(bme280_supply_pressure).state - id(bme280_return_pressure).state < 0.8) { | |
| return 0; | |
| } else { | |
| return cfm * 4.5 * (id(bme280_return_enthalpy).state - id(bme280_supply_enthalpy).state); | |
| } | |
| accuracy_decimals: 0 | |
| update_interval: 13s | |
| unit_of_measurement: "btu/h" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${btu_delta} | |
| - platform: template | |
| name: "${display_name} Sensible BTU/h" | |
| id: sensible_btu_hour | |
| lambda: |- | |
| const float cfm = 644.0; | |
| if(id(bme280_supply_pressure).state - id(bme280_return_pressure).state < 0.8) { | |
| return 0; | |
| } else { | |
| return cfm * (id(bme280_return_temperature).state - id(bme280_supply_temperature).state) *9.0/5.0 * 1.08; | |
| } | |
| accuracy_decimals: 0 | |
| update_interval: 14s | |
| unit_of_measurement: "btu/h" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${btu_delta} | |
| - platform: template | |
| name: "${display_name} Latent BTU/h" | |
| id: latent_btu_hour | |
| lambda: |- | |
| const float cfm = 644.0; | |
| if(id(bme280_supply_pressure).state - id(bme280_return_pressure).state < 0.8) { | |
| return 0; | |
| } else { | |
| return cfm * 0.68 * (id(bme280_return_enthalpy).state - id(bme280_supply_enthalpy).state); | |
| } | |
| accuracy_decimals: 0 | |
| update_interval: 12s | |
| unit_of_measurement: "btu/h" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${btu_delta} | |
| # - platform: template | |
| # name: "${display_name} Duct Temperature Difference" | |
| # id: duct_difference_temperature | |
| # lambda: |- | |
| # return abs((id(duct_return_temperature).state-id(duct_supply_temperature).state)*90.0/5.0)/10.0; | |
| # accuracy_decimals: 1 | |
| # update_interval: 12s | |
| # unit_of_measurement: "°F" | |
| # filters: | |
| # - or: | |
| # - heartbeat: ${heartbeat} | |
| # - delta: ${tempature_diff_delta} | |
| - platform: template | |
| name: "${display_name} Temperature Difference" | |
| id: bme280_difference_temperature | |
| lambda: |- | |
| return abs((id(bme280_return_temperature).state-id(bme280_supply_temperature).state)*90.0/5.0)/10.0; | |
| accuracy_decimals: 1 | |
| update_interval: 20s | |
| unit_of_measurement: "°F" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${tempature_diff_delta} | |
| - platform: template | |
| name: "${display_name} Pressure Difference" | |
| id: bme280_difference_pressure | |
| lambda: |- | |
| return abs((id(bme280_supply_pressure).state-id(bme280_return_pressure).state)*1000.0)/10.0; | |
| accuracy_decimals: 1 | |
| update_interval: 20s | |
| unit_of_measurement: "Pa" | |
| filters: | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: ${pressure_diff_delta} | |
| - platform: template | |
| name: "${display_name} Filter Pressure" | |
| id: filter_pressure | |
| accuracy_decimals: 0 | |
| unit_of_measurement: "Pa" | |
| - platform: template | |
| name: "${display_name} Ambiant Pressure" | |
| id: ambiant_pressure | |
| accuracy_decimals: 0 | |
| unit_of_measurement: "Pa" | |
| # - platform: template | |
| # name: "${display_name} Supply Spped of Sound" | |
| # id: bme280_supply_sos | |
| # lambda: |- | |
| # return 64202.43439*(pow((id(bme280_supply_temperature).state+273.16)/273.15,0.5)); | |
| # accuracy_decimals: 1 | |
| # update_interval: 20s | |
| # unit_of_measurement: ft/m | |
| # filters: | |
| # - or: | |
| # - heartbeat: ${heartbeat} | |
| # - delta: 10 | |
| # - platform: template | |
| # name: "${display_name} Return Spped of Sound" | |
| # id: bme280_return_sos | |
| # lambda: |- | |
| # return 64202.43439*(pow((id(bme280_return_temperature).state+273.16)/273.15,0.5)); | |
| # accuracy_decimals: 1 | |
| # update_interval: 20s | |
| # unit_of_measurement: ft/m | |
| # filters: | |
| # - or: | |
| # - heartbeat: ${heartbeat} | |
| # - delta: 10 | |
| - platform: wifi_signal | |
| id: wifi_sig | |
| name: "${display_name} RSSI" | |
| unit_of_measurement: "dBm" | |
| update_interval: 122s | |
| filters: | |
| - median: | |
| window_size: 7 | |
| send_every: 5 | |
| send_first_at: 5 | |
| - or: | |
| - heartbeat: ${heartbeat} | |
| - delta: 3 | |
| # const float den = 0.075 * (530 / (460 / tempf ) * ( (id(bme280_return_pressure).state/1000) / 29.92 ); | |
| # CFM = (AMPS*VOLTS*3.41214) / (1.08 * (SupplyTemp - ReturnTemp)) | |
| # BTU Sensible Heat Removed = CFM * (1.08 * (SupplyTemp - ReturnTemp)) | |
| # BTU Latent Heat Removed = 0.68 * CFM * | |
| # BTU Heat Removed = BTU Sensible + BTU Latent, aka, 4.5 * CFM | |
| binary_sensor: | |
| - platform: template | |
| id: overflow_lockout | |
| name: "${display_name} Overflow Lockout" | |
| - platform: template | |
| id: freeze_lockout | |
| name: "${display_name} Freeze Lockout" | |
| - platform: template | |
| id: freeze_warn | |
| name: "${display_name} Freeze Warning" | |
| - platform: gpio | |
| id: thermostat_y | |
| name: "${display_name} Thermostat Y" | |
| pin: | |
| number: ${thermostat_y} | |
| mode: INPUT_PULLUP | |
| inverted: true | |
| filters: | |
| - delayed_on: 50ms | |
| - delayed_off: 50ms | |
| - platform: gpio | |
| id: thermostat_o | |
| name: "${display_name} Thermostat O" | |
| pin: | |
| number: ${thermostat_o} | |
| mode: INPUT_PULLUP | |
| inverted: true | |
| filters: | |
| - delayed_on: 20ms | |
| - delayed_off: 20ms | |
| - platform: gpio | |
| id: thermostat_w | |
| name: "${display_name} Thermostat W" | |
| pin: | |
| number: ${thermostat_w} | |
| mode: INPUT_PULLUP | |
| inverted: true | |
| filters: | |
| - delayed_on: 30ms | |
| - delayed_off: 30ms | |
| - platform: gpio | |
| id: thermostat_g | |
| name: "${display_name} Thermostat G" | |
| pin: | |
| number: ${thermostat_g} | |
| mode: INPUT_PULLUP | |
| inverted: true | |
| filters: | |
| - delayed_on: 20ms | |
| - delayed_off: 20ms | |
| - platform: gpio | |
| id: outdoor_w | |
| name: "${display_name} Outdoor Defrost" | |
| pin: | |
| number: ${outdoor_w} | |
| mode: INPUT_PULLUP | |
| inverted: true | |
| filters: | |
| - delayed_on: 30ms | |
| - delayed_off: 30ms | |
| - platform: gpio | |
| id: overflow | |
| name: "${display_name} Water Overflow" | |
| pin: | |
| number: ${overflow} | |
| mode: INPUT_PULLUP | |
| inverted: false #off on overflow, on for normal | |
| filters: | |
| - delayed_on: 50ms | |
| - delayed_off: 50ms | |
| on_press: | |
| then: | |
| - switch.turn_off: outside_y | |
| - binary_sensor.template.publish: | |
| id: overflow_lockout | |
| state: ON | |
| on_release: | |
| then: | |
| - binary_sensor.template.publish: | |
| id: overflow_lockout | |
| state: OFF | |
| switch: | |
| - platform: template | |
| id: schedule_override | |
| name: "${display_name} Disable Schedule" | |
| restore_state: false | |
| optimistic: true | |
| turn_on_action: | |
| - globals.set: | |
| id: schedule_disabled | |
| value: 'true' | |
| turn_off_action: | |
| - globals.set: | |
| id: schedule_disabled | |
| value: 'false' | |
| lambda: |- | |
| return id(schedule_disabled); | |
| - platform: gpio | |
| id: fan_high | |
| name: "${display_name} Fan High" | |
| restore_mode: ALWAYS_OFF | |
| pin: | |
| pcf8574: gpiohub | |
| number: 7 | |
| mode: OUTPUT | |
| inverted: false | |
| interlock: &fanspeed_group [fan_high, fan_med, fan_low] | |
| interlock_wait_time: 1s | |
| - platform: gpio | |
| id: fan_med | |
| name: "${display_name} Fan Med" | |
| restore_mode: ALWAYS_OFF | |
| pin: | |
| pcf8574: gpiohub | |
| number: 6 | |
| mode: OUTPUT | |
| inverted: false | |
| interlock: *fanspeed_group | |
| interlock_wait_time: 1s | |
| - platform: gpio | |
| id: fan_low | |
| name: "${display_name} Fan Low" | |
| restore_mode: ALWAYS_OFF | |
| pin: | |
| pcf8574: gpiohub | |
| number: 5 | |
| mode: OUTPUT | |
| inverted: false | |
| interlock: *fanspeed_group | |
| interlock_wait_time: 1s | |
| # - platform: gpio | |
| # name: "${display_name} Extra3" | |
| # restore_mode: ALWAYS_OFF | |
| # pin: | |
| # pcf8574: gpiohub | |
| # number: 4 | |
| # mode: OUTPUT | |
| # inverted: false | |
| # - platform: gpio | |
| # name: "${display_name} Extra4" | |
| # restore_mode: ALWAYS_OFF | |
| # pin: | |
| # pcf8574: gpiohub | |
| # number: 3 | |
| # mode: OUTPUT | |
| # inverted: false | |
| - platform: gpio | |
| id: electric_heat | |
| name: "${display_name} Em Heat" | |
| restore_mode: ALWAYS_OFF | |
| pin: | |
| pcf8574: gpiohub | |
| number: 2 | |
| mode: OUTPUT | |
| inverted: false | |
| on_turn_on: | |
| then: | |
| if: | |
| condition: | |
| - switch.is_off: fan_high | |
| - switch.is_off: fan_med | |
| - switch.is_off: fan_low | |
| then: | |
| - script.execute: fan_heatpump | |
| - platform: gpio | |
| id: outside_y | |
| internal: false | |
| name: "${display_name} Outdoor Y" | |
| restore_mode: ALWAYS_OFF | |
| pin: | |
| pcf8574: gpiohub | |
| number: 1 | |
| mode: OUTPUT | |
| inverted: false | |
| on_turn_on: | |
| then: | |
| - if: | |
| condition: | |
| or: | |
| - binary_sensor.is_on: overflow_lockout | |
| - binary_sensor.is_on: freeze_warn | |
| - binary_sensor.is_on: freeze_lockout | |
| then: | |
| - switch.turn_off: outside_y | |
| # else: | |
| # - if: | |
| # condition: | |
| # - switch.is_off: ${heatpump_fanspeed} | |
| # then: | |
| # - script.execute: fan_heatpump | |
| - platform: gpio | |
| id: outside_o | |
| internal: false | |
| name: "${display_name} Outdoor O" | |
| restore_mode: ALWAYS_ON | |
| pin: | |
| pcf8574: gpiohub | |
| number: 0 | |
| mode: OUTPUT | |
| inverted: false | |
| text_sensor: | |
| - platform: wifi_info | |
| bssid: | |
| id: wifi_bssid | |
| name: "${display_name} BSSID" | |
| # - platform: ble_scanner | |
| # name: "${display_name} BLE" | |
| - platform: template | |
| name: ${display_name} Uptime Readable | |
| id: uptime_human | |
| icon: mdi:clock-start | |
| #light: | |
| # - platform: neopixelbus | |
| # type: GRB | |
| # pin: ${neopixel} | |
| # num_leds: 1 | |
| # name: "NeoPixel Lights" | |
| # id: statusrgb | |
| # internal: true | |
| # variant: WS2812 | |
| # effects: | |
| # - strobe: | |
| # name: "Cooling" | |
| # colors: | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 0% | |
| # green: 0% | |
| # blue: 100% | |
| # - state: false | |
| # duration: 500ms | |
| # - strobe: | |
| # name: "Heating" | |
| # colors: | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 100% | |
| # green: 0% | |
| # blue: 0% | |
| # - state: false | |
| # duration: 500ms | |
| # - strobe: | |
| # name: "Fan On" | |
| # colors: | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 0% | |
| # green: 100% | |
| # blue: 0% | |
| # - state: false | |
| # duration: 500ms | |
| # - strobe: | |
| # name: "Dehumidifing" | |
| # colors: | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 40% | |
| # green: 0% | |
| # blue: 100% | |
| # - state: false | |
| # duration: 500ms | |
| # - strobe: | |
| # name: "Cool" | |
| # colors: | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 0% | |
| # green: 0% | |
| # blue: 100% | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 0% | |
| # green: 0% | |
| # blue: 100% | |
| # - strobe: | |
| # name: "Heat" | |
| # colors: | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 100% | |
| # green: 0% | |
| # blue: 0% | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 100% | |
| # green: 0% | |
| # blue: 0% | |
| # - strobe: | |
| # name: "Fan" | |
| # colors: | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 0% | |
| # green: 100% | |
| # blue: 0% | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 0% | |
| # green: 100% | |
| # blue: 0% | |
| # - strobe: | |
| # name: "Dry" | |
| # colors: | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 40% | |
| # green: 0% | |
| # blue: 100% | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 40% | |
| # green: 0% | |
| # blue: 100% | |
| # - strobe: | |
| # name: "Auto" | |
| # colors: | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 100% | |
| # green: 100% | |
| # blue: 100% | |
| # - state: true | |
| # duration: 500ms | |
| # brightness: ${status_bright}% | |
| # red: 100% | |
| # green: 100% | |
| # blue: 100% | |
| climate: | |
| - platform: thermostat | |
| id: hvac | |
| name: "${display_name} Thermostat" | |
| visual: | |
| min_temperature: ${min_temp} °C | |
| max_temperature: ${max_temp} °C | |
| temperature_step: 1.0 °C | |
| sensor: thermastat_temperature | |
| # sensor: xiaomi_upstairs_temperature | |
| default_mode: heat_cool | |
| default_target_temperature_low: ${low_temp} °C | |
| default_target_temperature_high: ${high_temp} °C | |
| set_point_minimum_differential: 3 °C | |
| cool_deadband: 1 °C | |
| cool_overrun: 0.5 °C | |
| heat_deadband: 1 °C | |
| heat_overrun: 0.5 °C | |
| # supplemental_cooling_delta: 2 °C | |
| # max_cooling_run_time: 1000s | |
| # supplemental_heating_delta: 2 °C | |
| # max_heating_run_time: 1000s | |
| away_config: | |
| default_target_temperature_low: ${low_away} °C | |
| default_target_temperature_high: ${high_away} °C | |
| startup_delay: true | |
| min_cooling_off_time: 600s | |
| min_cooling_run_time: 800s | |
| min_heating_off_time: 600s | |
| min_heating_run_time: 800s | |
| min_idle_time: 30s | |
| # min_fanning_off_time: 30s | |
| # min_fanning_run_time: 60s | |
| min_fan_mode_switching_time: 30s | |
| # fan_only_action_uses_fan_mode_timer: true | |
| # fan_only_cooling: false | |
| fan_with_cooling: false | |
| fan_with_heating: false | |
| cool_action: | |
| - switch.turn_on: outside_o | |
| - switch.turn_on: outside_y | |
| - delay: 30s | |
| - script.execute: fan_heatpump | |
| # supplemental_cooling_action: | |
| dry_action: | |
| - switch.turn_on: outside_o | |
| - switch.turn_on: outside_y | |
| - delay: 30s | |
| - switch.turn_on: ${dry_fanspeed} | |
| heat_action: | |
| - switch.turn_off: outside_o | |
| - switch.turn_on: outside_y | |
| - delay: 200s | |
| - script.execute: fan_heatpump | |
| # supplemental_heating_action: | |
| # - switch.turn_on: electric_head | |
| # fan_only_action: | |
| # if: | |
| # condition: | |
| # or: | |
| # - switch.is_on: outside_y | |
| # - switch.is_on: electric_heat | |
| # then: | |
| # - switch.turn_on: ${heatpump_fanspeed} | |
| # else: | |
| # - switch.turn_on: ${constant_fanspeed} | |
| idle_action: | |
| - switch.turn_off: outside_y | |
| - switch.turn_off: electric_heat | |
| - script.execute: fan_ramp_off | |
| # To set led | |
| # auto_mode: | |
| # - light.turn_on: | |
| # id: statusrgb | |
| # effect: Auto | |
| # off_mode: | |
| # - light.turn_off: | |
| # id: statusrgb | |
| # heat_mode: | |
| # - light.turn_on: | |
| # id: statusrgb | |
| # effect: Heat | |
| # cool_mode: | |
| # - light.turn_on: | |
| # id: statusrgb | |
| # effect: Cool | |
| # dry_mode: | |
| # - light.turn_on: | |
| # id: statusrgb | |
| # effect: Dry | |
| # fan_only_mode: | |
| # - light.turn_on: | |
| # id: statusrgb | |
| # effect: Fan | |
| fan_mode_auto_action: | |
| then: | |
| if: | |
| condition: | |
| or: | |
| - switch.is_on: outside_y | |
| - switch.is_on: electric_heat | |
| then: | |
| - script.execute: fan_heatpump | |
| else: | |
| - script.execute: fan_ramp_off | |
| fan_mode_low_action: | |
| then: | |
| if: | |
| condition: | |
| or: | |
| - switch.is_on: outside_y | |
| - switch.is_on: electric_heat | |
| then: | |
| - script.execute: fan_heatpump | |
| else: | |
| - switch.turn_on: fan_low | |
| fan_mode_medium_action: | |
| then: | |
| if: | |
| condition: | |
| or: | |
| - switch.is_on: outside_y | |
| - switch.is_on: electric_heat | |
| then: | |
| - script.execute: fan_heatpump | |
| else: | |
| - switch.turn_on: fan_med | |
| fan_mode_high_action: | |
| then: | |
| if: | |
| condition: | |
| or: | |
| - switch.is_on: outside_y | |
| - switch.is_on: electric_heat | |
| then: | |
| - script.execute: fan_heatpump | |
| else: | |
| - switch.turn_on: fan_high | |
| # fan_mode_off_action: | |
| # - script.execute: fan_ramp_off | |
| fan_mode_on_action: | |
| then: | |
| if: | |
| condition: | |
| or: | |
| - switch.is_on: outside_y | |
| - switch.is_on: electric_heat | |
| then: | |
| - switch.turn_on: ${heatpump_fanspeed} | |
| else: | |
| if: | |
| condition: | |
| - switch.is_off: fan_high | |
| - switch.is_off: fan_med | |
| - switch.is_off: fan_low | |
| then: | |
| - switch.turn_on: ${constant_fanspeed} | |
| script: | |
| - id: fan_heatpump | |
| mode: single | |
| then: | |
| if: | |
| condition: | |
| - switch.is_off: fan_high | |
| - switch.is_off: fan_med | |
| - switch.is_off: fan_low | |
| then: | |
| - lambda: |- | |
| id(ambiant_pressure).publish_state(id(bme280_return_pressure).raw_state*100.0); | |
| - switch.turn_on: ${heatpump_fanspeed} | |
| - delay: 40s | |
| - lambda: |- | |
| id(filter_pressure).publish_state(id(ambiant_pressure).raw_state-(id(bme280_return_pressure).raw_state*100.0)); | |
| else: | |
| - switch.turn_on: ${heatpump_fanspeed} | |
| - id: fan_ramp_off | |
| mode: restart | |
| then: | |
| if: | |
| condition: | |
| lambda: |- | |
| return abs(id(bme280_return_temperature).state - id(coil_temperature).state)>5.0; | |
| then: #was cooling or heating | |
| - switch.turn_off: fan_med | |
| - switch.turn_off: fan_high | |
| - switch.turn_off: fan_low | |
| - if: | |
| condition: | |
| lambda: |- | |
| switch(id(hvac).fan_mode.value()) { | |
| case esphome::climate::CLIMATE_FAN_LOW: | |
| case esphome::climate::CLIMATE_FAN_MEDIUM: | |
| case esphome::climate::CLIMATE_FAN_HIGH: | |
| case esphome::climate::CLIMATE_FAN_ON: | |
| return false; | |
| case esphome::climate::CLIMATE_FAN_OFF: | |
| case esphome::climate::CLIMATE_FAN_AUTO: | |
| default: | |
| return true; | |
| } | |
| then: | |
| - switch.turn_on: ${constant_fanspeed} | |
| - wait_until: | |
| lambda: |- | |
| return abs(id(bme280_return_temperature).state - id(coil_temperature).state)<4.0 | |
| || id(outside_y).state | |
| || id(electric_heat).state; | |
| - switch.turn_off: ${constant_fanspeed} | |
| - if: | |
| condition: | |
| or: | |
| - switch.is_on: outside_y | |
| - switch.is_on: electric_heat | |
| then: | |
| - switch.turn_on: ${heatpump_fanspeed} | |
| else: | |
| if: | |
| condition: | |
| lambda: |- | |
| switch(id(hvac).fan_mode.value()) { | |
| case esphome::climate::CLIMATE_FAN_LOW: | |
| return true; | |
| default: | |
| return false; | |
| } | |
| then: | |
| switch.turn_on: fan_low | |
| else: | |
| if: | |
| condition: | |
| lambda: |- | |
| switch(id(hvac).fan_mode.value()) { | |
| case esphome::climate::CLIMATE_FAN_MEDIUM: | |
| return true; | |
| default: | |
| return false; | |
| } | |
| then: | |
| switch.turn_on: fan_med | |
| else: | |
| if: | |
| condition: | |
| lambda: |- | |
| switch(id(hvac).fan_mode.value()) { | |
| case esphome::climate::CLIMATE_FAN_HIGH: | |
| return true; | |
| default: | |
| return false; | |
| } | |
| then: | |
| switch.turn_on: fan_high | |
| else: | |
| if: | |
| condition: | |
| lambda: |- | |
| switch(id(hvac).fan_mode.value()) { | |
| case esphome::climate::CLIMATE_FAN_ON: | |
| return true; | |
| default: | |
| return false; | |
| } | |
| then: | |
| switch.turn_on: ${constant_fanspeed} | |
| else: | |
| - switch.turn_off: fan_low | |
| - switch.turn_off: fan_med | |
| - switch.turn_off: fan_high | |
| - if: | |
| condition: | |
| or: | |
| - switch.is_on: outside_y | |
| - switch.is_on: electric_heat | |
| then: | |
| - switch.turn_on: ${heatpump_fanspeed} | |
| else: | |
| if: | |
| condition: | |
| lambda: |- | |
| switch(id(hvac).fan_mode.value()) { | |
| case esphome::climate::CLIMATE_FAN_LOW: | |
| return true; | |
| default: | |
| return false; | |
| } | |
| then: | |
| switch.turn_on: fan_low | |
| else: | |
| if: | |
| condition: | |
| lambda: |- | |
| switch(id(hvac).fan_mode.value()) { | |
| case esphome::climate::CLIMATE_FAN_MEDIUM: | |
| return true; | |
| default: | |
| return false; | |
| } | |
| then: | |
| switch.turn_on: fan_med | |
| else: | |
| if: | |
| condition: | |
| lambda: |- | |
| switch(id(hvac).fan_mode.value()) { | |
| case esphome::climate::CLIMATE_FAN_HIGH: | |
| return true; | |
| default: | |
| return false; | |
| } | |
| then: | |
| switch.turn_on: fan_high | |
| else: | |
| if: | |
| condition: | |
| lambda: |- | |
| switch(id(hvac).fan_mode.value()) { | |
| case esphome::climate::CLIMATE_FAN_ON: | |
| return true; | |
| default: | |
| return false; | |
| } | |
| then: | |
| switch.turn_on: ${constant_fanspeed} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment