Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Home Assistant <> Afficheur distant
#1
Bonjour,

J'ai suivi les instructions pour monter un afficheur distant tel que décrit ici: https://f1atb.fr/fr/affichage-a-distance...lectrique/

J'ai donc acheté l'ESP avec l'afficheur intégré: le LILYGO® TTGO T-Display 1.14 pouces ESP 32 (4MB CH9102F).
J'ai pris celui avec la coque, plus pratique pour moi: https://fr.aliexpress.com/item/330506396...pt=glo2fra

Pendant plusieurs semaines j'ai donc utilisé le code fourni par André: l'écran communique donc en direct avec le routeur solaire.
Et cela me convenait tout à fait, beau boulot André.

Jusqu'au moment où j'ai voulu afficher aussi ma production solaire instantannée, info captée par un Shelly et envoyée à Home Assistant.
Je dois avouer que je n'ai pas cherché sur le forum si le sujet avait déjà été évoqué.  Sad 
(hypothèse: une automatisation dans Home Assistant pour envoyer régulièrement au routeur solaire la production solaire en utilisant MQTT ?)

A la place, j'ai cherché sur le net pour trouver comment utiliser cet écran avec Home Assistant, via le module complémentaire ESPHome.
Là non plus je n'ai pas regardé sur le forum ! Sad 

Comme j'ai passé pas mal de temps à trouver la bonne config qui permette d'utiliser l'écran, puis aussi un peu de temps pour trouver la bonne syntaxe du code dans ESPHOME Builder, je vous partage ici-même:
-> Les photos des 3 pages que j'affiche actuellement sur l'écran
-> Le code pour gérer l'écran dans ESPHOME Builder.
-> Le fichier "calibri.ttf" pour la police utilisée sur l'écran, à placer ici dans Home Assistant: config\esphome\fonts
EDIT 1: fichier "calibri.ttf" impossible à uploader dans ce post. Mais vous le trouverez facilement sur le net, ou sur votre PC windows dans C:\Windows\Fonts
EDIT 2: l'encadrement des pages + le jour tempo sont maintenant de la couleur du jour Tempo

En l'état actuel des choses:
- Je n'ai pas réussi à afficher une barre de progression pour l'ouverture du triac
- Le code permet de basculer d'une page à l'autre avec les boutons de l'écrans. 
J'ai commenté le code qui permet de faire défiler les pages toutes les x secondes, c'est donc à votre choix
- Je n'ai pas branché de capteur de présence sur cet ESP.


Je suis preneur de toute évolutions/améliorations. 

Voilou, amusez-vous bien Wink

Code :
esphome:
  name: test
  friendly_name: Afficheur

esp32:
  board: esp32dev
  framework:
    type: esp-idf
    version: recommended

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "VOTRE CLEF ICI"

ota:
  - platform: esphome
    password: "VOTRE MDP ICI"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Point d'acces afficheur"
    password: ""

captive_portal:
   
# Définition des couleurs
color:
  - id: Rouge
    red: 100%
    green: 0%
    blue: 0%
  - id: Jaune
    red: 100%
    green: 100%
    blue: 0%
  - id: Vert
    red: 0%
    green: 100%
    blue: 0%
  - id: Bleu
    red: 0%
    green: 0%
    blue: 100%
  - id: Gris
    red: 50%
    green: 50%
    blue: 50%
  - id: Blanc
    red: 100%
    green: 100%
    blue: 100%
  - id: Orange
    red: 100%
    green: 60%
    blue: 0%
  - id: Turquoise
    red: 0%
    green: 50%
    blue: 45%       

# Copier le fichier calibri.ttf dans le dossier esphome/fonts/
font:
  - file: "fonts/calibri.ttf"
    id: calibri_60
    size: 60
  - file: "fonts/calibri.ttf"
    id: calibri_48
    size: 40
  - file: "fonts/calibri.ttf"
    id: calibri_24
    size: 20
  - file: "fonts/calibri.ttf"
    id: calibri_S
    size: 16

