Files
hassos_config/esphome/cfg_old/habbit_display.yaml
2026-03-26 12:10:21 +01:00

689 lines
17 KiB
YAML

substitutions:
device_name: "habbit_desk"
comment: "esp32"
location: "kantoor"
api_password: !secret deskcontroller_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
gateway: !secret ip_gateway
subnet: !secret ip_subnet
# Device customization
name: habbit_desk
friendly_name: Habbit Desk
background_color: '000000'
main_icon_file: https://aguacatec.es/wp-content/uploads/2025/01/aguacatec.png
secondary_image_file1: https://aguacatec.es/wp-content/uploads/2025/01/aguacatec_youtube.png
secondary_image_file2: https://aguacatec.es/wp-content/uploads/2025/01/aguacatec_telegram.png
# Example of Sensors
sensor_temperature: sensor.temperatuur_slaapkamer_temperatuur
sensor_home_temperature: sensor.ikea_of_sweden_vindstyrka_temperatuur
sensor_home_humidity: sensor.temperatuur_slaapkamer_luchtvochtigheid
chat_entity: input_text.habbit_desk_chat
assist_entity: assist_satellite.voice_zolder_assist_satellite
assist_awake_text: "Te escucho, ¿qué necesitas?"
sensor_youtube: sensor.aguacatec_suscriptores
sensor_telegram: input_number.miembros_telegram
# Example of Lights
desk_led: light.lamp_slaapkamer_2
# Example of Thermostat
climate: climate.smart_radiator_thermostat_x
# Example of Vacuum
vacuum: vacuum.roborock_qrevo_s
# Example of Switches
printer: switch.regleta_l3
printer3d: switch.regleta_l4
# Other settings
# Otros ajustes
allowed_characters: " ¿?¡!#%'()+,-./:°0123456789ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwxyzáéíóú"
################################################################################################################
esphome:
name: ${name}
friendly_name: ${friendly_name}
platformio_options:
upload_speed: 921600
build_unflags: -Werror=all
board_build.flash_mode: dio
board_build.f_flash: 80000000L
board_build.f_cpu: 240000000L
psram:
mode: octal
esp32:
board: esp32-s3-devkitc-1
flash_size: 16MB
framework:
type: esp-idf
external_components:
- source: github://buglloc/esphome-components
components: [sy6970]
#disable Blinking led
sy6970:
i2c_id: touchscreen_bus
state_led_enable: false
packages:
connection: !include common/wifi.yaml
# Enable logging
logger:
globals:
- id: inactivity_time
type: int
restore_value: no
initial_value: '0'
switch:
- platform: template
name: "Auto Lock"
id: auto_lock
icon: "mdi:lock-clock"
optimistic: true
restore_mode: 'restore_default_off'
- platform: template
name: "Display"
id: habbit_display
icon: "mdi:fit-to-screen"
optimistic: true
restore_mode: 'always_on'
on_turn_on:
- light.turn_on: backlight
- lambda: |-
id(inactivity_time) = 0;
on_turn_off:
- light.turn_off: backlight
- display.page.show: home
number:
- platform: template
name: "Time Out"
id: time_out
icon: "mdi:timer-sand"
optimistic: true
min_value: 10
max_value: 600
step: 10
unit_of_measurement: "s"
restore_value: true
font:
- file: "gfonts://Space Grotesk"
id: clock_time
size: 30
glyphs: ${allowed_characters}
- file: "gfonts://Space Grotesk"
id: secondary
size: 16
glyphs: ${allowed_characters}
- file: "gfonts://Roboto"
id: info
size: 20
glyphs: ${allowed_characters}
- file: "gfonts://Roboto"
id: title
size: 25
glyphs: ${allowed_characters}
- file: "gfonts://Space Grotesk"
id: big_numbers
size: 120
glyphs: ${allowed_characters}
color:
- id: background_color
hex: ${background_color}
- id: orange
hex: 'e9c726'
- id: white
hex: 'ffffff'
- id: dirty_white
hex: 'c6c6c6'
- id: grey
hex: '222222'
- id: light_grey
hex: '444444'
- id: lime
hex: 'deff00'
- id: crimson
hex: 'f3528f'
- id: blue
hex: '52c0f3'
- id: dark_blue
hex: '1d85b6'
- id: magenta
hex: 'a91225'
- id: dark_magenta
hex: '440109'
image:
rgb:
alpha_channel:
- file: ${main_icon_file}
id: icon_habbit
resize: 180x180
# type: RGB
# transparency: alpha_channel
- file: ${secondary_image_file1}
id: secondary_image1
resize: 160x160
# type: RGB
# transparency: alpha_channel
- file: ${secondary_image_file2}
id: secondary_image2
resize: 120x120
# type: RGB
# transparency: alpha_channel
binary:
- file: mdi:chat-outline
id: icon_chat
resize: 40x40
- file: mdi:chat-processing
id: icon_assist
resize: 40x40
- file: mdi:white-balance-sunny
id: icon_weather
resize: 40x40
- file: mdi:home-thermometer
id: icon_temperature
resize: 40x40
- file: mdi:water-percent
id: icon_humidity
resize: 40x40
- file: mdi:home-automation
id: icon_devices
resize: 50x50
- file: mdi:exit-to-app
id: icon_exit
resize: 45x45
- file: mdi:plus-thick
id: icon_plus
resize: 45x45
- file: mdi:led-strip-variant
id: icon_led_strip
resize: 100x100
- file: mdi:thermostat
id: icon_thermostat
resize: 100x100
- file: mdi:robot-vacuum
id: icon_vacuum
resize: 100x100
- file: mdi:printer
id: icon_printer
resize: 100x100
- file: mdi:printer-3d-nozzle
id: icon_printer3d
resize: 100x100
# This will fetch time from Home Assistant
time:
- platform: homeassistant
id: esptime
# Create sensors from HA you want to use and show
# Crea los sensores de HA que quieres utilizar y mostrar
sensor:
- platform: homeassistant
id: sensor_temperature
entity_id: ${sensor_temperature}
internal: true
- platform: homeassistant
id: sensor_home_temperature
entity_id: ${sensor_home_temperature}
internal: true
- platform: homeassistant
id: sensor_home_humidity
entity_id: ${sensor_home_humidity}
internal: true
# - platform: homeassistant
# id: sensor_youtube
# entity_id: ${sensor_youtube}
# internal: true
# on_value:
# then:
# - display.page.show: secondary1
# - light.turn_on: backlight
# - switch.turn_on: habbit_display
# - lambda: |-
# id(inactivity_time) = 0;
# - platform: homeassistant
# id: sensor_telegram
# entity_id: ${sensor_telegram}
# internal: true
# on_value:
# then:
# - display.page.show: secondary2
# - light.turn_on: backlight
# - switch.turn_on: habbit_display
# - lambda: |-
# id(inactivity_time) = 0;
text_sensor:
# - platform: homeassistant
# id: chat_message
# entity_id: ${chat_entity}
# internal: true
# on_value:
# then:
# - display.page.show: home
# - light.turn_on: backlight
# - switch.turn_on: habbit_display
# - lambda: |-
# id(inactivity_time) = 0;
- platform: homeassistant
id: chat_assist
entity_id: ${assist_entity}
internal: true
on_value:
then:
- if:
condition:
lambda: 'return id(chat_assist).state == "listening";'
then:
- display.page.show: home
- light.turn_on: backlight
- switch.turn_on: habbit_display
- lambda: |-
id(inactivity_time) = 0;
- platform: homeassistant
id: device_desk_led
entity_id: ${desk_led}
internal: true
- platform: homeassistant
id: device_thermostat
entity_id: ${climate}
internal: true
- platform: homeassistant
id: device_vacuum
entity_id: ${vacuum}
internal: true
- platform: homeassistant
id: device_printer
entity_id: ${printer}
internal: true
- platform: homeassistant
id: device_printer3d
entity_id: ${printer3d}
internal: true
spi:
- id: display_qspi
type: quad
clk_pin: 17
data_pins:
- 13
- 18
- 21
- 14
i2c:
sda: 15
scl: 10
id: touchscreen_bus
touchscreen:
- platform: axs15231
id: main_touch
display: main_display
i2c_id: touchscreen_bus
transform:
mirror_x: true
mirror_y: False
swap_xy: false
calibration:
x_min: 0
x_max: 640
y_min: 0
y_max: 180
on_touch:
- lambda: |-
ESP_LOGI("cal", "x=%d, y=%d, x_raw=%d, y_raw=%0d, state=%d",
touch.x,
touch.y,
touch.x_raw,
touch.y_raw,
touch.state
);
- lambda: |-
id(inactivity_time) = 0;
binary_sensor:
- platform: touchscreen
name: Screen
internal: true
x_min: 0
x_max: 640
y_min: 0
y_max: 180
on_press:
then:
- lambda: |-
id(inactivity_time) = 0;
- light.turn_on: backlight
- switch.turn_on: habbit_display
- platform: touchscreen
name: Devices button
internal: true
x_min: 580
x_max: 630
y_min: 0
y_max: 90
on_press:
then:
- if:
condition:
display.is_displaying_page: home
then:
- display.page.show: devices1
else:
- display.page.show: home
#[11:04:51.630][I][cal:375]: x=608, y=29, x_raw=31, y_raw=151, state=1
- platform: touchscreen
name: More button
internal: true
x_min: 580
x_max: 630
y_min: 90
y_max: 180
on_press:
then:
- if:
condition:
display.is_displaying_page: devices1
then:
- display.page.show: devices2
# else:
# - if:
# condition:
# display.is_displaying_page: devices2
# then:
# - display.page.show: devices1
# else:
# - if:
# condition:
# display.is_displaying_page: secondary1
# then:
# - display.page.show: secondary2
# else:
# - if:
# condition:
# display.is_displaying_page: secondary2
# then:
# - display.page.show: secondary1
- platform: touchscreen
name: Device 1
internal: true
x_min: 0
x_max: 160
y_min: 0
y_max: 180
on_press:
then:
# - if:
# condition:
# - switch.is_on: habbit_display
# - display.is_displaying_page: home
# then:
# - display.page.show: secondary1
- if:
condition:
display.is_displaying_page: devices1
then:
- homeassistant.action:
service: light.toggle
data:
entity_id: ${desk_led}
- if:
condition:
display.is_displaying_page: devices2
then:
- homeassistant.action:
service: switch.toggle
data:
entity_id: ${printer3d}
- platform: touchscreen
name: Device 2
internal: true
x_min: 161
x_max: 290
y_min: 0
y_max: 180
on_press:
then:
- if:
condition:
display.is_displaying_page: devices1
then:
- homeassistant.action:
service: climate.toggle
data:
entity_id: ${climate}
- platform: touchscreen
name: Device 3
internal: true
x_min: 291
x_max: 420
y_min: 0
y_max: 180
on_press:
then:
- if:
condition:
display.is_displaying_page: devices1
then:
- if:
condition:
lambda: 'return id(device_vacuum).state == "cleaning";'
then:
- homeassistant.action:
service: vacuum.pause
data:
entity_id: ${vacuum}
else:
- homeassistant.action:
service: vacuum.start
data:
entity_id: ${vacuum}
- platform: touchscreen
name: Device 4
internal: true
x_min: 421
x_max: 550
y_min: 0
y_max: 180
on_press:
then:
- if:
condition:
display.is_displaying_page: devices1
then:
- homeassistant.action:
service: switch.toggle
data:
entity_id: ${printer}
output:
- platform: ledc
pin: GPIO1
id: backlight_pwm
light:
- platform: monochromatic
output: backlight_pwm
name: Display
id: backlight
restore_mode: ALWAYS_ON
internal: True
display:
- platform: mipi_spi
id: main_display
spi_id: display_qspi
#id: lily_display
model: AXS15231
#spi_id: lily_spi
dimensions:
height: 640 #180
width: 184 #180
cs_pin: 12
reset_pin: 16
rotation: 90
auto_clear_enabled: false
# display:
# - platform: mipi_spi
# id: main_display
# spi_id: display_qspi
# #id: lily_display
# model: AXS15231
# dimensions:
# height: 640
# width: 180
# cs_pin: 12
# reset_pin: 16
# transform:
# mirror_x: true
# mirror_y: true
# swap_xy: false
# rotation: 90
# auto_clear_enabled: false
pages:
- id: home
lambda: |-
it.fill(id(background_color));
it.image(-20, 0, id(icon_habbit));
if (id(chat_assist).state == "listening") {
it.image(100, 20, id(icon_assist), id(blue));
it.print(150, 25, id(info), "${assist_awake_text}");
}
// else {
// it.image(100, 20, id(icon_chat), id(lime));
// std::string message = id(chat_message).state.c_str();
// if (message.length() > 35) {
// message = message.substr(0, 35) + "...";
// }
// it.print(150, 25, id(info), message.c_str());
// }
it.strftime(580, 30, id(clock_time), TextAlign::CENTER, "%H:%M", id(esptime).now());
it.strftime(580, 53, id(secondary), TextAlign::CENTER, "%d/%m/%y", id(esptime).now());
it.image(170, 90, id(icon_weather), id(orange));
it.printf(220, 95, id(title), id(dirty_white), "%.0f°C", id(sensor_temperature).state);
it.image(300, 90, id(icon_temperature), id(crimson));
it.printf(355, 95, id(title), id(dirty_white), "%.0f°C", id(sensor_home_temperature).state);
it.image(430, 90, id(icon_humidity), id(blue));
it.printf(475, 95, id(title), id(dirty_white), "%.0f%%", id(sensor_home_humidity).state);
it.filled_triangle(640, 180, 640, 60, 530, 180, grey);
it.image(580, 120, id(icon_devices), id(light_grey));
- id: devices1
lambda: |-
it.fill(id(background_color));
if (id(device_desk_led).state == "on") { it.image(40, 40, id(icon_led_strip), id(orange)); }
else { it.image(40, 40, id(icon_led_strip), id(light_grey)); }
if (id(device_thermostat).state == "heat") { it.image(170, 40, id(icon_thermostat), id(crimson)); }
else { it.image(170, 40, id(icon_thermostat), id(light_grey)); }
if (id(device_vacuum).state == "cleaning") { it.image(300, 40, id(icon_vacuum), id(lime)); }
else { it.image(300, 40, id(icon_vacuum), id(light_grey)); }
if (id(device_printer).state == "on") { it.image(430, 40, id(icon_printer), id(blue)); }
else { it.image(430, 40, id(icon_printer), id(light_grey)); }
it.image(585, 10, id(icon_plus), id(light_grey));
it.filled_triangle(640, 180, 640, 60, 530, 180, grey);
it.image(585, 125, id(icon_exit), id(light_grey));
- id: devices2
lambda: |-
it.fill(id(background_color));
if (id(device_printer3d).state == "on") { it.image(40, 40, id(icon_printer3d), id(lime)); }
else { it.image(40, 40, id(icon_printer3d), id(light_grey)); }
it.image(585, 10, id(icon_plus), id(light_grey));
it.filled_triangle(640, 180, 640, 60, 530, 180, grey);
it.image(585, 125, id(icon_exit), id(light_grey));
# - id: secondary1
# lambda: |-
# it.fill(id(magenta));
# it.image(-10, 10, id(secondary_image1));
# it.printf(170, 15, id(big_numbers), id(dirty_white), "%.3f", id(sensor_youtube).state / 1000);
# it.image(585, 10, id(icon_plus), id(dark_magenta));
# it.filled_triangle(640, 180, 640, 60, 530, 180, dark_magenta);
# it.image(585, 125, id(icon_exit), id(magenta));
# - id: secondary2
# lambda: |-
# it.fill(id(blue));
# it.image(20, 30, id(secondary_image2));
# it.printf(170, 15, id(big_numbers), id(white), "%.3f", id(sensor_telegram).state / 1000);
# it.image(585, 10, id(icon_plus), id(dark_blue));
# it.filled_triangle(640, 180, 640, 60, 530, 180, dark_blue);
# it.image(585, 125, id(icon_exit), id(blue));
interval:
- interval: 1s
then:
- lambda: |-
if (id(auto_lock).state) {
if (id(inactivity_time) < id(time_out).state) {
id(inactivity_time) += 1;
} else {
id(backlight_pwm).turn_off();
id(habbit_display).turn_off();
}
}