ESPHome: switch condition?

Bonjour

J’ai besoin dans du code ESPHome de faire la fonction switch (la fonction conditionnelle) qui est un empilement de IF basiquement ! Malheureusement ESPHome n’accepte pas plusieurs if au même niveau ni le ELSE IF :frowning:

Une idée ? merci

Vincèn

Salut,

En fait si il y a des fonctions if/elif/else dans ESPhome pour ça il faut utiliser les lambdas

lambda: |-
  if (expression){statement}
  else if (expression){statement}
  else {statement}
2 « J'aime »

Il y a juste des personnes formidables ici :smiling_face_with_three_hearts:

1 « J'aime »

Ah oki donc il faut en passer par les lambdas :frowning: Bon j’ai tenté ça pour commencer mais pas très concluant :confused:

script:
  - id: digit_dial
    then:
      lambda: |-
        if (id(digit) == 1)
          {
           - button.press: bd1 
          }
        else if (id(digit) == 2)
          {
           - button.press: bd2
          }
/config/esphome/kincony-k868-ag.yaml: In lambda function:
/config/esphome/kincony-k868-ag.yaml:74:18: error: expected primary-expression before '.' token
            - button.press: bd1 
                  ^
/config/esphome/kincony-k868-ag.yaml:78:18: error: expected primary-expression before '.' token
            - button.press: bd2
                  ^
*** [/data/kincony-k868-ag/.pioenvs/kincony-k868-ag/src/main.cpp.o] Error 1
========================== [FAILED] Took 3.10 seconds ==========================

Tu as un forfait limité pour ne partager que l’extrait de ton code ? :joy:

Bon si j’ai bien compris tu veux coder dans l’esp l’équivalent d’une automatisation pour faire 1 action (parmi X) = 1 réaction… (donc 1 pour 1)

Dans les lambda, tu peux pas déclencher directement, tu peux je crois ne faire que des state_publish

Je suis pas sur que ce soit la meilleure piste, pour moi autant de switch (au sens HA) que d’actions et c’est suffisant
D’où l’intérêt du code pour avoir une vue un peu plus globale

Non c’était juste pour éviter de polluer avec tout le reste qui est pas directement concerné pour le moment :smiley:

substitutions:
  friendly_name: kincony-k868-ag
  source_name: maison

esphome:
  name: $friendly_name

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:

web_server:

ota:

wifi:
  networks:
  - ssid: !secret wifi_ssid
    password: !secret wifi_passwd
  - ssid: !secret wifi_puppy
    password: !secret wifi_puppy_passwd
  - ssid: !secret wifi_cstj
    password: !secret wifi_cstj_passwd
  ap:
    ssid: $friendly_name

captive_portal:

#output:
#  - platform: ledc
#    pin: GPIO4
#    id: rtttl_out

#rtttl:
#  output: rtttl_out

api:
  reboot_timeout: 120min
#  services:
#    - service: favorites
#      variables:
#        channel: Int
#      then:
#        lambda: !lambda |-
#          if (id($channel) >= 999) {
#            script.execate : digit_dial;
#          }

globals:
   - id: digit
     type: int
     restore_value: no
     initial_value: '0'

sensor:
  - platform: wifi_signal
    name: $friendly_name WiFi Signal
    update_interval: 60s
  - platform: uptime
    name: $friendly_name Uptime
    filters:
      - lambda: return x / 60.0;
    unit_of_measurement: minutes

script:
  - id: digit_dial
    then:
      lambda: |-
        if (id(digit) == 1)
          {
           - button.press: bd1 
          }
        else if (id(digit) == 2)
          {
           - button.press: bd2
          }

remote_transmitter:
  pin: GPIO2
  carrier_duty_percent: 50%

#remote_receiver:
#  pin:
#    number: GPIO23
#    inverted: true
#    mode:
#      input: true
#      pullup: true
#  dump: all

