ESPHome : script avec paramètres

Hello,

Histoire de me mettre à ESPHome, j’aimerais remplacer mon Hub Switchbot.
Je n’ai que des thermomètres, du coup j’aimerais me baser sur ce code.
C’est un peu en japonnais :smiley:

Le code pour éviter le japonais
substitutions:
  devicename: switchbot_meters

esphome:
  name: $devicename
  platform: ESP32
  board: esp32dev
  platformio_options: 
    platform: espressif32
    board: az-delivery-devkit-v4
    board_build.mcu: esp32
    board_build.f_cpu: 240000000L

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_key

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "${devicename}_AP"
    password: !secret ap_key

captive_portal:

# Enable Home Assistant API
api:
  password: !secret api_pass

ota:
  password: !secret ota_pass

sensor:
  - platform: template
    name: "$devicename Humidity"
    id: humidity0
    unit_of_measurement: '%'
    accuracy_decimals: 0
    icon: "mdi:water-percent"
  - platform: template
    name: "$devicename Temperature"
    id: temperature0
    unit_of_measurement: '°C'
    accuracy_decimals: 1
    icon: "mdi:thermometer"
  - platform: template
    name: "$devicename BT RSSI"
    id: rssi0
    unit_of_measurement: 'dB'
    accuracy_decimals: 0
    icon: "mdi:bluetooth"
  - platform: template
    name: "$devicename Battery"
    id: battery0
    unit_of_measurement: '%'
    accuracy_decimals: 0
    icon: "mdi:battery"
  - platform: template
    name: "$devicename Humidity 1"
    id: humidity1
    unit_of_measurement: '%'
    accuracy_decimals: 0
    icon: "mdi:water-percent"
  - platform: template
    name: "$devicename Temperature 1"
    id: temperature1
    unit_of_measurement: '°C'
    accuracy_decimals: 1
    icon: "mdi:thermometer"
  - platform: template
    name: "$devicename BT RSSI 1"
    id: rssi1
    unit_of_measurement: 'dB'
    accuracy_decimals: 0
    icon: "mdi:bluetooth"
  - platform: template
    name: "$devicename Battery 1"
    id: battery1
    unit_of_measurement: '%'
    accuracy_decimals: 0
    icon: "mdi:battery"

esp32_ble_tracker:
  scan_parameters:
    duration: 60s
  on_ble_advertise:
    - mac_address: f4:42:fa:b4:72:2a
      then:
        - lambda: |-
            for (auto data : x.get_service_datas()) {
                if(data.data.size() == 6) {
                  float temperature = (float)(data.data[4] & 0b01111111) + ((float)(data.data[3] & 0b00001111) / 10);
                  if (!(data.data[4] & 0b10000000)) {
                    temperature = -temperature;
                  }
                  int8_t humidity= data.data[5] & 0b01111111;
                  int8_t battery = data.data[2] & 0b01111111;
                  int8_t rssi=x.get_rssi();
                  id(humidity0).publish_state(humidity);
                  id(temperature0).publish_state(temperature);
                  id(rssi0).publish_state(rssi);
                  id(battery0).publish_state(battery);
                }
            }

Au départ je voulais utiliser ce projet Arduino mais je n’ai pas besoin de tout ça et ça serait pas mal d’utiliser ESPHome. Mais je digresse…

Dans le code cité ci-dessus, il n’y a qu’un seul thermomètre, mais j’en ai plusieurs.
Du coup, pour éviter de devoir dupliquer les lambda, je pensais utiliser un script auquel je pourrais spécifier quel sensor mettre à jour, en tout cas passer les info qu’il faudrait pour mettre à jour la température pour le thermomètre souhaité.
Sauf qu’on ne peut pas passer de paramètre à un script, contrairement à Home-Assistant :slight_smile:

Quelqu’un a-t-il une idée de comment procéder ?
Ou est-ce qu’il n’y a pas d’autre solution que dupliquer la ligne qui récupère les info donc un bloque par adresse mac et tout le lambda ?

Salut,

Tu veux rendre générique (via le script) mais

