Node-RED - Utilisation du Cube Aqara (toutes les fonctions) sans passerelle Xiaomi avec

Utilisation du Cube Aqara sans passerelle Xiaomi

Pré requis :
Un cube
Clef Deconz Conbee II ou autre clef prenant en charge le protocole zigbee
installer Node Red
Du temps pour lire ce tuto ^^

  1. Préparation :
    Après que vous l’ayez appareillé dans l’interface Phoscon de votre clef Deconz Conbee II (comme un switch classique) :

image

Vous le retrouvez ensuite dans vos intégrations :
image

Renommez-le avec un nom sympa :
image

Identification des actions
Il s’agit d’un cube, d’un dès, nous allons donc identifier chacun des mouvements de celui-ci, pour ce faire, nous allons d’abord utiliser un schéma du cube et écouter chaque évènement.
image

Je nomme les faces de cette manière (les amateurs de rubiks cube ne seront pas dépaysés !)

U : Up (la face du haut)
B : Back (la face arriere)
F : Front (la face avant, devant vous)
L : Left (celle de gauche)
R : Right (quelle surprise, celle de droite)
D : Down ( celle du bas, face à la table)

Il faut maintenant connaitre les différents mouvements possibles :
Rotate : quand vous basculez le cube d’une face à l’autre (de U vers L par exemple)
Spin : quand le cube reste sur une face et pivote dans le sens horaire ou anti horaire
Shake : le secouer !
Drop : lorsqu’il tombe
Double Tap : le taper 2 fois dans une main ou sur une tabe
Push : (ou glisser) lorsque que vous lui donnez une pichenette et qu’il glisse sur quelques centimètres.

Bien ! chaque mouvement associera donc un point de départ , un point d’arrivée et un mouvement , ok ?
par exemple mon cube est sur la table et je bascule à droite : donc de U vers L en Rotate (<- rappelez-vous de cette exemple on revenir dessus très vite)

Allez dans ‘Outils de Développement’ puis sur l’onglet ‘Evènements’ et dans le champs ‘Evenement auquel s’abonner’ saisir ‘deconz_event’ puis cliquer sur ‘COMMENCE A ECOUTER’

image

Méticuleusement, tourner votre cube de U à L :

Voici le résultat :

