Aller au contenu
Nono007

Mise a jour d'un enfant via le parent

Recommended Posts

Bonjour

 

 Je viens de prendre en main ma HC3 et j'ai commencé a lire toutes vos publications, exemple ,.. afin de comprendre les nouvelles logique.

Je ne suis pas un grand développeur, mais j'aime bien me faire mes scripts, pas très propre :( mais qui répondent à mes besoin.

 

Bref je me suis lancé a faire une Quick App qui va récupérer en base de données, 6 capteurs de température (1wire). Pour cela j'avais déjà avec la HC2, un PHP me retournant un Json.

Ma première version, je récupère bien les data, mis en variable Quick App puis affichage.

Mais impossible de récupérer ces variables simplement, et oui elle, ce n'est pas des VG HC2.

 

Puis je tombe sur les échanges concernant les Enfants, je m'inspire de quelques exemple, dont : 

 

  Magnifique mes 6 Childs de type com.fibaro.temperatureSensor sont crées. Mais il reste a les alimenter

 

Si je comprend bien, une class propre à ce type de capteur est définie et instanciée pour chaque enfant.

Puis on y ajoute des méthodes .

 

Voici une partie  du code, avec la class "OneWire18B20" et l'initialisation des enfants

 


function QuickApp:onInit()
    self.http = net.HTTPClient({timeout=10000})
    -- Initialisation des appareils enfants
    self:initChildDevices({["com.fibaro.temperatureSensor"] = OneWire18B20})
   -- Verification de la présence des 6 enfants
    local i = 0
    self.temperatureSensor = {}
    for id,device in pairs(self.childDevices) do
        i=i+1
        self:debug("[", id, "]", device.name, ", type of: ", device.type)
        self.temperatureSensor[i] = id
        --self.relais[i] = id
    end
    if i == 0 then 
       local Nom = "Temp Chambre"
       self:createChild(Nom)
       Nom = "Temp Salon"
       self:createChild(Nom)
       Nom = "Temp Cuisine"
       self:createChild(Nom)
       Nom = "Temp Exterieur"
       self:createChild(Nom)
       Nom = "T Freezer"
       self:createChild(Nom)
       Nom = "T Réfregirateur"
       self:createChild(Nom)
    end
    self:loop("")
end
-------------------------------------------------------------------------------------
-- Création d'un nouvel appareil enfant
-------------------------------------------------------------------------------------
function QuickApp:createChild(Nom)
    -- Print all child devices.
    self:debug("Child devices:")
    for id,device in pairs(self.childDevices) do
        self:debug("[", id, "]", device.name, ", type of: ", device.type)
    end
        local child = self:createChildDevice({
        name = Nom,
        type = "com.fibaro.temperatureSensor",
    }, OneWire18B20)
 
    self:trace("Child device created: ", child.id)
end


--Définition d'une méthode pour de nouvelles classes
-------------------------------------------------------------------------------------
-- Exemple de classe pour gérer votre logique de commutation binaire. Vous pouvez créer autant de classes que vous le souhaitez.
-- Chaque type de périphérique que vous créez doit avoir sa propre classe qui hérite du type QuickAppChild.
class 'OneWire18B20' (QuickAppChild)
 
-- __init est un constructeur pour cette classe. Toutes les nouvelles classes doivent l'avoir
function OneWire18B20:__init(device)
    -- Vous ne devez pas insérer de code avant QuickAppChild.__init.
    QuickAppChild.__init(self, device) -- Nous devons appeler un constructeur de la classe parente
    self:trace("OneWire18B20 init", device.name)  
end

function OneWire18B20:UpdateTemp(temperature)
        self:trace("DEBUG OneWire18B20:UpdateTemp")
       self:updateProperty("value", temperature) 
end

 

Mais je ne comprend pas comment appeler cette méthode, pour chaque enfants instanciés.

 

Pour le moment je passe par un call en passant l'ID et en passant la valeur

fibaro.call(56"updateProperty""value", temperture)

, mais je trouve dommage de ne pas passer par la méthode de la class, ce qui serait plus logique.

 

N'étant pas très familier avec le lua, je dois manquer quelque chose.

 

 Merci pour votre aide et m'aider a comprendre. :-)

 

 

 

 

 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu pourrais regarder cette discussion, car la fonction push() que je crée sur mes enfants est utilisée aussi bien pour une mise à jour depuis l'API, que depuis le parent lui-même.

 

 

Dans ton cas, ta fonction UpdateTemp() est similaire à ce que fait ma fonction push()

 

 

Pour l'appeler pour chaque enfant instancié, il faut que tu parcoure ta table des enfants avec :

for _, child in pairs(self.childDevices) do
	child:UpdateTemp(value)
end

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour

 

 Merci @Lazer, ça semble bien plus clair :-), pourquoi j'ai pas essayé tous simplement la boucle sur le childDevices, et y mettre mes conditions pour affecter la bonne température au bon child 

Je vais regarder ça ce soir.

 

 Merci

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour

 

  Avec un peu de retard, je vous confirme que j'ai réussi a faire ce que je souhaitais, merci pour l'aide.

 

J'ai donc fait une fonction qui prend en paramètre la température d'un capteur, et son ID, la fonction scan les child pour trouver le bon et lance la méthode pour update la value.

 

Il y a certainement plus propre mais pour le moment ça me convient car ce n'est pas une QuickApp "générique" a ma situation

 

 Je vous souhaite de passer de bonnes fêtes 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Sur la désactivation d'un parent peut on envisager dans le Init() d'un QA de mettre les devices enfants disabled ?

if not api.get("/devices/"..tostring(self.id)).enabled then

	for _, child in pairs(self.childDevices) do
    		child:updateProperty("enabled", false)
	end
end

je dois pas bien m'y prendre car enabled reste à true  

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 9 heures, henri-allauch a dit :

Sur la désactivation d'un parent peut on envisager dans le Init() d'un QA de mettre les devices enfants disabled ?


if not api.get("/devices/"..tostring(self.id)).enabled then

	for _, child in pairs(self.childDevices) do
    		child:updateProperty("enabled", false)
	end
end

je dois pas bien m'y prendre car enabled reste à true  

It's not a. 'property'

if not api.get("/devices/"..self.id).enabled then
    for _,child in pairs(self.childDevices) do
       child:setEnabled(false) 
    end
end

 

or (both ways):

local enabled = api.get("/devices/"..self.id).enabled
for _,child in pairs(self.childDevices) do
  child:setEnabled(enabled) 
end

self:setEnabled(bool) is the same as

api.post("/devices/"..self.id,{enabled=bool==true})

 

'enabled' doesn't stop the QA from running, you have to enforce that yourself (ex. in QuickApp:onInit() )

 

Ex.

function QuickApp:onInit()
  if not __fibaro_get_device(self.id).enabled then  
    self:debug("QA ",self.name," disabled")
    return 
  end
  :
  :
end

 

Modifié par jang
  • Like 1
  • Thanks 1
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Est ce que :


if not api.get("/devices/"..self.id).enabled then
    for _,child in pairs(self.childDevices) do
		child:setEnabled(false) 
		child:setVisible(false)
    end
end

C'est correct ? 

Pour setEnabled c'est OK mais pour setVisible ?

J'ai essayé sans succès, l'idée c'est de mettre les childs disabled et non visible si le QA est disable

Modifié par henri-allauch

Partager ce message


Lien à poster
Partager sur d’autres sites

child:setVisible(false) works for me, but I need to refresh the web GUI. I haven't tried the app.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

×