# Les capteurs en provenance de Home Assistant
sensor:
  - platform: homeassistant
    id: sonde_edf_routeur
    entity_id: sensor.sonde_edf_routeur
    internal: true
    state_class: measurement
    unit_of_measurement: W
    device_class: power

  - platform: homeassistant
    id: prod_solaire
    entity_id: sensor.conso_edf_et_production_solaire_em1_power
    internal: true

  - platform: homeassistant
    id: triac_ouverture
    entity_id: sensor.routeur_rms_chauffe_eau_ouverture
    internal: true


  - platform: homeassistant
    id: temp_triac
    entity_id: sensor.routeur_rms_triac
    internal: true

  - platform: homeassistant
    id: temp_max_triac
    entity_id: sensor.temperature_triac_max
    internal: true

  - platform: homeassistant
    id: duree_equiv_triac
    entity_id: sensor.routeur_rms_chauffe_eau_duree_equiv
    internal: true


  - platform: homeassistant
    id: energie_J_soutiree
    entity_id: sensor.routeur_rms_energie_jour_t_soutiree
    internal: true

  - platform: homeassistant
    id: energie_J_injectee
    entity_id: sensor.routeur_rms_energie_jour_t_injectee
    internal: true


text_sensor:
  - platform: homeassistant
    id: tempo_J
    name: tempo_J
    entity_id: sensor.rte_tempo_couleur_actuelle


# Matériel et affichage des informations
spi:
  clk_pin: GPIO18
  mosi_pin: GPIO19

