Automatisation avec bouton Xiaomi

Je suis tout nouveau sur Node-Red alors je ferais des petits posts sur son utilisation pour les grands débutants.

Nous allons voir dans ce post comment utiliser les boutons Xiaomi switch Mijia ou Aqara pour des automatisations.

Pourquoi ? c’est simple non ?

Le problème de ces boutons c’est qu’ils ont plusieurs positions (voir les images ci-dessous) mais surtout que dés que l’on lâche le bouton il envoi une infos nul.

Positions bouton Xiaomi Mijia

J’ai voulu me faire un simple flow pour allumer ou éteindre ma cafetière.
Donc je suis parti sur un events: state avec si = single la prise et On sinon la prise est Off. sauf que le bouton repassant dans un état nul la prise s’active est se désactive aussitôt.

La solution est d’utiliser switch sur la branche false avec comme condition : tous ce qui est différent de null (le null ne doit pas être écrit).

Voici le flow en question.

Bouton Click Autre positions

Voici le code.

[{"id":"437e5ae6.d0bd1c","type":"tab","label":"Journalier","disabled":false,"info":""},{"id":"e0f4ae58.fa4d1","type":"api-call-service","z":"437e5ae6.d0bd1c","name":"Prise Cafetière On","server":"9002a0ed.0d72a","version":1,"debugenabled":false,"service_domain":"switch","service":"turn_on","entityId":"switch.prise_cafetiere_switch","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":730,"y":40,"wires":[[]]},{"id":"589f9be4.45ffb4","type":"api-call-service","z":"437e5ae6.d0bd1c","name":"Prise Cafetière Off","server":"9002a0ed.0d72a","version":1,"debugenabled":false,"service_domain":"switch","service":"turn_off","entityId":"switch.prise_cafetiere_switch","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":730,"y":100,"wires":[[]]},{"id":"226f5fcf.ffa3a8","type":"server-state-changed","z":"437e5ae6.d0bd1c","name":"Bouton Cafetière Simple","server":"9002a0ed.0d72a","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.bouton_cafetiere_click","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"single","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"x":230,"y":40,"wires":[["e0f4ae58.fa4d1"],["a36cc0a1.5f63f8"]]},{"id":"a36cc0a1.5f63f8","type":"switch","z":"437e5ae6.d0bd1c","name":"Autres positions valident","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":470,"y":100,"wires":[["589f9be4.45ffb4"]]},{"id":"9002a0ed.0d72a","type":"server","z":"","name":"Home Assistant","addon":true}]

C’est très simple mais cela permet à tous ceux qui ne sont pas des experts de Node-Red de comprendre quelques petites subtilités.

2 « J'aime »

Bonjour,
Quelle solution utilises tu pour interfacer les boutons xiaomi? Quelle passerelle zigbee?
Perso, j’utilise un CC2531 avec zigbee2mqtt. Ca permet de recevoir les événements des boutons directement dans nodered.
Donc un flot pour faire la même chose ou presque ressemble à:

Comme ça, je gére le click et le double click pour allumer deux lumières différentes avec le même bouton.

GV

Pour essayer de comprendre…

Quel intérêt à utiliser NodeRed (une surcouche) pour une action faisable en natif sous HA ?

J’ai choisi de faire toutes mes « automations » sous nodered. Je trouve ça plus facile à gérer que le yaml. J’ai commencé par le yaml et j’avais pas mal de difficultés pour le debug et les mises au point.
Là, je peux faire des scénario assez compliqués plutôt facilement.
Il n’y a pas réellement d’autre intérêt. C’est juste une affaire de goût.
GV

1 « J'aime »

oui en effet, automatisation HA ou node red reste une affaire de gout mais aussi strategique dans ton plan de continuité avec la séparation des fluxs en fonction de ta config hardware.
Comme beaucoup j’ai basculé tout mes scenarii sur node red par commodité (scene, input boolean, inputselect, automatisations ect…). Herberger HA sur un rpi et node red sur un autre host est interessant !
Node red (ibm) est quand meme super stable et fiable, la logique et son ergonomie permet une prise facile et aisée (à condition d’avoir une certaine motivation au début;) )

Idem que @golfvert je trouve plus simple de gérer mes automatisations via Node Red.
Plus visuel et le débug est utile c’est ce qu’il manque a HA

Je pense basculer mon Node Red sur un autre RPi pour libérer de la mémoire et gérer les déconnexions de HA.

