Problème de syntaxe yaml pour récupérer une action MQTT définie dans le payload

Bonjour,
Ma question semble simple mais je n’ai trouvé la réponse ni dans la doc ha ni dans les forums anglais.

J’ai des interrupteurs (double poussoirs aqara lumi) qui sont reliés à un zigbee2mqtt déporté.
Mon HA recoit le message MQTT suivant. Mon but est de pouvoir déclencher des actions quand le bouton est pressé.

{
  "action": "single_left",
  "battery": 100,
  "click": "left",
  "device_temperature": 31,
  "linkquality": 255,
  "power_outage_count": 53,
  "voltage": 3005
}

Les parties intéressantes sont « action »: « single_left » et « click »: « left ». Idéalement les 2 expressions devraient se trouver mais déjà avec une seule je serais heureux.

Dans mqtt.yaml:

button:
  - name: "inter varangue"
    command_topic: "zigbee2mqtt/Inter varangue jardin"
    payload_press: '{"action": "single_left","click": "left"}'

Je suppose que mon payload_press est mauvais.
J’ai aussi essayé avec un value_json.action mais ma syntaxe était mauvaise.

Etant donné que HA ne fait que recevoir une info, j’ai commencé par définir un binay sensor, mais à la réflexion, j’ai pensé qu’un button serait plus logique. Il me semble qu’il faut raisonner globalement lorsque deux machines communiquent. Sinon chaque sensor sur une machine deviendrait un switch sur l’autre et on ne s’en sortirait pas. Je me trompe ?

Merci d’avance pour votre aide !!!

EDIT: je viens de lire que la commande « click » est dépréciée. Il ne faut donc se baser que sur le « single_left »
source: Xiaomi WXKG02LM_rev1 control via MQTT | Zigbee2MQTT

Hello

La partie click du payload est dépréciée, voir sur le site z2m

Une fois ton configuration.yaml modifié comme indiqué, dans une automatisation HA tu utilise simplement MQTT en trigger avec single/double left ou single/double right comme charge utile du payload

@+

Merci pour ta réponse, @Krull56 !
En effet, j’ai vu hier que click était déprécié. J’avais édité mon message et effectué la modification sur la config du z2m déporté (en dehors de HA).
Depuis sur MQTT explorer, je vois que le payload a évolué et qu’il n’y a plus le click. Juste le single_left accompagné de toutes les autres infos qui m’intéressent moins.

Je suppose que dans HA il y a deux manières de faire. Soit en définissant les devices sur mqtt.yaml soit directement comme tu le proposes sur les automatisation.
Mais dans les deux cas je suis confronté au même problème de syntaxe. Comment mettre en place un filtre sur la valeur du champ action du payload ?
Pourrais tu stp m’aiguiller ?
merci :slight_smile:

Hello

Un exemple simple à adapter à ta config:

platform: mqtt
topic: zigbee2mqtt/inter_chp/action
payload: 1_single

J’ai bien essayé cela mais ca ne fonctionne pas.

alias: Inter jardin
description: ""
trigger:
  - platform: mqtt
    topic: zigbee2mqtt/Inter_varangue_jardin/action
    payload: single_right
condition: []
action:

Pour rappel mon payload ressemble à cela :

{
  "action": "single_left",
  "battery": 100,
  "device_temperature": 31,
  "linkquality": 255,
  "power_outage_count": 53,
  "voltage": 3005
}

Donc « action »: se trouve dans le payload et pas dans le sujet mqtt, mais je l’ai fait « remonter » dans la partie sujet. Le problème vient il de là ?
Quoi qu’il en soit l’automation n’est jamais déclenchée alors que les messages mqtt arrivent bien.

Bonjour,

Pourquoi passer par MQTT pour tester un switch Zigbee puisque avec z2m, les buttons sont créés en tant qu entités et on retrouve l’action directement.

J’ai une télécommande zigbee et j’ai des automatisations dans ce sens

Je crois comprendre que la commande est sur un autre réseau zigbee (déporté) …
D’où le passage par MQTT

Peut-être crer un sensor qui aurait comme état le payload MQTT. Le json quoi!
Ensuite avec un template, il doit y avoir moyen d’extraire ce que tu veux du json.
Mais, là je ne suis pas capable de te donner le code.

C’est très loin d’être une généralité pour les inter/télécommande type scène ( à pile).
C’est quel modèle ta télécommande ?

@GDX2 : Voici mon inter:

@vdomos : Je confirme que mon z2m est déporté sur un pi zero dédié qui fonctionne très bien.

Mon problème est un problème de syntaxe. J’ai corrigé le titre de la discussion pour plus de clareté.
Comment déclencher une action lorsqu’un message mqtt donné contient dans son payload ‹ « action »: « single_left » › ??

Est il possible de faire une sorte de
value_json.action == single_left ??

@Krull56 : il me semble que ton exemple de code fonctionnerait si « action » faisait partie du sujet mais là il est dans le payload…

Hello,

Sur mes inter, le payload est de la forme

{« action »:« 1_single »,« battery »:null,« last_seen »:« 2023-12-12T09:06:12.672Z »,« linkquality »:167}

et ça fonctionne sans pb avec le trigger que je t’ai indiqué.

Curieux que ca ne fonctionne pas pour moi.
Chez toi Z2M est installé sur la même machine, il n’est pas déporté comme chez moi ? mais normallement ca de devrait faire aucune différence…
Je ne comprends pas…

Tu n’as rien indiqué de particulier dans ta conf yaml concernant ce sujet mqtt ?

Je n’ai rien indiqué manuellement et effectivement, déporté ou pas, ça ne change rien.
Tu es sûr du topic ? verifie avec mqtt explorer

Oui j’ai bien vérifié avec mqtt explorer. J’ai supprimé les majuscules et les espaces, puis re vérifié. Tout semble ok

La je sèche :thinking:
As-tu retiré tes « personnalisations » de ton mqtt.yaml, désappairé ton inter, réappairé de nouveau ?

Un bon point, je viens de supprimer mes tests réalisés dans mqtt.yaml
Mais hélas, rien de changé, l’automation n’est toujours pas déclenchée.

Les messages arrivent bien sur mqtt explorer…
Vraiment je ne vois pas…

Voici le message MQTT dans mqtt explorer :

Topic: zigbee2mqtt/inter_varangue_jardin
{
  "action": "single_left",
  "battery": 100,
  "device_temperature": 31,
  "linkquality": 255,
  "power_outage_count": 53,
  "voltage": 3015
}

Et voici mon automation :

alias: Inter varangue
description: ""
trigger:
  - platform: mqtt
    topic: zigbee2mqtt/inter_varangue_jardin/action
    payload: single_left
condition: []
action:
  - if:
      - condition: state
        entity_id: light.ampoule_varangue2
        state: "on"
    then:
      - type: turn_off
        device_id: bb9605467705ef94eb7c92d32176da5f
        entity_id: 89edaf9da864f2095dc8f17abde5f2f6
        domain: light
      - type: turn_off
        device_id: 74ca56aa987977227c5d7196a84760be
        entity_id: af127a96636c9067f3a3ff790cd54db0
        domain: light
    else:
      - type: turn_on
        device_id: bb9605467705ef94eb7c92d32176da5f
        entity_id: 89edaf9da864f2095dc8f17abde5f2f6
        domain: light
      - type: turn_on
        device_id: 74ca56aa987977227c5d7196a84760be
        entity_id: af127a96636c9067f3a3ff790cd54db0
        domain: light
mode: single

Cela me semble conforme à ton code mais mon automation n’est jamais déclenchée.

Ton inter est bien présent dans l’intégration mqtt de HA ? ( je ne parle pas du module complémentaire puisque ton mqtt est externe)

Non, dans mon intégration mqtt (core-mosquitto) je n’ai pas d’entrées correspondant aux devices.
J’utilise beaucoup de devices mqtt que j’ai tous définis dans mon mqtt.yaml (un nabaztag pi, un ovms pour la voiture électrique, et plusieurs ESP8266 sans esphome). Tous ces appareils communiquent bien en mqtt.
Ils sont définis en yaml mais j’aurais aussi bien pu le faire dans des automations, a priori ca revient au meme.
Chez toi ils sont présents dans l’interface web de ton intégration mqtt ??
Ca doit plutot être dans z2m, non ?

Sinon l’intégration mqtt permet d’écouter des sujets. Lorsque je met mon sujet zigbee2mqtt/Inter_varangue_jardin, ha voit bien le payload exactement comme sur mqtt explorer. En revanche si je met zigbee2mqtt/Inter_varangue_jardin/action il ne voit plus rien.

C’est différent chez toi ?

Bonsoir,
J’ai aussi zigbee2mqtt sur un rpi distant et pas besoin de jouer avec les topics mqtt, il y a un paramètre pour que zigbee2mqtt utilise le mqtt discovery de ha et du coup les entités sont créés automatiquement dans ha . Par exemple une entité « action » pour l’état des boutons d’une télécommande