Esphome select component

Mon problème

Bonjour,

Je cherche à piloter 2 gpio d’un ESP en fonction de l’état d’un « select component » dans ESPhome. Dans l’idée je voudrais que :

si option1 : gpio 1 =0 et gpio 2 = 0
si option2 : gpio 1=0 et gpio 2 = 1
...

Je pensais utiliser la fonction on_value, mais je ne comprend pas comment elle s’utilise.

Pourriez vous m’aider sur le sujet svp?

Merci d’avance

Bonjour à tous,

En farfouillant un peu sur le site esphome, j’ai trouvé des infos mais je ne m’en sort pas… Je n’ai pas d’erreur apparent mais je n’arrive à compiler…

Pourriez vous m’aider svp ?

Voici mon code :

output:
  - platform: gpio
    pin: D1
    id: gpio1_output
  - platform: gpio
    pin: D2
    id: gpio2_output

select:
  - platform: template
    name: "Mode de Chauffage"
    options:
      - "Off"
      - "HG"
      - "Eco"
      - "Confort"
    id: mode_de_chauffage
    initial_option: "Confort"
    optimistic: true    
    set_action:
      - logger.log:
          format: "Chosen option: %s"
          args: ["x.c_str()"]
    on_value:
      then:
        - if:
            condition: 
              lambda: "return id(mode_de_chauffage).state == 'Off';"
            then:
              - output.turn_off: gpio1_output

A priori c’est la partie avec le lambda qui pose soucis. Quand je la commente, ça compile. Pourtant, ça ressemble beaucoup à ce qu’on trouve dans la doc…

on_...:
  then:
    - if:
        condition:
          lambda: 'return id(some_sensor).state < 30;'
        then:
          - logger.log: "The sensor value is below 30!"
          - light.turn_on: my_light
          - delay: 5s
        else:
          - logger.log: "The sensor value is above 30!"
    - light.turn_off: my_light

la il manque beaucoup de ligne de code
Quel type esp ?
comment tu code ?

sérieux , comment voulez vous qu’on vous aide avec un tiers des infos !

Merci pour le retour. Le reste du code étant les infos de connexions, ota et api, je ne vois pas bien en quoi c’est important ici…

Comme évoqué, l’erreur se situe dans le lambda, en inversant les ’ ’ et les " " ça à solutionner le problème et ça compile. Par contre, je n’arrive pas à enchainer plusieurs if et je ne vois pas de manière de faire un else if dans la doc esphome. Il n’est fait mention que de else…

Comment faire pour gérer les 4 critères ?

Bonjour tout le monde, je cherche moi aussi a piloter plusieurs sorties via le imput select, j’ai declarer toutes les sorties mais au moment de la compilation ca plante j’ai chercher un moment pour trouver quelquechose de coherant sur le lamba mais ca veux pas ( je suis debutant sur esphome ) je penses que j’ai mal déclarer ou alors que je n’utilise pas le bon lambda.