button:
  - platform: template
    name: $source_name Power
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 0041 0020 0021 0040 0021 0020 06C3"
  - platform: template
    name: $source_name TV Power
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000A 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0041 0040 0041 0020 0021 0040 0041 0020 06C3"
  - platform: template
    name: $source_name A/V
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0020 0021 0040 06C3"
  - platform: template
    name: $source_name Red
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000A 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0041 0020 0021 0040 0021 0020 0041 0040 06C3"
  - platform: template
    name: $source_name Green
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0041 0020 0020 0041 0020 0021 0020 0021 0040 0041 0020 0021 0040 0021 0020 0021 0020 0041 0020 06C3"
  - platform: template
    name: $source_name Yellow
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0041 0020 06C3"
  - platform: template
    name: $source_name Blue
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000A 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0041 0040 06C3"
  - platform: template
    name: $source_name Mute
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0021 0020 0020 0021 0040 0041 0021 0020 0020 0021 0040 0041 0020 0021 0040 0021 0020 0021 0020 0021 0020 06C3"
  - platform: template
    name: $source_name TV
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000A 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0041 0020 0021 0040 0041 0040 0041 0020 06C3"
  - platform: template
    name: $source_name EPG
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000A 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0041 0020 0021 0040 0041 0020 0021 0040 06C3"
  - platform: template
    name: $source_name Settings
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0041 0020 0021 0040 0021 0020 0041 0020 0021 0020 06C3"
  - platform: template
    name: $source_name i
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0041 0020 06C3"
  - platform: template
    name: $source_name Vol +
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000A 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0041 0040 0021 0020 0041 0040 06C3"
  - platform: template
    name: $source_name Vol -
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0021 0020 0041 0041 0020 0020 0041 0021 0020 0020 06C3"
  - platform: template
    name: $source_name CH +
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0020 0021 0040 0021 0020 06C3"
  - platform: template
    name: $source_name CH -
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0021 0020 0041 0040 0021 0020 0021 0020 0041 0020 06C3"
  - platform: template
    name: $source_name Up
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0020 0021 0040 0041 0020 06C3"
  - platform: template
    name: $source_name Down
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0021 0020 0020 0021 0040 0041 0020 0021 0020 0021 0020 0021 0021 0020 0040 06C3"
  - platform: template
    name: $source_name Left
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000C 0000 0021 0020 0021 0020 0040 0041 0020 0021 0020 0021 0040 0041 0021 0020 0020 0021 0021 0020 0020 0021 0020 0021 0020 06C3"
  - platform: template
    name: $source_name Right
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000A 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0041 0040 0041 0040 0041 0020 0021 0020 06C3"
  - platform: template
    name: $source_name OK
    id: "bok"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000A 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0041 0040 0041 0020 0021 0040 0021 0020 06C3"
  - platform: template
    name: $source_name Home
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 0041 0020 0021 0040 0041 0020 06C3"
  - platform: template
    name: $source_name Return
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000C 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 0041 0020 0021 0020 0021 0020 0021 0020 06C3"
  - platform: template
    name: $source_name APP
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 06C3"
  - platform: template
    name: $source_name PIP
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000A 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0041 0040 0041 0020 0021 0020 0021 0040 06C3"
  - platform: template
    name: $source_name Menu
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000A 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 0041 0040 0041 0041 06C3"
  - platform: template
    name: $source_name Rewind
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000A 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0021 0020 0041 0040 0041 0020 0021 0040 06C3"
  - platform: template
    name: $source_name Play/Pause
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 0041 0040 0041 0020 0021 0020 06C3"
  - platform: template
    name: $source_name Forward
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0021 0020 0041 0040 0021 0020 0021 0021 0020 0020 06C3"
  - platform: template
    name: $source_name 1
    id: "bd1"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000C 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 0021 0020 0021 0020 0021 0020 0041 0020 06C3"
  - platform: template
    name: $source_name 2
    id: "bd2"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0021 0020 0020 0021 0040 0021 0020 0021 0020 0021 0020 0021 0020 0041 0040 06C3"
  - platform: template
    name: $source_name 3
    id: "bd3"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000C 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 0021 0020 0021 0020 0041 0020 0021 0020 06C3"
  - platform: template
    name: $source_name 4
    id: "bd4"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 0021 0020 0041 0040 0021 0020 06C3"
  - platform: template
    name: $source_name 5
    id: "bd5"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 0021 0020 0041 0040 0041 0020 06C3"
  - platform: template
    name: $source_name 6
    id: "bd6"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0041 0020 0020 0021 0020 0021 0020 0041 0020 0021 0040 06C3"
  - platform: template
    name: $source_name 7
    id: "bd7"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000C 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0021 0021 0020 0021 0040 0021 0020 0021 0020 0020 06C3"
  - platform: template
    name: $source_name 8
    id: "bd8"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 0041 0040 0021 0020 0021 0020 06C3"
  - platform: template
    name: $source_name 9
    id: "bd9"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 0041 0040 0021 0020 0041 0020 06C3"
  - platform: template
    name: $source_name 0
    id: "bd0"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000C 0000 0020 0021 0040 0021 0020 0041 0020 0021 0020 0021 0040 0021 0020 0021 0020 0021 0020 0021 0020 0021 0020 0021 0020 06C3"
  - platform: template
    name: $source_name Resize
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0020 0021 0040 0041 0020 0021 0020 0021 0040 0021 0020 0041 0040 0041 0020 0021 0020 0021 0020 06C3"
  - platform: template
    name: $source_name Keyboard
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0020 0021 0040 0021 0020 0041 0021 0020 0020 0021 0040 0021 0020 0041 0020 0021 0040 0021 0020 0021 0020 06C3"

