Aller au contenu
pepite

Aide Code Lua Rgb

Recommended Posts

Bonjour,

 

La question du jour ;-) bon le code c'est pas trop trop mon truc. Pour aider notre king de l'electricite nommé @Did, je suis parti d'un code posté par @steven et j'ai essayé de l'adapter au mieux pour les besoins de @Did.

 

Pourriez-vous corriger et me dire s'il y a des boulettes ? et si vous comprenez le besoin ?

Et du code de @steven je ne comprends pas bien le if (g) ..;si vous avez envie de m'expliquer lol

 

Code de @steven

local var_global = "RGB_PREVIOUS"
local id = 27
 
if (fibaro:getGlobalValue(var_global) == "" or fibaro:getGlobalValue(var_global) == nil) then
   -- On stock l'état du ruban
   -- et on lance l'alarme
   local prog = fibaro:getValue(id, "currentProgram")
   local color = fibaro:getValue(id, "color")
   if (prog == 0) then
      -- on stocke la couleur du ruban car pas de programme en cours
      fibaro:setGlobal(var_global, color)
   else
      -- on stocke le programme en cours
      fibaro:setGlobal(var_global, prog)
   end
   fibaro:call(id, "setColor", "0", "0", "255", "100" )
else
   -- on récupère les valeurs précédentes et on les remets sur le ruban
   local r,g,b,w = string.match(fibaro:getGlobalValue(var_global), "(%d),(%d),(%d),(%d)")
   if (g) then
      fibaro:call(id, "setColor", r, g, b, w)
   else
      fibaro:call(id, "startProgram", r)
   end
   -- On désactive la variable
   fibaro:setGlobal(var_global, "")
end

Le code modifié

local var_global = {"RGB_Previous1", "RGB_Previous2"}
local idRGB = {239, 545}
local prog_rgb = 546
    
local CeL = fibaro:getValue(208,  'value'  )
local currentdate = os.date("%d/%m/%Y %H:%M:%S")

function GetValueRGB(id)
    local prog = tonumber(fibaro:getValue(id, "currentProgram"))
    local color = fibaro:getValue(id, "color")
        for i = 1,#var_global do
            if (prog == 0) then
          -- on stocke la couleur du ruban car pas de programme en cours
          -- si éteint : color = 0,0,0,0
                 fibaro:setGlobal(var_global[i], color)
            else
                -- on stocke le programme en cours
                fibaro:setGlobal(var_global[i], prog)
            end
        end
end    

function PutValueRGB(id)
    for i = 1,#var_global do
        local r,g,b,w = string.match(fibaro:getGlobalValue(var_global[i]), "(%d),(%d),(%d),(%d)")
        if (g) then
          fibaro:call(id, "setColor", r, g, b, w)
       else
          fibaro:call(id, "startProgram", r)
       end
    end
end
    
for i = 1, #idRGB do
fibaro:debug("Démarrage du script : " ..currentdate)
    if ((fibaro:getGlobalValue(var_global1) == "" or fibaro:getGlobalValue(var_global1) == nil) and (CeL == '1')) then
        GetValueRGB(idRGB[i])
        fibaro:call(idRGB[i], "startProgram", prog_rgb)
        fibaro:sleep(15*1000)
        PutValueRGB(idRGB[i])
        for i = 1,#var_global do
            fibaro:setGlobal(var_global[i], "")
        end
        fibaro:call(idRGB[i], "turnOff")
    end
end

Partager ce message


Lien à poster
Partager sur d’autres sites

et si tu nous disais ce que tu voulais faire avec ce code, histoire qu'il ne faille pas faire du rétroengenering.

On est faînéant de ce coté ci de la frontière

Partager ce message


Lien à poster
Partager sur d’autres sites

A mon avis, le if (g) permet de tester si le string.match(getGlobalValue...) a retourné une valeur de type RGB, ou une uniquement valeur de programme courant.... lequel programme serait alors uniquement stocké dans la variable r

 

