Bloug Posté(e) le 29 janvier 2023 Auteur Signaler Partager Posté(e) le 29 janvier 2023 Bon là c'est d'un autre niveau ! En tout cas Bravo ! Il y a 15 heures, mprinfo a dit : Dans sa librairie il y a un exemple j'ai jamais trop cherché a regarder ... surement la peur de voir le loup ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bloug Posté(e) le 29 janvier 2023 Auteur Signaler Partager Posté(e) le 29 janvier 2023 @jang I just did a test with your example library and .... You did it again ! At the first recording of the main I have the creation of the children. At the next recording there is again the creation of 6 additional children . Is it still a problem with my Hc3 !? Lien vers le commentaire Partager sur d’autres sites More sharing options...
jang Posté(e) le 29 janvier 2023 Signaler Partager Posté(e) le 29 janvier 2023 Well, of course there was a small problem with my code.... Try this version The load and creation of children is protected with a pcall. do local childID = 'ChildID' local classID = 'ClassName' local defChildren local children = {} local undefinedChildren = {} local createChild = QuickApp.createChildDevice class 'QwikAppChild'(QuickAppChild) function QwikAppChild:__init(device) QuickAppChild.__init(self, device) self:debug("Instantiating object ",device.name) local uid = self:getVariable(childID) or "" if defChildren[uid] then children[uid]=self -- Keep table with all children indexed by uid. uid is unique. else -- If uid not in our children table, we will remove this child undefinedChildren[#undefinedChildren+1]=self.id end end function QuickApp:createChildDevice(uid,props,interfaces,className) __assert_type(uid,'string') __assert_type(className,'string') props.initialProperties = props.initialProperties or {} local qas = {{name=childID,value=uid},{name=classID,value=className}} props.initialProperties.quickAppVariables = qas props.initialInterfaces = interfaces self:debug("Creating device ",props.name) return createChild(self,props,_G[className]) end local function getVar(child,varName) for _,v in ipairs(child.properties.quickAppVariables or {}) do if v.name==varName then return v.value end end return "" end function QuickApp:loadExistingChildren(chs) __assert_type(chs,'table') local stat,err = pcall(function() defChildren = chs self.children = children function self.initChildDevices() end local cdevs,n = api.get("/devices?parentId="..self.id) or {},0 -- Pick up all my children for _,child in ipairs(cdevs) do local uid = getVar(child,childID) local className = getVar(child,classID) local childObject = _G[className] and _G[className](child) or QuickAppChild(child) self.childDevices[child.id]=childObject childObject.parent = self end end) if not stat then self:error("loadExistingChildren:"..err) end end function QuickApp:createMissingChildren() local stat,err = pcall(function() for uid,data in pairs(defChildren) do if not self.children[uid] then local props = { name = data.name, type = data.type, } self:createChildDevice(uid,props,data.interfaces,data.className) end end end) if not stat then self:error("createMissingChildren:"..err) end end function QuickApp:removeUndefinedChildren() for _,deviceId in ipairs(undefinedChildren) do -- Remove children not in children table self:removeChildDevice(deviceId) end end end ------------------------------- -- 1 - Definition of class ------------------------------- class 'Class_Temp'(QwikAppChild) -- Class NOM_Temps pour "com.fibaro.temperatureSensor" ------------------------------- -- 2 - Class constructor ------------------------------- function Class_Temp:__init(device) QwikAppChild.__init(self, device) end -------------------------------- -- 3 - Definition of children -------------------------------- local myChildren = { -- Unique ID (uid) -> child initialization data, in our case the name ["Child_Temps1"] = { name="Température1", type="com.fibaro.temperatureSensor", className='Class_Temp', interfaces = {'battery'}, }, ["Child_Temps2"] = { name="Température2", type="com.fibaro.temperatureSensor", className='Class_Temp', interfaces = {'battery'}, }, ["Child_Temps3"] = { name="Température3", type="com.fibaro.temperatureSensor", className='Class_Temp', interfaces = {'battery'}, }, ["Child_Temps4"] = { name="Température4", type="com.fibaro.temperatureSensor", className='Class_Temp', interfaces = {'battery'}, }, ["Child_Temps5"] = { name="Température5", type="com.fibaro.temperatureSensor", className='Class_Temp', interfaces = {'battery'}, }, ["Child_Temps6"] = { name="Température6", type="com.fibaro.temperatureSensor", className='Class_Temp', interfaces = {'battery'}, }, } -------------------------------- -- 4 - Initialization of children -------------------------------- function QuickApp:onInit() self:loadExistingChildren(myChildren) self:createMissingChildren() self:removeUndefinedChildren() self:update_child("Child_Temps5") -- example, update child with uid 'Child_Temps5' -- for uid,_ in pairs(self.children) do -- update all children -- self:update_child(uid) -- end end -------------------------------- -- 5 - Accessing children -------------------------------- function QuickApp:update_child(uid) local default_temp = 37 --- pour l'ex du tuto local default_log = " I'm bad " --- pour l'ex du tuto self.children[uid]:updateProperty("value", default_temp) self.children[uid]:updateProperty("log", default_log) end Lien vers le commentaire Partager sur d’autres sites More sharing options...
lamparo Posté(e) le 29 janvier 2023 Signaler Partager Posté(e) le 29 janvier 2023 Bonsoir à tous, superbe tuto, un grand merci @Bloug. Mais juste une question, à part le fait que ce soit un enfant, ça sert à quoi un "child"???? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 29 janvier 2023 Signaler Partager Posté(e) le 29 janvier 2023 à payer les retraites des "old" C'est un QuickApp enfant, ça permet de puis un QuickApp parent de gérer plusieurs enfants, avec le même code LUA. Exemples : Une station Netatmo : un module parent qui va chercher les infos sur le cloud Netatmo, et qui met à jour tous les enfants, avec un enfant pour chaque capteur : température, humidité, pression, etc Lien vers le commentaire Partager sur d’autres sites More sharing options...
jjacques68 Posté(e) le 31 janvier 2023 Signaler Partager Posté(e) le 31 janvier 2023 bravo pour ce tuto !! Lien vers le commentaire Partager sur d’autres sites More sharing options...
TitiXsi Posté(e) le 17 août 2023 Signaler Partager Posté(e) le 17 août 2023 (modifié) Hello, bravo pour le détail, j'ai une question naïve ... Comment trouver la liste des Types disponible pour les Childs ? Merci Edit : Je crois que j'ai trouvé : https://manuals.fibaro.com/document/hc3-quick-apps/ Modifié le 17 août 2023 par TitiXsi Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 17 août 2023 Signaler Partager Posté(e) le 17 août 2023 En fait la liste officielle est sur l'API de ta box : /api/quickApp/availableTypes En pratique, on a même constaté que tu peux utiliser certains types non listés dans l'API précédente. C'est à dire qu'un QuickApp peut utiliser n'importe quel type disponible sur la box, incluant donc tous les types des différents modules Z-Waves, Zigbee, etc. Voir : /api/devices/hierarchy En plus cette dernière liste a le bon gout d'être hiérarchisée, ce qui est intéressant pour découvrir les relations entre les modules de type proche. 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
jang Posté(e) le 19 août 2023 Signaler Partager Posté(e) le 19 août 2023 (modifié) and if you run hierarchy through graphviz... Modifié le 19 août 2023 par jang 2 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés