Aller au contenu

Gestion des appareils enfants


Krikroff

Recommended Posts

COMPORTEMENT ETRANGE :

 

j'ai une simple boucle le soir qui doit m'éteindre toute les lumières  (device avec catégories "Lights", donc y compris les Child de l'IPX) :

 

--Extiction lumières
for i = 1, #ListeDevice do
    if ListeDevice[i].properties.categories and ListeDevice[i].properties.categories[1] == "lights" then
        fibaro.call(ListeDevice[i].id, "turnOff")
        fibaro.sleep(50)
    end
end

je sais pas si c'est depuis que j'ai passé l'IPX sur Child Device (ou depuis la dernière mise à jour),

mais j'ai dû ajouter une tempo de 50 ms,

car systématiquement 1 Chlid device (toujours le même en plus, le deuxième) n'était pas éteint.

 

Vous avez une idée ?

 

EDIT : même sans passer par une boucle, faire un turnOff (ou On) sur 3 Child (de l'IPX)  juste l'un derrière l'autre, sans temporisation, me fait le même bug !!!???

 

@Lazer, j'aimerais bien savoir si tu constates la même chose ? du moins si ton installation le permet...

Modifié par jjacques68
Lien vers le commentaire
Partager sur d’autres sites

  • 2 weeks later...

@Krikroff, bonjour, j'ai une question concernant les appareils enfants...

 

dans le contexte d'un QA Heos, je voudrais créer autant d'enfants que de devices HEOS installés. 

Bien que l'ensemble de la gestion des commandes et des messages de retour se fasse via le QA Master, je voudrais que chaque enfant puisse avoir des boutons (exemple : Play/Pause/Start/Volume, etc) de manière à pouvoir gérer le volume et le titre écouté sur chaque device. 

 

Est-ce que tu crois qu'il est possible (et si oui, comment ?) d'avoir des childs avec des boutons ? 

Comme je ne vois qu'il n'y a aucun moyen de le faire via l'interface, il y a peut-être moyen par un bout de code ? 

 

Par exemple, je vois que le QA dispo pour HEOS par défaut dans la box permet de faire ca comme il le faisait sur la HC2, mais dommage que ce QA ne fonctionne pas bien du tout :-)

 

merci à toi

Lien vers le commentaire
Partager sur d’autres sites

Il y a 2 heures, Cardane a dit :

Est-ce que tu crois qu'il est possible (et si oui, comment ?) d'avoir des childs avec des boutons

 Oui, ça s'appelle l'acné. :98:

 

  • Like 1
  • Haha 4
Lien vers le commentaire
Partager sur d’autres sites

Lol [mention]Did [/mention] j’adore [emoji23][emoji23]

[mention]Cardane [/mention] malheureusement ce n’est pas encore disponible et c’est dommage c’était faisable dès le départ avec les plugins utilisateurs... faut attendre.


Envoyé de mon iPhone en utilisant Tapatalk

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

You could hijack the com.fibaro.sonosPlayer type

class 'HEOSPlayer'(QuickAppChild)
function HEOSPlayer:__init(dev)
     QuickAppChild.__init(self,dev)
     self.ip = dev.properties.ip
     self:trace("HEOS:",self.ip," initiated, deviceId:",self.id)
end
function HEOSPlayer:play_Button()
   self:trace("Play HEOS:",self.ip,", deviceId:",self.id)
end
function HEOSPlayer:pause_Button()
   self:trace("Pause HEOS:",self.ip,", deviceId:",self.id)
end
function HEOSPlayer:rewind_Button()
   self:trace("Rewind HEOS:",self.ip,", deviceId:",self.id)
end
function HEOSPlayer:forward_Button()
   self:trace("Forward HEOS:",self.ip,", deviceId:",self.id)
end
function HEOSPlayer:mute_on()
   self:trace("Mute HEOS:",self.ip,", deviceId:",self.id)
end
function HEOSPlayer:mute_off()
   self:trace("Unmute HEOS:",self.ip,", deviceId:",self.id)
end
function HEOSPlayer:volume_Slider(ev)
   self:trace("Volume HEOS:",self.ip,", deviceId:",self.id," Volume:",ev.values[1])
   self:updateProperty("volume",ev.values[1])
   self:updateProperty('ui.volume_Label.caption', tostring(ev.values[1]))
end
function HEOSPlayer:setInfo(label,title,creator)
 self:updateProperty('ui.position_Label.caption', "Label:"..label)
 self:updateProperty('ui.title_Label.caption', "Title:"..title)
 self:updateProperty('ui.creator_Label.caption', "Creator:"..creator)
end

local function getChildVariable(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:UIHandler(event)
  local obj = self
  if self.id ~= event.deviceId then obj = self.childDevices[event.deviceId] end
  if not obj then return end
  local elm,etyp = event.elementName, event.eventType
  local cb = obj.uiCallbacks or {}
  if obj[elm] then return obj:callAction(elm, event) end
  if cb[elm] and cb[elm][etyp] then return obj:callAction(cb[elm][etyp], event) end
  if obj[elm.."Clicked"] then return obj:callAction(elm.."Clicked", table.unpack(event.values or {})) end
  self:warning("UI callback for element:", elm, " not found.")
end

function QuickApp:onInit()
  self:trace("Mother of HEOS, deviceId:",self.id)
  local cdevs = api.get("/devices?parentId="..self.id) or {} -- Pick up all my children
  function self:initChildDevices() end -- Null function, else Fibaro calls it after onInit()...
  if #cdevs ~= 2 then -- No children, create 2
    local initChildData = {
        {className="HEOSPlayer", type="com.fibaro.sonosSpeaker", ip="1.2.3.4"},
        {className="HEOSPlayer", type="com.fibaro.sonosSpeaker", ip="1.2.3.5"},
    }
    for i,c in ipairs(initChildData) do
       local child = self:createChildDevice(
           {name = "HEOS "..i,
            type=c.type,
            initialProperties = {
                deviceIcon = 28,
                --icon = { path="plugins/com.fibaro.denonHeos/img/icon.png"},
                ip = c.ip,
            }, -- Add properties if you need
            initialInterfaces = {}, -- Add interfaces if you need
            },
            _G[c.className] -- Fetch class constructor from class name
       )
       child:setVariable("className",c.className)  -- Save class name so we know when we load it next time
       api.put("/devices/"..child.id,{properties={icon={path="plugins/com.fibaro.denonHeos/img/icon.png"}}})
    end
  else
    for _,child in ipairs(cdevs) do
       local className = getChildVariable(child,"className")
       childObject = _G[className](child)
       self.childDevices[child.id]=childObject
    end
  end
end

 

  • Like 2
Lien vers le commentaire
Partager sur d’autres sites

Oui c’est certain puisqu’il s’agit d’un type existant, mais cela ne règle que partiellement le problème.


Envoyé de mon iPhone en utilisant Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

Il y a 20 heures, Krikroff a dit :

Yes it is certain since it is an existing type, but that only partially solves the problem.

Yes, but potentially an interesting part of the problem :)

Here are some add on to the QuickApp class to make child management easier.

https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/?do=findComment&comment=209389

Reduces tasks to QuickApp:createChild{} and QuickApp:loadChildren() and fixes button interactions...

Lien vers le commentaire
Partager sur d’autres sites

  • 1 month later...

petite question

 

où est le problème dans cette boucle

self.Liste = {}

for id,child in pairs(self.childDevices) do
    print(id, child:getVariable("IPX_OUTPUT"))
    self.Liste[id] = child:getVariable("IPX_OUTPUT")
end

traduction : pour chaque "enfants" je veux remplir une table sous cette forme : [ID_Enfant] = contenu_de_sa_variable

pourtant le print donne le bon résultat !!!!

self.Liste = {
	[xxx] = 1
	[yyy] = 2
	[zzz] = 3
	...
}

Et bien il me remplit pas la table !!!!

 

???????????

Modifié par jjacques68
Lien vers le commentaire
Partager sur d’autres sites

ah oui ok !

nan mais c'était juste un exemple...

 

Le soucsi est bien dans le code plus haut !

J'affecte directement une valeur dans la table en spécifiant sa position.

Et ça marche pas...

Comme si on pouvait pas commencer avec autre chose que la position 1...

Lien vers le commentaire
Partager sur d’autres sites

Qu'est ce qui te fait dire qu'il ne remplie pas la table ?

Si tu ne commences pas l'index à 1, tu ne peux pas la parcourir avec ipairs(), donc tu auras l'impression que la table est vide.

Pourtant si tu testes les valeurs, tu devrais voir qu'elles sont bien présentes.

if self.Liste{123] then
	punition.call("Ah tu te cachais petit malin")
else
	police.call("avis de recherche")
end

 

  • Like 2
Lien vers le commentaire
Partager sur d’autres sites

Normal aussi, # ne sait pas compter quand l'index ne commence par à 1.

 

C'est pour cela que je te dis de les appeler 1 par 1 par leur nom comme dans mon exemple

Lien vers le commentaire
Partager sur d’autres sites

Sinon il faut faire l'appel des enfants avec select()

for i=1, select('#', self.MaTable) do
	local v=select(i, self.MaTable)
	print(type(v))
end

 

EDIT : cela dit, je viens de regarder mes QuickApps, j'utilise des index alphabétiques à chaque fois, donc de type "string"

 

Modifié par Lazer
Lien vers le commentaire
Partager sur d’autres sites

OH PUTAIN QUEL CON !!!

 

pour lire je faisais

for i= 1, 10 do 
	print(self.MaTable[i])
end

Mais comme tu as dis, les valeur ne sont pas forcément placés dans les 10 premières occurences...

 

mais si je m'adresse comme ça

for i= 640, 650 do 
	print(self.MaTable[i])
end

là je les ai !!

 

bordel 2 heures de perdu avec ces conneries !!!

 

bref, une fois de plus merciiiiiiiiiiiiiiiiiiiiiii !

Lien vers le commentaire
Partager sur d’autres sites

ben du coup mon noueau QA IPX devient nickel !!!

 

je n'utilise plus du tout les requettes HTTP, mais que une socket TCP...

Plus de réglages PUSH à faire sur les sorties ou entrées...

C'est TOP !

 

Juste un soucis de traitement de chaine de caractères...

Si vous êtes motivé messieurs : https://www.domotique-fibaro.fr/topic/14509-optimisation-traitement-de-chaines-de-caractères/

 

;) 

 

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Après le string les enfants
Punaise vous allez vite en besogne
Je vais pas vous déranger plus longtemps

PS si vous cherchez un parrain riche je vous suggère@Nico il sera ravi [emoji23]

Envoyé avec Tapatalk

  • Haha 2
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...