Aller au contenu

Messages recommandés

Posté(e)

Petite mise à jour avec notamment l'ajout du ModificationTime pour chaque propriété de la lampe et l'envoi des logs dans la zone de debug de la scène ou du VD d'où a été envoyée la commande.

Posté(e) (modifié)

Dernière petite modification : il est désormais possible de modifier le VD à loisir (ajouter ou supprimer des boutons, des étiquettes...) en fonction des besoins et de la lampe (par exemple, l'ampoule blanche n'a pas besoin de tout ce qui concerne la couleur), et ce sans avoir à s'inquiéter du changement de numérotation des boutons Connexion TCP et Transmission :).

 

Pour ceux que ça intéresse, voici la fonction qui permet au VD de se débrouiller tout seul pour savoir où appuyer (fonction générique pouvant être reprise telle qu'elle dans n'importe quel VD ou scène pourvu qu'on ait besoin de faire un pressButton) :

 

function getBtn(id, name)
  count,rows = 0, api.get("/devices/"..tostring(id))["properties"]["rows"]
  for a, b in pairs(rows) do 
    for c, d in pairs(b) do 
      if c == "elements" then 
        for e, f in pairs(d) do 
          for g, h in pairs(f) do 
            if g == "name" then 
              count = count + 1 
              if h == n then 
                return count
              end 
            end 
          end 
        end 
      end 
    end 
  end 
  fibaro:debug("Unable to locate button "..n..", check virtual device "..id)
  return nil
end

Et la version minifiée :

getBtn=function(i,n)x,r=0,api.get("/devices/"..tostring(i))["properties"]["rows"];for a,b in pairs(r)do for c,d in pairs(b)do if c == "elements" then for e,f in pairs(d)do for g,h in pairs(f)do if g=="name" then x=x+1 if h==n then return x end end end end end end end fibaro:debug("Unable to locate button "..n..", check virtual device "..i);return nil end

 

Modifié par OJC
  • Like 1
Posté(e)

Si je peux me permettre, par souci d'optimisation de la performance du code, il faut éviter l'utilisation de la fonction "pairs" qui est très lente. Elle a l'avantage de simplifier l'écriture et la compréhension, mais elle est peu performante, On trouve des benchmarks sur le net.

Donc il vaut mieux privilégier l'emploi d'une simple boucle "for".

 

Bon après, c'est surtout vrai si on appelle souvent ce code. Si il est peu utilisé, c'est pas ça qui changera les perfs de la box.

 

Merci pour ce bout de code en tout cas :)

 

  • Like 1
Posté(e) (modifié)

@Lazer Chef, oui Chef !

 

getBtn=function(i,n)
  r = api.get("/devices/"..tostring(i))["properties"]["rows"]
  for a=1,#r do
    for b=1,#r[a].elements do
      if n == r[a].elements[b].name then return a+b end
    end 
  end 
  return nil
end

getBtn=function(i,n)r=api.get("/devices/"..tostring(i))["properties"]["rows"] for a=1,#r do for b=1,#r[a].elements do if n == r[a].elements[b].name then return a+b end end end return nil end

 

Modifié par OJC
Posté(e)

Je peux faire le chieur ? :P

Tu comptes le nombre d'éléments de tes tableaux à chaque passage dans la boucle, tant qu'à optimiser il veut mieux stocker dans une variable locale avant d'entrer dans la boucle.

Posté(e) (modifié)

J'ai du mal à saisir ?

 

EDIT = Comme ça ? cf post précédent :)

Modifié par OJC
Posté(e)

Comme ceci, non testé :

getBtn=function(i,n)
  local c,r = 0, api.get("/devices/"..tostring(i))["properties"]["rows"]
  local nbr = #r
  for a=1, nbr do
    local nbra = #r[a].elements
    for b=1, nbra do
      c=c+1
      if n == r[a].elements[b].name then return c end
    end 
  end 
  return nil
end

J'en ai profité pour déclarer toutes les variables en local, cela évite d'interférer avec les éventuelles variables du reste du script LUA de l'utilisateur qui intègrera ce code.

  • Like 2
Posté(e) (modifié)
il y a 40 minutes, Lazer a dit :

for a=1, nbr do

J'ignorais cette subtilité, tu veux dire que la ligne ci-dessus est exécuter autant de fois que la valeur nbr. Je supposais qu'elle n'était exécutée qu'une fois et que c'était uniquement le contenu de la boucle qui était exécuté autant de fois que la valeur nbr. :huh:

 

Il y énormément de codes sur le forum qui sont écrit comme ça :

for a=1, #r do

 

Modifié par MAM78
Posté(e)

Oui tout à fait, la ligne for elle-même est interprétée à chaque passage.

Bien sur qu'il y a énormément de code écrit ainsi, tout comme il y a énormément de code avec la fonction pair().

