Aller au contenu

Questions de débutant en Quick Apps sur HC3


Messages recommandés

Posté(e)
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

Posté(e) (modifié)

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
Posté(e) (modifié)

Ç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
Posté(e)

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)

 

Posté(e)

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:

Posté(e)

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.

Posté(e) (modifié)

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
Posté(e)
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

 

Posté(e)

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
  • 3 mois après...
Posté(e)

Bonjour, J'essai de réaliser un premier QA pour la gestion de mon jardin entre arrosage auto, robot de tonte et associé à la météo et aussi au prévision,

1er objectif est qu'il récupère mes données de mon pluviomètre Netatmo (pluie de la journée) le stock dans une variable du QA. (Cette partie fonctionne).

2nd objectif variable avec le cumul des précipitations sur 7 jours, (je coince déjà...) enfaite dans le code ci joint la fonction updateCumulPluie7J semble faire le boulot mais à la lecture des variables journalières il lit 0 alors que j'ai des données différentes 0.1 - 1.1. Mon soucis est donc dans la lecture de mes variables pour faire leurs total. Avez vous une idée pour un débutant en QA...

 

Citation

-- Définir les identifiants

local moduleID = 602  -- Remplacez 602 par l'ID de votre module

local QA_ID = 756  -- Remplacez 756 par l'ID de votre QuickApp

 

-- Fonction pour lire la valeur du module

local function readModuleValue()

    local value = fibaro.getValue(moduleID, "value")

    return tonumber(value) or 0

end

 

-- Fonction pour lire la valeur d'une variable QA

local function readQAVariable(variableName)

    local value = fibaro.getValue(QA_ID, variableName)

    return tonumber(value) or 0

end

 

-- Définir les variables pour chaque jour de la semaine

local dailyVariables = {

    [1] = "Cumul_pluie_dim",    -- Dimanche

    [2] = "Cumul_pluie_lun",    -- Lundi

    [3] = "Cumul_pluie_mar",    -- Mardi

    [4] = "Cumul_pluie_mer",    -- Mercredi

    [5] = "Cumul_pluie_jeu",    -- Jeudi

    [6] = "Cumul_pluie_ven",    -- Vendredi

    [7] = "Cumul_pluie_sam"     -- Samedi

}

 

-- Fonction pour mettre à jour la variable Cumul_pluie_7J

local function updateCumulPluie7J()

    local total = 0

    for _, variableName in pairs(dailyVariables) do

        total = total + readQAVariable(variableName)

    end

    fibaro.call(QA_ID, "setVariable", "Cumul_pluie_7J", tostring(total))

end


 

-- Fonction pour mettre à jour la variable de QA

local function updateQAVariable(dayOfWeek, value)

    local variableName = dailyVariables[dayOfWeek]

    if variableName then

        fibaro.call(QA_ID, "setVariable", variableName, tostring(value))

        -- Mettre à jour le cumul des 7 jours après chaque mise à jour journalière

        updateCumulPluie7J()

    else

        fibaro.debug("Error", "Invalid day of the week: " .. tostring(dayOfWeek))

    end

end

 

-- Fonction pour planifier l'exécution à 09h10

local function scheduleNextRun()

    local currentDate = os.date("*t")

    local targetTime = os.time({year=currentDate.year, month=currentDate.month, day=currentDate.day, hour=9, min=42, sec=10})

    local delay

 

    if os.time() >= targetTime then

        targetTime = targetTime + 86400  -- Ajouter un jour en secondes si 09h10 est déjà passé

    end

 

    delay = targetTime - os.time()

 

    fibaro.setTimeout(delay * 1000, function()

        local moduleValue = readModuleValue()

        local currentDayOfWeek = os.date("*t", os.time()).wday

        updateQAVariable(currentDayOfWeek, moduleValue)

        scheduleNextRun()  -- Replanifier pour le jour suivant

    end)

end

 