"event_type": "deconz_event",
"data": {
"id": "mi_magic_cube",
"unique_id": "00:15:8d:00:02:7d:6c:9b",
"event": 4001

Puis de L à U :
« event_type »: « deconz_event »,
« data »: {
« id »: « mi_magic_cube »,
« unique_id »: « 00:15:8d:00:02:7d:6c:9b »,
« event »: 1004

Pour faire simple le U , commencera toujours par 100x le x prendra le chiffre de la dernière position, ici 4.

image

Donc si on a bien compris, si on passe de U à R : on obtiendra 3001 (3 étant R et 1 étant U)
à retenir : le premier chiffre prend le chiffre correspondant à sa nouvelle position et le dernier à sa précédente position.

Si je passe R à U, donc je reviens à l’état initial, alors U aura comme valeur 1003 !

Et là vous vous dite, ‘la vache ! y a plein de possibilités !’

En effet ! pour U en voici quelques une que vous pourrez transposer pour els autre face :

UF 2001,
FU 1002
UR 3001,
RU 1003
UL 4001,
LU 1004,
UB 5001,
BU 1005
UD 6001,
DU 1006 ……………………

Mais aussi de n’importe quelle face vers une autre, n’oubliez pas, le premier chiffre représente l’etat actuel le dernier représente la valeur précédente.

image

Ici l’enchainement donnera : (UL) 4001 → (LD) 6004 → (DR) 3006 → (RU) 1003 !

Pour finir !
- le shake est formaté de cette manière : 7007

  • le double tap : x00x
  • le push : x000

Toutes ces données, vous les trouvez dans Evènements ! allez-y faire vos tests !

Vous êtes toujours là ? ok, maintenant que nous avons fait connaissance avec le cube et ce qu’il sait faire, continuons !

  1. Intégration et automatisation dans Node Red

Pour comprendre Node Red, SNoof85 fait de supers tuto.

Alors, dans un Flow, nous allons déposer :

image

Un nœud Events all , un switch, une fonction, un switch, et quelques calle services.

De gauche à droite, le event all servira à ecouter le service DECONZ_EVENT (comme tout à l’heure) Le switch est un switch virtuel, il permettra d’identifier le le cube au cas ou vous disposeriez d’autre interrupteur en zigbee, la fonction permet d’indiquer toutes les fonction de notre cube, le deuxieme switch sera l’image de notre cube et de ses fonctions (vous verrez c’est classe !) et le call services permettront d’executer un service (genre light turn on) une fois relié à une fonction du switch.

En clair ! voila :

image

3.1 Paramétrage des nœuds :

Double clic sur le nœud event all :

image

Ici, on lui demande d’écouter ce qu’il se passe sur le service Deconz (comme nous avons fait tout à l’heure)

Pour le premier switch :

image

Ici on filtre les actions sur un switch en particulier. Vous pourrez rajouter d’autre switch par la suite (interrupteur, bouton poussoir…)

Pour le nœud Fonction :

Ne vous posez pas de question, copier/coller le code :

image

const code = msg.payload.event.event;
let action;
const codes = {
"side1": [1002, 1003, 1004, 1005, 1006],
"side2": [2001, 2003, 3004, 4005, 5006],
"side3": [3001, 3002, 3004, 3005, 3006],
"side4": [4001, 4002, 4003, 4005, 4006],
"side5": [5001, 5002, 5003, 5004, 5006],
"side6": [6001, 6002, 6003, 6004, 6005],
"push": [1000, 2000, 3000, 4000, 5000, 6000],
"doubletap": [1001, 2002, 3003, 4004, 5005, 6006],
"shake": [7007],
"drop": [7008],
"wake": [7000]
};

for (let a in codes) {
if(codes[a].includes(code)) {
action = a;
break;
}
}

if (!action) {
const strCode = String(code);
if (strCode.substr(1,2) !== "00" || strCode.length !== 4) {
action = code > 0 ? "rotatecw" : "rotateccw";
}
}

msg.payload = action || "";

return msg;

/!\ pour info, il s’agit ci-dessus de l’ensemble des positions et surtout du spin (rotatecw et rotate ccw) correspondant au faite de tourner le cube sur lui-même dans le sens horaire et anti horaire. /!\

Pour le deuxième switch :

Il va falloir rentrer les libellés des codes correspondant aux positions :

image

Vous les avez indiqués dans la fonction précédente ici en vert :

image

C’est long, mais pas compliqué ! (Alors oui on peut faire des imports / exports, etre plus rapide et tout et tout mais ce n’est le sujet du howto :wink: )

Votre switch prend une autre allure:

image

Pour le nœud Service call :

Nous allons tester 4 services :

Lancer une scene
Allumer Eteindre une lumiere
Baisser le son de votre tv
Augmenter le son de votre tv
( vous pourrez également faire mute et unmute sur la tv ou votre GH, plein d’autres possibilités….)

Double cliquer sur le premier nœud Service call pour paramétrer le lancement de la scène :

image

Double cliquez sur le second nœud pour allumer éteindre une lampe :

image

Jusqu’ici c’est quand même super intuitif !

Double cliquez sur le troisième et quatrième nœud pour baisser / monter le volume de votre media :

image

image

Voila !!

Plus qu’à relier le tout :

image

Servez-vous des infos bulles pour connaitre de quelles fonctions il s’agit sur votre switch, comme sur le screen précédent.

Cliquez sur Deploy et tester tout ca !

Pour ceux qui ne se sont pas encre pendu, ou endormi, vous devriez avoir saisie toutes les possibilités du cubes et de node red ! c’est juste énorme J

Référence et remerciements :

Merci à SNoof85 !

un peu de lecture : https://la-cascade.io/json-pour-les-debutants/

Le tuto de Snoof : debuter-avec-nodered ici sur le forum https://forum.partificiels.com

Je ne suis pas infaillible, si une erreur s’est glissée, je m’en excuse d’avance, n’hésitez pas à m’en faire part ! et surtout vous aussi, faites-nous profiter de vos tutos, du plus simple au plus complexe !

Jybi89

1 « J'aime »

Mais c’est génial ce tuto !
le cube me fait de l’oeil depuis un moment, au quotidien c’est utilisable et utile ou juste un gadget?

Merci :wink:

oui j’en ai deux à la maison, faut etre créatif et trouver des idées.
le premier sur la table basse me permet de baisser/ augmenter le son en le tournant, de declencher la scene HA cinéma (lumiere tamisé avec transition lente par exemple) et GH qui nous souhaite un bon film en TTS…. ect….
un deuxieme dans la cuisine pour regler le volume de GH, pour declencher des scènes (petit dej, repas, ….)
ca fait gadget, donc totalement indispensable :wink:

j’avais juste peur de me perdre… genre euh c’est ou encore rotation ou tourner pour le son … y a tellement d’action possible

pour le son, c’est rotation sens horaire ou antihoraire :slight_smile:

bien vu bon je pense que je vais me laisser tenter

Excellent ce tuto !

Si je l’avais eu sous la main, j’aurais moins galéré.
Au final (et parce que je suis une tanche pour les fonctions), j’ai fait un peu différemment :

Je choppe l’event de départ dans un autre flow (c’est le node de lien qui est en entrée sur le screen).

Derrière j’ai cherché à identifier le geste effectué.
J’utilise un switch pour chopper le code du geste (payload.event.gesture) :

Il y en a 9 :
0 => Wake (renvoyé à l’éveil du cube)
1 => Shake (on le secoue)
2 => Fall (on le laisse tomber)
3 => Flip 90° (retournement de 90°)
4 => Flip 180° (retournement de… 180° :stuck_out_tongue:)
5 => Slide (on fait glisser le cube sur sa face. « Push » dans le tuto)
6 => Dble tap (on le frappe deux fois)
7 => Rotate Clockwise (rotation dans le sens horaire)
8 => Rotate Counterclockwise (rotation dans le sens anti-horaire)

Les événements « wake », « shake » et « fall » sont propre au cube lui même, pas a sa face.
Les « flip 90° », "flip 180°, « slide » et « dbletap » sont des events qui renvoient la face concernée selon l’excellent récap de jybi89.

Par contre la rotation horizontale ne renvoie pas cette info.

Donc je me suis fendu d’une variable qui va enregistrer la dernière face active lorsqu’elle est dispo et la réutiliser lorsque ce n’est pas le cas pour formater un message qui contient toujours la face active « side » (et celle d’avant « from » que je n’utilise pas en fait mais je l’ai gardée pour le fun)

Pour les events de 3 à 6, on définit la face active dans une variable et on formate le message avec :


« payload.side » correspond à la face active
« payload.from » à la face de départ pour les flip
« flow.lastside » est la variable de flow qui stocke la dernière face active

Le code pour payload.side :

$number(
   $substring(
       $string(msg.payload.event.event),
       0,
       1

   )
)

Même chose avec le dernier caractère pour la face d’origine (inutile mais bon…)

Pour les actions 7 et 8 (donc la rotation à plat), on récupère la variable et on la fout dans le message au même endroit que pour les autres ‹ side › :

Derrière, on sait que dans payload.side on aura soit la face active pour les events qui la contienne, soit la dernière face active pour ceux qui ne la contiennent pas.

Suffit alors de faire un switch selon la face :

Puis de choisir les actions à effectuer en fonction de chaque geste :

Avantages :

  • le node ‹ side action › c’est du copier coller. Ils fonctionnent tous exactement de la même manière.
  • les actions possibles sont regroupées par face dans chaque ‹ side action ›. Je trouve ça plus lisible.
  • On a une rotation par face : Par exemple un de mes cubes contrôle différentes ampoules/groupes d’ampoules + le son dans la pièce. Il me suffit donc de le mettre sur la bonne face pour que la rotation fasse varier la lumière concernée (ou le son, c’est la même chose)

Inconvénient :
On perd la variable de flow en cas de redémarrage de hass/NodeRed. Mais elle se réinitialise rien qu’en glissant le cube ou en le culbutant donc c’est un problème assez mineur à l’usage.

1 « J'aime »

Un super complément/autre façon de faire, c est l avantage de node red :slight_smile: merci pour ce partage !

Comment vous savez que le cube est sur la face 1? Vous avez gravé d’une manière ou d’une autre? Je gère le « flip90 » mais, sans différencier la source et la destination. Ca fait donc moins de choix :slight_smile:

la face 1 (donc UP) est visible , y a marqué aqara dessus ^^
si tu gères le flip (c’est à dire la bascule d’un coté à l’autre d’un coté à l’autre non?)

Pour faire simple le U , commencera toujours par 100x le x prendra le chiffre de la dernière position, ici 4.

image

Donc si on a bien compris, si on passe de U à R : on obtiendra 3001 (3 étant R et 1 étant U)
à retenir : le premier chiffre prend le chiffre correspondant à sa nouvelle position et le dernier à sa précédente position.

Si je passe R à U, donc je reviens à l’état initial, alors U aura comme valeur 1003 !

Et là vous vous dite, ‘la vache ! y a plein de possibilités !’

En effet ! pour U en voici quelques une que vous pourrez transposer pour els autre face :

UF 2001,
FU 1002
UR 3001,
RU 1003
UL 4001,
LU 1004,
UB 5001,
BU 1005
UD 6001,
DU 1006 ……………………

Mais aussi de n’importe quelle face vers une autre, n’oubliez pas, le premier chiffre représente l’etat actuel le dernier représente la valeur précédente.

image

Ici l’enchainement donnera : (UL) 4001 → (LD) 6004 → (DR) 3006 → (RU) 1003 !

Ici tout est différencié, puisque d’une position à l’autre, sans revenir au point de depart tu peutx attribuer une action, mais ca va etre vite une grosse galere je pense lol je ne sais pas si j’ai bien saisie ta question en faite :wink:

Ou, je n’ai pas compris l’explication :slight_smile:
Je n’utilise pas conbee mais zigbee2mqtt. Le principe est néanmoins le même je pense.
Comme sur un dé normal, chaque face du dé représente un nombre de 1 à 6.
Flip90, si 1 est au dessus, tu peux soit tourner vers 2, 3, 4 ou 5 (puisque 6 en en dessous). Conbee t’envoie le message comme quoi le cube était sur 1 et va sur 2. OK.
Mais toi, humain, comment sait tu que tu tournes vers 2 et pas 3, 4 ou 5? Parce que si tu ne sais pas faire la différence, et que tu ne « vois » que « j’ai tourné à 90° », peu importe la face d’arrivée. C’est plus clair comme question :thinking: ?

ah ok,
en effet z2mqtt doit pas changer grand chose.
Alors si, tu peux passer de 1 à 6 ( soit de U à D comme sur mon schema) ca te donnera le signal 6001

Mais moi, humain, bah je n’ai pas de méthode particulière, je n’ai pas particulièrement besoin de savoir le numéro des faces, je sais par exemple que quand je le bascule à droite je declenche l’ambiance cinéma, si je le bascule à gauche ambiance repas ect… ca se fait de façon instinctive, j’essai de voir la finalité de l’utilisation du cube et ensuite seulement j’y associe l’action : par exemple il me semblait ‹ normal › de le basculer à droite pour l’ambiance ciné alors j’ai associé ce mouvement à la scene.
remarque pour simplifier les choses, tous ce qui vient de F D R L ou B vers U il ne se passe rien, comme ca quand je bascule de U vers une autre face cela execute la scene ou l’automation et je peux remettre le dés la face U vers le haut sans que cela enclenche quelque chose :wink:

OK. Donc, en fait ça te fait comme moi, tu as 4 flip90 utilisables (vers la droite, vers la gauche, vers l’avant, vers l’arrière) et pas toute la palanquée en fonction de quelle face est en haut…

bah en faite ca t’en fait encore beaucoup plus, car quand tu passes de U vers L (4001) tu peux ensuite allez de L vers F (2004) sans repasser par U (donc deux flip90 deux actions differentes deux automatisations ) ce qui est différent que de passer de U à F (2001) qui est encore une autre action. et ca fait 5x6 soit 30 flips utilisables. et tu rajoutes les possibilités du shake en fonction de la face, le drop le push… ca devient vite usine à gaz lol

Trois écoles j’ai l’impression.

Tu peux bosser avec les flips simples (sans tenir compte de la face) :

  • je flip le cube a 90° = une action
  • je flip le cube à 180° = une autre action
  • je dbltap = une action

Tu peux bosser avec les flips par face (tu tiens compte de la face de départ et d’arrivée) :

  • je passe de la face 1 à la face 3 = une action
  • je passe de la face 3 à la face 6 = une autre action
  • je passe de la face 1 à la face 6 = encore une autre

Tu peux bosser avec uniquement la face active (donc celle du dessus)

  • je dbletap avec la face 1 au dessus = une action
  • je slide avec la face 2 au dessus = une autre action
  • je fais une rotation CW avec la face 1 au dessus = une action

Perso j’ai opté pour la troisième. Donc j’ai identifié les faces physiquement : J’ai mis un adhésif type « tableau noir » sur chacune et écrit dessus à quoi chaque face faisait référence, j0r « cuisine », « spot SàM », « son », etc…

Chaque face correspond à un luminaire/fonction donc je n’ai qu’à appliquer exactement la même logique à tout quand je les utilise :

  • Dbltap = toggle
  • rotation CW = plus (d’intensité lumineuse, de son…)
  • rotation CCW = moins (pareil qu’au dessus)
    (je pense en lisant ce topic que je vais également remonter le « shake » sur chaque face pour faire un « off »)

Ce sont au final les seules interactions que j’utilise dans les faits.
En même temps, ça en fait déjà 18 par cube :joy:.

Bien évidement, tu peux combiner les 3 écoles… Mais vas-y pour te rappeler que si tu flip de 1 à 6 tu déclenche telle action, que de 1 à 3 c’est une autre mais que si tu dbltap sur la face 3 APRES le flip tu n’as pas la même action que si c’était un flip de la 5 à la 3…

Au final, tu peux remonter 8 actions par face + tous les passages d’une face à une autre qui peuvent agir pour les modifier. Je vous laisse calculer les possibilités…

Bottom line : A chacun selon ses usages, et ce n’est pas parce que les possibilités existent qu’on est obligés de les utiliser. :wink:

2 « J'aime »