Le propre d'un langage de programmation, c'est aussi de nous faciliter la vie avec des raccourcis, mais ces raccourcis sont rarement performants au sens du temps d'exécution machine.

Si on pousse plus loin encore le raisonnement, un appel de fonction, c'est très long, il faut placer les paramètres sur la pile, décaler le pointeur d'exécution du programme, etc. D'un point de vue performance, un code linéaire est donc plus performant qu'un code bien structuré avec de multiples fonctions. Sauf qu'à un moment donné, on est quand même obligé d'utiliser les fonctions si on veut que le développeur, un simple humain, puisse s'y retrouver dans la structure du code. De plus, les fonctions permettent de factoriser le code, donc de minimiser l'usage mémoire. Il a longtemps été reproché à Microsoft d'être trop gourmand en RAM.... donc les fonctions, faut les utiliser !

  • Like 1
Posté(e)

Cela dit, je parle là d'optimisation "atomiques", il existe ainsi plein de petits trucs et astuces à savoir....

 

MAIS on gagne là des pouillèmes de micro-secondes, souvent le temps perdu par un code l'est par une mauvaise logique, et il est parfois plus efficace de restructurer son code différemment que de se prendre la tête sur les optimisations atomiques.

Posté(e)

Et une lampe wifi à côté de la tête toute là nuit ?
Je suis pas trop parano mais j ai pris l habitude de mettre l iPhone en avion la nuit.

Posté(e)

Je publie une nouvelle version, m'étant rendu compte que dans certains cas, le VD détectait bien la remise sous tension de la lampe mais ne relançait pas la connexion pour en recevoir les informations de mise à jour.

J'en ai profité pour nettoyer un peu le code et virer la fonction _y:help() qui au final prenait surtout beaucoup de place pour pas grand chose.

Et le VD s'occupe aussi de nettoyer tout seul les variables globales lorsqu'un VD est supprimé ou en cas de changement d'ID. J'ai à cette occasion découvert que si on peut faire un api.delete dans une scène, ce n'est pas prévu pour les VD :mellow: où il faut passer directement par Net.FHttp() pour pouvoir supprimer une variable globale...

  • 1 mois après...
Posté(e)

Je tombe sur ce post tardivement, voyant qu'on parle d'optimisation :

 

getBtn=function(i,n)
  local c,r = 0, api.get("/devices/"..tostring(i))["properties"]["rows"]
  local nbr = #r
  for a=1, nbr do
    local nbra = #r[a].elements
    for b=1, nbra do
      c=c+1
      if n == r[a].elements[b].name then return c end
    end 
  end 
  return nil
end

A quoi sert "c" ... pourquoi ne pas retourner directement "b" :D

 

Ok, :98:

Posté(e)

LOL :13:

Magnifique exemple de ce que je disais précédemment : " il est parfois plus efficace de restructurer son code différemment "

 

J'avoue que je n'ai même pas cherché à comprendre ce que faisait le code.... :rolleyes:

  • Haha 1
Posté(e)

@Steven Parce que la valeur de a correspond au numéro de la ligne sur le VD, et celle de b correspond au numéro de l'élément au sein de cette ligne, d'où il suit qu'elle est réinitialisée à chaque itération de a et donc que retourner cette valeur de b comme résultat de la fonction ne correspond pas à ce qui est attendu.

 

Sinon, pas trop froid, dehors ?

Posté(e)

C'est pas faux :P

 

Oui, je me les cailles comme on dit vulgairement... température réelle -7, ressentie -13.

Je suis en train du brûler du "pellet" comme jamais. C'est dans des moments comme celui-ci qu'on regrette de ne pas avoir un autre mode de chauffage. :(

 

Après en ce qui concerne l'optimisation, perso, ma devise est : "préféré un code qui fait son travail à un code parfait qui ne fait rien". :16:

Posté(e)
il y a 24 minutes, Steven a dit :

préféré un code qui fait son travail à un code parfait qui ne fait rien"

Et moi je fais des codes qui ne font rien et non parfait, la galère non ? :60:

  • 4 mois après...
Posté(e) (modifié)

bonjour, je test ce VD avec un Yeelight Smart LED Bulb et un Yeelight Lightstrip qui semblent ok avec l'open API mais le VD ne marche pas. J'ai mis l'ip et le port dans le VD mais il me met "état : hors ligne" alors que dans l'app Yeelight j'ai bien le contrôle des deux... une idée ? 

 

Quelqu'un a t-il essayé avec ce genre de produit et cela est-il fonctionnel chez quelqu'un ?

 

Sur quel serveur les avez-vous enregistrer ? (singapour, chine, allemagne ?)

Modifié par Eliah
Posté(e)

@Eliah Tu as activé le contrôle local dans l'application Yeelight (pour chaque lampe) ? C'est indispensable pour pouvoir commander les lampes depuis le réseau local.

×
×
  • Créer...