Page 1 sur 1

Transformer un blind en blind percent.

Publié : 11 mai 2018, 19:26
par landaisbenj
Bonjour a tous.

Je cherche a faire une modification d'un blind pour le rendre en blind percent. En passant par un dummy et en gerant via le temps d'ouverture du volet.

Je peux le coder mais je n'arrive pas, mathematiquement, a reflechir entre un volet qui est deja semi ouvert et qui change pour une autre semi ouverture etc...

Enfin bref je pense que je ne suis pas clair, alors je fourni le debut de mon code ici en esperant avoir vos propositions de simplification et de reflexion, pour les integrer (en mode timeline quoi)...

Pour le code je sépare en deux.
La partie du dummy:

Code : Tout sélectionner

local delai=22
local volet='Volet Baie'
local dummy='Volet'

-- Je securise pour le moment l'utilisation du dummy:
-- Comme il s'agit d'un mouvement chronophage, il ne faut pas qu'il soit modifié avant sa fin.
if lastSeen(dummy) > (otherdevices_svalues[volet]*22)/100 then
    -- Si le demande de changement sur le dummy est un pourcentage
    if devicechanged[dummy]:match('(%a+) ', 0)=='Set' then
        --local valeur = devicechanged['Volet']:match('(%d+)')
        local pourcentageDummy = otherdevices_svalues[dummy]
        local pourcentageVolet = otherdevices_svalues[volet]
        local difference = math.abs(pourcentageDummy - pourcentageVolet)
        local temps = math.floor((difference*22)/100)
        -- Si la position demandée est inferieur a la position du volet
        if pourcentageDummy < pourcentageVolet then
            -- J'ouvre le volet et je renvoi l'ordre d'ouvrir apres la difference de pourcentage en temps
            commandArray[#commandArray+1]={[volet] = 'Off'}
            commandArray[#commandArray+1]={[volet] = 'Off AFTER '..temps}
            -- Puis je met a jour le device pour qu'il soit toujours en etat fermé
            commandArray[#commandArray+1]={['UpdateDevice'] = otherdevices_idx[volet]..'|1|0'}
        else -- Sinon je referme le volet et je renvoi l'ordre de fermeture apres la difference de pourcentage en temps
            commandArray[#commandArray+1]={[volet] = 'On'}
            commandArray[#commandArray+1]={[volet] = 'On AFTER '..temps}
        end
    else
        if devicechanged[dummy]=='Open' then
            commandArray[#commandArray+1]={[volet] = 'Off'}
            commandArray[#commandArray+1]={['UpdateDevice'] = otherdevices_idx[volet]..'|2|0'}
        else
            commandArray[#commandArray+1]={[volet] = 'On'}
            commandArray[#commandArray+1]={['UpdateDevice'] = otherdevices_idx[volet]..'|2|100'}
        end
    end
end

En ce qui concerne la partie du volet, je voulais aussi securiser dans le cas ou j'utilise le device du volet sans utiliser le dummy (la télécommande par exemple (WAF)). Soit j'empeche de l'utiliser, soit je detecte les changements et je calcul les pourcentage. Si c'est ouvert depuis plus du delai c'est facile. Mais dans le cas inverse...
Il faut que les valeurs de pourcentage se mettent a jour que quand la télécommande est utilisé(il faudra donc surement l'inclure avec le dummy). Le debut du code:

Code : Tout sélectionner


local delai=22
local volet='Volet Baie'
local dummy='Volet'
--Aux changements via la télécommande, il faut que je change le pourcentage du volet, du dummy et l'etat du dummy
if devicechanged[volet] then
    if lastSeen(volet)>delai then
        if otherdevices[volet]=='Open' then
            commandArray[#commandArray+1]={['UpdateDevice'] = otherdevices_idx[volet]..'|2|0'}
            commandArray[#commandArray+1]={['UpdateDevice'] = otherdevices_idx[dummy]..'|0|0'}
            commandArray[#commandArray+1]={['UpdateDevice'] = otherdevices_idx[dummy]..'|2|0'}
        else
            commandArray[#commandArray+1]={['UpdateDevice'] = otherdevices_idx[volet]..'|2|100'}
            commandArray[#commandArray+1]={['UpdateDevice'] = otherdevices_idx[dummy]..'|1|0'}
            commandArray[#commandArray+1]={['UpdateDevice'] = otherdevices_idx[dummy]..'|2|100'}
        end
    else--probleme ici le calcul fonctionnera si depart depuis 0 ou 100 mais en cas d'inverse
        local svalues = otherdevices_svalues[volet]
        if svalues~=0 or svalues~=100 then
            local calcul = math.floor((lastSeen(volet)*100)/delai)
            commandArray['UpdateDevice']=otherdevices_idx[dummy]..'|2|'..calcul
        end
    end
end
    

Il me reste a reflechir sur le fait d'arreter le volet dans son changement avec la télécommande avant la fin du delai. Une autre question posé cette cette nuit c'est si la télécommande est utiliser plein de fois a la suite ex: je suis ouvert totalement (donc fermé a 0%) je ferme avec la télécommande et j'arret le volet avec la télécommande. Ici pas de probleme par ce que le calcul et les mises a jours peuvent etre faites. Par contre si je decide que le volet n'est pas a la bonne position je renvoi des ordres. Ici, comme je me base sur le lastupdate, je pense que je peux avoir un trou.

Re: Transformer un blind en blind percent.

Publié : 11 mai 2018, 23:41
par papoo
en mémorisant le dernier ordre (montée ou descente) via une (des?) variable(s) tu pourrais calculer le % d'ouverture/fermeture du volet
exemple
derniere position 80% de fermeture
si variable_utilisateur == descente and ordre_montée == 30% then position 20%_ouverture + 30%_ordre_montée end

si variable_utilisateur == descente and ordre_descente == 5% then position 80%_fermeture +5%_ordre_descente end

je sais pas si c'est très clair comme explication et si c'est ce que tu recherche

Re: Transformer un blind en blind percent.

Publié : 12 mai 2018, 00:15
par papoo
une question, pk vouloir un volet modulant?
pk ne pas définir seulement une ou deux positions intermédiaire genre 25% et 75% ouverture?

Re: Transformer un blind en blind percent.

Publié : 12 mai 2018, 01:17
par landaisbenj
Parce que ça m'éclate xD. En vrai j'ai déjà une seule position juste au dessous du dossier du canapé après 15s ça me suffit. Mais c'est typiquement le genre de script que je peux développer alors je le fais lol xD

Merci beaucoup pour tes petites info je pense que c'est exactement le genre de point de vu qui va m'aider à avancer.

Par contre j'utiliserai pas une variable mais simplement le svalues du volet (qui existe sans vraiment exister). Ça fait économiser une variable lol

Re: Transformer un blind en blind percent.

Publié : 12 mai 2018, 12:05
par landaisbenj
Bon voila. Vu le retour de tekkharibo, j'ai pu developper le passage d'un pourcentage a un autre !!!
tekkharibo a écrit :(22/100*PourcentagePositionDemande)-(22/100*PourcentagePostionActuel)
Si ton résultat est > 0 c'est ton temps de descente si il est < 0 c'est ton temps de monté et il faudra le multiplier par-1

Si je ne me trompe pas c'est ca

Envoyé de mon SM-G935F en utilisant Tapatalk

Code : Tout sélectionner

elseif devicechanged[dummy]:match('(%a+) ', 0)=='Set' then
    --local valeur = devicechanged['Volet']:match('(%d+)')
    local pourcentageDummy = otherdevices_svalues[dummy]
    local pourcentageVolet = otherdevices_svalues[volet]
    local difference = math.abs(pourcentageDummy - pourcentageVolet)
    local temps = math.floor((difference*22)/100)
    if pourcentageDummy < pourcentageVolet then
        
        commandArray[#commandArray+1]={[volet] = 'Off'}
        commandArray[#commandArray+1]={[volet] = 'Off AFTER '..temps}
        commandArray[#commandArray+1]={['UpdateDevice'] = otherdevices_idx[dummy]..'|1|0'}
        
    else
        
        commandArray[#commandArray+1]={[volet] = 'On'}
        commandArray[#commandArray+1]={[volet] = 'On AFTER '..temps}
    
    
    end

Re: RE: Re: Transformer un blind en blind percent.

Publié : 12 mai 2018, 12:41
par tekkharibo
landaisbenj a écrit :Bon voila. Vu le retour de tekkharibo, j'ai pu developper le passage d'un pourcentage a un autre !!!
tekkharibo a écrit :(22/100*PourcentagePositionDemande)-(22/100*PourcentagePostionActuel)
Si ton résultat est > 0 c'est ton temps de descente si il est < 0 c'est ton temps de monté et il faudra le multiplier par-1

Si je ne me trompe pas c'est ca

Envoyé de mon SM-G935F en utilisant Tapatalk

Code : Tout sélectionner

elseif devicechanged[dummy]:match('(%a+) ', 0)=='Set' then
    --local valeur = devicechanged['Volet']:match('(%d+)')
    local pourcentageDummy = otherdevices_svalues[dummy]
    local pourcentageVolet = otherdevices_svalues[volet]
    local difference = math.abs(pourcentageDummy - pourcentageVolet)
    local temps = math.floor((difference*22)/100)
    if pourcentageDummy < pourcentageVolet then
        
        commandArray[#commandArray+1]={[volet] = 'Off'}
        commandArray[#commandArray+1]={[volet] = 'Off AFTER '..temps}
        commandArray[#commandArray+1]={['UpdateDevice'] = otherdevices_idx[dummy]..'|1|0'}
        
    else
        
        commandArray[#commandArray+1]={[volet] = 'On'}
        commandArray[#commandArray+1]={[volet] = 'On AFTER '..temps}
    
    
    end
Content que ça ai pu t'aider


Envoyé de mon SM-G935F en utilisant Tapatalk