Aller au contenu
Krikroff

Gestion des appareils enfants

Recommended Posts

Bon les gars... faites une simple table de mapping dans le parent pour associer les child;)

 

Le problème des ids c’est plus général comme sujet, le QA lui même change d’ID en cas de mise à jour. J’ai ouvert un ticket pour demander une prise en charge d’une vraie mise à jour et pas un sup/ajout...

 

[mention]Lazer [/mention] toujours pas certain de bien comprendre, tu veux gérer quoi avec les variables dans tes childs que tu ne peux pas gérer dans le parent ?

 

 

Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

 

ahhhh je pige pas un truc : 

 

pour accéder a une variable parent depuis l'enfant, on a vu que :

self.parent:getVariable("MaVar")

fonctionne très bien :

 

exemple typique pour le TurnOff d'une sortie de l'IPX  : 

on voit dans cette exemple que j'accède à 2 variables "parent" (IP et PASSWORD) et une variable du "Child" (D_OUTPUT)

tout ça depuis la méthode TurnOff de la classe IPX.

function IPX:turnOff()
    self:debug("child", self.id, "turned off")

    local http = net.HTTPClient({timeout=3000})
        http:request("http://"..self.parent:getVariable("IP").."/preset.htm?set"..self:getVariable("D_OUTPUT").."=0",
        {
            options = {
                headers = {['Authorization']='Basic '..self.parent:getVariable("PASSWORD")},
                method = 'GET'
            },  
            success = function(response) end, 
            error = function(err) self:error(tostring(err)) end
        })
end

 

mais POURQUOI LA

dans une autre méthode de la même classe j'ai cette erreur ? :

Citation

[ERROR] [QUICKAPP528]: line: 97 attempt to index a nil value (field 'parent')

la ligne 97 est la ligne avec le http:request()

function IPX:Ask_State()
        local http = net.HTTPClient({timeout=3000})
        self:warning(self.parent:getVariable("IP"))
        http:request("http://"..self.parent:getVariable("IP").."/api/xdevices.json?cmd=20",
        {
            options = {
                headers = {['Authorization']='Basic '..self.parent:getVariable("PASSWORD")},
                method = 'GET'
            },  
            success = function(response) self:Find_Out(response.data) end,
            error = function(response) self:error(tostring(response)) end
        })
end

 

???????

 

EDIT : je précise que cette méthode est appelée dans le code "__init" du "Child"

 

function IPX:__init(device)
    QuickAppChild.__init(self, device) 

    self:debug(self.id , "MyBinarySwitch init")
    self:Ask_State()
end

 

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

 

il y a 10 minutes, jjacques68 a dit :

EDIT : je précise que cette méthode est appelée dans le code "__init" du "Child" 

 


function IPX:__init(device)
    QuickAppChild.__init(self, device) 

    self:debug(self.id , "MyBinarySwitch init")
    self:Ask_State()
end

 

Peu être ça le problème... tu as essayé en le sortant du Init ? ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

oui, je me suis rendu compte que le "__init" n'était pas pareil que le "onInit", qui peut être déclaré également dans la classe

même erreur

 

class 'IPX' (QuickAppChild)

function IPX:__init(device)
    QuickAppChild.__init(self, device) 
    self:debug(self.id , "MyBinarySwitch init")
end

function IPX:onInit()
    self:debug(self.id, "onInit")
    self:trace(self.parent:getVariable("IP"))
end
[17.05.2020] [11:09:00] [DEBUG] [QA_528_CHILD]: 552 onInit
[17.05.2020] [11:09:01] [ERROR] [QUICKAPP528]: QuickApp crashed
[17.05.2020] [11:09:01] [ERROR] [QUICKAPP528]: line: 47 attempt to index a nil value (field 'parent')

 

je m'étais dis que les variables parents n'étaient accessible que depuis les "actions" prédéfinies comme "turnOn" et "turnOff", mais non j'en une méthode où ça fonctionne très bien !!

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

IPX c'est une classe de ton device enfant ?

Partager ce message


Lien à poster
Partager sur d’autres sites

oui tout à fait : 

 

voilà le debut du code : 

 

---------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------
-- INIT PARENT
---------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------
function QuickApp:onInit()
    __TAG = "QA_"..self.id.."_Child"
    self:debug("QuickApp:onInit")
    self:initChildDevices({
        ["com.fibaro.binarySwitch"] = IPX,
    })
    self:debug("Child devices:")
    for id,device in pairs(self.childDevices) do self:debug("[", id, "]", device.name, ", type of: ", device.type) end
