
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
-
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...
-
-
-
Utilisation des fichiers dans les QA
jjacques68 a répondu à un(e) sujet de jjacques68 dans Tutoriels
alors je me suis rendu compte qu'il faisait une simple copie du code du fichier dans le QA... en affichant le "content" du file. du coup, ça risque d'alourdir la taille des QA... ? voir leur réactivité ?? il va falloir optimiser les "fichier", en créer plusieurs pour regrouper les fonctions (traitement de chaines, opérations sur nombres, etc...) On aura jamais besoin de tout en même temps... -
Voici un petit tuto sur la gestion des fichiers dans les QA. petite nouveauté depuis la version 5.040.37 - 23/07/2020 Le code utilisé provient de @jgab sur le fofo officiel : https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/?do=findComment&comment=211496 (lien cité par @Lazer dans le topic dédié à la mise à jour : https://www.domotique-fibaro.fr/topic/14477-hc3-504037-23072020/) Donc le principe de ces fichiers est de partager des fonctions d'un QA à un autre. On pouvait déjà appeler une fonction d'un QA x depuis une scène ou un autre QA avec : fibaro:call(id_QA, "MaFonction") Mais maintenant on peut exploiter le retour de la fonction, ce qui super intéressant. On peut donc se créer une vrai bibliothèque de fonctions Voici un exemple concret : le QA "source" le QA "utilisateur" l'appel d'une fonction la modification du fonction Remarques 1. Le QA "source" : En cliquant sur l'icone "File" tout à gauche, une liste de fichier apparaît. En cliquant sur le bouton "+", on ajoute un nouveau fichier, ici "newFile". La navigation se fait facilement d'un fichier à un autre via des onglets : On a la possibilité de supprimer ou renommer un fichier. Dans mon exemple : voici le contenu du fichier Main : au passage, ce fichier ne peut pas être supprimer donc en fait, il y a rien de particulier pour lui... voici le contenu du fichier "newFile" que j'ai renommé "ToolBox" : on y voit 2 fonctions : StringToTimeStamp() Split() 2. le QA "utilisateur" Dans un nouveau QA, j'ai inséré cette fonction : merci à @jagb du fofo officiel. function QuickApp:copyFile(deviceId,fileName) local copyFile = api.get(string.format("/quickApp/%s/files/%s", deviceId, fileName)) assert(copyFile,"File doesn't exists") local myFile = api.get(string.format("/quickApp/%s/files/%s", self.id, fileName)) if not myFile then --création du fichier local stat,res = api.post(string.format("/quickApp/%s/files", self.id), {name=fileName, type="lua", isMain=false, isOpen=false, content=copyFile.content}) if res == 200 then self:debug("File '",fileName,"' added") else self:error("Error:",res) end elseif myFile.content ~= copyFile.content then --mise à jour si existant local stat,res = api.put(string.format("/quickApp/%s/files/%s", self.id, fileName), {name=fileName, type="lua", isMain=false, isOpen=false, content=copyFile.content}) if res == 200 then self:debug("File '",fileName,"' updated") else self:error("Error:",res) end else --rien à changer self:debug("File '",fileName,"' not changed") end end et dans le code onInit() de ce QA : j'appelle cette fonction avec comme argument l'ID du QA précédent, et comme nom, le fichier créé dans ce QA précédent : function QuickApp:onInit() self:debug("onInit") self:copyFile(494,"ToolBox") end après un petit refresh de la page : on voit que le fichier ToolBox a été ajouté Mais faut faire gaffe, ça saute pas au yeux, mais je suis bien dans le nouveau QA que je viens de créer et non dans le QA précédent ! et on peut accéder à son code en cliquant dessus ! MAIS ATTENTION A NE PAS MODIFIER LE CODE ICI ! sinon la modif ne sera pas répercutée sur le QA "source" ! 3. pour faire appel à une fonction de ce fichier intégré rien de plus simple : print(self:StringToTimeStamp("25/07/2020 16:00:00")) réponse : [25.07.2020] [16:17:37] [DEBUG] [QUICKAPP618]: 1595685600 4. En cas de modification du fichier "source" : encore une fois, rien de plus simple : on modifie le fichier source. on relance le QA qui intègre ce fichier source. (penser à faire des refresh du navigateur sinon on ne voit pas la modification) et le code est mise à jour. 5. Remarques : Il est possible bien-sûr d'intégrer le même fichier dans plusieurs QA, et la modification sera évidemment répercutée sur tous les QA... Visiblement dès qu'on change de fichier dans les onglets, ça relance le QA... Donc attention lors du développement, vu que les QA se relancent automatiquement en cas d'erreurs, ça peut vite tourner en boucle... Le code de la fonction "copyFile" est très clair, mais lors des mises à jour, il affiche toujours dans le debug "not changed". Alors qu'en réalité, il y a bien eu une modification !! Impossible de trouver dans l'API, les infos sur ce "fichier" intégrer au QA. Normalement, on devrait y trouver une propriété "files" avec le code, mais je trouve pas...
-
vous me faites peur avec vos chiffres si bas... !!! si on compte pas le cache je suis à 35 %