Pular para o conteúdo principal

TRMNL 7.5inch(OG) DIY Kit funciona com ESPHome


Introdução ao Home Assistant

Home Assistant é uma poderosa plataforma de automação residencial de código aberto que permite controlar e monitorar seus dispositivos de casa inteligente a partir de uma interface unificada. Ele atua como o hub central da sua casa inteligente, permitindo automatizar rotinas, monitorar sensores e criar um ambiente mais inteligente.

Por que Home Assistant?

  • Controle local: Diferentemente de muitas soluções baseadas em nuvem, o Home Assistant roda localmente na sua rede, garantindo que seus dados permaneçam privados e que suas automações funcionem mesmo sem acesso à internet.

  • Amplo suporte a dispositivos: O Home Assistant se integra a milhares de dispositivos e serviços de casa inteligente, tornando-o altamente versátil e preparado para o futuro.

  • Automação poderosa: Crie regras de automação sofisticadas que podem responder a diversos gatilhos como horário, estados de dispositivos, leituras de sensores e muito mais.

  • Dashboard personalizável: Crie sua própria interface de usuário para exibir as informações que mais importam para você.

Por que usar o TRMNL 7.5inch(OG) DIY Kit com Home Assistant?

O TRMNL 7.5inch(OG) DIY Kit é um excelente companheiro para o Home Assistant por vários motivos:

  1. Eficiência energética: O display de e-paper consome energia apenas ao atualizar o conteúdo, tornando-o perfeito para exibir informações persistentes, como previsões do tempo, eventos de calendário ou status do sistema.

  2. Ótima visibilidade: Diferente das telas LCD, os displays de e-paper são facilmente legíveis em qualquer condição de iluminação, incluindo luz solar direta, sendo ideais para painéis de controle de parede.

  3. Longa duração da bateria: Combinado com o modo de sono profundo, o display pode operar por meses com uma única carga de bateria, ainda assim fornecendo informações valiosas de relance.

  4. Integração flexível: Por meio do ESPHome, o display se integra perfeitamente ao Home Assistant, permitindo mostrar qualquer dado do seu sistema de casa inteligente em um formato elegante e sempre visível.

Essas vantagens tornam o TRMNL 7.5inch(OG) DIY Kit uma escolha ideal para criar um display de informações sempre ligado e eficiente em energia para a sua configuração com Home Assistant.

Integração com ESPHome

ESPHome é uma ferramenta de criação de firmware de código aberto projetada especificamente para dispositivos ESP8266/ESP32. Ela permite criar firmware personalizado usando simples arquivos de configuração YAML, que podem então ser gravados no seu dispositivo. Para o TRMNL 7.5inch(OG) DIY Kit, o ESPHome atua como o middleware essencial que habilita a comunicação entre o dispositivo e o Home Assistant.

O sistema funciona convertendo sua configuração YAML em um firmware completo que roda no seu dispositivo ESP. Esse firmware lida com todas as tarefas complexas de conexão à sua rede, comunicação com o Home Assistant e controle do display ePaper. Quando combinado com o Home Assistant, o ESPHome oferece uma plataforma robusta para criar displays e controles sofisticados de automação residencial.

Vamos explorar como configurá-lo e tirar o máximo proveito desse display versátil.

Primeiros Passos

Antes de começar o conteúdo do tutorial deste artigo, você precisa ter o seguinte hardware preparado.

Materiais necessários

TRMNL 7.5inch(OG) DIY KitHome Assistant Green

Home Assistant Green é a forma mais simples e com foco em privacidade para automatizar sua casa. Ele oferece uma configuração sem esforço e permite controlar todos os dispositivos inteligentes com apenas um sistema, onde todos os dados são armazenados localmente por padrão. Esta placa se beneficia do próspero ecossistema do Home Assistant e será aprimorada todos os meses pela comunidade de código aberto.

Recomendamos usar o Home Assistant Green como o host do Home Assistant para este tutorial, ou você pode usar qualquer host do Home Assistant com um Supervisor.

install Home Assistant

Nós também escrevemos como instalar o Home Assistant para alguns produtos da Seeed Studio, consulte-os.

Se você não estiver usando um produto Seeed Studio, também pode verificar e aprender como instalar o Home Assistant para outros produtos no site oficial do Home Assistant.