display:
  - platform: st7789v
    id: my_display
    model: TTGO TDisplay 135x240
    backlight_pin: GPIO4
    cs_pin: GPIO05
    dc_pin: GPIO16
    reset_pin: GPIO23
    update_interval: 5s
    rotation: 90°

    pages:
      - id: page1
        lambda: |-
            it.rectangle(0,  0, it.get_width(), it.get_height(), id(Gris));

            if (id(tempo_J).state == "Bleu") {
              it.rectangle(0,  0, it.get_width(), it.get_height(), id(Bleu));
            }

            if (id(tempo_J).state == "Blanc") {
              it.rectangle(0,  0, it.get_width(), it.get_height(), id(Blanc));
            }

            if (id(tempo_J).state == "Rouge") {
              it.rectangle(0,  0, it.get_width(), it.get_height(), id(Rouge));
            }

            it.print(1, 22, id(calibri_24), id(Rouge), TextAlign::LEFT, "EDF");
            it.printf(232, 2, id(calibri_60), id(Rouge), TextAlign::RIGHT, "%.0f W", id(sonde_edf_routeur).state);

            it.print(1, 65, id(calibri_24), id(Jaune), TextAlign::LEFT, "SUN");
            it.printf(232, 45, id(calibri_60), id(Jaune), TextAlign::RIGHT, "%.0f W", id(prod_solaire).state);

            it.print(1, 110, id(calibri_24), id(Blanc), TextAlign::LEFT, "TRIAC");
            it.printf(232, 98, id(calibri_48), id(Blanc), TextAlign::RIGHT, "%.0f %%", id(triac_ouverture).state);

      - id: page2
        lambda: |-
            it.rectangle(0,  0, it.get_width(), it.get_height(), id(Gris));
            if (id(tempo_J).state == "Bleu") {
              it.rectangle(0,  0, it.get_width(), it.get_height(), id(Bleu));
            }

            if (id(tempo_J).state == "Blanc") {
              it.rectangle(0,  0, it.get_width(), it.get_height(), id(Blanc));
            }

            if (id(tempo_J).state == "Rouge") {
              it.rectangle(0,  0, it.get_width(), it.get_height(), id(Rouge));
            }

            it.print(1, 22, id(calibri_24), id(Rouge), TextAlign::LEFT, "temp. Triac");
            it.printf(232, 2, id(calibri_60), id(Rouge), TextAlign::RIGHT, "%.1f°", id(temp_triac).state);

            it.print(1, 65, id(calibri_24), id(Jaune), TextAlign::LEFT, "temp. max");
            it.printf(232, 45, id(calibri_60), id(Jaune), TextAlign::RIGHT, "%.1f°", id(temp_max_triac).state);

            it.print(1, 110, id(calibri_24), id(Blanc), TextAlign::LEFT, "Duree equ.");
            it.printf(232, 98, id(calibri_48), id(Blanc), TextAlign::RIGHT, "%.2f h", id(duree_equiv_triac).state);

      - id: page3
        lambda: |-
            it.rectangle(0,  0, it.get_width(), it.get_height(), id(Gris));

           
            if (id(tempo_J).state == "Bleu") {
              it.rectangle(0,  0, it.get_width(), it.get_height(), id(Bleu));
              it.print(1, 22, id(calibri_24), id(Bleu), TextAlign::LEFT, "Tempo J");
              it.printf(232, 2, id(calibri_60), id(Bleu), TextAlign::RIGHT, "%s", id(tempo_J).state.c_str());
            }        

            if (id(tempo_J).state == "Blanc") {
              it.rectangle(0,  0, it.get_width(), it.get_height(), id(Blanc));
              it.print(1, 22, id(calibri_24), id(Blanc), TextAlign::LEFT, "Tempo J");
              it.printf(232, 2, id(calibri_60), id(Blanc), TextAlign::RIGHT, "%s", id(tempo_J).state.c_str());
            }

            if (id(tempo_J).state == "Rouge") {
              it.rectangle(0,  0, it.get_width(), it.get_height(), id(Rouge));
              it.print(1, 22, id(calibri_24), id(Rouge), TextAlign::LEFT, "Tempo J");
              it.printf(232, 2, id(calibri_60), id(Rouge), TextAlign::RIGHT, "%s", id(tempo_J).state.c_str());
            }

            it.print(1, 65, id(calibri_24), id(Jaune), TextAlign::LEFT, "J soutiree");
            it.printf(232, 60, id(calibri_48), id(Jaune), TextAlign::RIGHT, "%.0f wh", id(energie_J_soutiree).state);

            it.print(1, 110, id(calibri_24), id(Blanc), TextAlign::LEFT, "J injectee");
            it.printf(232, 98, id(calibri_48), id(Blanc), TextAlign::RIGHT, "%.0f wh", id(energie_J_injectee).state);

# Rectangle plein: it.filled_rectangle(0, 120, 239, 20, id(turquoise));
# Ligne:           it.line(0, 22, 240, 22, id(Bleu));
# Afficher heure:  it.strftime(5, 2, id(calibri_S), id(jaune), TextAlign::TOP_LEFT, "%d.%m.%Y %H:%M", id(esptime).now());

time:
  - platform: homeassistant
    id: esptime

# Etat de l'ESP et utilisation de ses 2 boutons
binary_sensor:
  - platform: status
    name: "Node Status"
    id: system_status
 
  - platform: gpio
    internal: false
    name: ttgo button_0 push
    id: tdisplay_button_input_0
    entity_category: config
    pin:
      number: GPIO0
      inverted: true
      mode:
        input: true
        pullup: true
    on_click:
      then:
          - display.page.show_next: my_display
          - component.update: my_display  

  - platform: gpio
    internal: false
    id: tdisplay_button_input_1
    name: ttgo button_1 push
    entity_category: config
    pin:
      number: GPIO35
      inverted: true
      mode:
        input: true
    filters:
      - delayed_on: 10ms
      - delayed_off: 10ms
    on_click:
      then:
          - display.page.show_previous: my_display
          - component.update: my_display   


# Pour faire un carousel pour passer d'une page à l'autre, à la place des boutons
#interval:
#  - interval: 5s
#    then:
#      - display.page.show_next: my_display
#      - component.update: my_display


Pièces jointes Miniature(s)
           
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)