RE: Scenario panique - mifrey - 02-28-2016
Je viens de faire ce script mais ca ne marche pas.
Le compteur s'incremente a chaque fois et depasse 6 (1,2,3,4,5,6,7,8,9,10,...) mais le script ne passe jamais dans les 2 derniers "if" comme si le timer n'etait ni true ni false. Le timer est mis sur 5 secondes pour l'nstant. Qu'est-ce qui ne va pas ?
Code: print("script_panic: start script")
-- IO id
timer_id = "input_58" -- InputTimer type
counter_id = "intern_0" -- InternalInt type
-- Increment the counter
local counter = calaos:getInputValue(counter_id) + 1;
calaos:setOutputValue(counter_id, counter);
-- Start the timer the first time
if counter == 1 then
print("script_panic: Start timer")
calaos:setOutputValue(timer_id, "start");
end
-- Panic mode: Counts reached before the timer is done
if counter >= 6 and calaos:getInputValue(timer_id) == false then
print("script_panic: Panic mode")
calaos:setOutputValue(timer_id, "stop");
return true
end
-- Counts not reached when the timer is done
if calaos:getInputValue(timer_id) == true then
print("script_panic: Reset timer and counter")
calaos:setOutputValue(timer_id, "stop");
calaos:setOutputValue(counter_id, 0);
return false
end
print("script_panic: Timer continues, counter = " .. counter)
return false
RE: Scenario panique - raoulh - 02-29-2016
Tu peux faire une boucle for sur les ID, mais ca va tout prendre et pas seulement les lumieres.
RE: Scenario panique - mifrey - 07-24-2016
Je reviens sur ce post car je n'ai toujours pas reussi a tester la valeur d'un timer dans un script LUA. Il ne me manque que ca pour que ca marche !
Alors voila mon probleme qui est facilement repetable avec le simple script ci-dessous. Le bloc IF devrait toujours etre execute mais ca n'est pas le cas.
Code: local timer_id = "input_58" -- InputTimer type
local timer = calaos:getInputValue(timer_id)
print("TEST TIMER: timer = " .. tostring(timer))
if timer == false or timer == true then
print("TEST TIMER: OK")
return true
end
print("TEST TIMER: NOT OK")
return false
Le log montre bien que le timer est true mais montre aussi que le bloc IF n'est pas execute. Comment est-ce possible ?
Code: Jul 24 23:37:10 raspberrypi calaos_server[993]: INF<993>:calaos_script.lua LuaScript/ScriptBindings.cpp:88 int Calaos::Lua_print(lua_State*)() LuaPrint: TEST TIMER: timer = true
Jul 24 23:37:10 raspberrypi calaos_server[993]: INF<993>:calaos_script.lua LuaScript/ScriptBindings.cpp:88 int Calaos::Lua_print(lua_State*)() LuaPrint: TEST TIMER: NOT OK
RE: Scenario panique - raoulh - 07-25-2016
calaos:getInputValue() renvoie un string, donc:
Code: if timer == "true" or timer == "false"
RE: Scenario panique - mifrey - 07-25-2016
Merci Raoul j'essaierai ce soir mais ca me parait bizarre car :
- J'ai du utiliser tostring dans print("TEST TIMER: timer = " .. tostring(timer)) car sinon j'avais une erreur "vous essayez de concatener un boolean avec un string", ce qui montre a priori que calaos:getInputValue() retourne un boolean.
- J'ai fait un autre test avec exactement le meme code mais en remplacant le timer par une variable interne boolean et la ca marche (le bloc IF est execute), ce qui montre que calaos:getInputValue() retourne un boolean dans ce cas.
calaos:getInputValue() retourne peut-etre un type different selon le type d'IO ? Je n'ai pas verifie dans le code source. J'essaierai ce que tu proposes ce soir mais meme si ca marche, comment expliquer les points ci-dessus ?
RE: Scenario panique - raoulh - 07-25-2016
Hmmm oui tu as raison, j'ai dis n'importe quoi
getInputValue() retourne soit un string, soit un bool, soit une valeur numerique suivant le type d'IO.
Mais c'est quand meme bizarre que ca ne marche pas ton test if.
Perso dans un de mes scripts je fais ca et ca fonctionne:
Code: local val = calaos:getInputValue("XXX")
if val then
-- blabla
end
RE: Scenario panique - mifrey - 07-25-2016
T'as essaye avec un timer ? Chez moi ca marche avec des IO ou des variables internes mais pas avec les timers.
RE: Scenario panique - raoulh - 07-25-2016
Je viens de verifier dans le code, le timer c'est un string et pas un boolean. Donc ca devrait marcher avec ma precedente reponse et un if timer == "true"
RE: Scenario panique - mifrey - 07-26-2016
Ca marche Raoul c'est bien un string !
Ce qui m'a induit en erreur et me faisait croire que c'etait un boolean c'est l'editeur de script de Calaos Installer qui indiquait l'erreur "Error Runtime error : [string "CalaosScript"]:18: attempt to concatenate a boolean value" avec le code suivant :
Code: print(script_name .. ": timer = " .. calaos:getInputValue(timer_id))
J'ai donc du ajouter un tostring() pour que Calaos Installer accepte le script.
Pour finir, voici le script complet qui fonctionne pour ceux que ca interesse. Le script doit etre mis dans les conditions de la regle et etre declenche par tous les poussoirs voulus (je les ai mis tous chez moi). Il retourne true en cas de situation panique. Dans l'exemple, il retourne true si les poussoirs sont presses 6 fois (12 changement d'etats) dans les 2 secondes (le timer est a definir dans Calaos Installer). A mettre sur https://www.calaos.fr/wiki/fr/liste_script ?
Code: -- Detect a panic situation in which switches are pressed several times within a short time.
-- The script shall be called each time the state of a switch changes.
--if true then return false end -- Uncomment to disable the script
-- Script start
local script_name = "SCRIPT_CONDITIONS_PANIC"
print(script_name .. ": Start")
-- IOs id
local timer_id = "input_58" -- InputTimer type
local counter_id = "intern_0" -- InternalInt type
-- Other variables to define
local panic_count = 12 -- Number of times the state of a switch must change within a specific time (typically 2 seconds) to trigger a panic situation
-- Read IOs
local timer = calaos:getInputValue(timer_id) -- ATTENTION: getInputValue(InputTimer type) returns a string type. Timer is false when timer starts or stops, true when timer is done.
local counter = calaos:getInputValue(counter_id)
print(script_name .. ": timer = " .. tostring(timer))
print(script_name .. ": counter = " .. tostring(counter))
-- Max time exceeded or first count
if timer == "true" or counter == 0 then
print(script_name .. ": Max time exceeded, restart timer and counter.")
-- Restart timer
timer = "start"
calaos:setOutputValue(timer_id, timer)
print(script_name .. ": Set timer = " .. tostring(timer))
-- First count
counter = 1;
calaos:setOutputValue(counter_id, counter)
print(script_name .. ": Set counter = " .. tostring(counter))
print(script_name .. ": End")
return false
-- Max time not exceeded
else
-- Count up
counter = counter + 1
calaos:setOutputValue(counter_id, counter)
print(script_name .. ": Max time not exceeded, count up. Set counter = " .. tostring(counter))
-- Counts not reached, wait for the next count.
if counter < panic_count then
print(script_name .. ": Counts not reached, wait for the next count.")
print(script_name .. ": end")
return false
-- Counts reached, panic mode.
else
print(script_name .. ": Counts reached, panic mode.")
-- Stop timer
timer = "stop"
calaos:setOutputValue(timer_id, timer)
print(script_name .. ": Set timer = " .. tostring(timer))
-- Reset counter
counter = 0;
calaos:setOutputValue(counter_id, counter)
print(script_name .. ": Set counter = " .. tostring(counter))
print(script_name .. ": end")
return true
end
end
print(script_name .. ": Oups, should never be there...")
return false
RE: Scenario panique - raoulh - 07-26-2016
Ah bah oui effectivement, c'est un bug dans calaos installer ca.... Merci
|