Aller au contenu
Fredmas

Questions de débutant en Quick Apps sur HC3

Recommended Posts

il y a 19 minutes, Lazer a dit :

D'ailleurs ta question n'a rien à voir avec les QuickApp directement, mais plutôt aux possibilités du langage LUA en général.

 

Là tu as raison...

J'en reviens donc au sujet de base les QA...

 

J'essaie de faire une QA avec un switch ON/OFF

 

Je voudrais que suivant l'état du switch il exécute ou n'exécute pas le code

ON : Je lance le code avec une boucle de 5min

OFF : je stoppe la boucle

 

Malheureusement, le switch n'est pas actif lorsque la boucle est en attente..

Voici mon code


local function loop()
    -- Chanel_1
     Get_HC3_Values_send_to_ThingSpeak(Key_Chanel_1,ids_for_Chanel_1)  
    
    -- loop
    if (hub.getValue(plugin.mainDeviceId,"state") == true) then
        setTimeout(loop,60*1000*loop_value_min)        --- minutes
        --setTimeout(loop,1000*loop_value_min)        -- secondes for debug
    end
end

function QuickApp:turnOn()
    self:debug("binary switch turned on")
    self:updateProperty("value", true)    
    loop()
end
function QuickApp:turnOff()
    self:debug("binary switch turned off")
    self:updateProperty("value", false)
end

--================================================================================================--
                                        -- MAIN --
--================================================================================================--
function QuickApp:onInit()
    self:debug("onInit")
    self:turnOn()
end

Note : Désolé, le coloring n'est pas présent... dès que je sélectionne le langage lua dans le champs codage, je n'ai plus rien dans mon post... 3 fois que je perds tout... Grrrr

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors je développe pas mal en Shell à mes heures perdues, mais le backquote (ou le $(...)) ne sert pas à évaluer le nom d'une variable sous forme de chaine de caractère, mais à évaluer une commande complète.

Ou alors je veux bien un exemple où tu manipules le nom d'une variable, car il ne me semble jamais avoir vu ça en Shell.

 

EDIT : après les scripts Shell ne sont pas compilés, mais interprétés, donc ça change beaucoup de choses, les possibilités peuvent être différentes.

 

Modifié par Lazer

Partager ce message


Lien à poster
Partager sur d’autres sites

Ça permet d'évaluer et de donner la valeur d'une commande qui peut être passée en string. Je me suis sûrement mal exprimé... Bref.. le backquote est très utile dans ces cas là ;). [Hors sujet off]

 

Édit suite à ton édit, c'est claire que ç'est différents ;)

Modifié par TitiXsi

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui voilà tu l'as dit, "une commande" passée en string, pas un "nom de variable" manipulé en string

Le truc, c'est que quelque soit le langage de programmation, tu ne peux pas jouer avec le nom des variables qui est défini lors de la compilation du programme, c'est à dire avant son lancement.
Durant l'exécution du programme, le nom des variables n'existe même pas, ce sont juste des emplacements mémoires, à des adresses bien précises, que le CPU va aller lire/écrire.

 

C'est pour cela que je t'ai indiqué qu'on utilise les Tables en LUA, on peut manipuler leur contenu à loisir avec des index.

Ces index peuvent être de type numérique (entier à partir de 1 en LUA, ou à partir de 0 dans de nombreux autres langages), ou bien de type chaine de caractère (string)
Et là, cet index de type string, on peut le manipuler, c'est tout à fait possible.
Par ex :

local myTable = {
	myIndex_1 = "Hello",
	myIndex_2 = "World",
}

for i = 1, 2 do
	local ton_index_en_string_devant_le_prisunic = "myIndex_" .. i
	print("nom de l'index : ", ton_index_en_string_devant_le_prisunic)
	local value = myTable[ton_index_en_string_devant_le_prisunic]
	print("valeur de l'index : ", value)
end

Ce qui se rapproche un peu de ce que tu cherchais à faire initialement, un peu plus lourd à manipuler, mais fonctionnel (j'ai pas testé ce bout de code donc j'espère qu'il n'y a pas d'erreur de syntaxe, mais c'est pour expliquer le principe)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Sympa la référence au prisunic :60:.

J'ai utilisé la table indiquée plus haut et ça fonctionne impeccablement. Je passe juste 2 paramètres au lieu d'un seul, pas dramatique. Merci ^_^

 

Sinon pour en revenir au sujet, si tu as une idée pour la qa déclarée en device de type Switch, je suis preneur, sinon, ça restera comme ça sans arrêt possible. :17:

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah désolé j'ai loupé ton message concernant le QA switch

 

J'ai regardé, mais je ne comprends pas ce qui te pose problème ?

 

Je ne sais pas si j'ai compris ce que tu cherches à faire, mais j'aurais procédé différemment :
- Une loop infinie
- les fonctions turnOn et turnOff activent une variable true/false

- lors de chaque exécution, la loop vérifie la valeur de la variable, et si true, alors effectue l'action.

Plus simple et efficace ainsi je pense.

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est ce que j'ai fait en premier, mais je me suis rendu compte que lorsque la fonction est sur le Time Out, le bouton du device n'est pas opérant... Je referai des tests demain avec un truc plus simple et je posterai le fichier.

Modifié par TitiXsi

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 8 heures, TitiXsi a dit :

C'est ce que j'ai fait en premier, mais je me suis rendu compte que lorsque la fonction est sur le Time Out, le bouton du device n'est pas opérant... Je referai des tests demain avec un truc plus simple et je posterai le fichier.

Je viens de comprendre.. Quel buse... La case "Appareil désactivé" était cochée... Punaise, je comprenais pas pourquoi avec un nouveau device tout propre c'était ok, mais pas avec l'autre ...

Bref, si ca peut aider, je partage un morceau de code qui fait le job

 

local loop_value_sec = 5
----------------------------------------------------------------------------------------------------
                        -- check locales variables
----------------------------------------------------------------------------------------------------
print("----------------START-".._ID.."_"..Main_Device.."--------------------")


--================================================================================================--
                                        -- Functions --
--================================================================================================--
local function loop()
    if (hub.getValue(plugin.mainDeviceId,"state") == true) then
		tools:trace("Run Loop")

    -- loop
     then        
        setTimeout(loop,1000*loop_value_sec)        -- secondes
    end
end

function QuickApp:turnOn()
    self:debug("binary switch turned on")
    self:updateProperty("value", true)    
    loop()
end
function QuickApp:turnOff()
    self:debug("binary switch turned off")
    self:updateProperty("value", false)
end

--================================================================================================--
                                        -- MAIN --
--================================================================================================--
function QuickApp:onInit()
    self:debug("onInit")
    self:turnOn()    
end

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Problems:

1. You set 'value' but test 'state'

2. If you click 'off' -> 'on' quickly you may end up with 2 running loops...

I think @laser meant something like this (but here we use the property instead of a local var)

local function loop()
    if (hub.getValue(plugin.mainDeviceId,"value") == true) then
       print("Run Loop action")
    end
    -- loop    
    setTimeout(loop,1000*loop_value_sec)        -- secondes
end
loop()

function QuickApp:turnOn()
    self:debug("binary switch turned on")
    self:updateProperty("value", true)    
end
function QuickApp:turnOff()
    self:debug("binary switch turned off")
    self:updateProperty("value", false)
end

 

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Jang, you have torally right! It's m'y Bad :blink:

Partager ce message


Lien à poster
Partager sur d’autres sites

×