#############################################################
##### START - SUBSTITUTIONS #####
#############################################################


##### advanced config activate only when you know what you do #####
# substitutions: 
  # ## usage of secrets-file ## -> comment in ###### Change ME ######
  # device_name: "nspanel-name" # Wird im Blueprint benötigt!
  # wifi_ssid: !secret nspanel_wifi_ssid # add in your esphome secrets file.
  # wifi_password: !secret nspanel_wifi_password # add in your esphome secrets file.
  # ota_password: !secret nspanel_ota_password # add in your esphome secrets file.
  # nextion_update_url: !secret nspanel_update_url # add in your esphome secrets file. Example: "http://"HOME ASSISTANT IP":8123/local/nspanel/nspanel.tft"

  # ## static ip config ##
  # ip: "10.0.0.7"
  # gw: "10.0.0.138"
  # subnet: "255.255.255.0"
  # dns: "10.0.0.138"
  # domain: ".local"

##### end of advanced config #####

  ###### EDIT THE BELOW ENTITIES FOR YOURS... depricated #######################################################################
  ##### - will be removed in future release - ignore it or set if exist ##################
  # ha_hotwater_charge: switch.wwcharge
  # ha_heating_system_flame: binary_sensor.flamestatus ##### Buderus Heizung Flamen-Status (Integration) #####
  # ha_climate_thermostat_target_temp: sensor.nspanel_target_temp  ##### Climate Thermostat generiert in HA (custom_configuration -> nspanel) #####
  # ha_climate_thermostat: climate.nspanel_name ##### Climate Thermostat generiert in HA (custom_configuration -> nspanel) #####    
#########################################
#
#
#############################################################
##### CLOSE - SUBSTITUTIONS #####
#############################################################
#
##
###
#############################################################################################################################################################################################
###
##
#
#############################################################
##### START - Settings #####
#############################################################
#
#
#########################################

##### Functionality for the Nextion display #####
external_components:
  - source: github://pr#2956
    components: [nextion]
    refresh: 1h

##### ESP home CONFIG #####
esphome:
  name: ${device_name}



##### TYPE OF ESP BOARD #####
esp32:
  board: esp32dev

##### WIFI SETUP #####
wifi:
  ssid: ${wifi_ssid}
  password: ${wifi_password}
  power_save_mode: none
  ##### advanced config - uncomment to use static IP-Config #####  
  # manual_ip:
  #   static_ip: ${ip}
  #   gateway: ${gw}
  #   subnet: ${subnet}
  #   dns1: ${dns}
  # domain: ${domain}
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "${device_name}"
    password: ${wifi_password}

captive_portal:

web_server:
  port: 80
  auth:
    username: admin
    password: ${ota_password}

##### OTA (Over the air updates) password #####
ota:
  password: ${ota_password}
  safe_mode: true
  reboot_timeout: 3min
  num_attempts: 3

##### LOGGER #####
logger:
#  baud_rate: 0
#  level: WARN

##### CONFIGURE INTERNAL BUZZER #####
output:
    ##### BUZZER FOR PLAYING RINGTONES #####
  - platform: ledc
    id: buzzer_out
    pin:
      number: 21

##### ENABLE RINGTONE MUSIC SUPPORT #####
rtttl:
  id: buzzer
  output: buzzer_out

##### UART FOR NEXTION DISPLAY #####
uart:
  tx_pin: 16
  rx_pin: 17
  baud_rate: 115200
  id: tf_uart

###### A reboot button is always useful #####
button:
  - platform: restart
    name: ${device_name} Restart
    id: restart_nspanel




#########################################
#
#
#############################################################
##### CLOSE - Settings #####
#############################################################
#
##
###
#############################################################################################################################################################################################
###
##
#
#############################################################
##### START - API #####
#############################################################
#
#
#########################################