Le but ici serait de pouvoir selectionner les vitesse différente et d’activer ou non des sorties en fonction du mode choisi. Je met mon bout de code ( qui n’est pas encore complet mais il y a l’essentiel pour cette fonction (enfin je penses ):

substitutions:
  name: esphome-web-c52254
  friendly_name: ESP piscine

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  name_add_mac_suffix: false
  project:
    name: esphome.web
    version: '1.0'

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:

# Allow Over-The-Air updates
ota:

# Allow provisioning Wi-Fi via serial
improv_serial:

wifi:
  # Set up a wifi access point
  ap: {}

# In combination with the `ap` this allows the user
# to provision wifi credentials to the device via WiFi AP.
captive_portal:

dashboard_import:
  package_import_url: github://esphome/example-configs/esphome-web/esp32.yaml@main
  import_full_config: true

# Sets up Bluetooth LE (Only on ESP32) to allow the user
# to provision wifi credentials to the device.
esp32_improv:
  authorizer: none

# To have a "next url" for improv serial
web_server:

time:
  - platform: sntp
    id: sntp_time
i2c:
  sda: 21
  scl: 22
  scan: true
  id: bus_a

sensor:

  - platform: wifi_signal
    name: "WiFi Signal dB"
    id: wifi_signal_db
    update_interval: 60s
    entity_category: "diagnostic"

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

  - platform: internal_temperature
    name: "Temperature esp"

  - platform: pulse_counter
    name: "vitesse moteur"
    id: pump_speed
    unit_of_measurement: 'RPM'
    pin:
      number: GPIO17
      inverted: true
      mode:
        input: true
        pullup: true
    update_interval: 3s

  - platform: pulse_counter
    name: "debit filtration"
    icon: mdi:water
    id: water_speed
    unit_of_measurement: 'l/mn'
    filters:
      - lambda: return x / (45/100); # 1l = 7.5 impulsionspour dn16 = 27 pour dn40
    pin:
      number: GPIO32
      inverted: true
      mode:
        input: true
        pullup: true
    update_interval: 3s

  - platform: ntc
    name: NTC Temperature
    sensor: resistance_sensor
    calibration:
      - 632.2kOhm -> -10°C
      - 354.6kOhm -> 0°C
      - 33.45kOhm -> 50°C
      #b_constant: 3950
      #reference_temperature: 25°C
      #reference_resistance: 100kOhm #129.2kOhm


  - platform: resistance
    id: resistance_sensor
    sensor: source_sensor
    configuration: UPSTREAM #thermistance coté 3.3v
    resistor: 4.68kOhm
    name: Resistance Sensor
  - platform: adc
    id: source_sensor
    pin: A0
    filters:
      - multiply: 3.3

output:
  - platform: gpio
    id: pompe_arret
    pin: GPIO26
    inverted: True
    #restore_mode: always_off

  - platform: gpio
    id: pompe_marche
    pin: GPIO18
    
  - platform: gpio
    id: pompe_auto
    pin: GPIO14
    
  - platform: gpio
    id: pompe_v1
    pin: GPIO19
    
  - platform: gpio
    id: pompe_v2
    pin: GPIO23
    
  - platform: gpio
    id: pompe_v3
    pin: GPIO27
    
  - platform: gpio
    id: pompe_uvc
    pin: GPIO33

select:
  - platform: template
    name: "Vitesse pompe"
    options:
      - 'Off'
      - 'V1'
      - 'V2'
      - 'V3'
    id: vitesse_pompe
    initial_option: "Off"
    optimistic: true    
    set_action:
      - logger.log:
          format: "Chosen option: %s"
          args: ["x.c_str()"]
    on_value:
      then:
        - lambda: !lambda |-
           auto options = id(vitesse_pompe).traits.get_options();
           id(vitesse_pompe) = std::distance(options.begin(), std::find(options.begin(), options.end(),x) );
        - if:
            condition: 
              lambda: "return id(vitesse_pompe).state == 'Off';"
            then:
              - output.turn_off: pompe_arret
              - output.turn_off: pompe_marche
              - output.turn_off: pompe_v1
              - output.turn_off: pompe_v2
              - output.turn_off: pompe_v3
              - output.turn_off: pompe_uvc
            else:
              - output.turn_on: pompe_arret
        - if: 
            condition:
              lambda: "return id(vitesse_pompe).state == 'V1';"
            then:
              - output.turn_on: pompe_marche
              - output.turn_on: pompe_v1
              - output.turn_on: pompe_uvc
              - output.turn_off: pompe_v2
              - output.turn_off: pompe_v3
        - if: 
            condition:
              lambda: "return id(vitesse_pompe).state == 'V2';"
            then:
              - output.turn_on: pompe_marche
              - output.turn_on: pompe_v2
              - output.turn_on: pompe_uvc
              - output.turn_off: pompe_v1
              - output.turn_off: pompe_v3
        - if: 
            condition:
              lambda: "return id(vitesse_pompe).state == 'V3';"
            then:
              - output.turn_on: pompe_marche
              - output.turn_on: pompe_v3
              - output.turn_off: pompe_uvc
              - output.turn_off: pompe_v1
              - output.turn_off: pompe_v2

merci d’avance pour l’aide.

Après avoir pas mal cherché et fait appel à chatGPT,

Voici à quoi je suis arrivé :

output:
  - platform: gpio
    pin: D1
    id: gpio1_output
  - platform: gpio
    pin: D2
    id: gpio2_output

select:
  - platform: template
    name: "Mode de Chauffage"
    options:
      - "Off"
      - "HG"
      - "Eco"
      - "Confort"
    id: mode_de_chauffage
    initial_option: "Off"
    optimistic: true 
    on_value:
      then:
        - if:
            condition:
              lambda: 'return id(mode_de_chauffage).state == "Off";'
            then:
              - logger.log: "GPIO1: OFF, GPIO2: ON"
              - output.turn_on: gpio1_output
              - output.turn_off: gpio2_output
        - if:
            condition:
              lambda: 'return id(mode_de_chauffage).state == "HG";'
            then:
              - logger.log: "GPIO1: ON, GPIO2: OFF"
              - output.turn_off: gpio1_output
              - output.turn_on: gpio2_output
        - if:
            condition:
              lambda: 'return id(mode_de_chauffage).state == "Eco";'
            then:
              - logger.log: "GPIO1: ON, GPIO2: ON"
              - output.turn_on: gpio1_output
              - output.turn_on: gpio2_output
        - if:
            condition:
              lambda: 'return id(mode_de_chauffage).state == "Confort";'
            then:
              - logger.log: "GPIO1: OFF, GPIO2: OFF"
              - output.turn_off: gpio1_output
              - output.turn_off: gpio2_output

Si jamais ça peut t’aider

avec chat GPT!! lol
ok je vais y pensser mais ca pourrais me servir comment t’as fait?

Je viens de tester chatGPT!!! c’est de la balle, j’ai donc mon bout de code opérationnel, avec mon imput select. je vais voir si il est encore possible de l’optimiser. Je partagerais ici

donc voici ce qui en est ressorti avec « optimisation » du code en faisant les déclarations des pins en tête de fichier:

substitutions:
 
  # Pins GPIO
  gpio_pompe_arret: '26'
  gpio_pompe_marche: '18'
  gpio_lampe_uvc: '33'
  gpio_pompe_v1: '19'
  gpio_pompe_v2: '23'
  gpio_pompe_v3: '27'

pour les switchs j’ai preferer les masquer afin de n’avoir que le select d’affichable

switch:
  - platform: gpio
    pin: GPIO${gpio_pompe_arret}
    name: "pompe_arret"
    id: pompe_arret

  - platform: gpio
    pin: GPIO${gpio_pompe_marche}
    name: "pompe_marche"
    id: pompe_marche

  - platform: gpio
    pin: GPIO${gpio_lampe_uvc}
    name: "lampe_uvc"
    id: lampe_uvc
    interlock: 
      - pompe_v3
    
  - platform: gpio
    pin: GPIO${gpio_pompe_v1}
    name: "pompe_v1"
    id: pompe_v1
    internal: true
    interlock: 
      - pompe_v2
      - pompe_v3
    disabled_by_default: true

  - platform: gpio
    pin: GPIO${gpio_pompe_v2}
    name: "pompe_v2"
    id: pompe_v2
    internal: true
    interlock: 
      - pompe_v1
      - pompe_v3
    disabled_by_default: true

  - platform: gpio
    pin: GPIO${gpio_pompe_v3}
    name: "pompe_v3"
    id: pompe_v3
    internal: true
    interlock: 
      - pompe_v1
      - pompe_v2
      - lampe_uvc
    disabled_by_default: true

select:
  - platform: template
    name: "Vitesse pompe"
    options:
      - "Off"
      - "V1"
      - "V2"
      - "V3"
    id: vitesse_pompe
    initial_option: "Off"
    optimistic: true
    on_value:
      then:
        - if:
            condition: 
              lambda: "return id(vitesse_pompe).state == \"Off\";"
            then:
              - logger.log: "All outputs OFF"
              - switch.turn_off: pompe_arret
              - switch.turn_off: pompe_marche
              - switch.turn_off: pompe_v1
              - switch.turn_off: pompe_v2
              - switch.turn_off: pompe_v3
              - switch.turn_off: lampe_uvc
        - if: 
            condition:
              lambda: "return id(vitesse_pompe).state == \"V1\";"
            then:
              - logger.log: "V1 selected"
              - switch.turn_off: pompe_v3
              - switch.turn_off: pompe_v2
              - switch.turn_on: pompe_marche
              - switch.turn_on: pompe_v1
              - switch.turn_on: lampe_uvc
        - if: 
            condition:
              lambda: "return id(vitesse_pompe).state == \"V2\";"
            then:
              - logger.log: "V2 selected"
              - switch.turn_off: pompe_v1
              - switch.turn_off: pompe_v3
              - switch.turn_on: pompe_marche
              - switch.turn_on: pompe_v2
              - switch.turn_on: lampe_uvc
        - if: 
            condition:
              lambda: "return id(vitesse_pompe).state == \"V3\";"
            then:
              - logger.log: "V3 selected"
              - switch.turn_off: lampe_uvc
              - switch.turn_off: pompe_v1
              - switch.turn_off: pompe_v2
              - switch.turn_on: pompe_marche
              - switch.turn_on: pompe_v3

J’avais entendu parler de chatGPT mais de la a te sortir un code en faisant un copier coller et lui adjoindre les logs de compilations afin de corriger!!! c’est fou.

1 « J'aime »