Instalação do equipamento

Passo 1. Conectar o display à placa controladora
Alinhe o cabo FPC com o conector na XIAO ePaper Display Board e, em seguida, prenda a trava para garantir uma conexão firme.

dica

O lado metálico do cabo FPC deve ficar voltado para cima, caso contrário, nenhum conteúdo será exibido.

Siga o tutorial de instalação abaixo, muitas pessoas fazem isso de forma incorreta.

Passo 2. Conectar a bateria
Conecte o cabo da bateria ao conector JST na placa controladora, garantindo a polaridade correta (fio vermelho em +, fio preto em -).

Passo 3. Montagem do gabinete (Opcional)

dica

Observe que o cabo flexível da tela é muito frágil. Tenha cuidado ao manusear. Se ele for danificado, toda a tela deixará de funcionar.

Imprima as peças do gabinete open-source a partir da Resource part e monte os componentes dentro.

Primeiro, monte a placa controladora e a bateria.

Teste o kit TRMNL para ver se está funcionando bem.

Encaixe a tela no gabinete e deixe o FPC sair.

Conecte o cabo de extensão FPC e monte todo o gabinete.

O gabinete em formato de L é muito semelhante.

dica

Se o seu kit TRMNL estiver muito longe do seu roteador, você pode mover a antena para fora do gabinete. Isso trará um desempenho melhor.

Passo 1. Instalar o ESPHome

Se você já instalou o ESPHome, pode pular esta etapa.

Vá para Settings -> Add-ons -> ADD-ON STORE

Pesquise ESPHome e clique nele. Clique em INSTALL e START.

dica

Se você não conseguir encontrar ESPHome na loja de complementos, certifique-se de que está usando uma instalação do Home Assistant que ofereça suporte a complementos (como Home Assistant OS ou instalações supervisionadas). Para outros tipos de instalação (como Home Assistant Container), talvez seja necessário executar o ESPHome Device Builder de forma independente usando Docker. Consulte a documentação oficial do ESPHome para mais detalhes.

Em seguida, o ESPHome Builder aparecerá na barra lateral.

Etapa 2. Adicionar um novo dispositivo

Vá para o ESPHome e clique em NEW DEVICE.

Dê ao dispositivo um nome de sua preferência e selecione ESP32-S3 para o tipo de chip, depois clique em SKIP.

Depois de criar um novo dispositivo, clique em EDIT.

No código padrão gerado, o framework de esp32 pode ser esp-idf, o que precisamos alterar para arduino.

Etapa 3. Instalar firmware

Este é um exemplo bem básico e exibirá "Hello World!" na tela.

O principal objetivo é mostrar diferentes maneiras de instalar o firmware no dispositivo.

Agora você pode copiar o código abaixo e colá-lo depois de captive_portal, como mostrado abaixo.

# define font to display words
font:
- file: "gfonts://Inter@700"
id: font1
size: 24

# define SPI interface
spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: 30s
lambda: |-
it.print(0, 0, id(font1), "Hello World!");

Clique em INSTALL para instalar o código no dispositivo e você verá a seguinte imagem.

dica

Se o seu Home Assistant Host (Raspberry PI/Green/Yellow etc.) estiver longe de você, recomendamos usar este método. Você pode instalar usando o computador que tem em mãos.

Primeiro, você precisa clicar em Manual download para baixar o firmware compilado.

Abra este site onde enviaremos o firmware para o painel ePaper.

Volte para o ESPHome para baixar o firmware.

Selecione o formato Factory.

Use um cabo USB para conectar o painel ePaper ao seu computador e clique em CONNECT.

Selecione usbmodemxxx (no Windows é COMxxx) e clique em connect. Encontrou um problema? Clique aqui.

Clique em INSTALL e selecione o firmware que você acabou de baixar.

Aguarde um momento e você verá 'Hello world!' na tela ~

Usos básicos

1. Exibir forma

Este exemplo exibirá uma forma na tela.

Você pode copiar o código abaixo e colá-lo na parte de captive_portal, como na imagem a seguir.

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: 5min
lambda: |-
it.rectangle(10, 10, 100, 50);
it.rectangle(150, 10, 50, 50);
it.circle(250, 35, 25);