api:
  services:

    ##### SERVICE TO UPDATE THE HMI FILE #####
    - service: upload_tft
      then:
        - lambda: 'id(disp1)->upload_tft();'
            
    ##### Service to send a command "printf" directly to the display. Useful for testing #####
    - service: send_command_printf
      variables:
        cmd: string
      then:
        - lambda: 'id(disp1).send_command_printf("%s", cmd.c_str());'

    ##### Service to send a command "text_printf" directly to the display. Useful for testing #####
    - service: send_command_text_printf
      variables:
        component: string
        message: string
      then:
        - wait_until:
              switch.is_on: nextion_init
        - lambda: 'id(disp1).set_component_text_printf(component.c_str(), "%s", message.c_str());'

    ##### Service to send a command "component_value (Dualstate Button)" directly to the display. Useful for testing #####
    - service: send_command_value
      variables:
        component: string
        message: int
      then:
        - wait_until:
              switch.is_on: nextion_init
        - lambda: 'id(disp1).set_component_value(component.c_str(), message);'

    ##### Service to send a command "component_value (Dualstate Button)" directly to the display. Useful for testing #####
    - service: send_command_hide
      variables:
        component: string
      then:
        - wait_until:
              switch.is_on: nextion_init
        - lambda: 'id(disp1).hide_component(component.c_str());'

    ##### Service to send a command "component_value (Dualstate Button)" directly to the display. Useful for testing #####
    - service: send_command_font_color
      variables:
        component: string
        message: int
      then:
        - wait_until:
              switch.is_on: nextion_init
        - lambda: 'id(disp1).set_component_font_color(component.c_str(), message);'
    ##### Service to send a command "component_value (Dualstate Button)" directly to the display. Useful for testing #####
    - service: send_command_background_color
      variables:
        component: string
        message: int
      then:
        - wait_until:
              switch.is_on: nextion_init
        - lambda: 'id(disp1).set_component_background_color(component.c_str(), message);'

#########################################
#
#
#############################################################
##### CLOSE - API #####
#############################################################
#
##
###
#############################################################################################################################################################################################
###
##
#
#############################################################
##### START - GLOBALS #####
#############################################################
#
#
#########################################

globals:

  # ##### Save Target Temp #####
  # - id: climate_target_temp_val_global
  #   type: float
  #   restore_value: true
  #   initial_value: '12'

  # ##### Save Thermostat PIC Position #####
  # - id: climate_slider_val_global
  #   type: int
  #   restore_value: true
  #   initial_value: '0'

  ##### Save Display Brightness for NSPanel reboot #####
  - id: display_brightness_global
    type: int
    restore_value: true
    initial_value: '100'

  ##### Save Display DIM Brightness for NSPanel reboot
  - id: display_dim_brightness_global
    type: int
    restore_value: true
    initial_value: '10'

  ##### Save Display DIM Brightness for NSPanel reboot
  - id: sleep_modus_global
    type: int
    restore_value: true
    initial_value: '0'

  # ##### Save State Heating Room #####
  # - id: heating_room_global
  #   type: int
  #   restore_value: true
  #   initial_value: '0'

  ##### Save State HVAC #####
  # - id: hvac_mode_global
  #   type: int
  #   restore_value: true
  #   initial_value: '0'

  ##### lastclick_general State #####
  - id: lastclick_general_global
    type: std::string
    restore_value: no
    initial_value: ''

  ##### lastclick_lightsettings State #####
  - id: lastclick_lightsettings_global
    type: std::string
    restore_value: no
    initial_value: ''

  ##### lastclick_coversettings State #####
  - id: lastclick_coversettings_global
    type: std::string
    restore_value: no
    initial_value: ''

  ##### lastclick_climatesettings State #####
  - id: lastclick_climatesettings_global
    type: std::string
    restore_value: no
    initial_value: ''

#########################################
#
#
#############################################################
##### CLOSE - GLOBALS #####
#############################################################
#
##
###
#############################################################################################################################################################################################
###
##
#
#############################################################
##### START - BINARY SENSOR #####
#############################################################
#
#
#########################################