Hum c’est un peu plus compliqué que ça :wink: En fait c’est pour gérer des favoris TV donc j’ai un bouton dans Lovelace et quand on appuie dessus cela provoque la composition en infrarouge d’un numéro pré-déterminé ! Au début j’avais codé cela avec des boutons dans ESPHome en dur mais cela prenait trop de place et ne rentrait plus dans l’ESP assez rapidement :frowning: Ma nouvelle piste était donc de faire un service dans ESPHome avec comme paramètre le numéro à composer et ensuite faire un petit bout de logique dans ESPHome pour dépiauter le numéro reçu en chiffres individuels et émettre les codes IR correspondants :wink:

Ok donc c’est plus clair, pas que la totalité du code soit importante mais pour le contexte c’est mieux… db1 etc

En fait, je pense qu’il faut revoir le principe global. Tu as déjà eu le souci, tout coder coté ESP c’est bien mais on atteints vite les limites de taille/mémoire…
Là avec un if / elif / else tu va devoir coder tous tes favoris quand même. Et donc potentiellement tu as les même souci de taille

Et que ce soit coté HA ou coté ESP tu va devoir coder un découpage de la séquence « 1234 » en la succession de touche 1 puis 2 puis 3 puis 4
Pourquoi plus dans ESP que dans HA ?

Euh non justement plus besoin de coder tous les favoris individuellement dans ESPHome :wink: Comme tu le dis après mon idée était de découper le chiffre reçu en numéro individuel (millier/centaine/dixaine/unité) et envoyer les chiffres correspondants :wink:
Je suis parti dans l’idée de le faire côté ESPHome parce que cela me paraissait plus simple à faire et plus logique :grin: J’avoue que côté HA je sais pas trop quelle serait la meilleure approche pour faire ça :confused:

Je suis d’accord que tu n’aura pas besoin de tout coder, mais dans ce cas, c’est pas des IF qu’il te faut c’est une boucle…

Par exemple avec la chaine « XYZ » tu fais une boucle de 3 appels (3 caractères dans la chaine) sur la bouton dont le nom est à chaque appel B+valeur d’un caractère

Il n’y a pas de IF là dedans

Par ailleurs, avant de faire le décodage, sais-tu envoyer la chaine à ton esp ? Parce que si ça c’est pas fonctionnel, tu bosses sur un truc qui sert à rien

un switch tu veux dire ? mais ça y’a pas dans esphome :frowning:

euh pas vraiment compris ton histoire :frowning: Je pensais simplement extraire chaque chiffre du numéro reçu de HA et ensuite appeler ma sous-routine autant de fois qu’il y a de chiffre à transmettre (la sous-routine faisant un test sur le chiffre pour transmettre le code IR correspondant !).

Oui le service créé dans l’ESP (voir le code précédemment posté) marche nickel ! J’appelle le service avec le numéro en paramètre côté HA et ça arrive bien dans ESPHome :sunglasses:

C’est une question de point de vue.

  • HA offre plus de choix que ESP en formes d’écritures automatisation/jinja/python
  • HA est déjà un moteur de ‹ traduction › entre 2 éléments

Le problème d’appeller ça un swith c’est de confondre avec le switch HA. Un swith HA et un swith ESP ça existe, c’est d’ailleurs la même entité
Bref, avec ta phrase suivante, on est quasi raccord sur le principe

Presque :

  • extraction = boucle
  • sous-routine = appel

mais techniquement tu n’a pas besoin de tester (ton IF) quand ton caractère est 1, la bouton a appeler est B1 > concaténation « B » avec ton caractère.