Je ne ne suis pas convaincu par la valeur ajouté de NR qui justifierai de m’y mettre, d’y migrer une partie de mes logiques et d’ajouter de la complexité dans mon architecture
D’autant plus que l’on peut maintenant faire des automations dans l’interface de HA pour les allergiques à YAML.

C’est une affaire de goût.

oui et non car pour celui qui utilise du mqtt par ex on peut se passer de ha pour l’automation donc si ton ha tombe tu pourras toujours allumer ta lumière par ex :wink:
après si c’est node red qui tombe on est d’accord le soucis est inversé ^^

Peux tu partager ton flow ?

Je débute et souhaiterais voir le contenu des nœuds :innocent:

@jybi89, @DcJona ou @golfvert (oui, c’est un peu un @everyone:wink:)

Je commence à regarder Node-red et à la lecture du premier post, je me pose une question :

  • Peux t’on récupérer les évènements de HA dans NR ?
    En clair, est-ce que NR est capable d’avoir TOUS les évènements de HA ?

Merci.

C’est juste une liste non exhaustive

Voilà:

[{"id":"cadd0992.962ed8","type":"switch","z":"fda65aca.413398","name":"Quel ?","property":"topic","propertyType":"msg","rules":[{"t":"cont","v":"bouton/cave","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":350,"y":840,"wires":[["e31b5a12.fefe28"]]},{"id":"e31b5a12.fefe28","type":"switch","z":"fda65aca.413398","name":"Bouton Cave","property":"payload.click","propertyType":"msg","rules":[{"t":"eq","v":"single","vt":"str"},{"t":"eq","v":"double","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":490,"y":840,"wires":[["a7ec43d6.b86cf"],["7874d19c.420a2"]]},{"id":"a7ec43d6.b86cf","type":"api-call-service","z":"fda65aca.413398","name":"Placard","server":"d28c9492.f419c8","version":1,"service_domain":"light","service":"toggle","entityId":"light.yeelightplacard","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":640,"y":800,"wires":[[]]},{"id":"f1b592e6.1e952","type":"json","z":"fda65aca.413398","name":"","property":"payload","action":"","pretty":false,"x":230,"y":840,"wires":[["cadd0992.962ed8"]]},{"id":"d45195bf.b51188","type":"mqtt in","z":"fda65aca.413398","name":"Bouton","topic":"zigbee2mqtt/bouton/#","qos":"2","datatype":"auto","broker":"8cf5f6b5.937088","x":110,"y":840,"wires":[["f1b592e6.1e952"]]},{"id":"7874d19c.420a2","type":"api-call-service","z":"fda65aca.413398","name":"Cave","server":"d28c9492.f419c8","version":1,"service_domain":"switch","service":"toggle","entityId":"switch.cavelightonoff","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":630,"y":860,"wires":[[]]},{"id":"d28c9492.f419c8","type":"server","name":"hassio","legacy":false,"addon":false,"rejectUnauthorizedCerts":false,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true},{"id":"8cf5f6b5.937088","type":"mqtt-broker","name":"","broker":"192.168.0.204","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]
1 « J'aime »

Je pense que oui… Je ne les ai pas tous testé loin de là.
En fait, j’utilise assez peu le déclencheur event, mais plus le trigger ou le poll.
Quel évènement t’intéresse? Pour les états des capteurs pas la peine de passer par là.

En fait, en automatisation YAML, quand on utilise un déclencheur state par exemple, il est pas notion de temps mais d’évènement.

La même chose est possible avec Node-red ?

Pour l’exemple concret, j’ai ce bouton également chez moi, et je gères les appuis par évènements et pas par états.
Le code que tu as mis juste au dessus, utilise ce principe c’est ça ?

Edit:
ma réponse dans ce poste du coup :wink:

Hello !
je ne sais pas si je fait bien de déterrer un sujet aussi vieux mais étant donné que ça parle du bouton Xiaomi…

Je m’explique je dispose de 2 boutons :
1 rond Xiaomi et 1 carré Aqara tout 2 communiquent en Zigbee avec ma Gateway Xiaomi et HA du coup.
Le bouton rond permet normalement d’avoir 3 fonctions :
simple clic
double clic
appuie long

le carré fait 2 fonction :
simple clic
double clic

Simplement je ne trouve pas comment paramétrer ça dans HA.
Pour une fois que je test une automation dans HA directement sans passer par NodeRed je me retrouve un peu perdu.
Votre aide sera la bienvenue !
merci :slight_smile:

Je ne sais via la passerelle xiaomi, va dans outils de devellopement puis filtre sur ton bouton, clique et regarde ce qui s’affiche. Ce devrait etre genre single_click, double_ click et long press.

Ensuite dans automatisation

platform: state
entity_id: sensor.bouton_cafetiere_action
to: single_click

En image

Quel intégration tu utilise pour ta passerelle xiaomi?
moi, j’ai une gateway v3 avec l’intégration xiaomi_gateway3.
comme le propose @McFly tu peu faire une automatisation par action, mais faudra en créer une par action du bouton.
Alors que si tu utilise un blueprint, tu pourra créer une seul automatisation qui comprendras toutes les actions de ton bouton.

un exemple d’un blueprint pour un button sonoff ( le principe reste identique, a modifier suivant le nom des actions)

blueprint:
  name: Sonoff Button SNZB-01 with Xiaomi Gateway 3
  description: '

    ## Sonoff Button SNZB-01 with Xiaomi Gateway 3

    Basic blueprint for executing supported actions with the Sonoff Button SNZB-01 and
    Xiaomi Gateway 3 using default firmware.


    Supports the following actions:

    - Single

    - Double

    - Hold

    ### Requirements:

    - [Xiaomi Gateway 3 Integration][1] v2.0.3

    - Official Firmware for the Gateway

    - Paired Sonoff Button SNZB-01


    [1]: https://github.com/AlexxIT/XiaomiGateway3

    '
  domain: automation
  input:
    trigger_entity:
      name: Sonoff Button
      description: Choose Sonoff Button Action entity
      selector:
        entity:
          domain: sensor
          integration: xiaomi_gateway3
    single:
      name: Single
      description: Actions to one click
      default: []
      selector:
        action: {}
    double:
      name: Double
      description: Actions to double click
      default: []
      selector:
        action: {}
    hold:
      name: Hold
      description: Actions to hold click
      default: []
      selector:
        action: {}
variables:
  action: '{{ trigger.to_state.state }}'
trigger:
- platform: state
  entity_id: !input 'trigger_entity'
condition: []
action:
- choose:
  - conditions:
    - '{{ action == ''single'' }}'
    sequence: !input 'single'
  - conditions:
    - '{{ action == ''double'' }}'
    sequence: !input 'double'
  - conditions:
    - '{{ action == ''hold'' }}'
    sequence: !input 'hold'
  default: []
mode: queued
max_exceeded: silent

voila l’automatisation créer a partir du blueprint:

alias: Sonoff Button SNZB-01 Salle a manger
description: ''
use_blueprint:
  path: warcozes/sonoff_snzb01_for_xiaomi_gateway3.yaml
  input:
    trigger_entity: sensor.0x00124b0025189cb5_action
    single:
      - service: light.toggle
        data: {}
        target:
          entity_id: light.salle_a_manger_tuya_local
    double:
      - service: switch.toggle
        data: {}
        target:
          entity_id: switch.prise_spot_sejour_tuya_local
    hold:
      - service: switch.toggle
        data: {}
        target:
          entity_id: switch.prise_vitrine_tuya_local

Ça va pas simplifier la chose mais j’ai aussi l’évent appui long sur un Xiaomi carré.
Je peux partager le bout de Flow qui fait les tri des 3 états

Avec plaisir pulpy ! Je testerais ensuite appliqué à l’un et l’autre de mes boutons.

Donc bouton de type WXKG11LM

Via zigbee2mqtt, il propose 3 sensors

sous Nodered, on utilise le sensor « action » dans un state node, et un switch pour ventiler les 3 états : single, double, hold de tous les boutons

Export des 2 boutons + switch :

[{"id":"c8093c23.7738","type":"server-state-changed","z":"5db898f0.0aad08","g":"a95e4519.b6db18","name":"Bouton chevet 1","server":"94a12356.a4a14","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.chevet1_suite_action","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":120,"y":1720,"wires":[["4432e2f5.6990ec"]]},{"id":"efb21338.54c6","type":"server-state-changed","z":"5db898f0.0aad08","g":"a95e4519.b6db18","name":"Bouton chevet 2","server":"94a12356.a4a14","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.chevet2_suite_action","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":120,"y":1780,"wires":[["4432e2f5.6990ec"]]},{"id":"4432e2f5.6990ec","type":"switch","z":"5db898f0.0aad08","g":"a95e4519.b6db18","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"single","vt":"str"},{"t":"eq","v":"double","vt":"str"},{"t":"eq","v":"hold","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":290,"y":1780,"wires":[["b0dc46f1.1ee8d8"],["4f655ecd.01ccf"],["e422d1e0b8e15b94"]]},{"id":"94a12356.a4a14","type":"server","name":"Home Assistant","version":2,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open|1","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30}]