binary_sensor:

  ###### LEFT BUTTON BELOW DISPLAY TO TOGGLE RELAY#####
  - platform: gpio
    name: ${device_name} Left Button
    pin:
      number: 14
      inverted: true

  ##### RIGHT BUTTON BELOW DISPLAY TO TOGGLE RELAY #####
  - platform: gpio
    name: ${device_name} Right Button
    pin:
      number: 27
      inverted: true

  ##### THERMOSTAT - BUTTON DECREASES CLIMATE TARGET TEMPERATURE IN HA #####
  # - platform: nextion
  #   name: ${device_name} Climate Target DOWN
  #   page_id: 6
  #   component_id: 13
  #   internal: true
  #   on_click:
  #     - homeassistant.service:
  #         service: climate.set_temperature
  #         data_template:
  #           entity_id: ${ha_climate_thermostat}
  #           temperature: !lambda return id(climate_target_temp_val_global) - 0.5;
            
  ##### THERMOSTAT - BUTTON INCREASES CLIMATE TARGET TEMPERATURE IN HA #####            
  # - platform: nextion
  #   name: ${device_name} Climate Target UP
  #   page_id: 6
  #   component_id: 14
  #   internal: true
  #   on_click:
  #     - homeassistant.service:
  #         service: climate.set_temperature
  #         data_template:
  #           entity_id: ${ha_climate_thermostat}
  #           temperature: !lambda return id(climate_target_temp_val_global) + 0.5;

  ##### THERMOSTAT - BUTTON ON / OFF Heating #####
  # - platform: nextion
  #   name: ${device_name} Heating Room State
  #   id: heating_room_state
  #   page_id: 6
  #   component_id: 16
  #   internal: true
  #   on_click:
  #     - switch.toggle: hvac_mode

  ##### Restart NSPanel Button #####
  - platform: nextion
    name: ${device_name} Restart
    page_id: 7
    component_id: 10
    internal: true
    on_click:
      - button.press: restart_nspanel

  ##### Sleep Modus NSPanel Button #####
  - platform: nextion
    name: ${device_name} Sleep Modus
    page_id: 7
    component_id: 5
    internal: true
    on_click:
      - switch.toggle: sleep_modus

  ##### Hotwater Charge #####
  - platform: nextion
    name: ${device_name} Hotwater Charge
    page_id: 6
    component_id: 21
    on_click:
      - homeassistant.service:
          service: switch.toggle
          data:
            entity_id: ${ha_hotwater_charge}

#########################################
#
#
#############################################################
##### CLOSE - BINARY SENSOR #####
#############################################################
#
##
###
#############################################################################################################################################################################################
###
##
#
#############################################################
##### START - SENSOR #####
#############################################################
#
#
#########################################

