Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Exemple de script LUA : boucle entre plusieurs luminosités
#1
Ma femme n'est pas fan du double-clic et encore moins du triple-clic. Pourtant, on a besoin de faire varier l'intensité lumineuse de certains éclairages. J'ai alors apprfondi un peu les scripts LUA, voici ce que j'ai fini par faire.

A. Le contexte

J'ai une lumière appelée "Mur" (rubans de LED encastrés dans le mur).
Elle est contrôlée en DALI et a l'identifiant "output_1".
C'est l'éclairage de la pièce que nous avons appelée "Coin TV".

Je souhaite faire varier sa luminosité de la manière suivante :
éteint => 25% (lecture de livres, etc) => 1% (visionnage de film, etc) => éteint
Par ailleurs, quand la lumière est dans un état non prévu, tout déclenchement doit l'éteindre (par exemple si on l'a exceptionnellement mise à 100%).

Tout cela en n'appuyant à chaque fois qu'une seule fois sur l'interrupteur.
Et tout cela doit être déclenchable à partir de plusieurs interrupteurs... enfin, deux interrupteurs, aux deux portes de la pièce, ainsi que l'interface mobile Android quand on est au fond du canapé.

B. La structure dans Calaos Installer

J'ai créé une "Scenario Variable" dans la pièce "Coin TV", nommée "Luminosité mur" que j'ai configurée comme visible (pour pouvoir agir dessus à partir de l'interface Android).

J'ai créé des règles pour chaque interrupteurs, avec :
- condition : <Nom de l'interrupteur> == true
- action : Luminosité mur / true

J'ai créé la règle suivante, dans la pièce "Coin TV" :
- condition : Luminosité mur == true
- action : script

C. Le script

Enfin, voici le script contenu dans la règle sus-mentionnée ; c'est lui qui gère entièrement la luminosité du point d'éclairage. Il n'y a aucun élément mis en œuvre ailleurs dans Calaos pour cela (pas de variable interne qui stockerait une valeur par exemple).

Code:
print("Lumière mur coin TV")

---------------------------------------------------
-- Config
MINI="1"
MAXI="25"
---------------------------------------------------

actuel = calaos:getOutputValue("output_1")
if actuel == "0" then
  calaos:setOutputValue("output_1", "set "..MAXI)
elseif actuel == MAXI then
  calaos:setOutputValue("output_1", "set "..MINI)
else
  calaos:setOutputValue("output_1", "false")
end

return true

Ce script peut être complété, par exemple si on veut quatre états différents au lieu de trois. L'action par défaut peut également être changée en modifiant les conditions des "if" ; cette action par défaut est bien sûr celle qui est mentionnée dans le bloc "else".




Qu'en pensez-vous ? Avez-vous des alternatives à cette approche ? Comment faites-vous dans vos maisons pour ce genre de besoins ?
Sébastien Maccagnoni-Munch - Maison en autorénovation, on ne garde que les murs
Automate Wago 750-849 (mais pas de KNX), centrale Beaglebone Black, Calaos 2.0, détecteurs de mouvement HC-SR501, éclairage LED, gradation DALI
Sonorisation Squeezebox avec Raspberry Pi (piCorePlayer), Kia Soul EV en charge toutes les nuits...
Reply
#2
Salut,

Ce que tu as besoin c'est une machine a etat.

Voila ce que je ferais:

Declare ca comme IO:
- Un variable interne int (on l'appelle "etat")
- Un timer pour remettre l'etat suivant a 0

Puis les regles suivantes pour definir tes etats.

Etat 0, la lampe est eteinte
Code:
Si etat == 0
Faire Mur = false

Etat ou la lampe est a 25%
Code:
Si etat == 1
Faire Mur = set 25

Etat pour les films 1%
Code:
Si etat == 2
Faire Mur = set 1

On ajoute la regle pour eteindre et retour a l'etat 0
Cette regle est la fin du cycle de bouclage (etat0 -> etat1 -> etat2 ->etat0)
Code:
Si etat == 3
Faire etat = 0

On rajoute encore le dernier etat (4) qui ne fait rien, il sert a basculer au prochain click sur l'etat 0
Code:
Si etat > 4
Faire etat = 0

Ensuite tu ajoute une regle pour dire a la lampe de demarrer le timer qui va passer a l'etat 4 apres un certain temps (genre 2-3s) Ca va permettre de rebasculer a l'etat 0 (eteint) au click suivant. (a chaque fois que la lumiere est allumé le timer est relancé)
Code:
Si Mur != 0
Faire timer = start

Lorsque le timer est ecoulé, on se met a l'etat 4. (ne rien faire)
Code:
Si timer == true
Faire etat = 4

La logique est en place, maintenant il manque plus que les regles pour les inter, bouton etc...

Les regles sont super simple, il faut juste incrémenter la valeur de l'etat pour passer a l'etat suivant.
Code:
Si Inter1 == true
Faire etat = inc 1

Et ca marche pour tout les inter/boutons/scenario:
Code:
Si Scenario == true
Faire etat = inc 1

Ensuite tu peux simplement mettre a un etat particulier en changeant la valeur de la variable etat.

Avec ca tu auras le fonctionement suivant:
Chaque click passe a l'etat suivant.
Etat0(eteint) -> Etat1(25%) -> Etat2(1%) -> Etat0

En reglant le temps du timer tu vas choisir le temps avant que l'etat ne bascule sur l'Etat4. Comme ca au prochain click l'etat repassera a Etat0(eteint).
Et ca marche meme si tu pilotes ta lumieres directement (avec la page web par ex.) car on a mis la regle qui demarre le timer sur le changement d'etat a allumé de la lumiere.
Raoul,
Calaos Core Dev.
Calaos git sur NUC NUC5PPYH | Wago 750-849 | DALI RGB | Sondes NTC sur 750-464 | Sondes 1Wire DS18B20 avec adaptateur USB DS9490R | Nodes MySensors avec gateway USB | Ecran tactile ELO avec adaptateur USB/RS232 | Squeezebox Duet et Radio | Logitech Harmony Ultimate | Ampli Pioneer VSX921
Reply
#3
Ok ça a son charme car côté interrupteurs on ne fait qu'un incrément, mais je trouve ça relativement complexe tout de même...

Si j'ai bien tout compris, ça oblige à créer une variable, un timer et 9 règles pour une simple lumière. Alors que de mon côté j'ai un simple script pour faire l'équivalent...

[ Petit bug dans ton truc, tu as mis "Si etat > 4" au lieu de "Si etat >= 4", rien de bien grave Smile ]

Ensuite, ce qui ne correspond pas au besoin exprimé :

1/ rien de grave, ça simplifie juste le problème

Là tu parles d'un timer 2/3 secondes qui passe à l'état 4, du coup le prochain clic est un "off" quel qu'ait été l'état précédent.

Mais l'idée est de faire une boucle réelle qui ne soit jamais court-circuitée en usage normal. Si on passe 1 heure avec la lumière à 25% puis qu'on clique une fois sur l'interrupteur, ça passe à 1% pour regarder un film.
Dans ce que je décris, ça veut dire que si on veut éteindre la lumière alors qu'elle est à 25%, il faut cliquer deux fois, oui. Je n'ai pas encore réussi à imaginer une approche qui pourrait concilier les deux idées (sauf éventuellement un clic long, ce que j'ai déjà mis en place d'ailleurs).

2/ mais du coup, comportement non attendu

Si on enlève le timer, alors l'intensité d'éclairage est supposée calquée sur l'état de la machine à état. Mais si on change manuellement la luminosité, alors l'état ne change pas : le clic suivant sera alors basé sur l'intensité supposée et non sur l'intensité réelle de la lumière.

Bien sûr, si on garde le timer, alors le "prochain clic" est toujours une extinction (tant qu'il est plus de 2-3 secondes après le précédent), mais le comportement habituel n'est pas celui qui est attendu.


Enfin, ce que j'ai fait n'est-il pas également un automate fini (meilleur nom pour ce qu'on appelle maladroitement "machine à états finis") ? Sauf que l'état, plutôt que de le stocker dans une variable, c'est l'intensité réelle de la lumière...
Sébastien Maccagnoni-Munch - Maison en autorénovation, on ne garde que les murs
Automate Wago 750-849 (mais pas de KNX), centrale Beaglebone Black, Calaos 2.0, détecteurs de mouvement HC-SR501, éclairage LED, gradation DALI
Sonorisation Squeezebox avec Raspberry Pi (piCorePlayer), Kia Soul EV en charge toutes les nuits...
Reply
#4
(09-25-2014, 05:17 PM)tiramiseb Wrote: Ok ça a son charme car côté interrupteurs on ne fait qu'un incrément, mais je trouve ça relativement complexe tout de même...

Si j'ai bien tout compris, ça oblige à créer une variable, un timer et 9 règles pour une simple lumière. Alors que de mon côté j'ai un simple script pour faire l'équivalent...
Sauf que ton script ne gere pas le click pour eteindre. Et le timer est la pour ca. J'utilise ca chez moi et c'est franchement bien plus confortable que de devoir clicker X fois pour eteindre. (J'avais ca avant c'etait super chiant...)

(09-25-2014, 05:17 PM)tiramiseb Wrote: [ Petit bug dans ton truc, tu as mis "Si etat > 4" au lieu de "Si etat >= 4", rien de bien grave Smile ]
Bah non justement y a pas de bug. C'est voulu, l'etat 4 ne fait rien, c'est l'etat suivant qui rebascule a 0 donc > 4.
Raoul,
Calaos Core Dev.
Calaos git sur NUC NUC5PPYH | Wago 750-849 | DALI RGB | Sondes NTC sur 750-464 | Sondes 1Wire DS18B20 avec adaptateur USB DS9490R | Nodes MySensors avec gateway USB | Ecran tactile ELO avec adaptateur USB/RS232 | Squeezebox Duet et Radio | Logitech Harmony Ultimate | Ampli Pioneer VSX921
Reply
#5
raoulh Wrote:J'utilise ca chez moi et c'est franchement bien plus confortable que de devoir clicker X fois pour eteindre.

Je vois ce que tu veux dire.

Après réunion avec l'instance décisionnaire de la maison, on va essayer comme ça pour le moment et on verra si dans notre cas c'est chiant...

raoulh Wrote:Bah non justement y a pas de bug. C'est voulu, l'etat 4 ne fait rien, c'est l'etat suivant qui rebascule a 0 donc > 4.

Ah oui d'accord Smile
Je comprends mieux après avoir connecté mes deux neurones.

Cela dit, je ferais quand même ça avec un script : je n'aime pas l'idée de multiplier les règles Smile
Sébastien Maccagnoni-Munch - Maison en autorénovation, on ne garde que les murs
Automate Wago 750-849 (mais pas de KNX), centrale Beaglebone Black, Calaos 2.0, détecteurs de mouvement HC-SR501, éclairage LED, gradation DALI
Sonorisation Squeezebox avec Raspberry Pi (piCorePlayer), Kia Soul EV en charge toutes les nuits...
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)