Aller au contenu
manulemalin

Scene basé sur Geofencing

Recommended Posts

Bonjour

 

Pour commencé, sans vous raconter toute ma vie, je vous rassure, je placer le contexte ;-)

 

J'ai donc trois enfants. deux garçons dans une chambre et ma fille dans une autre le tout placé a l’étage...

J'ai un HC3, j'ai créer des profils (surtout pour le chauffage) sur la box qui sont les suivants :

Away    => tout le monde est sorti (je sais, c'est pas très original)   chauffage au ralenti

Seul      => il y a que moi                                                            chauffage qu'au rdc

garçons => les garçons sont là                                                     chauffage au rdc et dans leurs chambre (pas dans celle de ma fille)

Fille      => ma fille est là                                                             chauffage au rdc et dans sa chambre (pas dans celle des garçons)

tous     => Tous le monde est la                                                  chauffage partout

 

Maintenant que le décor est planté... la question qui tue !!!

 

J'ai créer 5 scènes (avec des blocs) avec le geofencing de l’application fibaro (qui fonctionne bien d’ailleurs) pour spécifié si tous le monde est la , personnes que les garçons etc...

Ça marche plutôt bien, sauf que vu qu'il y a 5 scènes, c'est un peux au bonheur la chance sur le lancement des profils (pauvre hc3... je lui en fait voir de toutes les couleurs!)

 

Du coup, pour qu'il n'y ai pas de mélange, je me suis dit qu'en faisant une seul scènes en LUA, ça serai plus facile a digérer (pour elle... moi je cherche encore à en comprendre le fonctionnement)

Si quelqu'un a créer ce genre de scènes ou ne serais-ce qu'un morceau pour me guider dans ma rédaction, j'en serais ravi

 

En vous remerciant de m'avoir lu jusqu'ici, déjà, et pour vos réponses ensuite

 

Merci

Modifié par manulemalin

Partager ce message


Lien à poster
Partager sur d’autres sites

Très clairement, les scènes blocs sont prévues pour des scénarios ultra simples, du genre si ... alors...

Du coup, tu as plusieurs scénarios, donc plusieurs scènes, une pour chaque scénario, c'est logique, simple, efficace.

Ne t'inquiète pas, ce ne sont pas 5 scènes en mode bloc qui vont mettre à genoux la HC3.

 

Si tu veux tout regrouper en une seule scène, je pense que le mode bloc n'est pas du tout adapté.

Le mieux est encore de faire ça avec GEA. Sans connaitre le LUA, tu peux écrire des règles prenant en compte différentes conditions, et effectuant les actions correspondantes, tout cela depuis un point unique (un QuickApp)

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Lazer, encore une fois pour ton aide

 

J'ai vu que tu avais poster une quick app GEA il y a quelque temps, mais je ne savais pas trop a quoi ça pouvais servir....

Je vais me pencher dessus

 

Merci et bonne soirée

Partager ce message


Lien à poster
Partager sur d’autres sites

vous parlez de geofencing...

 

je l'ai essayé, ça fonctionne très bien.

Sauf que là le rayon de détection minimum d'un point de localisation est de 150m...

c'est large, très large... trop large...

 

pas moyen de réduire ce rayon, même directement via l'API, si je rentre autre une valeur plus petite, il ne me l'accepte pas.

 

bien dommage :( 

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour la distance, je pensais comme toi au départ et puis en y réfléchissant, surtout que pour moi, c’est essentiellement pour le chauffage, ça évite que le chauffage se coupe lorsque je vais chercher le pain ... il se coupe que lorsque je m’éloigne vraiment ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

mouai dans ton cas, c'est un bon exemple.

Mais pour des gestion autres, (je pense à de l'éclairage, wifi, ...) ça peut être gênant...

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir @Lazer

 

Je me suis donc penché à plusieurs reprise sur le GEA afin de mettre en place la vérification des conditions de mes scenarios "blocks" d'entrée et sortie (le geofencing fonctionne bien sans ça, mais il faut que tous le monde rentre dans l'ordre dans la maison sinon ça déconne LOL pas pratique)

Je dois avouer être plutôt perdu malgré toutes les explications donnée sur les différentes fonctions dans l'app GEA

 

Je poste ma question ici plutot que dans la "section" de GEA, afin de voir le contexte de ma question (j'espere bien faire !)

 

j'ai mis ceci (voir en dessous) dans le coté "main", mais je sais pas ou renseigné ID de la scene (je suppose dans la premiere ligne : function GEA:check(30)  ), ni d'ailleur s'il faut reconpier la totalité de la fonction !!!

 

Je te remercie par avance de ta réponse

et désolé pour la taille de la capture du code... pas réussi à réduire plus

 

Emmanuel

 

-- --------------------------------------------------------------------------------
-- Vérifie une entrée pour s'assurer que toutes les conditions soient remplies
-- --------------------------------------------------------------------------------
function GEA:check(entry)

    if self.options.restarttask.getValue(entry.id) then
        self:reset(entry)
        self.stoppedTasks[entry.id] = nil
        self.globalvalue = self.globalvalue:gsub("|R_" .. entry.id.."|", ""):gsub("|S_" .. entry.id.."|", ""):gsub("|M_" .. entry.id .. "{(%d+)}|", "")
    end
    if self.options.stoptask.getValue(entry.id) then entry.stopped = true end
  
    if entry.stopped then
        if not self.stoppedTasks[entry.id] then tools.debug("   ["..self.trad.stopped.."] " .. entry.log) end
        self.stoppedTasks[entry.id] = true
    end
  
    -- test des conditions
    local ready = true
    for i = 1, #entry.conditions do
--tools.error("i = " .. i) -- DEBUG
        self.currentCondition = entry.conditions[i]
--for k, v in pairs(entry.conditions) do 
  
--tools.warning("k = " .. k .. " - v : " .. type(v) .. " => " .. tostring(v)) -- DEBUG 
  
--end 
  
        local result, _ = entry.conditions[i].check() 
  
        if self.lldebug then tools.warning("GEA:check() result = " .. tostring(result) .. ", " .. tostring(_), "blue") end -- DEBUG 
  
        ready = ready and result 
  
    end 
    
    if not entry.stopped then tools.debug("@" ..(self.nbRun*self.checkEvery) .. "s ["..self.trad.validate..tools.iif(ready, "*] ", "] ") .. entry.log) end 
    
    -- si toutes les conditions sont validées 
  
    if ready then 
  
--tools.error("ready") -- DEBUG 
  
        if entry.stopped then return end 
  
        if tools.isNil(entry.lastvalid) then entry.lastvalid = self.runAt end 
  
        if tools.isNil(entry.firstvalid) then entry.firstvalid = self.runAt end 
  
        if os.difftime(self.runAt, entry.lastvalid) >= entry.getDuration() then 
  
            entry.count = entry.count + 1 
  
            entry.lastvalid = self.runAt 
  
            tools.info("   ["..self.trad.start_entry.."] " .. entry.log, "green") 
  
            -- gestion des actions 
  
            for i = 1, #entry.actions do 
  
                self.currentAction = entry.actions[i] 
  
                tools.debug("        ["..self.trad.action.."] " .. self:getMessage(entry.actions[i].getLog(), nil, true)) 
  
                if self.secureAction then 
  
                    local status, err = pcall(function() entry.actions[i].action() end) -- Lazer 
  
                    if not status then 
  
                        if self.debug then 
  
                            tools.error(err, "red") 
  
                        end 
  
                        tools.error(self.trad.err_check .. entry.actions[i].getLog(), "red") 
  
                        self:addHistory(self.trad.err_check .. entry.simplelog) 
  
                    end 
  
                else 
  
                    entry.actions[i].action() 
  
                end 
  
            end 
  
            -- envoi message push 
  
            if entry.message ~= "" then 
  
                if type(self.output)~="function" then 
  
                    for i = 1, #entry.portables do 
  
                        local status, err = pcall(function() self:getOption({"Portable", entry.portables[i], self:getMessage()}).action() end) 
  
                        if not status then 
  
                            if self.debug then 
  
                                tools.error(err, "pink") 
  
                            end 
  
                        end 
  
                    end 
  
                else 
  
                    -- Message push personnalisé 
  
                    self.output(self:getMessage()) 
  
                end 
  
            end 
  
            entry.runned = true 
  
            -- mise à jour des écoutes -- 
  
            for i=1, #entry.listeners do self:findEntry(entry.listeners[i]).isWaiting[entry.id] = false end 
  
            -- remise à zéro des attente -- 
  
            for i=1, #entry.isWaiting do entry.isWaiting[i] = true end 
  
            -- Vérification du MaxTime 
  
            if entry.maxtime > 0 then 
  
                local timeleft = self.options.maxtime.getValue(entry.id) 
  
                if not timeleft then 
  
                    self.options.maxtime.action(entry.id, entry.maxtime-1) 
  
                else 
  
                    timeleft = tonumber(timeleft) 
  
                    self.options.maxtime.action(entry.id, timeleft-1) 
  
                end 
  
            end 
  
            self:addHistory(entry.simplelog) 
  
            if not entry.repeating then entry.stopped = true end 
  
        end 
  
    else 
  
        self:reset(entry) 
  
    end 
  
    return ready 
  
end 
  

  
 

 


 

Modifié par manulemalin

Partager ce message


Lien à poster
Partager sur d’autres sites

Euh... je suis pas sûr de comprendre là (ton code est illisible, il faut utiliser les balises d'insertion de code dans l'éditeur du forum).

Mais si tu as modifié le code de GEA, ça ne va pas du tout, il ne faut modifier que le fichier config comme indiqué dans le tuto

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci de ta réponse

J'ai supprimé le code puisque illisible... Et vu ta réponse de toute façons, ce n’était pas ça !

 

Je cherche a mettre dans le fichier config les commandes pour demander de vérifier régulièrement  si toute les conditions d'une scène sont rempli (et de l'effectué si c'est vrai) car si je met une des conditions comme déclencheur, les différentes scènes ne s'active qu'au fur et a mesure de l’entrée des différentes personnes (si mon fils rentre en premier, sa chambre se met en chauffe, mais si je rentre ensuite, il n'y a plus que le rdc (prévu lorsqu’il n'est pas chez moi).

J’espère avoir été assez clair dans mon explication

 

Si ce n'est pas trop long et que tu en as le temps je serai preneur des lignes de commande "type" que j'adapterai

 

Merci de ton aide

 

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est compliqué ta demande.... je n'ai pas suivi honnêtement

 

Des lignes types, tu en as dans la config de base (4 pour être précis)

Et des milliers dans les différents sujets, il faut vraiment que tu commences par prendre le temps de lire le sujet officiel de @Steven, qui contient également la doc de syntaxe de @pepite

Tu as aussi des "showroom GEA" sur le forum avec tous les exemples des forumeurs.

 

C'est tout simple. Tu commences par des lignes basique (tu type "si... alors", exemple si la lumière est allumée depuis 30s, alors éteindre), puis tu augmente la complexité en fonction de tes besoins

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir

 

Je vais suivre ton conseil et reprendre la lecture (j'avais commencé, puis ca m a embrouillé lol)

 

Merci d'avoir pris le temps de me répondre

Partager ce message


Lien à poster
Partager sur d’autres sites

×