it.filled_rectangle(10, 80, 100, 50);
it.filled_rectangle(150, 80, 50, 50);
it.filled_circle(250, 105, 25);

Quando você vir o feedback como na imagem a seguir, isso significa que o código está sendo executado com sucesso.

Você também pode clicar aqui para ver mais usos.

2. Exibir informações no HA

Este exemplo exibirá na tela as informações do HA.

Antes de tudo, você precisa adicionar este dispositivo ao HA. Caso contrário, você não conseguirá obter as informações do HA.

Se o HA não mostrar o dispositivo, você deve executar primeiro o demo acima. Depois de executar o demo acima, você poderá ver o dispositivo no HA.

Em seguida, clique em SUBMIT e FINISH.

Depois de instalar o ESPHome e adicionar um novo dispositivo, você pode copiar o código abaixo e colá-lo após captive_portal, como mostrado abaixo.

# Define font to show info
font:
- file: "gfonts://Inter@700"
id: myFont
size: 24

# Get info from HA, as string format
text_sensor:
- platform: homeassistant
entity_id: weather.forecast_home
id: myWeather
internal: true
- platform: homeassistant
entity_id: weather.forecast_home
id: myTemperature
attribute: "temperature"
internal: true

# Get info from HA, as float format
sensor:
- platform: homeassistant
entity_id: weather.forecast_home
id: myPressure
attribute: "pressure"
internal: true

# Display info via SPI
spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: 30s
lambda: |-
//print info in log
ESP_LOGD("epaper", "weather: %s", id(myWeather).state.c_str());
ESP_LOGD("epaper", "temperature: %s", id(myTemperature).state.c_str());
ESP_LOGD("epaper", "pressure: %.1f", id(myPressure).state);
//display info in epaper screen
it.printf(100, 100, id(myFont), "%s", id(myWeather).state.c_str());
it.printf(100, 150, id(myFont), "%s", id(myTemperature).state.c_str());
it.printf(100, 200, id(myFont), "%.1f", id(myPressure).state);

Instale esses códigos no seu dispositivo.

A função do código é obter clima, temperatura e pressão do HA e exibi-los na tela.

dica

Se você descobrir que o seu Home Assistant não possui um componente relacionado ao clima, pode baixar uma integração chamada Open-Meteo de dentro da integração.

Quando você vir o feedback como na imagem a seguir, isso significa que o código está sendo executado com sucesso.

3. Exibir ícone

Este exemplo exibirá um ícone na tela.

Primeiro, precisamos instalar um add-on de Editor de Arquivos. Procure por Studio Code Server e clique nele. Clique em INSTALL e START.

E então, crie uma nova pasta chamada fonts e baixe este arquivo e coloque-o dentro da pasta fonts.

Você pode copiar o código abaixo e colá-lo após captive_portal, como mostrado abaixo.

font:
- file: 'fonts/materialdesignicons-webfont.ttf' #here is the directory to save ttf file
id: font_mdi_large
size: 200 # big size icon
glyphs: &mdi-weather-glyphs
- "\U000F0595" # weather cloudy
- "\U000F0592" # weather hail
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_mdi_medium # small size icon
size: 40
glyphs: *mdi-weather-glyphs

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: 30s
lambda: |-
it.printf(100, 200, id(font_mdi_medium), TextAlign::CENTER, "\U000F0595");
it.printf(400, 200, id(font_mdi_large), TextAlign::CENTER, "\U000F0592");

Quando você vir o feedback como na imagem a seguir, isso significa que o código está sendo executado com sucesso.

Se você quiser usar outros ícones, pode clicar no botão abaixo para explorar mais.

Selecione um ícone que você queira.

Copie o código e cole-o na parte captive_portal como na imagem a seguir.

4. Exibir imagem

Este exemplo exibirá quaisquer imagens que você quiser na tela.

Como no exemplo anterior, precisamos instalar o Studio Code Server e criar uma nova pasta chamada image para salvar a imagem.

Em seguida, coloque uma imagem dentro da pasta image. Você pode clicar no botão abaixo para baixar uma imagem e fazer um teste.

Você pode copiar o código abaixo e colá-lo após captive_portal, como mostrado abaixo.

