Esphome home assistant code Yaml ne veut plus s'integrer après version 2023.12.9

Le code de mon thermostat fonctionne bien mais il n’accepte plus la mise à jour des version esphome depuis la version 2023.12.9. quelqu’un peut m’aider? Il m’indique maintenant (sans que j’ai rien changé) qu’il ya une erreur pour cette ligne :

sensor: internal_temperature

et ces lignes :

lambda: |-
      if (id(fire).state) {id(ani_fire).next_frame(); it.image(0, 0, id(ani_fire));}
      else if (id(cool).state) {id(ani_fan).next_frame(); it.image(0, 0, id(ani_fan));}
      else {it.image(0, 0, id(home_thermometer));}
      it.print(64, 0,  id(font1), TextAlign::TOP_CENTER, "${room}");
      it.printf(128, 0,  id(font4), TextAlign::TOP_RIGHT, " %.1f%% ", id(internal_humidity).state);
      it.printf(64, 4, id(font2), TextAlign::TOP_CENTER, " %.1f°", id(internal_temperature).state);
      it.printf(0, 64, id(font3), TextAlign::BASELINE_LEFT, "L:%.1f°", id(this_thermostat).target_temperature_low);
      it.printf(128, 64, id(font3), TextAlign::BASELINE_RIGHT, "H:%.1f°", id(this_thermostat).target_temperature_high);
      if (id(brightness).state) {it.image(56, 51, id(bulb));} 
      else if (id(heat_cool).state) {it.image(56, 51, id(arrow_right));}
      else {it.image(56, 51, id(arrow_left));}
