Aller au contenu

jjacques68

Membres confirmés
  • Compteur de contenus

    4 346
  • Inscription

  • Dernière visite

  • Jours gagnés

    39

Tout ce qui a été posté par jjacques68

  1. jjacques68

    HC3 - 5.040.37 - 23/07/2020

    Ma charge moyenne du CPU à nettement diminuée avec les optimisations préconisées... et je suis sûr que je peux encore mieux faire ! en tout cas merci pour les conseils !! Cela dit, mon histoire de script avec les notifications n'est pas résolu, il est tout simplement désactivé pour le moment... Va falloir sérieusement que je m'y colle !
  2. oui pourquoi, pas y a une procédure qqpart pour prendre contact avec eux ? jamais fais...
  3. je viens de voir ta mise à jour du post, elle a mis du temps à venir, je comprenais pas ce que tu voulais dire... ouuuuuuu mais c'est pas bête du tout ça dit voir PS : je savais pas qu'on pouvait surcharger leurs fonctions, après dit comme ça, pourquoi pas ! faut juste être certain qu'il appelle la notre et pas la leur un coup sur deux...
  4. alors comportement étrange, depuis quelques jours, le backup se fait mais j'ai une alerte du NAS que me dit qu'il a pas pu rebooter la box. Je suis tombé au-delà des 10 min de timeout. Et le fichier n'est pas copié sur le NAS. J'ai monté à 12 min pour voir, idem... Je télécharge manuellement un fichier de backup depuis la HC3, et oh ! surprise ils dépassent 25 Mo !!!!! Alors que depuis le début je tourne entre 5 Mo et 7 Mo. Et ça depuis que ma box à commencé à crasher (les derniers crash étaient volontaires afin de comprendre le pourquoi du comment - voir sujet dans topic dédié à la mise à jour). J'ai donc restauré la dernière sauvegarde qui était encore de taille normal (dans le nouveau firmware), et là c'est ok... un mystère de plus...
  5. tu parles de la fonction sur HC2 ? parce que c'est ce que semble faire le getDeviceID() sur la HC3 ! on peut pas refaire son code !? si ?
  6. et voici la propriété "categories" avec getDeviceID() : ListeDevice = fibaro.getDevicesID({visible=true, properties={categories='["lights"]'}}) oui @Lazer, je suis d'accord avec toi, ça fait mal aux yeux Mais là j'ai que les ID
  7. oui on est tout à fait d'accord ! c'était pour l'exercice ! attend maintenant je vais le transposer pour le getDeviceID(), va être marrant ça...
  8. nan mais je rève ! Je l'avais cette put... de syntaxe de m..., mais au lieu d'utiliser les " je mettais %27 ! et en fait %27 c'est pas les " mais '. les " c'est %22 ! et en plus on est pas obligé de se faire chier avec les code ascii visiblement dans l'URL nan mais quel boulet je suis ! merci tout plein !
  9. nan mais les gars, je suis pas allé trop vite ! vous avez lu le premier post ? je cherche à filtrer les device dans une simple liste ! pas à obtenir tout leur contenu JSON ! api.get() = tu récupères toutes les propriété des device selon ton filtre fibaro.getDeviceID() = tu récupères que la liste des ID selon ton filtre @Lazer : les [] fonctionnent bien, mais pas sur la proriété "category", suis entrain de me demander si on est pas limiter dans l'arborescence... le problème c'est qu'on descend un cran plus bas...
  10. ben j'essaye de faire ça avec api.get() : /api/devices?property={category="lights"}}} retour : rien
  11. pas bête, mais y a des subtilité entre l'URL et la fonction : "properties" devient "property" "interfaces" devient "interface" ils ont tout mis au singulier on dirait... Ducoup je suis resté sur les fonctions pour avoir le même "texte" que ce que l'on voit dans le JSON !
  12. jjacques68

    HC3 - 5.040.37 - 23/07/2020

    oui j'ai vu, ben on va voir ce que ça donne... J'y ai déjà posé une colle
  13. question : comment fait-on pour filtrer sur cette rubrique "categories", qui est un tableau : j'ai essayé sans succès : ListeDevice = fibaro.getDevicesID({properties={categories={"lights"}}}) ListeDevice = fibaro.getDevicesID({properties={categories,"lights"}}) ListeDevice = fibaro.getDevicesID({properties={categories="lights"}}) ListeDevice = fibaro.getDevicesID({properties={categories[1]="lights"}}) ?????
  14. jjacques68

    HC3 - 5.040.37 - 23/07/2020

    Viens de faire une première grosse passe sur mes scripts... Et bien j'en ai modifié pas mal de code, question optimisation... J'ai bien l'impression, d'après la charge CPU, que ça a fait du bien... y a comme on dirait, plus d'oxygène Et je peux encore faire mieux, mais faut remettre en question l'algo de base pur certain... j'ai déjà des idées @Lazer j'ai commencé un topic pour le filtrage des device, je l'ai mis dans la section "pour les nuls", mais visiblement il faut qu'un admin approuve le sujet, j'ai fais une connerie ?
  15. On peut également filtrer sur le type d'interface : ListeDevice = fibaro.getDevicesID({interfaces ={"light"}}) Ici la syntaxe change encore, car on filtre sur un élément d'une sous-table : "interfaces".
  16. Donc je me lance : un exemple tout simple : lister les device visible : dans l'API on trouve la propriété "visible" : donc : MaListe = fibaro.getDevicesID({visible=true}) me retourne la liste des ID de TOUS les device visible on peut cumuler des filtres : par exemple je veux les visibles de type lumières : ListeDevice = fibaro.getDevicesID({visible=true, properties={isLight=true}}) là, la syntaxe est étrange car on descend dans l’arborescence des propriété des device :
  17. Bonjour à tous, Je commence ce topic afin de recenser les différentes manières de filtrer les device de nos box. Je suis entrain de tester cela depuis une HC3, donc je ne peux pas confirmer que cela fonctionne sur une HC2... Pour se faire, on utilise : MaListe = fibaro.getDevicesID({filter}) on aura donc la liste des ID des device trouvés. il existe une autre méthode avec : MaListe = api.get(/devices/?...) dans ce cas, on aura un retour JSON avec tout le contenu des propriétés des device. On choisira l'un ou l'autre suivant l'usage. Dans mon cas, je me suis rendu compte que j'utilisais très souvent api.get(), juste pour avoir la liste des ID ! Donc pas du tout cohérent, vu qu'on a pas besoin de récupérer la totalité des propriétés ! Pour les exemples suivant, je me sers de l'API d'un device, que j'ai copié dans NotePad++ afin de visualiser le JSON plus facilement (voir les captures futures)
  18. jjacques68

    HC3 - 5.040.37 - 23/07/2020

    non mais c'est super interessant. pour mon problème initiale de plantage... je réfléchirais en dormant là je sèche. Suis pas du genre à lâcher l'affaire, mais là... à moins d'attendre la prochaine MAJ, en espérant... sinon à l'ancienne, je désactive toutes les notifications des device, et je les gère depuis une scène ! Ah mais non, y a pas de multi instance des scènes ! donc faudra que j'utilise mon QA qui interroge le refreshState, qui tourne très bien... lui... Mais ça veut dire : gérer une liste de device, gérer la valeur du device, bla-bla-bla ... super lourd ! EDIT : peut être essayer de protéger l'appel de la foncation par un pcall...
  19. jjacques68

    HC3 - 5.040.37 - 23/07/2020

    oulà ton exemple me donne mal au cheveu qui me reste. faut que je l'étudie avec du debug... merci pour les explications !
  20. jjacques68

    HC3 - 5.040.37 - 23/07/2020

    en attendant, j'ai trouvé comment rendre le plantage du QA, donc de la box, non plus aléatoire, mais bien répétable à souhait ! il me suffit d'exécuter le QA (donc 3 à 4 secondes pour tout traiter) et de déclencher un device (capteur, ou actionneur) pendant ce temps là. Et ça loupe pas, crash instantané ! alors : hypothèse : à chaque changement d'état d'un device, la box fait un appel à l'api /deviceNotifications/ pour savoir si elle doit envoyer une notification ou non. Et moi pendant ce temps là je suis entrain de modifier cette API. Donc ça aime pas et plante tout. Pourtant... avant la mise à jour c'était ok, jamais planté, et je confirme que ce scénario arrivait souvent... Mais alors si c'est bien ça, je sais absolument pas comment le contourner !
  21. jjacques68

    HC3 - 5.040.37 - 23/07/2020

    ah mais attend ! suis bête ! j'utilise souvent la récursivité ! quand par exemple on veut bouclé une fonction à intervalle régulier pour contrôler une heure et déclencher des actions ! function MaFonction() ... fibaro.setTimeout(60*1000, function() MaFonction() end) end c'est bien ça ?
  22. jjacques68

    HC3 - 5.040.37 - 23/07/2020

    ok très bien. donc dans ce ca précis, le fait de passer par l'asynchrone suffit où il faut que je fasse une vrai récursivité ?
  23. jjacques68

    HC3 - 5.040.37 - 23/07/2020

    ça faudra tester...
  24. jjacques68

    HC3 - 5.040.37 - 23/07/2020

    je le ferais avec plaisir, mais ce sera lite... du moins au début, en espérant que la communauté alimente le sujet... sinon je continue mon optimisation du script qui plante : j'ai remplacé : ListeDevice = api.get("/devices/?visible=true") par : ListeDevice = fibaro.getDevicesID({visible=true}) ici, j'ai absolument pas besoin de toutes les infos des device que me donne le api.get(). J'ai juste besoin de la liste des device, déjà ça soulage la RAM et je prends beaucoup moins de temps à avoir la liste des ID (et ça j'avoue avoir fait cette connerie dans beaucoup de script...) Et du coup c'est plus facile d'exploiter la table également... ça rejoint la remarque de @mprinfo qui disait d'utiliser les fonctions fibaro... ben là c'est un bon exemple... Ensuite je me suis rendu compte que je faisais un api.put() même pour des device qui n'ont pas la propriété concernée ! Ne pouvant mieux filtrer la liste des device, je vérifie donc par code la présence de cette propriété avant de continuer -> c'est con ! mais j'avais pas fait gaffe !! Bon malgré ça, ça plante toujours aléatoirement, mais très rarement... donc là je trace pour chaque fonction exécutée, le "start" et le "end" avec l'ID en cours de modifications. ça m'explose le debug, mais je verrais bien sur quelle device ça bloque, peut être que c'est toujours le même ! A suivre ! PS : @Lazer : on est bien d'accord sur le terme "récursif" d'une fonction : for blablabla do fibaro.setTimeout(0, function() MaFonction() end) end ici, "MaFonction" est récursive, c'est bien ça ? C'est comme si je lançais une multitude de "thread" ? toujours ok ? le délai à 0 me gêne, j'ai l'impression que ça "emballe" la box...
  25. jjacques68

    HC3 - 5.040.37 - 23/07/2020

    @Lazer : alors j'arrive pas à trouver le moyen de mieux filtrer mes device pour ce coup là... Franchement, je pense que qqun de compétent (si tu vois ce que je veux dire ) créé un topic sur la manière de filtrer les api.get()... Visiblement, on peut pas filtrer tout ce qu'on veut. Mais on sait pas ce qu'on peut faire ou pas J'ai vu qu'il existait des moyens de comparaison (gt, lt ge, le, equal, ...) et pas moyen de les utiliser C'est galère quand il faut descendre dans l'arborescence de la table json... bref, en plus c'est pas franchement pas documenté... Ce serait vraiment top que qqun le fasse , je le ferai bien, mais je m'y connais pas assez, et rien sur le fofo officiel... je dis ça mais je dis rien sinon : je viens de modifier ce QA pour mes notifications : J'ai réussi à me passer d'une boucle (celle qui contient la liste des types d'actions dans ma variable) J'ai mis le code qui modifie l'api pour chaque device dans une fonction récursive. Et ben mon vieux, rien que ça , ça change la vie, la CPU mon franchement moins... MAIS ça continue à planter de temps à autre... ??? --[[----------------------------------------------------------------------------------------------- Active/désactive les notifications push V2 - 30/07/2020 - fonction récursive pour la modification V1 - 25/03/2020 - original -------------------------------------------------------------------------------------------------]] function QuickApp:onInit() __TAG = string.format("QA_%s_%s",self.id, self.name) self:debug("onInit") self.ListeEvent = { ["IsOpening"]=true, --Volet ouvert ["IsClosing"]=true, --Volet fermé ["TurningOn"]=true, --lumière ON ["TurningOff"]=true, --lummière OFF ["Motion"]=true, --détection PIR ["Flood"]=true, --détection inondation ["Opening"]=true, --ouverture d'une porte/fenêtre } end function QuickApp:turnOn() self:updateProperty("value", true) self:UpdateNotif(true) end function QuickApp:turnOff() self:updateProperty("value", false) self:UpdateNotif(false) end -------------------------------------------------------- -- Modifie l'API du device si son evenement est dans la liste -------------------------------------------------------- function QuickApp:ModifyNotif(id, value) --récupère les notifications de ce device MyNotif = api.get("/deviceNotifications/v1/"..id) --pour chaque notif de ce device, si trouve l'evenement, le modifie for j = 1, #MyNotif do if self.ListeEvent[MyNotif[j].type] then MyNotif[j].active = value end end --applique les modifications pour ce device api.put("/deviceNotifications/v1/"..id, MyNotif) end -------------------------------------------------------- -- Fonction Pincipale, liste tous les device visible -------------------------------------------------------- function QuickApp:UpdateNotif(value) --liste tous les device VISIBLE ListeDevice = api.get("/devices/?visible=true") --pour chaque device trouvés for i = 1, #ListeDevice do fibaro.setTimeout(0, function() self:ModifyNotif(ListeDevice[i].id, value) end) end self:trace("Notification = "..tostring(value)) end
×
×
  • Créer...