Pas sur d'être clair, mais on voit là  une optimisation digne d'un développeur de talent tel que Steven :)

Partager ce message


Lien à poster
Partager sur d’autres sites

@did avait qu'a demander lui même Na lol

 

La je suis perdu qui fait quoi et qui veut allé ou car la c'est pas simple de résoudre un probléme sans données. Comme @jojo le courage c'est pas le pays ou on habite mais c'est l'age LOL

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

hihihi messieurs, j'ai fait expres de ne mettre que le code sans explication pour savoir si ce que j'avais fait n'etait pas trop nimp.. à  priori ouii ca l'est.

 

Je donne le besoin de @Did :

 

- 2 RGB ( 239, 245) sur le coup qui peuvent etre éteints, ou sur une couleur, ou sur un programme.

- au passage devant les cellules (208), changement du programme en cours ou debut programme des 2 RGB en 546

- après 15 secs, remise des valeurs précedent le passage devant les cellules (si RGB allumé avec couleur ou prog ou extinction)

 

J'ai compris à  partir du code de Steven :

- recuperation des valeurs "prog" et "color" du RGB mise dans une Variable

- demarrage du programme souhaite

-string.match que je ne maitrise pas du tout pour recup les valeurs rgbw

- on remet le RGB dans l'etat précedent

- on reinitialise la variable.

 

J'ai rajouté une 2eme variable ne sachant pas comment retravaillé si je mets tout dans une seule varibale.

 

@mrpinfo : le 1er code est de maitre @steven, le 2ème, celui que j'ai fait pour essayer de répondre au besoin de @Did ;-)

 

A vos commentaires !!! pas d'hesitation,ca me fera encore apprendre

Partager ce message


Lien à poster
Partager sur d’autres sites

@Pepite,

Ce n'était pas urgent, je ne peux pas tester avant dimanche.

Partager ce message


Lien à poster
Partager sur d’autres sites

@did et @pepite je vais regardé cela dés je j'ai une flamme de motivation :D Car en ce moment je suis dans le shell linux comme mon neurone est limite en puissance il n'est pas multi taches :D

Je note cela dans un coin comme dirai @jojo

Je pense que dimanche je pourrai voir ce que je peux faire

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@Did et @mprinfo,

 

Ca me plait aussi @did, faut que je progresse en lua alors je bosse dessus, j'y reflechis encore,

J'ai mis un code modifié pour avoir les avis et commentaires des experts sur mon code hihihihi

Partager ce message


Lien à poster
Partager sur d’autres sites

 @pepite,

Sur la version modifiée (un peu plus haut), j'ai une c-----e dans le debug,

[DEBUG] 16:22:08: Démarrage du script : 15/02/2016 16:22:08
[DEBUG] 16:22:08: line 130: Assertion failed: Expected string

bizarre le code ne fait que 52 lignes. C'est une nouvelle scène créée aujourd'hui. :20:

 

Edit: L'idée de réunir les Id des FGRGB sous une variable locale serait top pour pouvoir ajouter simplement de nouveaux FGRGB.

Partager ce message


Lien à poster
Partager sur d’autres sites

sympa le debug ligne 130 pour un code de 50 lignes lol

 

ah oui bonne idee, je vais essayer..avec quoi je sais pas encore amis ca va venir lol

Partager ce message


Lien à poster
Partager sur d’autres sites

Haut les mains variable !

 

Bonjour,

j’espère ne pas trop m'incruster sur ce sujet... 

 

Pourriez vous m'indiquer l'élément dans ce code qui permet de stocker la valeur d'une variable?

je précise...

- Si on dit variable1 = couleur rgb, puis que l'on change la couleur rgb, la variable1 change... OK

- si je fais variable2 = variable1 à  cet instant T, puis HAUT LES MAINS variable2 puis je change la couleur rgb, je suis capable de remettre la couleur rgb de variable2 n'importe quand...ok

 