image:
- file: /config/esphome/image/wifi.jpg # the path where you save the image, png or jpg format
id: myImage
type: BINARY
resize: 800x480 # how big you want to show, the biggest size should be as same as ePaper Penal pixel(800x480)
invert_alpha: true # invert color

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: 30s
lambda: |-
it.image(0, 0, id(myImage));

Quando você vir o feedback como na imagem a seguir, isso significa que o código está sendo executado com sucesso.

Demo 1. Tirar uma captura de tela do painel do Home Assistant

Este exemplo exibirá a captura de tela do HA na tela.

Primeiro, você precisa instalar um Add-on de captura de tela Puppet, clique aqui para instalar.

Observe que a versão deve ser maior ou igual a 1.11.4. Após a instalação, vá para a página Configuration. Precisamos criar um access_token para este add-on.

Veja o próximo passo para criar um token e colá-lo aqui.

Vá até o final da página Security e crie um token e, em seguida, copie e cole-o no add-on Puppet.

Lembre-se de reiniciar o add-on Puppet.

Iniciar o add-on irá lançar um novo servidor na porta 10000. Qualquer caminho que você solicitar retornará uma captura de tela dessa página. Você precisará especificar o tamanho da viewport desejada.

Por exemplo, para obter uma captura de tela de 1000px x 1000px do seu painel padrão, busque:

# http://192.168.1.191:10000/lovelace/0?viewport=1000x1000(My address)

http://homeassistant.local:10000/lovelace/0?viewport=1000x1000

Para reduzir a paleta de cores para telas E Ink®, você pode adicionar o parâmetro eink. O valor representa o número de cores (incluindo preto) a serem usadas. Por exemplo, para uma tela E Ink® de 2 cores:

http://homeassistant.local:10000/lovelace/0?viewport=1000x1000&eink=2

Se você estiver usando eink=2, também poderá inverter as cores adicionando o parâmetro invert:

http://homeassistant.local:10000/lovelace/0?viewport=1000x1000&eink=2&invert

Além disso, você também pode fazer uma captura de tela de outra página, por exemplo a página de To-do lists no HA:

http://192.168.1.191:10000/todo?viewport=800x480&eink=2&invert

Você pode conferir o efeito da captura de tela inserindo esse link no seu navegador.

Copie o código abaixo e cole-o após esp32:

# Enable PSRAM support since online_image requires more than the available RAM capacity
psram:
mode: octal
speed: 80MHz

Você pode copiar o código abaixo e colá-lo após captive_portal, como mostrado abaixo.

http_request:
verify_ssl: false
timeout: 10s
watchdog_timeout: 15s

online_image:
- id: dashboard_image
format: PNG
type: BINARY
buffer_size: 30000
url: http://192.168.1.191:10000/todo?viewport=800x480&eink=2&invert #change this link to your screenshot link
update_interval: 30s
on_download_finished:
- delay: 0ms
- component.update: main_display

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
id: main_display
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: never
lambda: |-
it.image(0, 0, id(dashboard_image));

Quando você vir o feedback como na imagem a seguir, significa que o código está sendo executado com sucesso.

Demo2. Modo de deep sleep

dica

Durante o modo de deep sleep, você não pode enviar código para o dispositivo diretamente. Você precisa entrar no modo de download.Click here jump to Q3.

Este exemplo irá mostrar como usar o modo de deep sleep para economizar energia. Atualize as informações a cada 6 horas.

Você pode copiar o código abaixo e colá-lo após captive_portal, como mostrado abaixo.

globals:
- id: sleep_counter
type: int
restore_value: yes # key parameter, to use RTC storage
initial_value: '0'

# Here is deep sleep part
deep_sleep:
id: deep_sleep_1
run_duration: 30s # Device wake up and run 30s (enough to display)
sleep_duration: 3min # deep sleep for 3min

interval:
- interval: 29s # run this command before the end of run_duration
then:
- logger.log: "Entering deep sleep now..."

font:
- file: "gfonts://Inter@700"
id: font1
size: 24

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: 3min
lambda: |-
id(sleep_counter) += 1;
ESP_LOGD("main", "Wakeup count: %d", id(sleep_counter));
it.printf(100, 100, id(font1), "Wakeup count: %d", id(sleep_counter));

Você verá um contador. Ele será incrementado em um a cada vez que o dispositivo acordar.

Demo 3. Exemplo abrangente