-- Initialisation et planification de la première exécution à 09h10

scheduleNextRun()

 

function QuickApp:onInit()

    self:debug("onInit")

end

 

 

Posté(e)

Les variables locales ne sont pas dispo dans les autres fonctions.

 

l'instruction pour lire une variable du QA (encours) est :


self:getVariable("NOM_DE_LA_VARIABLE") --  La lecture de la valeur d'une variable existante

 

j'ai lu jusqu'ici

total = total + readQAVariable(variableName)

je mettrais ceci :

total = total + self:readQAVariable(variableName)

 

Posté(e)

Merci Jojo pour l'indication, pour le moment avec cette modification j'ai encore une erreur. Mais je vais fouiller sur cette piste.

Citation

[11.06.2024] [08:52:50] [ERROR] [QUICKAPP756]: timer handler failed with error: ./include/main.lua:32: attempt to index a nil value (global 'self')

 

Posté(e) (modifié)
il y a une heure, Fred.domotique a dit :

Merci Jojo pour l'indication, pour le moment avec cette modification j'ai encore une erreur. Mais je vais fouiller sur cette piste.

 

 

Je pense que la construction global ne dois pas être correct. Ci dessous le code qui fonctionne pour incrémenter chaque jour le cumul de mon pluviomètre dans les variables "Cumul_plui_lun" "....._mar" etc..

Comment rajouterais tu une fonction qui cumul les 7 jours dans une nouvelle variable nommé "Cumul_pluie_J"

Citation
-- Définir les identifiants
local moduleID = 602  -- Remplacez 602 par l'ID de votre module
local QA_ID = 756  -- Remplacez 756 par l'ID de votre QuickApp
 
-- Fonction pour lire la valeur du module
local function readModuleValue()
    local value = fibaro.getValue(moduleID, "value")
    return tonumber(value) or 0
end
 
-- Définir les variables pour chaque jour de la semaine
local dailyVariables = {
    [1] = "Cumul_pluie_dim",    -- Dimanche
    [2] = "Cumul_pluie_lun",    -- Lundi
    [3] = "Cumul_pluie_mar",    -- Mardi
    [4] = "Cumul_pluie_mer",    -- Mercredi
    [5] = "Cumul_pluie_jeu",    -- Jeudi
    [6] = "Cumul_pluie_ven",    -- Vendredi
    [7] = "Cumul_pluie_sam"     -- Samedi
}
 
-- Fonction pour mettre à jour la variable de QA
local function updateQAVariable(dayOfWeek, value)
    local variableName = dailyVariables[dayOfWeek]
    if variableName then
        fibaro.call(QA_ID, "setVariable", variableName, tostring(value))
    else
        fibaro.debug("Error", "Invalid day of the week: " .. tostring(dayOfWeek))
    end
end
 
-- Fonction pour planifier l'exécution à 09h10
local function scheduleNextRun()
    local currentDate = os.date("*t")
    local targetTime = os.time({year=currentDate.year, month=currentDate.month, day=currentDate.day, hour=9, min=58, sec=00})
    local delay
 
    if os.time() >= targetTime then
        targetTime = targetTime + 86400  -- Ajouter un jour en secondes si 09h10 est déjà passé
    end
 
    delay = targetTime - os.time()
 
    fibaro.setTimeout(delay * 1000, function()
        local moduleValue = readModuleValue()
        local currentDayOfWeek = os.date("*t", os.time()).wday
        updateQAVariable(currentDayOfWeek, moduleValue)
        scheduleNextRun()  -- Replanifier pour le jour suivant
    end)
end
 
-- Initialisation et planification de la première exécution à 09h10
scheduleNextRun()
 
function QuickApp:onInit()
    self:debug("onInit")
 
end

Merci

Modifié par Fred.domotique
Posté(e)

Je me répond sur une solution trouvé ce jour. En test pour le moment.

