Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Scenario panique
#11
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
  calaos-os-raspberrypi2-v3.0-alpha6-14-g341535a-2021-01-17 on Raspberry Pi 2 ▶ Wago_2.2/wago_881.pro on Wago 750-881 ▶ DS18B20 sensors on Pi GPIO ▶ Node-RED









Reply
#12
Tu peux faire une boucle for sur les ID, mais ca va tout prendre et pas seulement les lumieres.
Raoul,
Calaos Core Dev.
Calaos git sur NUC NUC5PPYH | Wago 750-849 | DALI RGB | Sondes NTC sur 750-464 | Sondes 1Wire DS18B20 avec adaptateur USB DS9490R | Nodes MySensors avec gateway USB | Ecran tactile ELO avec adaptateur USB/RS232 | Squeezebox Duet et Radio | Logitech Harmony Ultimate | Ampli Pioneer VSX921
Reply
#13
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 ? Huh

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
  calaos-os-raspberrypi2-v3.0-alpha6-14-g341535a-2021-01-17 on Raspberry Pi 2 ▶ Wago_2.2/wago_881.pro on Wago 750-881 ▶ DS18B20 sensors on Pi GPIO ▶ Node-RED









Reply
#14
calaos:getInputValue() renvoie un string, donc:

Code:
if timer == "true" or timer == "false"
Raoul,
Calaos Core Dev.
Calaos git sur NUC NUC5PPYH | Wago 750-849 | DALI RGB | Sondes NTC sur 750-464 | Sondes 1Wire DS18B20 avec adaptateur USB DS9490R | Nodes MySensors avec gateway USB | Ecran tactile ELO avec adaptateur USB/RS232 | Squeezebox Duet et Radio | Logitech Harmony Ultimate | Ampli Pioneer VSX921
Reply
#15
Merci Raoul j'essaierai ce soir mais ca me parait bizarre car :

  1. 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.
  2. 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 ?
  calaos-os-raspberrypi2-v3.0-alpha6-14-g341535a-2021-01-17 on Raspberry Pi 2 ▶ Wago_2.2/wago_881.pro on Wago 750-881 ▶ DS18B20 sensors on Pi GPIO ▶ Node-RED









Reply
#16
Hmmm oui tu as raison, j'ai dis n'importe quoi Smile

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
Raoul,
Calaos Core Dev.
Calaos git sur NUC NUC5PPYH | Wago 750-849 | DALI RGB | Sondes NTC sur 750-464 | Sondes 1Wire DS18B20 avec adaptateur USB DS9490R | Nodes MySensors avec gateway USB | Ecran tactile ELO avec adaptateur USB/RS232 | Squeezebox Duet et Radio | Logitech Harmony Ultimate | Ampli Pioneer VSX921
Reply
#17
T'as essaye avec un timer ? Chez moi ca marche avec des IO ou des variables internes mais pas avec les timers.
  calaos-os-raspberrypi2-v3.0-alpha6-14-g341535a-2021-01-17 on Raspberry Pi 2 ▶ Wago_2.2/wago_881.pro on Wago 750-881 ▶ DS18B20 sensors on Pi GPIO ▶ Node-RED









Reply
#18
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"
Raoul,
Calaos Core Dev.
Calaos git sur NUC NUC5PPYH | Wago 750-849 | DALI RGB | Sondes NTC sur 750-464 | Sondes 1Wire DS18B20 avec adaptateur USB DS9490R | Nodes MySensors avec gateway USB | Ecran tactile ELO avec adaptateur USB/RS232 | Squeezebox Duet et Radio | Logitech Harmony Ultimate | Ampli Pioneer VSX921
Reply
#19
Ca marche Raoul c'est bien un string !  Big Grin

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
  calaos-os-raspberrypi2-v3.0-alpha6-14-g341535a-2021-01-17 on Raspberry Pi 2 ▶ Wago_2.2/wago_881.pro on Wago 750-881 ▶ DS18B20 sensors on Pi GPIO ▶ Node-RED









Reply
#20
Ah bah oui effectivement, c'est un bug dans calaos installer ca.... Merci Wink
Raoul,
Calaos Core Dev.
Calaos git sur NUC NUC5PPYH | Wago 750-849 | DALI RGB | Sondes NTC sur 750-464 | Sondes 1Wire DS18B20 avec adaptateur USB DS9490R | Nodes MySensors avec gateway USB | Ecran tactile ELO avec adaptateur USB/RS232 | Squeezebox Duet et Radio | Logitech Harmony Ultimate | Ampli Pioneer VSX921
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)