C’est plus facile que de faire une cascade de 10 IF (10 chiffres ) pour retrouver à la correspondance et d’ajouter la semaine prochain les 26 autres (26 lettres) pour traiter les commandes de volumes/entrées parce que tu voudrais basculer de HDMI 1 à HDMI4 dans la même séquence

Tu vois l’idée ?

Effectivement et côté HA je n’aurais pas le problème de ressources très limitées d’ESPHome :wink:

Oui effectivement mais primo est-tu sur que cela marchera dans ESPHome ? et puis pour coder ça en lambdas c’est hors de mes capacités :frowning:
Du coup avec ton idée de faire ça dans HA j’essaye de tester ça mais bizarrement HA fait aucune erreur mais l’entité créée n’apparaît nulle part dans ha :frowning:

button:
  - platform: template
    name: Al Arabya
    on_press:
    - button.press: button.maison_4
    - delay: 0.1s
    - button.press: button.maison_5
    - delay: 0.1s
    - button.press: button.maison_1
    - delay: 0.1s
    - button.press: button.maison_7
    - delay: 0.1s
    - button.press: button.maison_ok

ça existe ça dans HA ?
Moi, je ferais ça dans un script/sequence

Par contre on est bien d’accord pour pour l’instant, c’est toi qui « découpe » à la main les boutons

Ben c’est super bizarre car aucune erreur dans les logs ni en faisant la vérification de config de HA mais l’entité n’est pas créée non plus :confused:

Pour le script pourquoi pas, il faut que je regarde alors si on peut y passer un paramètre (le numéro à composer) parce que je ne me vois pas créer autant de scripts que de favs à rappeler :rofl:
Pour la découpe je vais la faire dans le script alors non ? Je vais tester un script simple déja qui envoie une séquence pré-déterminée et ensuite je regarde comment faire ça dynamiquement selon un numéro passé en paramètre !

1 « J'aime »


Le script bourrin marche, c’est déja un premier point :slight_smile: Plus qu’à trouver comment faire le dépiautage d’un numéro passé en paramètres et le tour sera joué :wink: enfin j’espère…

bon déja pas gagné pour récupérer une variable dans le script :frowning: quand j’essaye d’appeler ce script il ne détecte pas qu’il a besoin d’un paranètre :frowning:

favori:
  alias: Favori
  variables:
    channel_number: 0
  sequence:
  - device_id: 3c06bd657b671c6a7dac0843bc3f5fea
    domain: button
    entity_id: button.maison_1
    type: press
  - delay:
      hours: 0
      minutes: 0
      seconds: 0
      milliseconds: 200
  - device_id: 3c06bd657b671c6a7dac0843bc3f5fea
    domain: button
    entity_id: button.maison_7
    type: press
  - delay:
      hours: 0
      minutes: 0
      seconds: 0
      milliseconds: 200
  - device_id: 3c06bd657b671c6a7dac0843bc3f5fea
    domain: button
    entity_id: button.maison_8
    type: press
  - delay:
      hours: 0
      minutes: 0
      seconds: 0
      milliseconds: 200
  - device_id: 3c06bd657b671c6a7dac0843bc3f5fea
    domain: button
    entity_id: button.maison_ok
    type: press
  mode: single
  icon: ios:4k-tv

Comme ça a 1ère vue, je penche pour :

  • tes favoris sour forme d’input-text ou number

Qui déclenchent une automatisation unique

Dans l’automatisation tu te sers de l’id du trigger pour récupérer le state (qui correspond à la séquence à jouer)

Pour ma part, c’est pas clair sur comment appeler les services dans un boucle depuis l’automatisation

Pourquoi tu parles d’automatisation ? Là je suis parti sur un script car je peux l’appeler directement depuis une entity Card (qui me sert de rappel du preset dans Lovelace :wink: Le truc maintenant c’est de trouver comment faire un script avec une variable en paramètre pour passer le numéro à compser et côté script voir si je peux faire un traitement mathématique basique pour extraire chacun des chiffres !
Petit aperçu d’une page de favs dans Lovelace :wink:

Justement, à défaut de pouvoir passer un paramètre à ton script, l’automatisation sait obtenir le ‹ trigger › qui pourrait être l’équivalent du paramètre

oui mais bon ça devient un peu lourdingue :frowning: là j’ai tenté ça parce que de ce que j’ai vu il suffisait d’utiliser une variable pour qu’elle se crée comme paramètres mais ça ne marche pas :frowning: il refuse d’enregistrer sur un problème de syntaxe !