dica

Para que você entenda melhor, recomendamos fortemente que execute primeiro os usos básicos acima.

Este exemplo demonstra uma configuração abrangente do ESPHome para o kit DIY de e-paper TRMNL de 7,5 polegadas. O código YAML integra múltiplos recursos para criar um painel de exibição inteligente e interativo que funciona perfeitamente com o Home Assistant.

Objetivo e Funcionalidade:

  • A configuração permite que o dispositivo se conecte ao Wi-Fi e ao Home Assistant, oferecendo suporte a atualizações via API e OTA para facilitar o gerenciamento.

  • Ela configura a tela de e-paper para mostrar diferentes tipos de informações em duas páginas comutáveis, controladas por botões físicos.

  • O dispositivo lê a tensão da bateria, calcula a porcentagem da bateria e exibe um ícone de bateria correspondente e o valor.

  • As condições climáticas e a temperatura são obtidas do Home Assistant e exibidas com ícones e unidades apropriados.

  • A hora e a data atuais também são exibidas, sincronizadas com o Home Assistant.

Este exemplo mostra como combinar leituras de sensores, dados do Home Assistant e entrada do usuário para criar um display inteligente rico em recursos e sempre ligado usando ESPHome e o kit de e-paper TRMNL de 7,5 polegadas.

Clique aqui para visualizar o código completo
esphome:
name: obdy
friendly_name: obdy
on_boot:
priority: 600
then:
- output.turn_on: bsp_battery_enable
- delay: 200ms
- component.update: battery_voltage
- component.update: battery_level

esp32:
board: esp32-s3-devkitc-1
framework:
type: arduino

# Enable PSRAM support since online_image requires more than the available RAM capacity
psram:
mode: octal
speed: 80MHz

# Enable logging
logger:

# Enable Home Assistant API
api:
encryption:
key: "j0V30kuJ6Zdij9SU6Ee+7ruwid+7SQOxtinjld2PRc0="

ota:
- platform: esphome
password: "db786195ae6f9748f5b57ea9bd1d4161"

wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password

# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Obdy Fallback Hotspot"
password: "IOfapF7hXq55"

captive_portal:

# Deep-sleep, wake by GPIO4
# deep_sleep:
# id: deep_sleep_1
# run_duration: 1min
# sleep_duration: 60min
# wakeup_pin: GPIO4
# wakeup_pin_mode: INVERT_WAKEUP

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

# Fonts
font:
- file: "gfonts://Inter@700"
id: small_font
size: 24
- file: "gfonts://Inter@700"
id: mid_font
size: 36
- file: "gfonts://Inter@700"
id: big_font
size: 180
- file: "gfonts://Inter@700"
id: time_font
size: 96 # for the big time display
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_bat_icon
size: 24
glyphs:
- "\U000F007A" # mdi-battery-10
- "\U000F007B" # mdi-battery-20
- "\U000F007C" # mdi-battery-30
- "\U000F007D" # mdi-battery-40
- "\U000F007E" # mdi-battery-50
- "\U000F007F" # mdi-battery-60
- "\U000F0080" # mdi-battery-70
- "\U000F0081" # mdi-battery-80
- "\U000F0082" # mdi-battery-90
- "\U000F0079" # mdi-battery
- file: "fonts/materialdesignicons-webfont.ttf" # <-- 替换成你的字体文件路径
id: weather_icon_font
size: 100
glyphs:
- "\U000F0599" # weather-sunny
- "\U000F0595" # weather-partly-cloudy
- "\U000F0F2F" # weather-cloudy
- "\U000F0597" # weather-rainy
- "\U000F0598" # weather-snowy
- "\U000F059B" # weather-windy
- "\U000F0594" # weather-fog
- "\U000F0596" # weather-lightning

globals:
- id: page_index
type: int
restore_value: true
initial_value: '0'
- id: battery_glyph
type: std::string
restore_value: no
initial_value: "\"\\U000F0079\"" # default full battery

