diff --git a/.github/workflows/validate_esphome.yml b/.github/workflows/validate_esphome.yml index 3c1993e..8e36e28 100644 --- a/.github/workflows/validate_esphome.yml +++ b/.github/workflows/validate_esphome.yml @@ -105,6 +105,18 @@ jobs: with: yaml_file: "./.test/esphome_advanced_climate_cool_esp_idf.yaml" + build_climate_heat_advanced_customization: + name: Customizations + runs-on: "ubuntu-latest" + needs: + - build_climate_heat_advanced + steps: + - uses: actions/checkout@v4.1.0 + - name: Build core+advanced+climate_heat+customizations + uses: esphome/build-action@v1.8.0 + with: + yaml_file: "./.test/esphome_advanced_climate_heat_customizations.yaml" + #build_climate_cool_advanced_esp_idf5: # name: esp-idf v5 & Bluetooth proxy # runs-on: "ubuntu-latest" diff --git a/.github/workflows/validate_esphome_beta.yml b/.github/workflows/validate_esphome_beta.yml index 139ef11..a326a9d 100644 --- a/.github/workflows/validate_esphome_beta.yml +++ b/.github/workflows/validate_esphome_beta.yml @@ -108,6 +108,19 @@ jobs: yaml_file: "./.test/esphome_advanced_climate_cool_esp_idf.yaml" version: beta + build_climate_heat_advanced_customization: + name: Customizations + runs-on: "ubuntu-latest" + needs: + - build_climate_heat_advanced + steps: + - uses: actions/checkout@v4.1.0 + - name: Build core+advanced+climate_heat+customizations + uses: esphome/build-action@v1.8.0 + with: + yaml_file: "./.test/esphome_advanced_climate_heat_customizations.yaml" + version: beta + #build_climate_cool_advanced_esp_idf5: # name: esp-idf v5 & Bluetooth proxy # runs-on: "ubuntu-latest" diff --git a/.test/esphome_advanced_climate_heat_customizations.yaml b/.test/esphome_advanced_climate_heat_customizations.yaml new file mode 100644 index 0000000..0e01f48 --- /dev/null +++ b/.test/esphome_advanced_climate_heat_customizations.yaml @@ -0,0 +1,251 @@ +substitutions: + device_name: nspanel + wifi_ssid: "nspanel" + wifi_password: "NSPanel_HA_Blueprint" + nextion_update_url: "https://github.com/Blackymas/NSPanel_HA_Blueprint/dummy" + nextion_update_blank_url: "http://homeassistant.local:8123/local/nspanel/dev/nspanel_blank.tft" + +packages: + core_package: !include ../nspanel_esphome.yaml # Core package + advanced_package: !include ../nspanel_esphome_advanced.yaml + addon_climate_heat: !include ../nspanel_esphome_addon_climate_heat.yaml + #addon_climate_cold: !include ../nspanel_esphome_addon_climate_cold.yaml + +##### Customizations from Wiki ##### +api: + # Encrypt the communication between ESPHome and Home Assistant + encryption: + key: !secret api_encryption_key + # Reboot if HA is not connected for 15 minutes + reboot_timeout: 15min + +binary_sensor: + # Is display awake? + - name: ${device_name} Display state + id: display_state + platform: template + lambda: |- + return (id(current_page).state != "screensaver"); + +# Enable Bluetooth proxy +bluetooth_proxy: + +button: + ##### UPDATE TFT BLANK DISPLAY ##### + - name: ${device_name} Update TFT display (blank) + platform: template + icon: mdi:file-sync + id: tft_update_blank + entity_category: config + on_press: + - logger.log: "Button pressed: Update TFT display (blank)" + - binary_sensor.template.publish: + id: nextion_init + state: false + - delay: 16ms + - lambda: |- + id(disp1)->set_tft_url("${nextion_update_blank_url}"); + id(disp1).upload_tft(); + # Adds a button to put the panel to sleep + - name: ${device_name} Sleep + id: force_sleep + platform: template + icon: mdi:sleep + on_press: + then: + - logger.log: Button Sleep pressed + - lambda: |- + if (id(current_page).state != "screensaver") id(disp1).goto_page("screensaver"); + + # Adds a button to wake-up the panel (similar to the existing service) + - name: ${device_name} Wake-up + id: force_wake_up + platform: template + icon: mdi:alarm + on_press: + then: + - logger.log: Button Wake-up pressed + - lambda: |- + if (id(current_page).state == "screensaver") id(disp1).goto_page(id(wakeup_page_name).state.c_str()); + // id(timer_page).execute(id(wakeup_page_name).state.c_str()); // enable this if you want page timeout to be reset + id(timer_sleep).execute(id(wakeup_page_name).state.c_str(), int(id(timeout_sleep).state)); + id(timer_dim).execute(id(wakeup_page_name).state.c_str(), int(id(timeout_dim).state)); + +deep_sleep: + # Define the wake-up button. Use pin 14 for left button or pin 27 for right button + wakeup_pin: 14 + wakeup_pin_mode: INVERT_WAKEUP + +# Change framework to `esp-idf` +esp32: + framework: + type: esp-idf + +esphome: + # change OTA password, remove after flashing + on_boot: + - lambda: |- + id(my_ota).set_auth_password("New password"); + # Limit the amount of resources used for compiling + compile_process_limit: 1 + +light: + # Add the display as a light in Home Assistant + - name: ${device_name} Display + id: display_light + icon: mdi:tablet-dashboard + platform: monochromatic + output: display_output + default_transition_length: 0s + on_turn_on: + then: + - lambda: |- + ESP_LOGV("light.display_light", "Turn-on"); + if (id(current_page).state == "screensaver") id(disp1).goto_page(id(wakeup_page_name).state.c_str()); + id(timer_reset_all).execute(id(wakeup_page_name).state.c_str()); + on_turn_off: + then: + - lambda: |- + ESP_LOGV("light.display_light", "Turn-off"); + id(disp1).goto_page("screensaver"); + +logger: + # Enable hardware UART serial logging + baud_rate: 115200 + +ota: + # change OTA password, remove after flashing + password: !secret wifi_password + id: my_ota + +output: + # Output required by `display_light` to send the commands to Nextion + - id: display_output + platform: template + type: float + write_action: + - lambda: |- + ESP_LOGV("output.display_output", "state: %f", state); + uint current_brightness = int(round(id(display_light).current_values.is_on() ? (id(display_light).current_values.get_brightness() * 100.0f) : 0.0)); + ESP_LOGV("output.display_output", "current_brightness: %i%%", current_brightness); + id(set_brightness).execute(current_brightness); + +script: + # Updates the existing `page_changed` script to update the `display_light` status when a page changes + - id: !extend page_changed + then: + - lambda: |- + ESP_LOGV("script.page_changed(custom)", "page: %s", page.c_str()); + ESP_LOGV("script.page_changed(custom)", "is_on(): %i", id(display_light).current_values.is_on() ? 1 : 0); + if (page == "screensaver" and id(display_light).current_values.is_on()) { + auto call = id(display_light).turn_off(); + call.perform(); + } else if (page != "screensaver" and (not id(display_light).current_values.is_on())) { + auto call = id(display_light).turn_on(); + call.perform(); + } + + # Updates the existing `set_brightness` script to update the `display_light` status when a new brightness level is set + - id: !extend set_brightness + then: + - lambda: |- + ESP_LOGD("script.set_brightness(custom)", "brightness: %i", brightness); + if (id(current_page).state != "screensaver" and brightness > 0) { + auto call = id(display_light).turn_on(); + call.set_brightness(static_cast(id(display_last_brightness)) / 100.0f); + call.perform(); + } else { + auto call = id(display_light).turn_off(); + call.perform(); + } + +time: + - id: !extend time_provider + timezone: "America/Cancun" + # Use my own local network time server + platform: sntp + servers: + - !secret mysntpserver + - europe.pool.ntp.org + - 0.pool.ntp.org + on_time: + - hours: 23 + minutes: 0 + seconds: 0 + then: + - deep_sleep.enter: + sleep_duration: 7h + # Scheduled relay + - hours: 7 + minutes: 30 + seconds: 0 + then: + - switch.turn_on: relay_1 + - hours: 12 + minutes: 15 + seconds: 0 + then: + - switch.turn_off: relay_1 + - hours: 19 + minutes: 0 + seconds: 0 + then: + - switch.turn_on: relay_1 + - hours: 23 + minutes: 30 + seconds: 0 + then: + - switch.turn_off: relay_1 + # Scheduled climate + - hours: 7 + minutes: 0 + seconds: 0 + then: + - climate.control: + id: thermostat_embedded + mode: auto + target_temperature: 22°C + - hours: 19 + minutes: 0 + seconds: 0 + then: + - climate.control: + id: thermostat_embedded + mode: auto + target_temperature: 20°C + - hours: 23 + minutes: 0 + seconds: 0 + then: + - climate.control: + id: thermostat_embedded + mode: auto + target_temperature: 18°C + +uart: + # Set Nextion comms baud rate to 921600 bps + - id: !extend tf_uart + baud_rate: 9600 + +web_server: + # Custom web server credentials + auth: + username: !secret web_server_username + password: !secret web_server_password + +wifi: + networks: + - id: !extend wifi_default + # Set IP address manually + manual_ip: + static_ip: 192.168.0.123 + gateway: 192.168.0.1 + subnet: 255.255.255.0 + # Connect to a hidden Wi-Fi network. + hidden: true + # Set dual network + priority: 10 + - ssid: !secret wifi_ssid_backup + password: !secret wifi_password_backup + priority: 0 + fast_connect: true