
Dans un article précédent j’avais commencé à vous présenter le Cube Magic de Xiaomi :
XIAOMI SMART HOME – PRESENTATION ET INCLUSION DANS DOMOTICZ
Sommaire
Présentation
Nous allons maintenant entrer plus en profondeur dans son exploitation, et comme je commence à être feignant, mais aussi que cela est très visuel, je vous ai fait une vidéo pour vous expliquer les différents mouvements.
J’ai fait l’impasse sur deux mouvements :
- Air Swing
- Alerte
Ils sont assez difficile à reproduire de façon récurrente…
Exemples d’utilisation
Nous allons maintenant voir comment utiliser ce cube dans notre installation, en premier lieu, je vais vous « donner » un script LUA, qui va vous permettre de piloter la luminosité d’une ampoule dimmable, comme le ferait un bouton rotatif.
Il faut savoir que le cube, en plus d’envoyer les informations de sens de rotation, envoie des valeurs.
Ces valeurs positives ou négatives sont des équivalences d’angle et de temps, dans l’API on trouve ceci pour le cube {\ »rotate\ »:\ »25,500\ »} :
- Rotate = Rotation
- 25 = Angle/3.6 soit ici : 90*3.6 = 25 : Nous avons tourné le cube dans le sens horaire de 90°
- 500 = le temps en millisecondes nécessaire pour faire cette rotation
Magique !
Dans Domoticz cela nous donne :

