Nono007 Posté(e) le 22 décembre 2020 Signaler Posté(e) le 22 décembre 2020 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. :-)
Lazer Posté(e) le 22 décembre 2020 Signaler Posté(e) le 22 décembre 2020 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
Nono007 Posté(e) le 23 décembre 2020 Auteur Signaler Posté(e) le 23 décembre 2020 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
Nono007 Posté(e) le 27 décembre 2020 Auteur Signaler Posté(e) le 27 décembre 2020 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
henri-allauch Posté(e) le 28 mai 2021 Signaler Posté(e) le 28 mai 2021 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
jang Posté(e) le 29 mai 2021 Signaler Posté(e) le 29 mai 2021 (modifié) 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é le 29 mai 2021 par jang 1 1 1
henri-allauch Posté(e) le 29 mai 2021 Signaler Posté(e) le 29 mai 2021 je n'avais pas assez réfléchi Merci @jang
henri-allauch Posté(e) le 13 juin 2021 Signaler Posté(e) le 13 juin 2021 (modifié) 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é le 13 juin 2021 par henri-allauch
jang Posté(e) le 13 juin 2021 Signaler Posté(e) le 13 juin 2021 child:setVisible(false) works for me, but I need to refresh the web GUI. I haven't tried the app.
henri-allauch Posté(e) le 13 juin 2021 Signaler Posté(e) le 13 juin 2021 yes it's OK by refreshing the web interface thank you @jang
Messages recommandés