end


---------------------------------------------------------------------------------------
-- CREAT CHILD
---------------------------------------------------------------------------------------
function QuickApp:createChild(name, type, uid)
    local child = self:createChildDevice({
        name = "ECL OUEST",
        type = "com.fibaro.binarySwitch",
    }, IPX)

    child:setVariable("D_OUTPUT", "5")
    self:trace("Child device created: ", child.id)
end

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- CLASS IPX
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class 'IPX' (QuickAppChild)

----------------------------------------------------
-- ON INIT
----------------------------------------------------
function IPX:__init(device)
    QuickAppChild.__init(self, device) 
    self:debug(self.id , "MyBinarySwitch init")
end

function IPX:onInit()
    self:debug(self.id, "onInit")
    self:trace(self.parent:getVariable("IP"))
end

 

Partager ce message


Lien à poster
Partager sur d’autres sites

As-tu juste essayé ta méthode toute seule, par exemple dans un bouton ?

Partager ce message


Lien à poster
Partager sur d’autres sites

euh... tu peux pas ajouter un bouton dans le chlid... si ?

 

Mais dans le turnOn/Off ça marche super bien !

Partager ce message


Lien à poster
Partager sur d’autres sites

et puis là je cherche même plus à utiliser la méthode, je fait un simpe self:debug()...

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour moi tout ton code devrait être dans ton parent et pas dans ton enfant...

Tu réglerais tout tes problèmes, te faciliterais la vie pour plus tard car selon moi un child ne doit pas embarquer ou peu intelligence.

 

Pour ton problème de parent, je pense simplement qu'il n'est pas possible d'y accéder dans un init ( comportement qui me semblerai attendu ). Si c'est bien le cas, alors il y a un Hack possible avec un SetTimeout ;)

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites
à l’instant, Krikroff a dit :

Pour moi tout ton code devrait être dans ton parent et pas dans ton enfant...

on se comprend pas là, tout le code EST dans le QA parent.

 

La classe IPX est déclarée dans le QA parent, de toute façon on a pas le choix !

il n'y a pas d'éditeur de code pour les "Child".

Partager ce message


Lien à poster
Partager sur d’autres sites
on se comprend pas là, tout le code EST dans le QA parent.

Si j'ai compris, juste que ton code est dans la classe de ton enfant (déclarée dans le parent)

Partager ce message


Lien à poster
Partager sur d’autres sites

mais c'est pas comme ça qu'il faut faire ?

je vois pas autrement...

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu peux le faire sans problème mais au final cela va t’amener plus de complications et des problèmes de maintenance, de gestion des ressources notamment.

Ex: 1 client HTTP mutualisé au niveau du parent est suffisant pour tous les enfants.

Le parent doit être l’orchestrateur du QA, c’est lui qui doit tout gérer, fournir... Enfin c’est ma vision des choses


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 52 minutes, jjacques68 a dit :

 

EDIT: I specify that this method is called in the "__init" code of "Child"

 


 
 

 

self.parent est attribué une fois que __init est terminé.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

C’est bien ce que j’ai dis précédemment


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 3 minutes, Krikroff a dit :

Le parent doit être l’orchestrateur du QA, c’est lui qui doit tout gérer, fournir... Enfin c’est ma vision des choses emoji4.png

ben je voie pas comment faire autrement.

d'après ce que je lis de la doc et le pseudo bout de code fourni à la création du QA...

 

surtout que ça marche pour certaines choses et pas pour d'autres....

J'ai supprimer entièrement le QA parent et du coup les child on suivit avec (heuresement).

Et tout recréé, mais pareil.

 

Je poste le code complet du QA, si qqun est motivé, mais je vois vraiment pas où est l'erreur...

 

---------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------
-- INIT PARENT
---------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------
function QuickApp:onInit()
    __TAG = "QA_"..self.id.."_Child"
    self:debug("QuickApp:onInit")
    self:initChildDevices({
        ["com.fibaro.binarySwitch"] = IPX,
    })
    self:debug("Child devices:")
    for id,device in pairs(self.childDevices) do self:debug("[", id, "]", device.name, ", type of: ", device.type) end
end

---------------------------------------------------------------------------------------
-- CREAT CHILD - appelé par le bouton pour créer le child
---------------------------------------------------------------------------------------
function QuickApp:createChild(name, type, uid)
    local child = self:createChildDevice({
        name = "ECL OUEST",
        type = "com.fibaro.binarySwitch",
    }, IPX)

    child:setVariable("D_OUTPUT", "5")
    self:trace("Child device created: ", child.id)