Techniquement ESPHome, c’est ni plus ni moi que des fichiers plats :
image
Donc c’est automatisable…
Mais pour que ce soit vraiment intéressant de rendre les choses génériques, il faut soit un nombre très important de capteurs, soit que le code change souvent.
Même avec 20 capteurs, je pense que c’est plus rapide de faire un copié/collé… Quand à l’évolution du code si le premier est correcte, je vois pas ou ça change

Autre point d’attention, quand on replace une mécanique existante, l’important c’est les entrants et le sortants… Le chemin entre les 2 n’est pas forcement avec les mêmes étapes.

Ici, si c’est le nom de l’entité que tu souhaites garder pour les automatisations… il suffit rependre le même dans le code ESPHome

EDIT :
Par Mac, il y a 5 lignes qui doivent changent…


TemperatureXXX à remplacer par les noms actuels et à mon avis c’est fini etc

OK, du coup si je saisi bien, tu penses que ça ne vaudrait pas la peine de chercher un moyen d’éviter de dupliquer le code ?

Effectivement, il n’y a que les cinq sensors par mac à changer… à part ça tout est identique, mêmes informations à récupérer pour chaque appareil.

Je trouvais que ça rajoutais beaucoup de lignes (maintenabilité du code) et je me demandais si oui ou non ça pouvait changer quelque chose à la tail final du firmware compilé.

EDIT : sinon je pensais mettre le code constant dans une fonction dans un fichier que j’inclurais avec la directive include.

Pour 5 sondes, c’est juste valable pour l’exercice… Parce que la maintenabilité, y en pas :

  • le code ‹ ESP › changera peu (ou risque d’être portable)
  • en dehors de découper la trame BT (qui ne changera jamais) pour la publier, la fonction du template ça fait rien d’autre
  • tu ne t’amuses pas à remplacer tous les jours (changement de MAC).

Oui ça aurait pu marcher… Mais ça veut dire une fonction avec 4 ou 5 paramétres (MAC + les 4 noms à remonter) parce qu’actuellement c’est pas générique…

  • Donc en rendant le code plus complexe (il est ultra simple) tu vas les rendre plus difficile à rependre en main après quelques mois.
  • C’est du code compilé… Plus il y a de lignes, et plus ça prends de la place dans le .bin. Pour des éléments à mémoire limitée c’est moins bien, même si c’est pas trop beaucoup gros mais il faut y penser

Bonjour je n’y connait pas grand chose mais lorsque j’utilise le même code pour les même device j’utilise:
substitutions:
Avec par exemple l’IP
device_ip: 192.168.0.23

device_name: esp X

Au début de mon programme
Puis dans le programme générique a tous mes esp je retrouve
statique_ip: ${device_ip}
name: ${device_name}
Donc tu doit pouvoir même dans tes lambda, mac, etc faire la même chose
Et donc un programme générique avec une introduction substitution pour chaque esp
Stefan

Salut,

Plusieurs ESP c’est pas indispensable du moment que le BT est à porté… 1ESP doit pouvoir suffire à capter les 5 thermométres switchbot

Bonsoir , l’esp sert de passerelle c’est ça,.
J’avais pas tout compris oups

Ça reste intéressant malgré le hors-sujet :wink:

Oui, je veux remplacer mon hub mini.
Actuellement, je passe par des rest sensors qui font appel à l’API Switch-Bot mais j’aimerais pouvoir m’afrenchir du cloud.

Cela dit, il est effectivement bon de garder à l’esprit les substitutions qui peuvent faire gagner du temps, même si elles ne permettent pas de faire ce que je pensais mieux.

C’est ce que j’espère obtenir de mon ESP32, pouvoir récupérer la température et l’hygrométrie de mes six thermomètres Switch-Bot mais vu que j’ai un étage, je pense que je devrais prendre un deuxième ESP32 pour répartir.
En tout cas avec des dongles Bluetooth je n’ai jamais réussi à tout avoir mais ça n’est peut-être pas comparable.

Bref, pour en revenir au sujet de base, j’ai donc usé de copier/coller et de la fonction remplacer dans la sélection au lieu de me torturer le cerveau avec ma solution de base.

1 « J'aime »