Mais alors qui tient le flingue dans ce script? Je suis dans le jus...  merci.

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai relu 3 fois ton post, et je ne comprends pas la question, ni ce que tu veux faire.

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci, jojo,

 

Je vais essayer de mieux m'expliquer, mais je vais surtout reprendre l'API du début, où je trouverais sans doute des réponses et éviter de faire perdre du temps aux membres...

 

Voila,

 

Dans le code de @Pepite & celui de @steven, il s'agit de stocker une valeur "color" ou "prog" pour la ressortir plus tard, si j'ai bien compris.

ma question est : comment stocker une valeur (ampoule allumée (1) ou eteinte (0) par exemple) à  un instant T1, pour pouvoir modifier cette valeur à  volonté T2=0 T3=0 T4=1 etc...et être capable de rappeler la valeur de l'instant T1 quand bon me chante?

 

application fictive : detecteur de porte = ouvert -- alors j'enregistre la valeur de l'ampoule X --  je la fais clignoter pendant 2mn -- et je rappel son état avant clignotement pour un retour "a la normal".

Je ne comprend pas dans ces codes ce qui permet de le faire. 

 

bon weekend!

Partager ce message


Lien à poster
Partager sur d’autres sites

ok, compris <= c'est la bonne nouvelle

la n"mauvaise" nouvelle : je n'ai pas de RGBW et aucune expérience avec.Donc je n'ai pas analysé les codes. Mais, l'idée serait de stocker les informations que tu voudrais récupérer dans une variable (si plusieurs paramètre, en y stockant un json), puis de les relire quand tu veux pour les réinjecter

Partager ce message


Lien à poster
Partager sur d’autres sites

 @pepite,

Je suis tombé sur ce script de @Domodial, je ne sais pas si ça peut aider pour le script proposé en début de post.

http://www.domotique-fibaro.fr/index.php/topic/5189-associer-synchroniser-2-modules-fibaro-rgbw/?p=103954

Il faut ajouter "405 currentProgramID" dans l'entête.

Et celui-ci:

http://www.fibarouk.co.uk/synchronising-rgbw-modules/

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut @Did,

 

alors la ke ne risquais pas d'écrire ce type de code, je ne maitrise pas du tout du tout les split et autre, tu pourrais me parler chinois ce serait la même chose ;-)

Super intéressant ce code, je regarde, merci beaucoup @Did de faire bosser mon cerveau lol

 

@domodial, la classe ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

@Did et avis aux experts pour commenter

 

Je suis parti de ce que tu m'as linké. ;-)

 

La scène a pour trigger ta cellule 208. 

-- Recup des couleurs, la fonction split de @domodial

-- Si programme en cours, recup dans une variable Globale, 1 pour chaque RGB

-- Au changement de 208, PROG 546 sur les 2 RGBs

-- Tempo de 15 secs

-- Remise des valeurs précédentes sur les RGB

-- Réinitialisation des Variables.

 

Je garantis rien, mais mon cerveau a bien chauffé ;-)

A tester ;-)

--[[
%% properties
208 value
%% globals
--]]
 
local id_master = 239; -- ID des Master (ID Master)
local id_slaves = {545}; -- ID des Slaves {1}, {1,2,3}
local prog_rgb = 546
local var_global_master = "RGB_Previous1"
local var_global_slave = "RGB_Previous2"
local debug = true; -- Debug

local CeL = fibaro:getValue(208,  'value'  )
local currentdate = os.date("%d/%m/%Y %H:%M:%S")
local VGMaster = fibaro:getGlobalValue(var_global_master)
local VGSlave = fibaro:getGlobalValue(var_global_slave)
 
if debug then fibaro:debug("Démarrage du script : " ..currentdate) end
 