animation:`

mon code entier :

esphome:
  name: d1minithermostat1
  friendly_name: D1minithermostat1

  platform: esp8266
  board: d1_mini

  on_boot:
    priority: -100.0
    then:
      - lambda: "id(oled_contrast).publish_state(0.4);"

substitutions:
  room: JX # Room Name
  entity_heater: input_boolean.tut_thermo_fire    ### Change for your 'Heating' Entity
  entity_cooler: input_boolean.tut_thermo_cool    ### Change for your 'Cooling' Entity
  default_low: "20"
  default_hi: "25"

# Enable logging
logger:

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

ota:
  password: "xxxxxxxxxxxxxxxxxxxxxxxxx"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "D1Minithermostat1"
    password: "xxxxxxxxxxxx"

i2c:
  sda: GPIO4
  scl: GPIO5
  scan: true
  # id: bus_a
  frequency: 400kHz

captive_portal:
switch:
  - platform: template
    id: heat_cool

    optimistic: true
  - platform: gpio
    id: relay_heater
    pin: GPIO16
    # inverted: true
  - platform: gpio
    id: relay_cooler
    pin: GPIO14
    # inverted: true
  - platform: template
    id: brightness
    optimistic: true

# Déclaration d'une variable globale
globals:
  - id: on_off
    type: int
    restore_value: yes
    initial_value: '1'

binary_sensor:
  - platform: template
    id: fire
  - platform: template
    id: cool

  - platform: gpio
    id: button
    pin:
      number: GPIO2
      inverted: true
    on_press:
      then:
        - switch.toggle: heat_cool
        - lambda: |-
            if (id(on_off) == 0) {
              id(oled1).turn_on();
              id(on_off) = 1;
            }
            else {
              id(oled1).turn_off();
              id(on_off) = 0;
            }
    on_click:
      - min_length: 1000ms
        max_length: 20000ms
        then:
          - switch.toggle: brightness

climate:
  - platform: thermostat
    min_cooling_off_time: 0s
    min_cooling_run_time: 0s
    min_heating_off_time: 0s
    min_heating_run_time: 0s
    min_idle_time: 0s
    visual:
      min_temperature: 15 °C
      max_temperature: 30 °C
    name: "${room} Thermostat"
    id: this_thermostat
    sensor: internal_temperature

### Updated for ESPHome v2022.10.0 Onwards
    default_preset: Home                      ### NEW! Use this to set Preset
    # on_boot_restore_from: memory            ### Use this to "Restore From Memeory" (A Saved State) OR...
    on_boot_restore_from: default_preset      ### Use this to set Preset to start on every Boot    
    preset:
      - name: Home
        default_target_temperature_low: $default_low
        default_target_temperature_high: $default_hi
        mode: AUTO
###########################################

    cool_action:
      - switch.turn_on: relay_cooler
      - lambda: id(cool).publish_state(true);
      - homeassistant.service:
          service: homeassistant.turn_on
          data:
            entity_id: $entity_cooler

    heat_action:
      - switch.turn_on: relay_heater
      - lambda: id(fire).publish_state(true);
      - homeassistant.service:
          service: homeassistant.turn_on
          data:
            entity_id: $entity_heater

    idle_action:
      - switch.turn_off: relay_cooler
      - switch.turn_off: relay_heater
      - lambda: id(cool).publish_state(false);
      - lambda: id(fire).publish_state(false);
      - homeassistant.service:
          service: homeassistant.turn_off
          data:
            entity_id: $entity_cooler
      - homeassistant.service:
          service: homeassistant.turn_off
          data:
            entity_id: $entity_heater


sensor:
  - platform: uptime
    name: "${friendly_name} uptime"
    id: uptime_sensor

  - platform: bme280_i2c
    temperature:
      name: "BME280 Temperature"
      oversampling: 16x
    pressure:
      name: "BME280 Pressure"
    humidity:
      name: "BME280 Humidity"
    address: 0x77
    update_interval: 15s

  - platform: template
    id: oled_contrast

  - platform: rotary_encoder
    id: encoder
    pin_a:
      number: GPIO12
      mode: INPUT_PULLUP
    pin_b:
      number: GPIO13
      mode: INPUT_PULLUP
    on_clockwise:
      - if:
          condition:
            switch.is_on: brightness
          then:
            - sensor.template.publish:
                id: oled_contrast
                state: !lambda "return id(oled_contrast).state + 0.02;"
            - lambda: |-
                id(oled1).set_contrast( id(oled_contrast).state );
          else:
            - if:
                condition:
                  switch.is_on: heat_cool
                then:
                  - climate.control:
                      id: this_thermostat
                      target_temperature_high: !lambda "return id(this_thermostat).target_temperature_high + 0.5;"
                else:
                  - climate.control:
                      id: this_thermostat
                      target_temperature_low: !lambda "return id(this_thermostat).target_temperature_low + 0.5;"

    on_anticlockwise:
      then:
        - if:
            condition:
              switch.is_on: brightness
            then:
              - sensor.template.publish:
                  id: oled_contrast
                  state: !lambda "return id(oled_contrast).state - 0.02;"
              - lambda: |-
                  id(oled1).set_contrast( id(oled_contrast).state);
            else:
              - if:
                  condition:
                    switch.is_on: heat_cool
                  then:
                    - climate.control:
                        id: this_thermostat
                        target_temperature_high: !lambda "return id(this_thermostat).target_temperature_high - 0.5;"
                  else:
                    - climate.control:
                        id: this_thermostat
                        target_temperature_low: !lambda "return id(this_thermostat).target_temperature_low - 0.5;"

display:
  - platform: ssd1306_i2c
    id: oled1
    update_interval: 1.0s
    contrast: 0.4
    model: "SSD1306 128x64"
    rotation: 180
    address: 0x3C 
    lambda: |-
      if (id(fire).state) {id(ani_fire).next_frame(); it.image(0, 0, id(ani_fire));}
      else if (id(cool).state) {id(ani_fan).next_frame(); it.image(0, 0, id(ani_fan));}
      else {it.image(0, 0, id(home_thermometer));}
      it.print(64, 0,  id(font1), TextAlign::TOP_CENTER, "${room}");
      it.printf(128, 0,  id(font4), TextAlign::TOP_RIGHT, " %.1f%% ", id(internal_humidity).state);
      it.printf(64, 4, id(font2), TextAlign::TOP_CENTER, " %.1f°", id(internal_temperature).state);
      it.printf(0, 64, id(font3), TextAlign::BASELINE_LEFT, "L:%.1f°", id(this_thermostat).target_temperature_low);
      it.printf(128, 64, id(font3), TextAlign::BASELINE_RIGHT, "H:%.1f°", id(this_thermostat).target_temperature_high);
      if (id(brightness).state) {it.image(56, 51, id(bulb));} 
      else if (id(heat_cool).state) {it.image(56, 51, id(arrow_right));}
      else {it.image(56, 51, id(arrow_left));}
animation:
  - file: 'fan.gif'
    id: ani_fan
  - file: 'fire.gif'
    id: ani_fire
image:
  - file: 'home-thermometer.png'
    id: home_thermometer
  - file: 'arrow-left-circle-outline.png'
    id: arrow_left
  - file: 'arrow-right-circle-outline.png'
    id: arrow_right
  - file: 'lightbulb-on-outline.png'
    id: bulb
font:
  - file: 'nasalization.ttf'
    id: font1
    size: 12

  - file: 'refsan.ttf'
    id: font2
    size: 42

  - file: 'refsan.ttf'
    id: font3
    size: 13
    
  - file: 'refsan.ttf'
    id: font4
    size: 10

Bonjour @morinxav,
un bonjour ne fais pas de mal, un oubli arrive, mais fais attention les prochaines fois quand tu créer un sujet.

Partage l’erreur que tu obtiens, ca donne un indice.
Parce que la, ca aide pas:

Bonjour,
Excuse moi, j’avais tellement de mal a mettre mon code en code dans le forum que j’en ai oublié de dire bonjour!

mais ce n’est absolument pas mon habitude.

par contre ce sont des erreurs de syntaxes. Mais qui fonctionnaient avant… Les nouvelle version de ESPHOME n’accepte plus cette syntaxe mais je ne sais pas par quoi la remplacer.

ceci dit ça fonctionne très bien sans mise à jour, mais bon ça fait désordre et si je veux en refaire un…

Cordialement

Salut,

internal_temperature c’est pas censé être un ID? Tu y fait référence 2fois mais il n’est pas défini

1 « J'aime »

Bonsoir,
Merci pour ta reponse, je comprends ta reponse mais malheureusement pas assez compétant pour savoir par quoi ou comment rectifier le problème. Tu pourrais m’aiguiller plus?
pour info, je ne sais pas non plus comment dessiner le schèma car je trouve que mon thermostat vaut bien ceux à plusieurs centaines d’euros et je veux bien le partager mais je ne sais pas comment.(gestion manuelle ventillateur ou chaufage avec afficheur et automatisation par home assistant inspiré de : Home Assistant and ESPHome Digital OLED Thermostat v3)
Cordialement

Salut,

je ne pense pas que ce soit lié à la partie fonctionnement physique de ton thermostat

Moi je corrigerai ces lignes pour voir :

sensor:
  - platform: uptime
    name: "${friendly_name} uptime"
    id: uptime_sensor

  - platform: bme280_i2c
    temperature:
      name: "BME280 Temperature"
      oversampling: 16x
      id: internal_temperature
	  
    pressure:
      name: "BME280 Pressure"
    humidity:
      name: "BME280 Humidity"
      id: internal_humidity
      address: 0x77
      update_interval: 15s

Regarde bien les différence (texte et espaces)

1 « J'aime »

Salut,
@Pulpy-Luke a raison, le * sensor est pour utiliser une source de température externe , donc ton bme280 a ce que vois dans le code.
Faut utiliser un ID, dans senor:. Faut créer un id pour ton capteur de température et l’utiliser dans sensor: du climate. le id: est au même niveau que name:

j’utilise un SHT30. Exemple pour l’indexion avec un ID.

sensor:
  - platform: sht3xd
    i2c_id: i2c_external
    temperature:
      name: Temperature
      id: temp_state
      filters:
        - offset: -1.4
    humidity:
      name: Humidity
      id: hum_state
      filters:
        - offset: 6.0
    address: 0x44
    update_interval: 60s

  - platform: qmp6988
    i2c_id: i2c_external
    pressure:
      name: Pression
      id: pression_state
      filters:
        - offset: 7.2      
    address: 0x70
    update_interval: 60s
    iir_filter: 2x
1 « J'aime »

C’est d’ailleurs écrit dans ce sens sur le git d’origine (vieux de 2 ans)

1 « J'aime »

Comment ça fonctionner, vu qu’il avais pas de ID ??? :shushing_face:

Je suis d’accord, c’est du code qui compile pas … La seule explication, l’absence de mise à jour de l’esp depuis un moment… c’est en plus cohérent avec la date de l’ancienne version 2023.12.9

2 « J'aime »

rien ne s’affiche, vu que internal_temperature est pas un ID

La OK, ca affichera bien la température:

  - platform: bme280_i2c
    temperature:
      name: "BME280 Temperature"
      oversampling: 16x
      id: internal_temperature
1 « J'aime »

oui, j’ai vu aussi, d’où la correction des 2 id d’un coup

2 « J'aime »

Bonjour,

merci à tous les deux. je regarde ça dès que possible et vous ferais un retour.

il faut que je prenne un nouveau d1 mini, sinon je vais perdre le seul qui fonctionne…

mais, je vous affirme que j’ai sous les yeux le thermostat qui fonctionne. Est-ce que j’ai un moyen d’extraire le code de mon D1 mini, pour savoir si entre temps j’aurais modifié quelque chose?

Je sais qu’a l’époque, j’avais passé enormement de temp pour arriver a faire une fonction qui eteigne juste l’ecran et le rallume en appuyant sur le switch du codeur tout en continuant à fonctionner.

Cordialement

Je n’ai pas connaissance d’un moyen d’extraite la config actuelle. En plus c’est du compilé donc c’est même pas toujours utilisable facilement sur un autre appareil (ip, gpio etc)