Affichage avec ESPHome

Mon problème

Je me lance dans ESPHome avec un D1 mini.

Mon premier « projet » est d’afficher ma consommation et ma production d’électricité sur un écran 4 digit 7 segments.

Pour le moment j’arrive à afficher une valeur saisie manuellement, mais je bloque sur la partie récupération de la variable de HA pour l’afficher sur l’écran.

Pourriez-vous m’aider ?

L’idée est d’afficher la valeur sensor.consototal puis sensor.prisesolaire_power avec une rotation toute les 1seconde.

Ma configuration

#Ecran 4x 7digits
display:

  • platform: tm1637
    id: tm1637_display
    clk_pin: D6
    dio_pin: D5
    update_interval: 100ms
    inverted: true
    length: 4
    lambda: |-
    it.print(« 8888 »);

Bonjour,
faut utiliser ce conposant:

puis ecrire ton lambda

sensor:
  - platform: homeassistant
    id: temp_1
    entity_id: sensor.atc_20a2_temperature

display:
  - platform: tdisplays3
    id: disp
    rotation: 90    
    update_interval: 1s
    lambda: |-
      it.printf(191, 40, id(roboto), Color(0, 255, 0), "%.1f°C", id(temp_1).state);

exemple de config:

esphome:
  name: s3-display
  friendly_name: ESP32-S3 T-Display
  platformio_options:
    board_build.f_flash: 80000000L
    board_build.partitions: default_16MB.csv
    board_build.arduino.memory_type: qio_opi

external_components:
  - source: github://landonr/lilygo-tdisplays3-esphome
    components: [tdisplays3]

esp32:
  board: esp32-s3-devkitc-1
  variant: esp32s3
  framework:
    type: arduino
  flash_size: 16MB

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

ota:
  password: "6ada2xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.1.60
    gateway: !secret wifi_gtw
    subnet: !secret wifi_sub
    dns1: !secret wifi_dns1

web_server:

time:
  - platform: homeassistant
    id: ha_time

sensor:
  - platform: homeassistant
    id: temp_1
    entity_id: sensor.atc_20a2_temperature

  - platform: homeassistant
    id: temp_2
    entity_id: sensor.atc_67c6_temperature

  - platform: homeassistant
    id: power
    entity_id: sensor.0xa4c1383a5eeb5542_power

  - platform: wifi_signal
    id: wifi_signal_db
    update_interval: 60s
    entity_category: "diagnostic"
    internal: true

  - platform: copy
    source_id: wifi_signal_db
    name: "WiFi Signal Percent"
    id: wifi_signal_pct
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    unit_of_measurement: "%"
    entity_category: "diagnostic"

  - platform: uptime
    id: uptime_sec
    update_interval: 60s
    internal: true

binary_sensor:
  - platform: gpio
    pin: 
      number: GPIO0
      inverted: true
    name: "Button 1"
    on_press:
      then:
        - light.toggle: light_s3

  - platform: gpio
    pin: 
      number: GPIO14
      inverted: true
      mode:
         input: true
    name: "Button 2"

  - platform: status
    name: "Statut"
    id: system_status
    entity_category: "diagnostic"

  - platform: homeassistant
    entity_id: binary_sensor.0x00158d0009439ec9_contact
    id: door_frigo


switch:
  - platform: restart
    name: "Restart"
    entity_category: config