sensor:

  ##### Uptime #####
  - platform: uptime
    name: ${device_name} uptime
    disabled_by_default: true

  ##### WIFI Signal stregth
  - platform: wifi_signal
    name: ${device_name} RSSI
    update_interval: 60s

  ##### INTERNAL TEMPERATUE SENSOR, ADC VALUE #####
  - platform: adc
    id: ntc_source
    pin: 38
    update_interval: 10s
    attenuation: 11db

  ##### INTERNAL TEMPERATUE SENSOR, adc reading converted to resistance (calculation)#####
  - platform: resistance
    id: resistance_sensor
    sensor: ntc_source
    configuration: DOWNSTREAM
    resistor: 11.2kOhm

  ##### INTERNAL TEMPERATUE SENSOR, resistance to temperature (calculation) #####
  - platform: ntc
    name: ${device_name} Temperature
    id: temp_nspanel
    sensor: resistance_sensor
    calibration:
      b_constant: 3950
      reference_temperature: 25°C
      reference_resistance: 10kOhm
    on_value:
      then:
        - wait_until:
            switch.is_on: nextion_init
        - lambda: id(disp1).set_component_text_printf("home.current_temp", "%.1f°", id(temp_nspanel).state); # onboard temp (thermostat temp) to home page.
        - lambda: id(disp1).set_component_text_printf("thermostat.a04", "%.1f", id(temp_nspanel).state);

  ##### THERMOSTAT CLIMATE TARGET TEMPERATURE FROM HA #####
  # - platform: homeassistant
  #   id: ha_climate_target_temp
  #   entity_id: ${ha_climate_thermostat_target_temp}
  #   on_value:
  #     then:
  #       - wait_until:
  #           switch.is_on: nextion_init
  #       - globals.set:
  #           id: climate_target_temp_val_global
  #           value: !lambda 'return float(x);'
  #       - lambda: id(disp1).set_component_text_printf("thermostat.a05", "%.1f", id(climate_target_temp_val_global));
  #         # THERMO PROGRESS CIRCLE, broken into 3 images to create space for the temperatures in the center.
  #       - lambda: |-
  #           int left=16; // 16 is empty left.
  #           int mid=17; // 17 is empty mid.
  #           int right=18; // 18 is empty right.
  #           if (id(climate_target_temp_val_global) == 13) {
  #             left=16;
  #             mid=17;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 13.5) {
  #             left=19;
  #             mid=17;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 14) {
  #             left=20;
  #             mid=17;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 14.5) {
  #             left=21;
  #             mid=17;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 15) {
  #             left=22;
  #             mid=17;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 15.5) {
  #             left=23;
  #             mid=17;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 16) {
  #             left=24;
  #             mid=17;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 16.5) {
  #             left=25;
  #             mid=17;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 17) {
  #             left=26;
  #             mid=17;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 17.5) {
  #             left=27;
  #             mid=17;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 18) {
  #             left=28;
  #             mid=17;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 18.5) {
  #             left=29;
  #             mid=30;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 19) {
  #             left=29; 
  #             mid=31;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 19.5) {
  #             left=29;
  #             mid=32;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 20) {
  #             left=29;
  #             mid=33;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 20.5) {
  #             left=29;
  #             mid=34;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 21) {
  #             left=29;
  #             mid=35;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 21.5) {
  #             left=29;
  #             mid=36;
  #             right=18;
  #           } else if (id(climate_target_temp_val_global) == 22) {
  #             left=29;
  #             mid=37;
  #             right=38;
  #           } else if (id(climate_target_temp_val_global) == 22.5) {
  #             left=29;
  #             mid=37;
  #             right=39;
  #           } else if (id(climate_target_temp_val_global) == 23) {
  #             left=29;
  #             mid=37;
  #             right=40;
  #           } else if (id(climate_target_temp_val_global) == 23.5) {
  #             left=29;
  #             mid=37;
  #             right=41;
  #           } else if (id(climate_target_temp_val_global) == 24) {
  #             left=29;
  #             mid=37;
  #             right=42;
  #           } else if (id(climate_target_temp_val_global) == 24.5) {
  #             left=29;
  #             mid=37;
  #             right=43;
  #           } else if (id(climate_target_temp_val_global) == 25) {
  #             left=29;
  #             mid=37;
  #             right=44;
  #           } else if (id(climate_target_temp_val_global) == 25.5) {
  #             left=29;
  #             mid=37;
  #             right=45;
  #           } else if (id(climate_target_temp_val_global) == 26) {
  #             left=29;
  #             mid=37;
  #             right=46;
  #           } else if (id(climate_target_temp_val_global) == 26.5) {
  #             left=29;
  #             mid=37;
  #             right=47;
  #           } else if (id(climate_target_temp_val_global) == 27) {
  #             left=29;
  #             mid=37;
  #             right=48;
  #           }
  #           // sends the 3 images to the display
  #           id(disp1).send_command_printf("thermostat.a01.pic=%i", left);
  #           id(disp1).send_command_printf("thermostat.a02.pic=%i", mid);
  #           id(disp1).send_command_printf("thermostat.a03.pic=%i", right);

  ###### TARGET TEMPERATURE GET VALUE FROM NEXTION CIRCLE SLIDER AND SET GLOBAL VARIBLE #####
  # - platform: nextion
  #   id: climate_circleslider
  #   name: ${device_name} Climate circleslider
  #   variable_name: climateslider
  #   internal: true
  #   on_value:
  #     then:
  #       - wait_until:
  #           switch.is_on: nextion_init
  #       - globals.set:
  #           id: climate_slider_val_global
  #           value: !lambda 'return int(x);'
  #       - lambda: |-
  #           if (id(climate_slider_val_global) == 0) {
  #             id(climate_target_temp_val_global) = 13;
  #           } else if (id(climate_slider_val_global) == 1) {
  #             id(climate_target_temp_val_global) = 13.5;
  #           } else if (id(climate_slider_val_global) == 2) {
  #             id(climate_target_temp_val_global) = 14;
  #           } else if (id(climate_slider_val_global) == 3) {
  #             id(climate_target_temp_val_global) = 14.5;
  #           } else if (id(climate_slider_val_global) == 4) {
  #             id(climate_target_temp_val_global) = 15;
  #           } else if (id(climate_slider_val_global) == 5) {
  #             id(climate_target_temp_val_global) = 15.5;
  #           } else if (id(climate_slider_val_global) == 6) {
  #             id(climate_target_temp_val_global) = 16;
  #           } else if (id(climate_slider_val_global) == 7) {
  #             id(climate_target_temp_val_global) = 16.5;
  #           } else if (id(climate_slider_val_global) == 8) {
  #             id(climate_target_temp_val_global) = 17;
  #           } else if (id(climate_slider_val_global) == 9) {
  #             id(climate_target_temp_val_global) = 17.5;
  #           } else if (id(climate_slider_val_global) == 10) {
  #             id(climate_target_temp_val_global) = 18;
  #           } else if (id(climate_slider_val_global) == 11) {
  #             id(climate_target_temp_val_global) = 18.5;
  #           } else if (id(climate_slider_val_global) == 12) {
  #             id(climate_target_temp_val_global) = 19;
  #           } else if (id(climate_slider_val_global) == 13) {
  #             id(climate_target_temp_val_global) = 19.5;
  #           } else if (id(climate_slider_val_global) == 14) {
  #             id(climate_target_temp_val_global) = 20;
  #           } else if (id(climate_slider_val_global) == 15) {
  #             id(climate_target_temp_val_global) = 20.5;
  #           } else if (id(climate_slider_val_global) == 16) {
  #             id(climate_target_temp_val_global) = 21;
  #           } else if (id(climate_slider_val_global) == 17) {
  #             id(climate_target_temp_val_global) = 21.5;
  #           } else if (id(climate_slider_val_global) == 18) {
  #             id(climate_target_temp_val_global) = 22;
  #           } else if (id(climate_slider_val_global) == 19) {
  #             id(climate_target_temp_val_global) = 22.5;
  #           } else if (id(climate_slider_val_global) == 20) {
  #             id(climate_target_temp_val_global) = 23;
  #           } else if (id(climate_slider_val_global) == 21) {
  #             id(climate_target_temp_val_global) = 23.5;
  #           } else if (id(climate_slider_val_global) == 22) {
  #             id(climate_target_temp_val_global) = 24;
  #           } else if (id(climate_slider_val_global) == 23) {
  #             id(climate_target_temp_val_global) = 24.5;
  #           } else if (id(climate_slider_val_global) == 24) {
  #             id(climate_target_temp_val_global) = 25;
  #           } else if (id(climate_slider_val_global) == 25) {
  #             id(climate_target_temp_val_global) = 25.5;
  #           } else if (id(climate_slider_val_global) == 26) {
  #             id(climate_target_temp_val_global) = 26;
  #           } else if (id(climate_slider_val_global) == 27) {
  #             id(climate_target_temp_val_global) = 26.5;
  #           } else if (id(climate_slider_val_global) == 28) {
  #             id(climate_target_temp_val_global) = 27;
  #           }
  #       - homeassistant.service:
  #           service: climate.set_temperature
  #           data_template:
  #             entity_id: ${ha_climate_thermostat}
  #             temperature: !lambda return id(climate_target_temp_val_global);

  ###### Display Brightness GET VALUE FROM NSPanel SLIDER #####
  - platform: nextion
    id: brightslider
    name: ${device_name} brightness Slider
    variable_name: brightslider
    internal: true
    on_value:
      then:
        - wait_until:
            switch.is_on: nextion_init
        - number.set:
            id: display_brightness
            value: !lambda 'return int(x);'
          # send text field percentage of current_lightslider_val  
        - lambda: id(disp1).set_component_text_printf("settings.a03", "%i", id(display_brightness_global));

  ###### Display DIM Brightness GET VALUE FROM NSPanel SLIDER #####
  - platform: nextion
    id: dimslider
    name: ${device_name} dim brightness slider
    variable_name: dimslider
    internal: true
    on_value:
      then:
        - wait_until:
            switch.is_on: nextion_init
        - number.set:
            id: display_dim_brightness
            value: !lambda 'return int(x);'
          # send text field percentage of current_lightslider_val  
        - lambda: id(disp1).set_component_text_printf("settings.a04", "%i", id(display_dim_brightness_global));

  ###### Send current page to HA
  - platform: nextion
    id: current_page
    name: "${device_name} Current Page"
    variable_name: dp
    update_interval: 1s
    accuracy_decimals: 0
    filters:
      - delta: 1.0
      - lambda: return int(x);