sensor:
- platform: adc
pin: GPIO1
name: "Battery Voltage"
id: battery_voltage
update_interval: 60s
attenuation: 12db
filters:
- multiply: 2.0
- platform: template
name: "Battery Level"
id: battery_level
unit_of_measurement: "%"
icon: "mdi:battery"
device_class: battery
state_class: measurement
lambda: 'return id(battery_voltage).state;'
update_interval: 60s
on_value:
then:
- lambda: |-
int pct = int(x);
if (pct <= 10) id(battery_glyph) = "\U000F007A";
else if (pct <= 20) id(battery_glyph) = "\U000F007B";
else if (pct <= 30) id(battery_glyph) = "\U000F007C";
else if (pct <= 40) id(battery_glyph) = "\U000F007D";
else if (pct <= 50) id(battery_glyph) = "\U000F007E";
else if (pct <= 60) id(battery_glyph) = "\U000F007F";
else if (pct <= 70) id(battery_glyph) = "\U000F0080";
else if (pct <= 80) id(battery_glyph) = "\U000F0081";
else if (pct <= 90) id(battery_glyph) = "\U000F0082";
else id(battery_glyph) = "\U000F0079";
filters:
- calibrate_linear:
- 4.15 -> 100.0
- 3.96 -> 90.0
- 3.91 -> 80.0
- 3.85 -> 70.0
- 3.80 -> 60.0
- 3.75 -> 50.0
- 3.68 -> 40.0
- 3.58 -> 30.0
- 3.49 -> 20.0
- 3.41 -> 10.0
- 3.30 -> 5.0
- 3.27 -> 0.0
- clamp:
min_value: 0
max_value: 100

output:
- platform: gpio
pin: GPIO6
id: bsp_battery_enable

binary_sensor:
- platform: gpio # Next page KEY1
pin:
number: GPIO2
mode: INPUT_PULLUP
inverted: true
id: key1
name: "Key1"
on_press:
then:
- lambda: |-
id(page_index) = (id(page_index) + 1) % 2;
id(epaper_display).update();

- platform: gpio # Prev page KEY2
pin:
number: GPIO3
mode: INPUT_PULLUP
inverted: true
id: key2
name: "Key2"
on_press:
then:
- lambda: |-
id(page_index) = (id(page_index) - 1 + 2) % 2;
id(epaper_display).update();

# - platform: gpio
# pin:
# number: GPIO5 # KEY3
# mode: INPUT_PULLUP
# inverted: true
# id: key2
# name: "Key2"
# on_press:
# then:

# Home Assistant time
time:
- platform: homeassistant
id: ha_time

text_sensor:
- platform: homeassistant
entity_id: weather.home
id: myWeather
- platform: homeassistant
entity_id: weather.home
id: temp
attribute: "temperature"

