
jjacques68
Membres confirmés-
Compteur de contenus
4 349 -
Inscription
-
Dernière visite
-
Jours gagnés
39
Tout ce qui a été posté par jjacques68
-
ça faudra tester...
-
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...
-
@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
-
alors un petit exemple, je pourrais gagne un api.get(), celui qui liste tous les devices, si j'utilise l'api : /deviceNotifications/v1 mais comment filtrer les éléments qui sont active = true ?? J'ai essayé : ListeDevice = api.get("/deviceNotifications/v1?notifications=[active,true]") ListeDevice = api.get("/deviceNotifications/v1?active=true") ListeDevice = api.get("/deviceNotifications/v1?=[active,true]") Mais à chaque fois il me retourne la liste entière [ { "deviceId": 3, "notifications": [ { "active": false, "label": "labels.deviceNotifications.settings.type.Unavailable", "type": "Unavailable", "interval": { "type": "once" }, "channels": [], "users": [ 2 ] } ] }, { "deviceId": 7, "notifications": [ { "active": false, "label": "labels.deviceNotifications.settings.type.Unavailable", "type": "Unavailable", "interval": { "type": "once" }, "channels": [], "users": [] } ] }, ... ]
-
ça ok ! et on peut les cumuler ? ÉDIT : oui pardon j'avais pas vu le dernier ! bon j'essayerais... merci encore pour les tuyaux !!
-
après pour les filtres dans les api.get, j'ai déjà beaucoup galéré ! il me semble qu'on peut pas filtrer sur toutes les propriétés existantes, et surtout on peut pas cumuler si ? par exemple filtré sur une propriété qui est elle même un tableau ? on peut pas filtrer sur l'élément x de ce tableau de cette propriété ?
-
oui voilà c'est ça
-
super interessant ton lien merci !
-
@mprinfo : y a pas de commande fibaro pour désactiver telle ou telle notification sur un device ! @Lazer : alors niveau temps on parle de en moyenne 4 secondes d'après les time code de début et fin de la fonction. la première boucle est en effet très grosse (tous les device visible) mais la seconde comporte 3 ou 4 éléments. et la troisième comporte le nombre d'éléments visible dans la variable... punaise ! oui oui dis comme ça, ça mouline sévère ! mais tu me fais pensé, avec ta remarque précédente sur les tableaux, j'avais vérifié les tableaux que je créé moi même, ex : MaTable = {} J'ai pas pensé aux tables créées quand on fait des api.get() ! et comme tu l'as bien constaté, j'ai tendance, pour me faciliter le code, à abuser des api.get() pour des fonctions génériques ! donc de créer beaucoup de tableaux !! en revanche, la gestion des socket par exemple, est bien gérée, malgré la quantité d'info qui passent, c'est hyper réactif ! mais j'ai de la récursivité partout pour ça pour pairs et ipairs, j'ai commencé à m'en séparer au profit de tableau indexé, si ça s'appel comme ça : {[1] = ..., [2] = …} comme ça je tape directement sur la bonne valeur, sans avoir à le parcourir systématiquement... bon ben je sens l'optimisation de code ces vacances PS : je savais pas qu'on pouvait faire du settimeout avec 0 en délais...
-
tu as raisons, tu suis bien ce que fais j'avais pas pensé au QA qui sont visibles aussi etc... en effet je peux peut-être mieux filtrer du coup ! pour les fonctions récursives, le fait, dans une boucle, d'appeler une fonction par settimeout, impose de mettre une tempo dans les paramètres du settimeout ! ça va ralentir la vitesse d'exécution du QA !! ?? ou alors j'ai pas compris ! ?
-
@mprinfo, ça marchait avant la dernière mise à jour, donc pas trop envie de la laisser tranquille !
-
mais je filtre sur la propriété visible, vu que ça concerne tous les device visible ! je peux faire plus ... oui donc on revient à la manière de coder je vais regardé ce que peux faire avec les fonctions récursives...
-
alors j'ai trouvé le code qui me fait planté la box. Mais alors pourquoi ??? Pour ceux que ça interesse, le voici, il est pas si compliqué que ça. Il permet de d'activer/désactiver les notifications push en cas d'absence/présence : Le code me semble propre, mais il est gourmand, la CPU monte en flèche lors de son utilisation... ------------------------------------------------------------------------------------------------- -- V1 - 25/03/2020 - Active/désactive les notifications push ------------------------------------------------------------------------------------------------- function QuickApp:onInit() __TAG = string.format("QA_%s_%s",self.id, self.name) self.ListeEvent = { "IsOpening", --Volet ouvert "IsClosing", --Volet fermé "TurningOn", --lumière ON "TurningOff", --lummière OFF "Motion", --détection PIR "Flood", --détection inondation "Opening", --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 suivant l'argument true ou false -------------------------------------------------------- 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 --récupère les notifications de ce device MyNotif = api.get("/deviceNotifications/v1/"..ListeDevice[i].id) --pour chaque notif de ce device for j = 1, #MyNotif do --teste pour chaque Evenement for k,v in pairs(self.ListeEvent) do --si l'évenement est trouvé, on modifie if v == MyNotif[j].type then MyNotif[j].active = value end end end --applique les modifications pour ce device api.put("/deviceNotifications/v1/"..ListeDevice[i].id, MyNotif) end self:trace("Notification = "..tostring(value)) end -------------------------------------------------------- -- EVENT OBJET -------------------------------------------------------- function QuickApp:BTN_ENABLE(event) self:turnOn() end function QuickApp:BTN_DESABLE(event) self:turnOff() end Et la seul chose que j'ai modifié qui me semblait louche (mais c'est très con, tellement con que je pense pas que ce soit la cause...) c'est : c'est le nom des boutons pour faire les actions, donc maintenant "BTN_Enable" et "BTN_Desable", que l'on peut voir dans la section "EVENT OBJET". lors de l'avant dernière mise à jour, le nom de ces boutons étaient automatiquement attribué par le box. Ils avaient un nom comme "button2_1_OnRelase_Event" et "button2_0-OnRelase_Event"... et depuis j'ai beau faire des essais, ça plante plus... ????? !!!!! ????? EDIT : ha ben non j'ai crié victoire trop vite, ça vient de cracher en jouant avec le QA, la charge CPU est montée à 100 % sur 3 core / 4 !!
-
je vais désactiver toutes les action, et les remettre une par une jusqu'à trouver celle qui plante... j'espère juste que les reboot continuel ne vont pas la crasher elecroniquement...
-
alors je pense avoir mis le doigt sur ce qui fait plané la box depuis la dernière mise à jour (en tout cas dans ma situation) J'ai une scène qui est triggée et suivant la valeur du trigger, elle se fige, obligé de faire un hard reboot. Cette scène malheureusement lane plusieurs autres scènes ou action... Donc pour trouvé ce qui plante réellement, ça va être joyeux !
-
Sauvegarde HC3 automatique sur NAS Synology
jjacques68 a répondu à un(e) sujet de Lazer dans Tutoriels
bande de nase ! -
Sauvegarde HC3 automatique sur NAS Synology
jjacques68 a répondu à un(e) sujet de Lazer dans Tutoriels
@Lazer : je vais faire une demande (pas en mariage ) : penses tu qu'il est possible de glisser dans le nom du fichier de backup, le numéro du firmware correspondant ? ou alors de créer une arborescence en fonction du firmware ? je me dis que ça permettrait en cas de retrogradage, de pouvoir savoir en quelle version était ce backup... après j'ai aucune idée de la complexité de ma demande... Si tu as un peu de temps et que tu pense que c'est utile, et pas trop compliqué à faire... ce serait avec plaisir ! merci ! -
Je viens de vérifier l'histoire des variables tableaux de @Lazer... je confirme bien que mes variables tableaux qui servent de "tampon" pour la com sur les socket sont bien gérées. Toute occurrence traitée est supprimée, je parle bien d'une suppression de l'occurrence donc avec son contenu. Du coup les dimensions des tableaux n'excèdent pas maximum une dizaine d'éléments. Je m'en suis rendu compte en traçant simplement le #MonTableau. Je me suis fait des alertes en cas de taille > 25. ça m'inquiète cette histoire de RAM qui monte, j'ai effectivement toujours un doute sur la qualité du code... Suis toujours entrain de remettre en question... Même si je pense faire bien attention, des fois on pense pas à des trucs tout simple tellement on a la tête dans le guidon... (c'est mon quotidien, ça m’empêche pas de dormir mais bon... quoique... des fois ça cogite grave )
-
@mprinfo : non, j'ai directe tout migré sur la HC3. encore une fois, y avait RAS jusqu'à cette dernière MAJ.
-
je sens qu'en attendant de trouver, je vais programmer un reboot si la ram monte trop... on peut facilement avoir sa valeur dans l'api.
-
@Lazer : très interessant ce que tu expliques, en effet je suis déjà monté à 33 % dans use space depuis le reboot... on verra demain matin ... les variables tableaux que j'utilise ont des dimensions maîtrisées, donc je pense pas que ce soit ça le soucis... aurais tu d'autres exemple de code qui ferait croître la ram ? après encore une fois, j'ai eut 0 soucis depuis l'avant dernière mise à jour jusqu'à cette dernière !!
-
mais bon, ça souligne pas un problème dans la gestion de la mémoire ?
-
c'est ce que tu disais déjà il y a quelques post... mais ça reste impressionnant...
-
-