function split(s, pattern, maxsplit)
  local pattern = pattern or ' '
  local maxsplit = maxsplit or -1
  local s = s
  local t = {}
  local patsz = #pattern
  while maxsplit ~= 0 do
    local curpos = 1
    local found = string.find(s, pattern)
    if found ~= nil then
      table.insert(t, string.sub(s, curpos, found - 1))
      curpos = found + patsz
      s = string.sub(s, curpos)
    else
      table.insert(t, string.sub(s, curpos))
      break
    end
    maxsplit = maxsplit - 1
    if maxsplit == 0 then
      table.insert(t, string.sub(s, curpos - patsz - 1))
    end
  end
  return t
end

--Recup couleur et Prog du RGB Master
local result = split(fibaro:getValue(id_master, "color"), ',')
local ProgMaster = fibaro:getValue(id_master, "currentProgramID")
-- Recup couleur et Prog du RGB slave
local resultat = split(fibaro:getValue(id_slaves, "color"), ',')
local ProgSlave = fibaro:getValue(id_slaves, "currentProgramID")

 
--Affichage dans le debug des couleurs de RGB Master et RGB Slave
if debug then
    fibaro:debug("Couleur Master :" ..result[1]..","..result[2]..","..result[3]..","..result[4])
    fibaro:debug("Programme Master :" ..ProgMaster)
    fibaro:debug("Couleur Slave :" ..resultat[1]..","..resultat[2]..","..resultat[3]..","..resultat[4])
    fibaro:debug("Programme slave :" ..Progslave)
end

-- Affectation PROG aux VG
fibaro:setGlobal(var_global_master, ProgMaster)
fibaro:setGlobal(var_global_slave, ProgSlave)

-- SI activation cellule 208, les 2 RGB avec le programme 546
if CeL == "1" then
    for i = 1, #id_master do
        fibaro:call(id_master[i], "startProgram", prog_rgb)
    end
    for i = 1, #id_slaves do
        fibaro:call(id_slaves[i], "startProgram", prog_rgb)
    end
end

-- Tempo de 15 secs
fibaro:sleep(15*1000)

-- Remise prog/couleur des RGB en cours avant activation cellule 208
for i = 1, #id_master do
    if (result[1] == "0" and result[2] == "0" and result[3] == "0" and result[4] == "0" and VGMaster ~="") then
        if debug then fibaro:debug("Programme Master :" ..VGMaster);end
    fibaro:call(id_master[i], "startProgram", VGMaster);
    else
    fibaro:call(id_master[i], "setColor", result[1], result[2], result[3], result[4])
    end
end

-- Remise prog/couleur des RGB en cours avant activation cellule 208
for i = 1, #id_slaves do
    if (resultat[1] == "0" and resultat[2] == "0" and resultat[3] == "0" and resultat[4] == "0" and VGSlave ~="") then
        if debug then fibaro:debug("Programme Slave :" ..VGSlave);end
    fibaro:call(id_slaves[i], "startProgram", VGSlave);
    else
    fibaro:call(id_slaves[i], "setColor", resultat[1], resultat[2], resultat[3], resultat[4])
    end
end

--Reinitialisation des variables
fibaro:setGlobal(var_global_master, "")
fibaro:setGlobal(var_global_slave, "")

Partager ce message


Lien à poster
Partager sur d’autres sites

 Bonjour @pepite et merci,

Nouvelle scène créée et ça ne bascule pas sur le prog 546. Je doit supprimer les deux variables RGB_Previous1 & 2 dans le panneau?

Voici le debug, il bloque sur la ligne 91.

