966 lines
29 KiB
YAML
966 lines
29 KiB
YAML
#####################################################################################################
|
|
##### NSPANEL ESPHOME created by Blackymas - https://github.com/Blackymas/NSPanel_HA_Blueprint #####
|
|
##### ADVANCED CONFIG + FULL ESPHOME CODE! #####
|
|
##### PLEASE only make changes if it is necessary and also the required knowledge is available. #####
|
|
##### For normal use with the Blueprint, no changes are necessary. #####
|
|
#####################################################################################################
|
|
|
|
|
|
##### ADVANCED CONFIGURATION - 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. -> per default this is also used for ota_password and web_password
|
|
# ota_password: !secret nspanel_ota_password # add in your esphome secrets file. - manual change in code required to activate
|
|
# web_password: !secret nspanel_web_password # add in your esphome secrets file. - manual change in code required to activate
|
|
# api_password: !secret nspanel_api_password # add in your esphome secrets file. - manual change in code required to activate
|
|
# 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"
|
|
|
|
##### if you rename this file to .nspanel_esphome.yaml then you can activate nested config
|
|
##### use the ADVANCED CONFIG-Section as device configuration
|
|
##### https://esphome.io/guides/configuration-types.html#yaml-insertion-operator
|
|
# <<: !include .nspanel_esphome.yaml
|
|
|
|
##### END OF ADVANCED CONFIGURATION ##############################################################
|
|
|
|
##### 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}
|
|
|
|
##### Functionality for the Nextion display #####
|
|
external_components:
|
|
- source: github://pr#2956
|
|
components: [nextion]
|
|
refresh: 1h
|
|
|
|
##### ESPHOME CONFIGURATION #####
|
|
esphome:
|
|
name: ${device_name}
|
|
min_version: 2022.10.2
|
|
|
|
##### TYPE OF ESP BOARD #####
|
|
esp32:
|
|
board: esp32dev
|
|
|
|
captive_portal:
|
|
|
|
web_server:
|
|
port: 80
|
|
auth:
|
|
username: admin
|
|
password: ${wifi_password}
|
|
##### advanced config - change to use web_password #####
|
|
# password: ${web_password}
|
|
|
|
##### OTA PASSWORD #####
|
|
ota:
|
|
password: ${wifi_password}
|
|
##### advanced config - change to use ota_password #####
|
|
# 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
|
|
|
|
##### START - BUTTON CONFIGURATION #####
|
|
button:
|
|
###### REBOOT BUTTON #####
|
|
- platform: restart
|
|
name: ${device_name} Restart
|
|
id: restart_nspanel
|
|
|
|
##### UPDATE TFT DISPLAY #####
|
|
- platform: template
|
|
name: ${device_name} Update TFT display
|
|
icon: mdi:file-sync
|
|
id: tft_update
|
|
entity_category: config
|
|
on_press:
|
|
- delay: 16ms
|
|
- lambda: id(disp1).upload_tft();
|
|
|
|
##### START - API CONFIGURATION #####
|
|
api:
|
|
##### advanced config - activate to use api_password #####
|
|
# password: ${api_password}
|
|
services:
|
|
|
|
##### SERVICE TO UPDATE THE HMI FILE #####
|
|
- service: upload_tft
|
|
then:
|
|
- lambda: 'id(disp1)->upload_tft();'
|
|
|
|
##### SERVICE TO UPDATE THE TFT FILE from URL #####
|
|
- service: upload_tft_url
|
|
variables:
|
|
url: string
|
|
then:
|
|
- lambda: 'id(disp1)->set_tft_url(url.c_str());'
|
|
- lambda: 'id(disp1)->upload_tft();'
|
|
|
|
##### Service to send a command "printf" directly to the display #####
|
|
- 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 #####
|
|
- 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 #####
|
|
- 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 "hide componente" directly to the display #####
|
|
- service: send_command_hide ### unused ###
|
|
variables:
|
|
component: string
|
|
then:
|
|
- wait_until:
|
|
switch.is_on: nextion_init
|
|
- lambda: 'id(disp1).hide_component(component.c_str());'
|
|
|
|
##### Service to send a command "show componente" directly to the display #####
|
|
- service: send_command_show ### unused ###
|
|
variables:
|
|
component: string
|
|
then:
|
|
- wait_until:
|
|
switch.is_on: nextion_init
|
|
- lambda: 'id(disp1).show_component(component.c_str());'
|
|
|
|
##### Service to send a command "show ALL componente" directly to the display #####
|
|
- service: send_command_show_all ### unused ###
|
|
then:
|
|
- wait_until:
|
|
switch.is_on: nextion_init
|
|
- lambda: 'id(disp1).show_component("255");'
|
|
|
|
##### Service to send a command "font color" directly to the display #####
|
|
- 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 "background color" directly to the display #####
|
|
- 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);'
|
|
|
|
##### Service to show a notification-message on the screen #####
|
|
- service: notification_show
|
|
variables:
|
|
label: string
|
|
text: string
|
|
then:
|
|
- wait_until:
|
|
switch.is_on: nextion_init
|
|
- lambda: |-
|
|
id(disp1).send_command_printf("page notification");
|
|
id(disp1).set_component_text_printf("notification.notifi_label", "%s", label.c_str());
|
|
id(disp1).set_component_text_printf("notification.notifi_text01", "%s", text.c_str());
|
|
id(notification_label).publish_state(label.c_str());
|
|
id(notification_text).publish_state(text.c_str());
|
|
- switch.turn_on: notification_unread
|
|
- if:
|
|
condition:
|
|
switch.is_on: notification_sound
|
|
then:
|
|
- rtttl.play: "two short:d=4,o=5,b=100:16e6,16e6"
|
|
|
|
##### Service to clear the notification #####
|
|
- service: notification_clear
|
|
then:
|
|
- wait_until:
|
|
switch.is_on: nextion_init
|
|
- lambda: |-
|
|
id(notification_label).publish_state("");
|
|
id(notification_text).publish_state("");
|
|
- switch.turn_off: notification_unread
|
|
|
|
##### Service to set entity-information for settings-page(s)
|
|
- service: set_settings_entity
|
|
variables:
|
|
entity: string
|
|
then:
|
|
- wait_until:
|
|
switch.is_on: nextion_init
|
|
- lambda: |-
|
|
id(settings_entity).publish_state(entity.c_str());
|
|
|
|
##### Service to play a rtttl tones #####
|
|
# Example tones : https://codebender.cc/sketch:109888#RTTTL%20Songs.ino
|
|
- service: play_rtttl
|
|
variables:
|
|
song_str: string
|
|
then:
|
|
- rtttl.play:
|
|
rtttl: !lambda 'return song_str;'
|
|
|
|
# Service to show a QR code on the display (ex. for WiFi password)
|
|
- service: qr_code
|
|
variables:
|
|
qrdata: string
|
|
then:
|
|
- wait_until:
|
|
switch.is_on: nextion_init
|
|
- lambda: |-
|
|
id(disp1).send_command_printf("page qrcode");
|
|
id(disp1).set_component_text_printf("qrcode.qrcode_value", "%s", qrdata.c_str());
|
|
|
|
#### Service to send thermostat cycle state ####
|
|
- service: send_thermostat_cycle_state
|
|
variables:
|
|
value: float
|
|
then:
|
|
- wait_until:
|
|
switch.is_on: nextion_init
|
|
- lambda: |-
|
|
//ESP_LOGD("nextion", "thermostat sendig value %f", value);
|
|
int v = int(2 * std::min(std::max(value - 13.5, 0.0), 5.0));
|
|
int left = v + (v ? 19 : 16); // 16 is empty left.
|
|
v = int(2 * std::min(std::max(value - 18.0, 0.0), 4.0));
|
|
int mid = v + (v ? 29 : 17); // 17 is empty mid.
|
|
v = int(2 * std::min(std::max(value - 21.5, 0.0), 5.5));
|
|
int right = v + (v ? 37 : 18); // 18 is empty right.
|
|
// sends the 3 images to the display
|
|
//ESP_LOGD("nextion", "thermostat left %i", left);
|
|
//ESP_LOGD("nextion", "thermostat mid %i", mid);
|
|
//ESP_LOGD("nextion", "thermostat right %i", right);
|
|
id(disp1).send_command_printf("climate_left.pic=%i", left);
|
|
id(disp1).send_command_printf("climate_middle.pic=%i", mid);
|
|
id(disp1).send_command_printf("climate_right.pic=%i", right);
|
|
// send target-temp
|
|
id(disp1).set_component_text_printf("target_temp", "%.1f°", value);
|
|
id(display_target_temp).publish_state(value);
|
|
|
|
|
|
##### START - GLOBALS CONFIGURATION #####
|
|
globals:
|
|
|
|
##### 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'
|
|
|
|
##### Temperature Correction #####
|
|
- id: temperature_correction_global
|
|
type: float
|
|
restore_value: true
|
|
initial_value: '0.0'
|
|
|
|
##### Save Display DIM Brightness for NSPanel reboot
|
|
- id: sleep_modus_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: ''
|
|
|
|
##### lastclick_currentpage State #####
|
|
- id: currentpage_global
|
|
type: std::string
|
|
restore_value: no
|
|
initial_value: ''
|
|
|
|
##### START - BINARY SENSOR CONFIGURATION #####
|
|
binary_sensor:
|
|
|
|
###### LEFT BUTTON BELOW DISPLAY TO TOGGLE RELAY#####
|
|
- platform: gpio
|
|
name: ${device_name} Left Button
|
|
id: left_button
|
|
pin:
|
|
number: 14
|
|
inverted: true
|
|
on_click:
|
|
then:
|
|
- if:
|
|
condition:
|
|
and:
|
|
- switch.is_on: relay1_fallback
|
|
- not:
|
|
api.connected:
|
|
then:
|
|
- switch.toggle: relay_1
|
|
- lambda: id(disp1).send_command_printf("home.icon_top_01.pic=51");
|
|
- lambda: id(disp1).send_command_printf("home.left_bt_pic.pic=98");
|
|
- if:
|
|
condition:
|
|
switch.is_on: relay_1
|
|
then:
|
|
- lambda: id(disp1).send_command_printf("home.icon_top_01.pic=105");
|
|
|
|
|
|
##### RIGHT BUTTON BELOW DISPLAY TO TOGGLE RELAY #####
|
|
- platform: gpio
|
|
name: ${device_name} Right Button
|
|
id: right_button
|
|
pin:
|
|
number: 27
|
|
inverted: true
|
|
on_click:
|
|
then:
|
|
- if:
|
|
condition:
|
|
and:
|
|
- switch.is_on: relay2_fallback
|
|
- not:
|
|
api.connected:
|
|
then:
|
|
- switch.toggle: relay_2
|
|
- lambda: id(disp1).send_command_printf("home.icon_top_02.pic=51");
|
|
- lambda: id(disp1).send_command_printf("home.right_bt_pic.pic=98");
|
|
- if:
|
|
condition:
|
|
switch.is_on: relay_2
|
|
then:
|
|
- lambda: id(disp1).send_command_printf("home.icon_top_02.pic=106");
|
|
|
|
##### JUMP PAGE TO SETTING PAGE #####
|
|
- platform: nextion
|
|
name: $device_name setting page
|
|
page_id: 0
|
|
component_id: 53
|
|
internal: true
|
|
on_multi_click:
|
|
- timing:
|
|
- ON for at least 1s #LONG Press
|
|
then:
|
|
- lambda: 'id(disp1).send_command_printf("page settings");'
|
|
|
|
##### Restart NSPanel Button - Setting Page #####
|
|
- platform: nextion
|
|
name: ${device_name} Restart
|
|
page_id: 7
|
|
component_id: 15
|
|
internal: true
|
|
on_click:
|
|
- button.press: restart_nspanel
|
|
|
|
##### Restart NSPanel Button - Boot Page #####
|
|
- platform: nextion
|
|
name: ${device_name} Restart
|
|
page_id: 8
|
|
component_id: 5
|
|
internal: true
|
|
on_click:
|
|
- button.press: restart_nspanel
|
|
|
|
##### Sleep Modus NSPanel Button #####
|
|
- platform: nextion
|
|
name: ${device_name} Sleep Modus
|
|
page_id: 7
|
|
component_id: 16
|
|
internal: true
|
|
on_click:
|
|
- switch.toggle: sleep_modus
|
|
|
|
##### Hotwater Charge #####
|
|
# - platform: nextion
|
|
# name: ${device_name} Hotwater Charge
|
|
# page_id: 6
|
|
# component_id: 20
|
|
# on_click:
|
|
# - homeassistant.service:
|
|
# service: switch.toggle
|
|
# data:
|
|
# entity_id: ${ha_hotwater_charge}
|
|
|
|
|
|
##### START - SENSOR CONFIGURATION #####
|
|
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
|
|
on_value:
|
|
- if:
|
|
condition:
|
|
wifi.connected:
|
|
then:
|
|
- lambda: id(disp1).set_component_text_printf("home.wifi_icon", "%s", "\U0000E5A8");
|
|
else:
|
|
- lambda: id(disp1).set_component_text_printf("home.wifi_icon", "%s", "\U0000FFFF");
|
|
|
|
##### INTERNAL TEMPERATURE SENSOR, ADC VALUE #####
|
|
- platform: adc
|
|
id: ntc_source
|
|
pin: 38
|
|
update_interval: 60s
|
|
attenuation: 11db
|
|
|
|
##### INTERNAL TEMPERATURE SENSOR, adc reading converted to resistance (calculation)#####
|
|
- platform: resistance
|
|
id: resistance_sensor
|
|
sensor: ntc_source
|
|
configuration: DOWNSTREAM
|
|
resistor: 11.2kOhm
|
|
|
|
##### INTERNAL TEMPERATURE 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
|
|
filters:
|
|
- lambda: return x + id(temperature_correction_global);
|
|
# 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("climate.current_temp", "%.1f", id(temp_nspanel).state);
|
|
|
|
##### current value of page-climate target_temp #####
|
|
- platform: template
|
|
name: ${device_name} Display Target Temperature
|
|
id: display_target_temp
|
|
lambda: return {};
|
|
update_interval: 10s
|
|
|
|
###### 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);
|
|
|
|
|
|
##### START - TEXT SENSOR CONFIGURATION #####
|
|
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
|
|
id: ip_address
|
|
ssid:
|
|
name: ${device_name} SSID
|
|
disabled_by_default: true
|
|
bssid:
|
|
name: ${device_name} BSSID
|
|
disabled_by_default: true
|
|
|
|
- platform: template
|
|
name: ${device_name} Notification Label
|
|
id: notification_label
|
|
|
|
- platform: template
|
|
name: ${device_name} Notification Text
|
|
id: notification_text
|
|
|
|
- platform: template
|
|
name: ${device_name} Settings Entity
|
|
id: settings_entity
|
|
|
|
##### 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;
|
|
- lambda: |-
|
|
id(page_timer)->execute(int(id(page_timeout).state));
|
|
|
|
##### 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;
|
|
- lambda: |-
|
|
id(page_timer)->execute(int(id(page_timeout).state));
|
|
|
|
##### 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;
|
|
- lambda: |-
|
|
id(page_timer)->execute(int(id(page_timeout).state));
|
|
|
|
##### 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;
|
|
- lambda: |-
|
|
id(page_timer)->execute(int(id(page_timeout).state));
|
|
|
|
##### currentpage sensor, the main action variable - push to HA #####
|
|
- platform: nextion
|
|
nextion_id: disp1
|
|
name: ${device_name} currentpage
|
|
id: disp1_currentpage
|
|
update_interval: 50ms
|
|
component_name: currentpage
|
|
internal: false
|
|
filters:
|
|
- lambda: |-
|
|
if (strcmp(x.c_str(), id(currentpage_global).c_str()) != 0) {
|
|
return x;
|
|
} else {
|
|
return {};
|
|
}
|
|
on_value:
|
|
then:
|
|
- globals.set:
|
|
id: currentpage_global
|
|
value: !lambda return x;
|
|
- lambda: |-
|
|
id(page_timer)->execute(int(id(page_timeout).state));
|
|
|
|
|
|
##### touchevent sensor, Reset the page timeout #####
|
|
- platform: nextion
|
|
nextion_id: disp1
|
|
#name: ${device_name} touchevent
|
|
id: disp1_touchevent
|
|
update_interval: 50ms
|
|
component_name: touchevent
|
|
internal: true
|
|
filters:
|
|
- lambda: |-
|
|
static std::string touchevent_history = "";
|
|
if (strcmp(x.c_str(), touchevent_history.c_str()) != 0) {
|
|
touchevent_history = x;
|
|
return x;
|
|
// touchevent_history = "";
|
|
} else {
|
|
return {};
|
|
}
|
|
on_value:
|
|
then:
|
|
- lambda: |-
|
|
id(page_timer)->execute(int(id(page_timeout).state));
|
|
|
|
|
|
##### START - SWITCH CONFIGURATION #####
|
|
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
|
|
|
|
##### Notification unread #####
|
|
- platform: template
|
|
name: ${device_name} Notification unread
|
|
id: notification_unread
|
|
entity_category: config
|
|
restore_state: true
|
|
optimistic: true
|
|
|
|
##### Notification sound #####
|
|
- platform: template
|
|
name: ${device_name} Notification sound
|
|
id: notification_sound
|
|
entity_category: config
|
|
restore_state: true
|
|
optimistic: true
|
|
|
|
##### Confirmation Message #####
|
|
- platform: template
|
|
name: ${device_name} Confirmation Message
|
|
id: confirmation_message
|
|
entity_category: config
|
|
restore_state: false
|
|
optimistic: true
|
|
|
|
##### 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
|
|
|
|
##### 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
|
|
entity_category: config
|
|
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);
|
|
|
|
##### Relay Local control Fallback #####
|
|
- platform: template
|
|
name: ${device_name} Relay 1 Local Fallback
|
|
id: relay1_fallback
|
|
entity_category: config
|
|
restore_state: true
|
|
optimistic: true
|
|
|
|
- platform: template
|
|
name: ${device_name} Relay 2 Local Fallback
|
|
id: relay2_fallback
|
|
entity_category: config
|
|
restore_state: true
|
|
optimistic: true
|
|
|
|
##### START - NUMBER CONFIGURATION #####
|
|
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);'
|
|
|
|
##### Temperature Correction #####
|
|
- platform: template
|
|
name: ${device_name} Temperature Correction
|
|
id: temperature_correction
|
|
entity_category: config
|
|
unit_of_measurement: '°C'
|
|
min_value: -10
|
|
max_value: 10
|
|
step: 0.5
|
|
restore_value: true
|
|
optimistic: true
|
|
set_action:
|
|
then:
|
|
- globals.set:
|
|
id: temperature_correction_global
|
|
value: !lambda 'return x;'
|
|
|
|
##### page-timeout #####
|
|
- platform: template
|
|
name: ${device_name} Page Timeout
|
|
id: page_timeout
|
|
entity_category: config
|
|
min_value: 0
|
|
max_value: 60
|
|
initial_value: 10
|
|
step: 1
|
|
restore_value: true
|
|
optimistic: true
|
|
|
|
##### START - DISPLAY START CONFIGURATION #####
|
|
display:
|
|
- platform: nextion
|
|
id: disp1
|
|
uart_id: tf_uart
|
|
tft_url: ${nextion_update_url}
|
|
on_setup:
|
|
then:
|
|
- lambda: id(disp1).send_command_printf("page 8");
|
|
- lambda: id(disp1).set_component_text_printf("boot.esph_version", "%s", "3.2"); ### esphome-version ###
|
|
- wait_until:
|
|
api.connected
|
|
- lambda: id(disp1).set_component_text_printf("boot.ip_addr", "%s", id(ip_address).state.c_str());
|
|
- delay: 1s
|
|
- 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", id(sleep_modus_global) == 1);
|
|
- delay: 1s
|
|
- switch.template.publish:
|
|
id: nextion_init
|
|
state: on
|
|
|
|
### Script for page_timer
|
|
script:
|
|
- id: page_timer
|
|
mode: restart
|
|
parameters:
|
|
delay: int
|
|
then:
|
|
- lambda: ESP_LOGD("nspanel", "start page-timer delay %i", int(id(page_timeout).state));
|
|
- delay: !lambda return delay *1000;
|
|
- lambda: |-
|
|
if (id(disp1_currentpage).state == "home" or id(disp1_currentpage).state == "screensaver" or id(disp1_currentpage).state == "boot" or int(id(page_timeout).state) == 0) {
|
|
ESP_LOGD("nspanel", "no page-jump");
|
|
} else {
|
|
ESP_LOGD("nspanel", "timer->home");
|
|
id(disp1).send_command_printf("page 0");
|
|
}
|