#########################################
#
#
#############################################################
##### CLOSE - SENSOR #####
#############################################################
#
##
###
#############################################################################################################################################################################################
###
##
#
#############################################################
##### START - TEXT SENSOR#####
#############################################################
#
#
#########################################

text_sensor:

  ##### ESPhome version used to compile the app #####
  - platform: version
    name: ${device_name} ESPhome Version
    disabled_by_default: true

  - platform: wifi_info
    ip_address:
      name: ${device_name} IP
      disabled_by_default: true
    ssid:
      name: ${device_name} SSID
      disabled_by_default: true
    bssid:
      name: ${device_name} BSSID
      disabled_by_default: true

  ##### SUN SENSOR FROM HA #####
  # - platform: homeassistant
  #   id: sun_sun
  #   entity_id: sun.sun

  ##### last click sensor, the main action variable - push to HA #####
  - platform: nextion
    nextion_id: disp1
    name: ${device_name} Last Click
    id: disp1_lastclick_general
    update_interval: 50ms
    component_name: lastclick
    internal: false
    filters:
      - lambda: |-
          if (strcmp(x.c_str(), id(lastclick_general_global).c_str()) != 0) {
            return x;
          } else {
            return {};
          }
    on_value:
      then:
        - globals.set:
            id: lastclick_general_global
            value: !lambda return x;
  
  ##### last click lightsettings page, the main action variable - push to HA #####
  - platform: nextion
    nextion_id: disp1
    name: ${device_name} last click lightsettings
    id: disp1_lastclick_lightsettings
    update_interval: 50ms
    component_name: lightsetting
    internal: false
    filters:
      - lambda: |-
          if (strcmp(x.c_str(), id(lastclick_lightsettings_global).c_str()) != 0) {
            return x;
          } else {
            return {};
          }
    on_value:
      then:
        - globals.set:
            id: lastclick_lightsettings_global
            value: !lambda return x;

  ##### last click coversettings page, the main action variable - push to HA #####
  - platform: nextion
    nextion_id: disp1
    name: ${device_name} last click coversettings
    id: disp1_lastclick_coversettings
    update_interval: 50ms
    component_name: coversetting
    internal: false
    filters:
      - lambda: |-
          if (strcmp(x.c_str(), id(lastclick_coversettings_global).c_str()) != 0) {
            return x;
          } else {
            return {};
          }
    on_value:
      then:
        - globals.set:
            id: lastclick_coversettings_global
            value: !lambda return x;

  ##### last click climate page, the main action variable - push to HA #####
  - platform: nextion
    nextion_id: disp1
    name: ${device_name} last click climatesettings
    id: disp1_lastclick_climatesettings
    update_interval: 50ms
    component_name: climatesetting
    internal: false
    filters:
      - lambda: |-
          if (strcmp(x.c_str(), id(lastclick_climatesettings_global).c_str()) != 0) {
            return x;
          } else {
            return {};
          }
    on_value:
      then:
        - globals.set:
            id: lastclick_climatesettings_global
            value: !lambda return x;

  ##### HEATING System ICON #####
  # - platform: homeassistant
  #   entity_id: ${ha_heating_system_flame}
  #   name: "Heating System"
  #   id: heating_system
  #   on_value:
  #     then:
  #       - wait_until:
  #           switch.is_on: nextion_init
  #       - lambda: |-
  #           int symbol=53; // 53 is a blank image 20x20
  #           if (id(heating_system).state == "on") {
  #             symbol=64;
  #           }
  #           id(disp1).send_command_printf("home.a50.pic=%i", symbol);
  #           id(disp1).send_command_printf("thermostat.a50.pic=%i", symbol);

  ##### Hotwater Charge ICON #####
  # - platform: homeassistant
  #   entity_id: ${ha_hotwater_charge}
  #   name: "Hotwater Charge"
  #   id: hotwater_charge
  #   on_value:
  #     then:
  #       - wait_until:
  #           switch.is_on: nextion_init
  #       - lambda: |- 
  #           if (id(hotwater_charge).state == "on") {
  #             id(disp1).set_component_value("thermostat.a12",1);
  #           } else {
  #             id(disp1).set_component_value("thermostat.a12",0);
  #           }