[DEBUG] 18:39:30: Démarrage du script : 25/02/2016 18:39:30
[DEBUG] 18:39:31: line 91: attempt to concatenate local 'deviceId' (a table value)
[DEBUG] 18:40:39: Démarrage du script : 25/02/2016 18:40:39
[DEBUG] 18:40:39: line 91: attempt to concatenate local 'deviceId' (a table value)
[DEBUG] 18:40:41: Démarrage du script : 25/02/2016 18:40:41
[DEBUG] 18:40:41: line 91: attempt to concatenate local 'deviceId' (a table value)
[DEBUG] 18:40:42: Démarrage du script : 25/02/2016 18:40:42
[DEBUG] 18:40:42: line 91: attempt to concatenate local 'deviceId' (a table value)
[DEBUG] 18:40:43: Démarrage du script : 25/02/2016 18:40:43
[DEBUG] 18:40:43: line 91: attempt to concatenate local 'deviceId' (a table value)
[DEBUG] 18:54:06: Démarrage du script : 25/02/2016 18:54:06
[DEBUG] 18:54:06: line 91: attempt to concatenate local 'deviceId' (a table value)
[DEBUG] 18:54:07: Démarrage du script : 25/02/2016 18:54:07
[DEBUG] 18:54:07: line 91: attempt to concatenate local 'deviceId' (a table value)
[DEBUG] 18:54:07: Démarrage du script : 25/02/2016 18:54:07
[DEBUG] 18:54:08: line 91: attempt to concatenate local 'deviceId' (a table value)

 Pas de 239 currentProgramID et 239 color dans l'entête?

Partager ce message


Lien à poster
Partager sur d’autres sites

 

Bonjour,

 

La question du jour ;-) bon le code c'est pas trop trop mon truc. Pour aider notre king de l'electricite nommé @Did, je suis parti d'un code posté par @steven et j'ai essayé de l'adapter au mieux pour les besoins de @Did.

 

Pourriez-vous corriger et me dire s'il y a des boulettes ? et si vous comprenez le besoin ?

Et du code de @steven je ne comprends pas bien le if (g) ..;si vous avez envie de m'expliquer lol

 

Code de @steven

local var_global = "RGB_PREVIOUS"
local id = 27

 

Hello Pepite !

 

Alors quelques précisions ;)

 

1 - Steven s'était penché sur mon besoin, mais j'avoue n'avoir jamais rien compris.

J'ai trituré le truc dans tous les sens, j'ai essayé de mixer ça avec GEA, j'ai .... et au final j'ai rien réussis à  faire.

 

2 - Pour le scripts de moi dont vous parlez, il n'est pas de moi.

J'ai dit que j'avais démerdé ce script.

 

J'ai trouvé ce script sur un blog ou je ne sais ou, le truc c'est que l'auteur avait fait un copier coller ET il avait du coup, mis des parasites dans le code.

J'ai contacté l'auteur mais il ne m'a jamais répondu.

 

J'avais tellement besoin de ce script, que au final j'ai lu ligne après ligne.

Et bien que ne connaissant rien en code, je suis arrivé à  trouver le problème, un ou deux mauvais caractères certainement dà» au copier/collé, de mémoire un &-§ un truc comme ça.

 

Donc non, je ne suis pas devenu codeur par le saint esprit  :lol:  :lol:

 

EDIT : c'est con, vous avez faillit me faire passer pour une idole  :D  :D

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Par contre je suis très interressé par une explication et mise en pratique du script de Steven....

 

Le but initial était d'avoir un programme ou une couleur d'ambiance, qui revienne à  l'état initial "APRES" une alerte lumineuse (style porte ouverte, approche vers la maison, ouverture garage).

Partager ce message


Lien à poster
Partager sur d’autres sites

@domodial,

 

Ben franchement, tu as lul le code et compris c'est deja enorme, je galere aussi hihihi

 

Oui, le besoin de @did est excatement celui la, en cas d'alerte, changement de couleur ou de programme sur les RGB concernes et remise à  la valeur précédente avant cette alerte ;-)

On y travaille aussi, je suis plus lent que les autres hihih, voire beaucoup plus ;-)

 

@did

Non garde les variables, je n'ai pas mis dans l'entete le 239, pour les tests, le declencheur est bien ton 208 value.

Vais essayer de corriger sans mettre les tables ;-)

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai rajouté des debug et enlevé la lecture des tables ;-)


--[[
%% properties
208 value
%% globals
--]]
 
local id_master = 239 -- ID des Master (ID Master)
local id_slaves = 545 -- ID des Slaves {1}, {1,2,3}
local prog_rgb = 546
local var_global_master = "RGB_Previous1"
local var_global_slave = "RGB_Previous2"
local debug = true -- Debug