end

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- CLASS IPX
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class 'IPX' (QuickAppChild)

----------------------------------------------------
-- ON INIT
----------------------------------------------------
function IPX:__init(device)
    QuickAppChild.__init(self, device) 
    self:debug(self.id , "MyBinarySwitch init")
end

function IPX:onInit()
    self:debug(self.id, "onInit")
    --************** DECONNE ICI ******************************
    self:trace(self.parent:getVariable("IP"))
    --*********************************************************
end

----------------------------------------------------
-- TURN ON
----------------------------------------------------
function IPX:turnOn()
    self:debug("child", self.id, "turned on")

    local http = net.HTTPClient({timeout=3000})
        http:request("http://"..self.parent:getVariable("IP").."/preset.htm?set"..self:getVariable("D_OUTPUT").."=1",
        {
            options = {
                headers = {['Authorization']='Basic '..self.parent:getVariable("PASSWORD")},
                method = 'GET'
            },  
            success = function(response) end, 
            error = function(err) self:error(tostring(err)) end
        })
end

----------------------------------------------------
-- TURN OFF
----------------------------------------------------
function IPX:turnOff()
    self:debug("child", self.id, "turned off")

    local http = net.HTTPClient({timeout=3000})
        http:request("http://"..self.parent:getVariable("IP").."/preset.htm?set"..self:getVariable("D_OUTPUT").."=0",
        {
            options = {
                headers = {['Authorization']='Basic '..self.parent:getVariable("PASSWORD")},
                method = 'GET'
            },  
            success = function(response) end, 
            error = function(err) self:error(tostring(err)) end
        })
end

----------------------------------------------------
-- reçoit le retour d'état de l'IPX (executé par le push de l'IPX)
----------------------------------------------------
function IPX:ReceiveState(status)
    if status == 1 then
        self:updateProperty("value", true)
    else
        self:updateProperty("value", false)
    end
end

----------------------------------------------------
-- demande le status à l'init du Child (recoit le status complet)
----------------------------------------------------
function IPX:Ask_State()
        local http = net.HTTPClient({timeout=3000})
        self:warning(self.parent:getVariable("IP"))
        http:request("http://"..self.parent:getVariable("IP").."/api/xdevices.json?cmd=20",
        {
            options = {
                headers = {['Authorization']='Basic '..self.parent:getVariable("PASSWORD")},
                method = 'GET'
            },  
            success = function(response) self:Find_Out(response.data) end,
            error = function(response) self:error(tostring(response)) end
        })
end

-------------------------------------------------------------------------------------
-- fonction trouve le status du QA spécifique
-------------------------------------------------------------------------------------
function IPX:Find_Out(response)
    local MyTable = json.decode(response)
    local MyState = ""
    for Out,Value in pairs(MyTable) do
        if Out == "OUT"..self:getVariable("D_OUTPUT") then
            if Value == 1 then
                self:updateProperty("value", true)
            else
                if Value == 0 then
                     self:updateProperty("value", false)
                else
                    self:error("unknowm state for OUTPUT "..self:getVariable("D_OUTPUT"))
                end
            end
        end
    end
end



---------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------
-- action sur le bouton Create dans le parent
---------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------
function QuickApp:NewChild()
    self:createChild()
end

 

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 2 minutes, jang a dit :

self.parent est attribué une fois que __init est terminé.

ah OK ! ben fallait le savoir ça !

 

oui du coup ça rejoint ce que du disais @Krikroff

Partager ce message


Lien à poster
Partager sur d’autres sites

Nb [mention]jang [/mention] je sais comment Hack le onAction et UIEvent si cela t’intéresse ;)


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

extrapoler, extrapoler, extrapoler, extrapoler, extrapoler, extrapoler, extrapoler, extrapoler, extrapoler :wacko:

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites
Krikroff said:

Nb [mention] jang [/ mention] I know how to Hack the onAction and UIEvent if that interests you ;)


Sent from my iPhone using Tapatalk

Je l'ai déjà résolu :)

Partager ce message


Lien à poster
Partager sur d’autres sites

avec le refresh state ? Ou bien en utilisant ce qui ce cache derrière ?


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

hallucinant

 

dans le "__init", comme ça, ça plante

 

self:trace(self.parent:getVariable())

mais avec ça, c'est ok :

fibaro.setTimeout(1, function() self:trace(self.parent:getVariable()) end)

avec 1 ms de delay...

Partager ce message


Lien à poster
Partager sur d’autres sites




Envoyé de mon iPhone en utilisant Tapatalk

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×