#########################################
#
#
#############################################################
##### CLOSE - TEXT SENSOR #####
#############################################################
#
##
###
#############################################################################################################################################################################################
###
##
#
#############################################################
##### START - SWITCH #####
#############################################################
#
#
#########################################
  
switch:

  # ##### Restart switch ######
  # - platform: restart
  #   name: ${device_name} Restart

  # ##### Restart in safe-mode #####
  # - platform: safe_mode
  #   name: ${device_name} Restart (Safe Mode)

  ##### global variable to keep track on whether the Nextion display is ready or not. Delays initial info from HA to the display #####
  - platform: template
    name: ${device_name} Nextion inited
    id: nextion_init
    entity_category: config
    restore_state: false
    assumed_state: off
    optimistic: true

  ##### UPDATE TFT DISPLAY #####
  - platform: template
    name: Update TFT display
    id: tft_update
    turn_on_action:
      - delay: 16ms
      - lambda: id(disp1).upload_tft();
      - switch.turn_off: tft_update

  ##### PHYSICAL SWITCH 1 #####
  - platform: gpio
    name: ${device_name} Relay 1
    id: relay_1
    pin:
      number: 22

  ##### PHYSICAL SWITCH 2 ######
  - platform: gpio
    name: ${device_name} Relay 2
    id: relay_2
    pin:
      number: 19

  ##### Switch Climate HVAC Mode #####
  # - platform: template
  #   device_class: switch
  #   name: ${device_name} hvac Mode
  #   id: hvac_mode
  #   restore_state: true
  #   assumed_state: false
  #   optimistic: true
  #   on_turn_off:
  #     - lambda: id(disp1).set_component_value("thermostat.a10",0);
  #     - globals.set:
  #           id: hvac_mode_global
  #           value: '0'
  #     - homeassistant.service:
  #         service: climate.set_hvac_mode
  #         data_template:
  #           entity_id: $ha_climate_thermostat
  #           hvac_mode: 'off'
  #     - lambda: id(disp1).send_command_printf("thermostat.a06.pic=49");
  #     - lambda: id(disp1).send_command_printf("home.a51.pic=53");
  #     - lambda: id(disp1).send_command_printf("thermostat.a51.pic=53");
  #   on_turn_on:
  #     - lambda: id(disp1).set_component_value("thermostat.a10",1);
  #     - globals.set:
  #           id: hvac_mode_global
  #           value: '1'
  #     - homeassistant.service:
  #         service: climate.set_hvac_mode
  #         data_template:
  #           entity_id: $ha_climate_thermostat
  #           hvac_mode: 'heat'
  #     - lambda: |-
  #         if (id(heating_room_global) == 0) 
  #         {
  #           id(disp1).send_command_printf("thermostat.a06.pic=50");
  #         } else if (id(heating_room_global) == 1) {
  #           id(disp1).send_command_printf("thermostat.a06.pic=51");
  #         } 
  #     - lambda: id(disp1).send_command_printf("home.a51.pic=65");
  #     - lambda: id(disp1).send_command_printf("thermostat.a51.pic=65");
      
  ##### DISPLAY ALWAYS ON #####
  - platform: gpio
    name: ${device_name} Screen Power
    id: screen_power
    entity_category: config
    pin:
      number: 4
      inverted: true
    restore_mode: ALWAYS_ON
    internal: true

  ##### Switch Display Sleep Modus #####
  - platform: template
    device_class: switch
    name: ${device_name} Sleep Modus
    id: sleep_modus
    restore_state: true
    assumed_state: false
    optimistic: true
    on_turn_off:
      - lambda: id(disp1).send_command_printf("home.sleepmodus.val=0");
      - globals.set:
            id: sleep_modus_global
            value: '0'
      - lambda:  id(disp1).set_component_value("settings.a02",0);
    on_turn_on:
      - lambda: id(disp1).send_command_printf("home.sleepmodus.val=1");
      - globals.set:
            id: sleep_modus_global
            value: '1'
      - lambda:  id(disp1).set_component_value("settings.a02",1);