local CeL = fibaro:getValue(208,  'value'  )
local currentdate = os.date("%d/%m/%Y %H:%M:%S")
local VGMaster = fibaro:getGlobalValue(var_global_master)
local VGSlave = fibaro:getGlobalValue(var_global_slave)
 
if debug then
    fibaro:debug("Démarrage du script : " ..currentdate)
    fibaro:debug("Valeur CeL : " ..CeL)
end
 
function split(s, pattern, maxsplit)
  local pattern = pattern or ' '
  local maxsplit = maxsplit or -1
  local s = s
  local t = {}
  local patsz = #pattern
  while maxsplit ~= 0 do
    local curpos = 1
    local found = string.find(s, pattern)
    if found ~= nil then
      table.insert(t, string.sub(s, curpos, found - 1))
      curpos = found + patsz
      s = string.sub(s, curpos)
    else
      table.insert(t, string.sub(s, curpos))
      break
    end
    maxsplit = maxsplit - 1
    if maxsplit == 0 then
      table.insert(t, string.sub(s, curpos - patsz - 1))
    end
  end
  return t
end

--Recup couleur et Prog du RGB Master
local result = split(fibaro:getValue(id_master, "color"), ',')
local ProgMaster = fibaro:getValue(id_master, "currentProgramID")
-- Recup couleur et Prog du RGB slave
local resultat = split(fibaro:getValue(id_slaves, "color"), ',')
local ProgSlave = fibaro:getValue(id_slaves, "currentProgramID")

 
--Affichage dans le debug des couleurs de RGB Master et RGB Slave
if debug then
    fibaro:debug("Couleur Master :" ..result[1]..","..result[2]..","..result[3]..","..result[4])
    fibaro:debug("Programme Master :" ..ProgMaster)
    fibaro:debug("Couleur Slave :" ..resultat[1]..","..resultat[2]..","..resultat[3]..","..resultat[4])
    fibaro:debug("Programme slave :" ..ProgSlave)
end

-- Affectation PROG aux VG
fibaro:debug("Affectation PROG aux variables")
fibaro:setGlobal(var_global_master, ProgMaster)
fibaro:setGlobal(var_global_slave, ProgSlave)

-- SI activation cellule 208, les 2 RGB avec le programme 546
fibaro:debug("RGB sur Programme 546")
fibaro:call(id_master, "startProgram", prog_rgb)    
fibaro:call(id_slaves, "startProgram", prog_rgb)

-- Tempo de 15 secs
fibaro:debug("tempo de 15 secs")
fibaro:sleep(15*1000)

-- Remise prog/couleur des RGB en cours avant activation cellule 208
fibaro:debug("Remise valeur précédente Master")
if (result[1] == "0" and result[2] == "0" and result[3] == "0" and result[4] == "0" and VGMaster ~="") then
    if debug then fibaro:debug("Programme Master :" ..VGMaster);end
    fibaro:call(id_master, "startProgram", VGMaster);
else
    fibaro:call(id_master, "setColor", result[1], result[2], result[3], result[4])
end

-- Remise prog/couleur des RGB en cours avant activation cellule 208
fibaro:debug("Remise valeur précédente Slave")
if (resultat[1] == "0" and resultat[2] == "0" and resultat[3] == "0" and resultat[4] == "0" and VGSlave ~="") then
    if debug then fibaro:debug("Programme Slave :" ..VGSlave);end
    fibaro:call(id_slaves, "startProgram", VGSlave);
else
    fibaro:call(id_slaves, "setColor", resultat[1], resultat[2], resultat[3], resultat[4])
end


--Reinitialisation des variables
fibaro:debug("Réinitialisation des variables")
fibaro:setGlobal(var_global_master, "")
fibaro:setGlobal(var_global_slave, "")


 

Partager ce message


Lien à poster
Partager sur d’autres sites

×