text_sensor:
  - platform: template
    id: s3_uptime
    name: "Uptime"
    lambda: |-
      int seconds = (id(uptime_sec).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600); 
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      if ( days ) {
        return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s ").c_str() };
      } else if ( hours ) {
        return { (String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s ").c_str() };
      } else if ( minutes ) {
        return { (String(minutes) +"m "+ String(seconds) +"s ").c_str() };
      } else {
        return { (String(seconds) +"s ").c_str() };
      }
    icon: mdi:clock-start
    update_interval: 60s
    entity_category: "diagnostic"

  - platform: ld2410
    version:
      name: "ld2410 firmware version"

output:
  - platform: ledc
    pin: GPIO38
    id: gpio38
    frequency: 2000

light:
  - platform: monochromatic
    output: gpio38
    name: "Backlight"
    id: light_s3
    restore_mode: RESTORE_DEFAULT_ON

font:
  - file: "gfonts://Roboto"
    id: roboto
    size: 30

  - file: 'fonts/materialdesignicons-webfont.ttf'
    id: icon_font
    size: 58
    glyphs: [
      "\U000F081B", # mdi-door-closed
      "\U000F081C", # mdi-door-open
      ]

  - file: 'fonts/materialdesignicons-webfont.ttf'
    id: icon_font_po
    size: 55
    glyphs: [
      "\U000F0241", # mdi-flash
      "\U000F0243", # mdi-flash-off
      ]

display:
  - platform: tdisplays3
    id: disp
    rotation: 90    
    update_interval: 1s
    lambda: |-
      it.printf(40, 1, id(roboto), Color(0, 0, 255), id(ha_time).now().strftime("%H:%M:%S %d/%m/%y").c_str());
      it.print(1,  40, id(roboto), Color(255, 255, 255), TextAlign::LEFT, "Congelateur:");  
      it.print(1,  80, id(roboto), Color(255, 255, 255), TextAlign::LEFT, "Refrigerateur:");
      it.printf(191, 40, id(roboto), Color(0, 255, 0), "%.1f°C", id(temp_1).state);
      it.printf(216, 80, id(roboto), Color(0, 255, 0), "%.1f°C", id(temp_2).state);
      it.print(1, 122, id(roboto), Color(255, 255, 255), TextAlign::LEFT, "Porte:");
      if (id(door_frigo).state == false) {
        it.print(88, 122, id(roboto), Color(0, 255, 0), TextAlign::LEFT, "Fermer");
      } else {
        it.print(88, 122, id(roboto), Color(255, 0, 0), TextAlign::LEFT, "Ouverte");
      }
      if (id(door_frigo).state == false) {
        it.printf(200, 112, id(icon_font), Color(0, 255, 0), TextAlign::LEFT, "\U000F081B");
      } else {
        it.printf(200, 112, id(icon_font), Color(255, 0, 0), TextAlign::LEFT, "\U000F081C");
      }
      if (id(power).state >= 1) {
        it.printf(260, 115, id(icon_font_po), Color(255, 0, 0), TextAlign::LEFT, "\U000F0241");
      } else {
        it.printf(260, 115, id(icon_font_po), Color(0, 255, 0), TextAlign::LEFT, "\U000F0243");
      }

J’ai donc modifié comme ci-dessous :

> #Récup info HA
> sensor:
>   - platform: homeassistant
>     id: Conso
>     entity_id: sensor.consototal
> 
> #Ecran 4x 7digits
> display:
>   - platform: tm1637
>     id: tm1637_display
>     clk_pin: D6
>     dio_pin: D5
>     update_interval: 100ms
>     inverted: true
>     length: 4
>     lambda: |-
>       it.printf(id(Conso));

Mais j’ai l’erreur de compilation suivante :

ta oublier le .state

it.printf(id(Conso).state);

J’avais déjà essayé mais exactement la même erreur.

ton entité est a virgule ?

Chaque fois que vous tapez un signe de pourcentage % dans une chaîne de format printf, il traitera les lettres suivantes comme une balise de format jusqu’à ce qu’un soi-disant « spécificateur » soit rencontré (dans ce cas f ). Vous pouvez en savoir plus ici , mais pour ESPHome, il n’y a vraiment que quelques choses que vous devez savoir.

Décomposons%.1f :

  • % - lancer la chaîne de format
  • .1 - arrondir le nombre décimal aux 1 chiffres après la virgule.
  • f - le spécificateur qui indique à printf le type de données de l’argument. Ici c’est af(loat).

Par exemple, si vous souhaitez imprimer une valeur de capteur avec une précision à deux chiffres, vous écrivez %.2f et avec une précision de zéro chiffre (sans décimale) %.0f .

Une autre chaîne de format intéressante est %7.2f , qui deviendrait la chaîne justifiée à droite pour une valeur de 20,506." 20.51"

  • % - lancer le format
  • 7 - signifie que le nombre sera justifié à droite et complété à gauche par des espaces si le résultat comporte moins de 7 caractères.
  • .2 - arrondir le nombre décimal aux 2 chiffres après la virgule.
  • f - spécificateur : f(loat).

       it.printf("%.1f", id(Conso).state);
1 « J'aime »

Merci pour votre aide, j’ai réussi à faire afficher la valeur.