#########################################
#
#
#############################################################
##### CLOSE - SWITCH #####
#############################################################
#
##
###
#############################################################################################################################################################################################
###
##
#
#############################################################
##### START - NUMBER #####
#############################################################
#
#
#########################################

number:

  ##### SCREEN BRIGHTNESS #####
  - platform: template
    name: ${device_name} Display Brightness
    id: display_brightness
    entity_category: config
    unit_of_measurement: '%'
    min_value: 1
    max_value: 100
    step: 1
    restore_value: true
    optimistic: true
    set_action:
      then:
        - lambda: 'id(disp1).set_backlight_brightness(x/100);'
        - lambda: 'id(disp1).send_command_printf("home.brightness.val=%i", int(x));'
        - globals.set:
            id: display_brightness_global
            value: !lambda 'return int(x);'

  ##### SCREEN BRIGHTNESS DIMMED DOWN #####
  - platform: template
    name: ${device_name} Display Brightness Dimdown
    id: display_dim_brightness
    entity_category: config
    unit_of_measurement: '%'
    min_value: 1
    max_value: 100
    step: 1
    restore_value: true
    optimistic: true
    set_action:
      then:
        - lambda: 'id(disp1).send_command_printf("home.brightdd.val=%i", int(x));'
        - globals.set:
            id: display_dim_brightness_global
            value: !lambda 'return int(x);'