Nous allons nous servir de l’angle pour notre script d’exemple.
Pilotage d’une ampoule à intensité variable
Plutôt que de vous filer le script tout fait, je vais vous l’expliquer par morceau qu’il faudra assembler pour avoir le résultat.
Le principe de fonctionnement :
Si le cube tourne en sens horaire, alors augmente la luminosité de l’ampoule de sa valeur actuelle + la valeur de la rotation avec un maximum à 100% :
Exemple : Ampoule à 95%, le cube fait une rotation de +10 (10*3.6 = 36° dans le sens des aiguilles d’une montre) donc ampoule sera 90 + 10 = 105% sauf que l’on va lui dire que son max sera 100%
Si le cube tourne en contre la montre, alors baisse la luminosité de l’ampoule de sa valeur actuelle – la valeur de la rotation avec un minimum à 0% qui va éteindre l’ampoule :
Exemple : Ampoule à 25%, le cube fait une rotation de -50 (-50*3.6 = -180° dans le sens inverse aux aiguilles d’une montre ) donc ampoule sera 25 + -50 = -25% sauf que l’on va lui dire que son mini sera 0%
On commence par récupérer les différentes valeurs nécessaires à notre calcul
if devicechanged['Xiaomi Cube Rotation'] then --après le commandarray, on se sert d'un changement de valeur du widget texte affichant la rotation comme du provocateur d’événement Bulbvalue = otherdevices_svalues['Appliques']; --On récupère la valeur actuelle de luminosité de l'ampoule à piloter RotValue = otherdevices_svalues['Xiaomi Cube Rotation']; --On récupère la valeur de rotation qui provoque le script RotValue = string.sub(RotValue, 1, string.len(RotValue) - 4) --On récupère l'angle à la mode xiaomi (donc enleve les 4 derniers caractères du widget texte NumericValue = tonumber(RotValue) --Lua est exigent, il faut transformer les caractères récupérés précédemment en valeur numérique
Une fois que nous avons les valeurs, on fait notre calcul :
CalcValue = (Bulbvalue + NumericValue) --CalcValue va être notre valeur finale à appliquer à l'ampoule (valeur actuelle de l ampoule + la valeur de rotation)
On délimite les valeurs maximums et minimums de la valeur à appliquer
if CalcValue > 100 then CalcValue = 100 --valeur maximale à 100% elseif CalcValue < 0 then CalcValue = 0 --aleur minimale à 0% end
Enfin on envoie l’ordre à l’ampoule avec sa nouvelle valeur :
commandArray['Appliques']='Set Level '..CalcValue..'' end
Et voila ! Bien sûr c’est un script device, et il manque les commandArray de début et de fin, mais vous le saviez 😉
Ce qui nous donne en vrai :
Difficile de filmer de l’éclairage dans la pénombre, désolé.
Dans le salon
Après cette seconde vidéo (la maison ne recule devant aucun sacrifice !), je vous livre mon autre script device en LUA qui réagit au Cube placé dans le salon :
-- chargement des modules package.path = package.path..";/home/nico/domoticz/scripts/lua/?.lua" require "modules" commandArray = {} if (devicechanged['Xiaomi Cube']=='tap_twice' and otherdevices['Sous Le Bar']=='Off') then groupOn('versaille') -- c'est un groupe qui gère tous les éclairages du salon - salle à manger ou tout est à 100% elseif (devicechanged['Xiaomi Cube']=='tap_twice' and otherdevices['Sous Le Bar']=='On') then groupOff('versaille') elseif (devicechanged['Xiaomi Cube']=='flip90') then switch('Eclairage TV') -- Allume mon hyperion dans une couleur jaune pleine lune elseif (devicechanged['Xiaomi Cube']=='flip180' and otherdevices['Appliques']=='Off') then groupOn('cube 180') -- original non ? ce groupe gère deux éclairages coté cheminée elseif (devicechanged['Xiaomi Cube']=='flip180' and otherdevices['Appliques']~='Off') then groupOff('cube 180') elseif devicechanged['Xiaomi Cube']=='free_fall' then switch('Meuble TV') -- toggle, switch, inverse l'état de la prise qui alimente mon meuble TV end return commandArray
Attention avec celui-ci ! il est fait pour travailler avec speedup domoticz !
Comme vous le voyez je n’utilise pas tous les ordres, il est dans une pièce à vivre, si je veux que ma moitié s’en serve, il faut que ce soit facile à utiliser, et surtout en complément d’autres boutons déjà en place.
Il reste aussi plein d’autres fonctions à utiliser, comme le temps qui a été mis pour effectuer la rotation, qui peut aussi servir.
Je vous laisse, j’ai reçu en exclu le nouveau cube multi-multi ordre, un vrai casse tète !
Bonjour,
Pour l’exemple, je dirais une rotation horaire de 151,20° en 1 demie-seconde.
Bon je vais continuer à lire le reste de l’article 😉
Cordialement,
Et bien oui ! Bravo tu es le premier a avoir répondu !
tu es equipé en emetteur / recepteur 433 mhz ?
Re-Bonjour,
Que dire si ce n’est que je suis content…
(La fidélité ça paie 😉
pour info, ton site fait désormais partie de ceux que je consulte tous les matins… 😉
Pour répondre à ta question,
Pour ce qui du 433 mhz, oui je suis bien équipé :
J’ai le rfxcom rfxtrx433e sur Domoticz (sur raspberry)
(et même un tellstick net en attente de reconversion 😉
Voilà…
Bien cordialement,
Cyril
Félicitations ! tu as gagné une prise commandé 433Mhz de marque Phenix Idk 230v 1000W compatible avec on Rrxtrxe, je te contact par email tout de suite !
bonjour,
pour le moment seul domoticz Beta supporte la gateway Xiamo ? Car sur la stable je n ai pas de Xiaomi Gateway dans la liste de mes hardware.
merci
effectivement que compatible avec le beta pour le moment
Bonjour,
Je viens de recevoir mon starter kit xiaomi, j’utilise domoticz sur un RPi2.
J’ai essayé de faire un copier/coller d’un code similaire provenant d’ici : https://www.domoticz.com/forum/viewtopic.php?t=11520&start=1700
[code]
commandArray = {}
— Run only if the cube has been rotated clockwise or anti-clockwise
if devicechanged[‘Xiaomi Cube’] == « clock_wise » or devicechanged[‘Xiaomi Cube’] == « anti_clock_wise » then
— Runs only if the light is already On
–if (otherdevices[‘CorridorLight’] == « On » or otherdevices[‘CorridorLight’] == « Set Level ») then
— grab the actual dimming value
actual_dimming = tonumber(otherdevices_svalues[‘CorridorLight’])
print(« the Current YeeeLightSvalue: » .. actual_dimming)
–if the cube has been rotated clockwise and dimming is below 100
if ((otherdevices[‘Xiaomi Cube’] == « clock_wise ») and actual_dimming 100 then
new_dim_value = 100
end
comando = « Set Level « ..new_dim_value
commandArray[‘CorridorLight’]=comando
end
–if the cube has been rotated anti-clockwise and dimming is above 1
if (otherdevices[‘Xiaomi Cube’] == « anti_clock_wise » and actual_dimming > 1) then
— need to find only the integer value
print(« a test print »)
actual_rotation = otherdevices_svalues[‘Xiaomi Cube Text’]
virgola = string.find(actual_rotation, « , »)
numero = string.sub(actual_rotation, 1, virgola-1)
— Add the rotation value (in this case is a negative value), to the actual dimming, and if is smaller than 1, set it to 1
new_dim_value = actual_dimming + tonumber(numero)
print(« the new value to reduce to: » .. new_dim_value)
if new_dim_value <= 1 then
new_dim_value = 0
end
comando = "Set Level "..new_dim_value
commandArray['CorridorLight']=comando
end
–end
end
return commandArray
[/code]
, mais j'ai cet erreur dans le log :
Error: EventSystem: in try: [string "commandArray = {} …"]:14: bad argument #1 to 'find' (string expected, got nil)
J'ai essayé de mixé un peu avec le code de l'article mais j'ai toujours cette erreur.
c'est a ce niveau que ca bloc :
RotValue = otherdevices_svalues['Xiaomi Cube Rotation']; –On récupère la valeur de rotation qui provoque le script
RotValue = string.sub(RotValue, 1, string.len(RotValue) – 4) –On récupère l'angle à la mode xiaomi (donc enleve les 4 derniers caractères du widget texte
NumericValue = tonumber(RotValue)
Probablement une erreur de conversion.
Peux tu m'aider ?
Merci !
Le mieux serait de demander à l’auteur du script.
Le mien fonctionne parfaitement, désoler mais je ne vais pas faire le sav des autres.
Erreur ligne 14 sur ‘find’ à voir avec son auteur
Moi je dis Merci Deennoo, j’ai reçu mon cube et hop test, c’est de la balle Xiaomi 🙂