display:
- platform: waveshare_epaper
id: epaper_display
model: 7.50inv2
cs_pin: GPIO44
dc_pin: GPIO10
reset_pin: GPIO38
busy_pin:
number: GPIO4
inverted: true
update_interval: never
lambda: |-
// ---------- PAGE 0 ----------
if (id(page_index) == 0) {
// Screen dimension constants for easy adjustment
const int scr_w = 800;
const int scr_h = 480;
const int center_x = scr_w / 2; // Center X-coordinate of the screen (400)

// --- Top-right: Battery Info ---
// Display the battery icon using an icon font
it.printf(scr_w - 130, 13, id(font_bat_icon), "%s", id(battery_glyph).c_str());
// Display the battery percentage text
it.printf(scr_w - 100, 10, id(small_font), "%.0f%%", id(battery_level).state);

// --- Draw the vertical separator line ---
// Draw a vertical line in the middle to separate left and right areas
it.filled_rectangle(center_x, 100, 2, 280);

// ==================================================
// LEFT AREA: WEATHER INFO
// ==================================================
// Calculate the center X-coordinate of the left area for alignment
const int left_center_x = center_x / 2; // 200

// 1. Display the title "Weather" at the top of the left area
it.printf(left_center_x, 110, id(mid_font), TextAlign::TOP_CENTER, "Weather");

// 2. Get the weather condition and select the corresponding icon
std::string weather_condition = id(myWeather).state;
std::string weather_icon = "\U000F0599"; // Default icon (sunny), as a fallback for unknown states

if (weather_condition == "partlycloudy") {
weather_icon = "\U000F0595"; // weather-partly-cloudy
} else if (weather_condition == "cloudy") {
weather_icon = "\U000F0F2F"; // weather-cloudy
} else if (weather_condition == "rainy") {
weather_icon = "\U000F0597"; // weather-rainy
} else if (weather_condition == "snowy") {
weather_icon = "\U000F0598"; // weather-snowy
} else if (weather_condition == "windy") {
weather_icon = "\U000F059B"; // weather-windy
} else if (weather_condition == "fog") {
weather_icon = "\U000F0594"; // weather-fog
} else if (weather_condition == "lightning") {
weather_icon = "\U000F0596"; // weather-lightning
}
// Display the weather icon in the center of the left area
it.printf(left_center_x, 240, id(weather_icon_font), TextAlign::CENTER, "%s", weather_icon.c_str());

// 3. Display the weather condition text below the icon
it.printf(left_center_x, 400, id(mid_font), TextAlign::BOTTOM_CENTER, "%s", weather_condition.c_str());


// ==================================================
// RIGHT AREA: TEMPERATURE INFO
// ==================================================
// Calculate the center X-coordinate of the right area for alignment
const int right_center_x = center_x + (center_x / 2); // 600

// 1. Display the title "Temperature" at the top of the right area
it.printf(right_center_x, 110, id(mid_font), TextAlign::TOP_CENTER, "Temperature");

// 3. Display the temperature reading below the icon, with one decimal place
float temp_c = stof(id(temp).state);
double temp_f = temp_c * 9.0 / 5.0 + 32.0;
it.printf(right_center_x, 250, id(mid_font), TextAlign::CENTER, "%.0f°F", temp_f);
it.printf(right_center_x, 380, id(mid_font), TextAlign::CENTER, "%.1f°C", temp_c);
}
// ---------- PAGE 1 ----------
else{
// Battery top-right
it.printf(670, 13, id(font_bat_icon), "%s", id(battery_glyph).c_str());
it.printf(700, 10, id(small_font), "%.0f%%", id(battery_level).state);

auto now = id(ha_time).now();
struct tm timeinfo = now.to_c_tm();

// centering time HH:MM
char timeStr[6];
strftime(timeStr, sizeof(timeStr), "%H:%M", &timeinfo);
it.printf(400, 180, id(time_font), TextAlign::CENTER, timeStr);

// Date: Day of week
const char *weekday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
const char *wday = weekday[timeinfo.tm_wday];

// Date: month - day
char dateStr[12];
strftime(dateStr, sizeof(dateStr), "%b %d", &timeinfo); // e.g. Jun 15

// Day of the week + date below the time
it.printf(400, 280, id(mid_font), TextAlign::CENTER, "%s, %s", wday, dateStr);
}

Quando você vir um retorno como na imagem a seguir, isso significa que o código está sendo executado com sucesso.

FAQ

P1: Por que não há dados?

Neste caso, você deve ir em Settings -> Devices & Services -> Integrations para RECONGFIGURE o dispositivo. Não encontrou seu ePaper Penal? Tente reiniciar o HA.

P2: Por que não consigo obter esses dados no Home Assistant?

Neste caso, você deve ir em Settings -> Devices & Services -> Integrations para ADD seu dispositivo ao HA.

P3: Como posso fazer upload de um novo programa quando o dispositivo está em modo de sono profundo?

Quando o dispositivo está em modo de sono profundo, você não pode fazer upload de um novo programa diretamente.

  1. Primeiro, certifique-se de que o dispositivo está ligado. Em seguida, pressione e segure o botão Boot localizado ao lado da porta USB-C no XIAO ESP32-S3 Plus.

  2. Enquanto mantém o botão Boot pressionado, pressione o botão Reset uma vez e depois solte o botão Boot.

  3. Depois disso, desligue o interruptor da bateria e desconecte o cabo de alimentação.

  4. Por fim, conecte o cabo novamente e faça upload de um novo programa.

P4: O kit DIY TRMNL 7.5inch(OG) não consegue se conectar ao seu computador?

Tente desconectar e reconectar várias vezes ou simplesmente instale o driver de acordo com as instruções.

P5: Falha ao enviar o programa via Wi-Fi?

Nesse caso, seu ePaper Penal está offline ou em modo de sono profundo. Coloque-o online ou desperte-o.

Suporte Técnico & Discussão de Produtos

Obrigado por escolher nossos produtos! Estamos aqui para oferecer diferentes formas de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...