#########################################
#
#
#############################################################
##### CLOSE - NUMBER #####
#############################################################
#
##
###
#############################################################################################################################################################################################
###
##
#
#############################################################
##### START - DISPLAY START#####
#############################################################
#
#
#########################################

display:
  - platform: nextion
    id: disp1
    uart_id: tf_uart
    tft_url: ${nextion_update_url}
    on_setup:
      then:
        - lambda: id(disp1).send_command_printf("page 9"); ##### CHANGE! -  Loading page #####
        - wait_until:
            api.connected
        - delay: 0.5s
        - rtttl.play: "two short:d=4,o=5,b=100:16e6,16e6"
        - delay: 0.5s
        - switch.template.publish:
            id: nextion_init
            state: on
        - lambda: id(disp1).send_command_printf("page 0"); #### home page #####
        - delay: 2s ##### gives the display time to update other components & set the home page #####
        - number.set:
            id: display_brightness
            value: !lambda 'return id(display_brightness_global);'
        - number.set:
            id: display_dim_brightness
            value: !lambda 'return id(display_dim_brightness_global);'
        - lambda: id(disp1).set_component_text_printf("settings.a03", "%i", id(display_brightness_global));
        - lambda: id(disp1).set_component_text_printf("settings.a04", "%i", id(display_dim_brightness_global));
        - lambda: id(disp1).send_command_printf("settings.brightslider.val=%i", id(display_brightness_global));
        - lambda: id(disp1).send_command_printf("settings.dimslider.val=%i", id(display_dim_brightness_global));
        - lambda: id(disp1).send_command_printf("home.sleepmodus.val=%i", id(sleep_modus_global));
        - lambda: |-
            id(disp1).set_component_value("settings.a02",0);
            if (id(sleep_modus_global) == 1) 
            {
              id(disp1).set_component_value("settings.a02",1);
            }
        # - lambda: |-
        #     id(disp1).send_command_printf("home.a50.pic=53");
        #     id(disp1).send_command_printf("thermostat.a50.pic=53");
        #     id(disp1).send_command_printf("thermostat.a06.pic=50");
        #     if (id(heating_room_global) == 1) 
        #     {
        #       id(disp1).send_command_printf("home.a52.pic=66");
        #       id(disp1).send_command_printf("thermostat.a52.pic=66");
        #       id(disp1).send_command_printf("thermostat.a06.pic=51");
        #     }
        # - lambda: |-
        #     if (id(hvac_mode_global) == 0) {
        #       id(disp1).send_command_printf("home.a51.pic=53");
        #       id(disp1).send_command_printf("thermostat.a51.pic=53");
        #       id(disp1).send_command_printf("thermostat.a06.pic=49");
        #     } else if (id(hvac_mode_global) == 1) {
        #       id(disp1).send_command_printf("home.a51.pic=65");
        #       id(disp1).send_command_printf("thermostat.a51.pic=65");
        #       id(disp1).set_component_value("thermostat.a10",1);
        #     }

#############################################################
##### CLOSE - DISPLAY START #####
#############################################################