ESPhome MQTT recevoir Message

Bonjour,

J’ai découvert ESPHOME et fait un premier test avec un ESP32 et Sim800L.

En envoyant un message en MQTT
SIM800L/light/internal_led
j’arrive a allumer la led en passant les paramètres ON et OFF qui allume le GPIO 13

  on_message:
    - topic: SIM800L/light/internal_led
      payload: 'ON'
      then:
        - logger.log: "incoming MQTT : ON"
        - output.turn_on : Internal_LED
    - topic: SIM800L/light/internal_led
      payload: 'OFF'
      then:
        - logger.log: "incoming MQTT : OFF"
        - output.turn_off : Internal_LED

Maintenant, je souhaite passer
SIM800L/sensor/sms_message
et passer le contenu du SMS ) envoyer

J’ai écumé plusieurs forums et je comprends que ca tourne autour le Payload & !Lambda , mais je n’arrive pas à récupérer le contenu du paramètre

  - topic: SIM800L/sensor/sms_message
      then:
        - logger.log: "Send Message"
        - sim800l.send_sms:
            recipient: ?????
            message: ?????

Pourriez-vous m’aider ?

Merci d’avance :wink:

Salut,

l’exemple dans la doc de ESPHome ne te suffit pas?

Merci @AlexHass,

Je me suis largement inspiré sur le gros du code. La plus part du temps les numéros de téléphone sont en dur.
Je souhaiterai pouvoir envoyer les paramètres via Mqtt , avec des variables

A la place de on_message tu peux utiliser on_json_message
Ensuite tu passe tes 2 valeurs en JSON dans le payload MQTT.
Et tu peux y accéder avec la variable ‹ x › qui contiendra les champs de ton paylaod.
Par exemple:

x["recipient"]
ou
x["message"]

Y’a un exemple dans la doc MQTT:

Merci @AlexHass ,

Je comprends que je passe mes paramètres
{« recipient »: +336xxxx,« Message »: toto}

Et je récupère avec
x[« recipient »]
ou
x[« message »]

Un peu comme ca

  • topic: SIM800L/sensor/sms_message
    then:
    - logger.log: « Send Message »
    - sim800l.send_sms:
    recipient: x[« recipient »]
    message: x[« message »]

Ça me semble trop simple en comparaison de la doc en exemple, je teste ça demain.

Oui c’est trop simple :slight_smile:
le `x[« recipient »]’ ne peut pas être utilisé directement dans le YAML, ça doit être dans un Lambda.

Mais sinon je crois que c’est ça. J’avais utilisé du MQTT dans un ancien module, mais je n’ai plus l’exemple.
Ca colle en tous cas avec la doc (si tu utilises le lambda)

1 « J'aime »

Grand merci @AlexHass ,

je suis impressionné, presque du premier coup :wink: merci pour ton éclairage, je galère à écumer le forum et là bingo
puis , je comprends de la doc, qu’il est nécessaire de vérifier que la clef existe, autrement l’ESP crash

Cela donne

   on_json_message:
    - topic: SIM800L/sensor/sms_message
      then:
        - logger.log: "incoming MQTT : Send SMS"
        - sim800l.send_sms:

            # test présence de la clef "destinaitaire"
            recipient: !lambda |-
              const char *destinataire = "+33xxxxx";
              if (x.containsKey("destinataire"))
                 destinataire = x["destinataire"];
              return destinataire;
            
            # test présence de la clef "message"
            message: !lambda |-
              const char *message = "None";
              if (x.containsKey("message"))
                 message = x["message"];
              return message;
                    

Autant
{}
Fait une erreur, mais l’ESP semble survivre
[10:11:42][E][json:063]: Could not allocate memory for JSON document! Requested 0 bytes, free heap: 113792

que
{« destinataire »:«  »,« message »:«  »}

[08:59:24][W][json:079]: Increasing memory allocation.
[08:59:24][W][json:079]: Increasing memory allocation.
[08:59:24][W][json:079]: Increasing memory allocation.

est fatal

le test sur x.containsKey(« message ») ne semble pas fonctionner ?
Il devrait me retourner la valeur par defaut