Citation
-- Définir les identifiants
local moduleID = 602  -- Remplacez 602 par l'ID de votre module
local QA_ID = 756  -- Remplacez 756 par l'ID de votre QuickApp
 
-- Fonction pour lire la valeur du module
local function readModuleValue()
    local value = fibaro.getValue(moduleID, "value")
    return tonumber(value) or 0
end
 
-- Définir les variables pour chaque jour de la semaine
local dailyVariables = {
    [1] = "Cumul_pluie_dim",    -- Dimanche
    [2] = "Cumul_pluie_lun",    -- Lundi
    [3] = "Cumul_pluie_mar",    -- Mardi
    [4] = "Cumul_pluie_mer",    -- Mercredi
    [5] = "Cumul_pluie_jeu",    -- Jeudi
    [6] = "Cumul_pluie_ven",    -- Vendredi
    [7] = "Cumul_pluie_sam"     -- Samedi
}
 
-- Fonction pour mettre à jour la variable de QA
local function updateQAVariable(dayOfWeek, value)
    local variableName = dailyVariables[dayOfWeek]
    if variableName then
        fibaro.call(QA_ID, "setVariable", variableName, tostring(value))
    else
        fibaro.debug("Error", "Invalid day of the week: " .. tostring(dayOfWeek))
    end
end
 
-- Fonction pour calculer le cumul des précipitations sur 7 jours
local function cumul_7J(self)
    -- Lecture des Variables journalières
    local Cumul_pluie_lun = tonumber(self:getVariable("Cumul_pluie_lun")) or 0
    local Cumul_pluie_mar = tonumber(self:getVariable("Cumul_pluie_mar")) or 0
    local Cumul_pluie_mer = tonumber(self:getVariable("Cumul_pluie_mer")) or 0
    local Cumul_pluie_jeu = tonumber(self:getVariable("Cumul_pluie_jeu")) or 0
    local Cumul_pluie_ven = tonumber(self:getVariable("Cumul_pluie_ven")) or 0
    local Cumul_pluie_sam = tonumber(self:getVariable("Cumul_pluie_sam")) or 0
    local Cumul_pluie_dim = tonumber(self:getVariable("Cumul_pluie_dim")) or 0
 
    -- Ecriture de la Variable de Cumul à 7 Jours
    local cumul_7J = Cumul_pluie_lun + Cumul_pluie_mar + Cumul_pluie_mer + Cumul_pluie_jeu + Cumul_pluie_ven + Cumul_pluie_sam + Cumul_pluie_dim
    self:setVariable("Cumul_pluie_7J", tostring(cumul_7J))
 
    -- Lecture de Variable de Cumul et affichage debug
    local statut = self:getVariable("Cumul_pluie_7J")
    self:debug("Cumul_pluie_7J", "text", statut)
end
 
-- Fonction pour planifier l'exécution à 23h58
local function scheduleNextRun(self)
    local currentDate = os.date("*t")
    local targetTime = os.time({year=currentDate.year, month=currentDate.month, day=currentDate.day, hour=23, min=58, sec=00})
    local delay
 
    if os.time() >= targetTime then
        targetTime = targetTime + 86400  -- Ajouter un jour en secondes si 23h58 est déjà passé
    end
 
    delay = targetTime - os.time()
 
    fibaro.setTimeout(delay * 1000, function()
        local moduleValue = readModuleValue()
        local currentDayOfWeek = os.date("*t", os.time()).wday
        updateQAVariable(currentDayOfWeek, moduleValue)
        cumul_7J(self)  -- Exécuter la fonction cumul_7J après mise à jour
        scheduleNextRun(self)  -- Replanifier pour le jour suivant
    end)
end
 
-- Initialisation et planification de la première exécution à 23h58
function QuickApp:onInit()
    self:debug("onInit")
    scheduleNextRun(self)
    cumul_7J(self)  -- Appeler la fonction cumul_7J lors de l'initialisation
end

 

×
×
  • Créer...