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
Une idée ? merci
Vincèn
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
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}
Il y a juste des personnes formidables ici
Ah oki donc il faut en passer par les lambdas Bon j’ai tenté ça pour commencer mais pas très concluant
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 ?
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
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 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
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
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 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
Je suis parti dans l’idée de le faire côté ESPHome parce que cela me paraissait plus simple à faire et plus logique J’avoue que côté HA je sais pas trop quelle serait la meilleure approche pour faire ça
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
euh pas vraiment compris ton histoire 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
C’est une question de point de vue.
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 :
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
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
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
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
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
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 !
bon déja pas gagné pour récupérer une variable dans le script quand j’essaye d’appeler ce script il ne détecte pas qu’il a besoin d’un paranètre
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 :
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 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
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