Aller au contenu
Krikroff

Gestion des appareils enfants

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

Partager ce message


Lien à poster
Partager sur d’autres sites

@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

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

[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

Partager ce message


Lien à poster
Partager sur d’autres sites

 Pardon, je n'ai pas pu résisté. :2:

 

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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...

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

En regardant en vitesse je dirais un problème de virgules

Envoyé avec Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

De virgules ? mais y a pas de virgules !!

y en a une dans le print c'est tout, mais le problème n'est pas dans le print...

Partager ce message


Lien à poster
Partager sur d’autres sites

Chaque élément dans la table est séparée par une virgule
La je ne la vois pas

Envoyé avec Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

self.Liste = {
[xxx] = 1
[yyy] = 2
[zzz] = 3
...
}
Moi je vois plutôt cela
self.Liste = {
[xxx] = 1,
[yyy] = 2,
[zzz] = 3,
...
}

Envoyé avec Tapatalk

Partager ce message


Lien à poster
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...

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

Je viens de tester, j'ai beau m'adresser directement à la table après sont remplissage avec : 

 

print(self.MaTable[2])

réponse nil !!!

 

nan mais c'est terrible ce truc !

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

Json.decode
Puis
Print
Tu verra si elle est vide ou pas



Envoyé avec Tapatalk

Partager ce message


Lien à poster
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 !

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah là là, on veut élever des enfants, mais on ne se souvient même pas de leur prénom :P

C'est ça les familles nombreuses :2:

  • Like 1

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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

Envoyé avec Tapatalk

  • Haha 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Pascal. Par contre je suis radin sur les cadeaux aux parents de mes filleuls :)

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

×