Page 1 sur 1

Minuterie réarmable avec un bouton Push On

Publié : 28 avr. 2021, 16:15
par zouzou
Bonjour,

Dans mon système de chauffage électrique, que j'utilise avec le script Chauffage PID de Vil1driver (formidable au passage !), j'aimerais ajouter la possibilité à une personne de forcer la mise en route d'un radiateur pendant X minutes. Ce délai doit pouvoir s'incrémenter de X minutes en cas d'un nouvel appui. Le nombre d'incrémentation doit être limité à N.

Pour l'instant je suis passé par un bouton virtuel Push On qui est mis en action via le bouton du SOnOff greffé au radiateur en question. J'ai spécifié un délai d'extinction dans le bouton. Avec mon script j'allume et j'éteins le bouton virtuel du radiateur, ça fonctionne.. sans respecter le temps à incrémenter ni le nombre d'appui maximal à prendre en compte.

J'ai beau essayer de faire quelques choses dans mon script LUA Devices, j'arrive seulement à faire une boucle infini..

Je vous joins mon dernier brouillon:

Code : Tout sélectionner

local bouton = 'Radiateur Salon Gauche Bouton'
local radiateur = 'Radiateur Salon Gauche'
local delai = 10 --durée d'action en minutes
local n = 1 --nombre d'itérations possibles du delai
local i  -- nombre d'appuis sur le bouton
local etat_bouton
local activation = 0


commandArray = {}

if (devicechanged[bouton] == 'On' and activation == 0) then
    -- Si la valeur passe On, alors on passe radiateur à On et activation à 1
    commandArray[radiateur] = 'On'
    activation = 1
    i = 0
end

if (devicechanged[radiateur] == 'Off' and otherdevice[bouton] == 'On' and activation == 1) then
    commandArray[radiateur] = 'On'
end


-- Si un nouvel appui sur le bouton on incrémente le compteur ou on le bloque au max n
if (devicechanged[bouton] == 'On' and activation == 1) then
    i=i+1
    if(i>n) then
        i = n
    end
end

-- Si le delai d'inactivité du bouton arrive au bout et que le chauffage est activé
if (devicechanged[bouton] == 'Off' and activation == 1) then
    -- alors on vérifie qu'il n'y a pas eu d'autres appuis à prendre en compte
    i = i - 1
    if (i > 0) then
        commandArray[bouton] = 'On'
    end
end
return commandArray
Je dois faire fausse route, n'existe-t-il pas un moyen plus simple d'arriver à mes fins ?
Le Push On n'est peut-être pas le plus pratique, surtout avec un temps que je souhaite pouvoir régler facilement.
Le but étant de répliquer ce script sur d'autres interrupteurs pour d'autres applications avec d'autres consignes virtuels.

Re: Minuterie réarmable avec un bouton Push On

Publié : 28 avr. 2021, 18:05
par Keros
Ton souci est que tu as besoin de garder en mémoire (entre deux exécutions de script) les informations de nombre de fois appuyer ou le temps restant de mise en route. Il te faut passer par une info extérieure. Ca peut-être une uservariable ou un device virtuel.

Voici une idée : utiliser un décompteur virtuel. Lorsque tu appuis sur ton bouton, tu ajoutes 5 (minutes) au décompteur. Avec un script time (qui s'exécute toutes les minutes) tu enlèves 1 au décompteur et quand il arrive à 0, tu éteins ton chauffage.
Il ne restera plus qu'a bloqué le décompteur pour qu'en appuyant sur le bouton, il ne peux pas dépasser 30 (soit 6 appuis max).

Sinon, tu peux regarder le DzVents qui permet de stocker des infos au niveau du script.

Re: Minuterie réarmable avec un bouton Push On

Publié : 28 avr. 2021, 22:40
par zouzou
Merci, je vais regarder cette piste.
J'avais totalement oublié les variables utilisateurs..

Je vais partir dans cette direction, une fonction d'incrémentation d'une variable utilisateur avec une vérification pour ne pas dépasser la consigne max et une autre fonction pour le décrémentation de la variable utilisateur.

Il faut vraiment que je regarde DzVents de plus près...

Re: Minuterie réarmable avec un bouton Push On

Publié : 29 avr. 2021, 00:38
par zouzou
Voici ce que j'ai réalisé.
Il fonctionne avec le script Chauffage PID et le modules.lua de Vil1driver.
* bouton est un interrupteur virtuel de type Push On avec un délai d'extinction de 60 secondes afin d'être pris en compte.
* interrupteur est l'interrupteur virtuel qui allume/éteint le radiateur en question.
* chauffage_general est un interrupteur virtuel qui me sert à savoir si le chauffage est en fonction dans la maison. Comme cela l'hiver après une demande de chauffage supplémentaire, le script laisse la main au script Chauffage PID. L'été le script éteint le chauffage après son passage et il s'assure chaque minute qu'il soit bien éteint.
* delai est la durée en minutes du temps de chauffage par appui sur le bouton.
* n est le nombre d'appui supplémentaire accepté par le script.

Le script de Vil1driver pourrait éteindre le chauffage si la pièce est trop chaude. Donc ce script va s'assurer toutes les minutes que l'interrupteur du chauffage est à On. C'est le comportement que je souhaite afin d'avoir un chauffage plus fort le temps d'un instant (vêtement à réchauffer, douche à prendre pour un membre du foyer plus frileux qu'un autre, etc).
Quand le délai de chauffe est éteint, c'est le script Chauffage PID de Vil1driver qui reprend le relais, avec son inertie.

Le défaut: pas de prise en compte d'un appui additionnel du bouton dans les 59 secondes suivantes..
Ce n'est pas gênant pour le moment, à voir à l'usage.

Code : Tout sélectionner

-- chargement des modules
dofile('/home/pi/domoticz/scripts/lua/modules.lua')
local debug = false

local bouton = 'Radiateur Salon Gauche Bouton'
local interrupteur = 'Radiateur Salon Gauche'
local chauffage_general = 'Chauffage habitation'
local delai = 10 --durée de chauffe en minutes
local n = 1 --nombre d'itérations possibles du delai


local function usrvarexist()
    if(uservariables['Timer_'..interrupteur] == nil) then
        creaVar('Timer_'..interrupteur,0)
    end
end

local function incremente(delai,n)
    usrvarexist()
    if(tonumber(uservariables['Timer_'..interrupteur]) > (delai * n)) then
        commandArray[interrupteur] = 'On'
        updateVar('Timer_'..interrupteur,(tonumber(uservariables['Timer_'..interrupteur])-1))
        return false
    else
        updateVar('Timer_'..interrupteur,(tonumber(uservariables['Timer_'..interrupteur])+delai))
        commandArray[interrupteur] = 'On'
    end
    
end

local function decremente(delai,n)
    usrvarexist()
    if(tonumber(uservariables['Timer_'..interrupteur]) == 0) then
        if (otherdevices[chauffage_general] == 'Off') then
            commandArray[interrupteur] = 'Off'
        end
        return false
    else
        updateVar('Timer_'..interrupteur,(tonumber(uservariables['Timer_'..interrupteur])-1))
        commandArray[interrupteur] = 'On'
    end
    --
end

commandArray = {}
if (otherdevices[bouton] == 'On') then
    incremente(delai,n)
else
    decremente(delai,n)
end

return commandArray