jjacques68 Posté(e) le 10 mars 2020 Signaler Posté(e) le 10 mars 2020 (modifié) Alors voici un exemple tout simple de gestion des volets : principe : ouverture le matin 15 min avant le levé de soleil fermeture le soir 15 min après le couché de soleil subtilité avec un volet : qui se ferme que si je suis absent et que la porte est fermée. Voici les Trigger : { operator = "any", conditions = { {type = "date", property = "sunrise", operator = "==", value = -15, isTrigger = true}, {type = "date", property = "sunset", operator = "==", value = 15, isTrigger = true} } } et voici la scène : fibaro.debug("Volets", "start Scene") local Trigger = sourceTrigger local Tel = tonumber(fibaro.getGlobalVariable("MonPhone")) local Message = "" local ListeDevice = api.get("/devices/") local IDVoletSalon = 38 ---------------------- --SUNSET ---------------------- if Trigger.property == "sunset" then fibaro.debug("Volets", "Sunset Trigger") Message = "Fermeture des volets" for i = 1, #ListeDevice do if ListeDevice[i].properties.categories then if ListeDevice[i].properties.categories[1] == "blinds" then --Volet du salon : le fermer que si absent et porte fermée if ListeDevice[i].id == IDVoletSalon then if fibaro.getGlobalVariable("Present") == "0" and fibaro.getValue(36, "value") == false then fibaro.call(38, "close") end else fibaro.call(ListeDevice[i].id, "close") end end end end end ---------------------- --SUNRISE ---------------------- if Trigger.property == "sunrise" then fibaro.debug("Volets", "Sunrise Trigger") Message = "Ouverture des volets" for i = 1, #ListeDevice do if ListeDevice[i].properties.categories then if ListeDevice[i].properties.categories[1] == "blinds" then fibaro.call(ListeDevice[i].id, "open") end end end end fibaro.alert("push", {Tel}, Message) et marche nickel Modifié le 10 mars 2020 par jjacques68 2
Krikroff Posté(e) le 11 mars 2020 Signaler Posté(e) le 11 mars 2020 Si tes roulants sont tous du type rollerShutter alors je te conseil très fortement de faire un get sur /api/devices/?type=com.fibaro.rollerShutter pour des questions de performance, ce n'est pas nécessaire de remonter en mémoire tous les devices de ton installation Encore mieux, tu pourrais faire un post sur le endpoint /devices/filter et remonter uniquement les périphériques de la catégortie "blinds", mais alors bon courage pour trouver la bonne syntaxe 1
jjacques68 Posté(e) le 11 mars 2020 Auteur Signaler Posté(e) le 11 mars 2020 il y a une heure, Krikroff a dit : Si tes roulants sont tous du type rollerShutter alors je te conseil très fortement de faire un get sur /api/devices/?type=com.fibaro.rollerShutter ah, savais pas qu’on pouvait faire ça ! oui je comprends, cela évite de devoir parcourir tous les device, afin de connaître leur catégories...
Krikroff Posté(e) le 11 mars 2020 Signaler Posté(e) le 11 mars 2020 Yeap cela évite en effet de parcourir tous les périphériques et surtout de charger la mémoire avec des infos non nécessaires Il faut penser à l'avenir, aujourd'hui ton contrôleur est très peu chargé mais d'ici 2 ans tu tourneras peut-être avec 80 devices, des scènes et des quickapp dans tous les sens.
jjacques68 Posté(e) le 11 mars 2020 Auteur Signaler Posté(e) le 11 mars 2020 tout à fait d'accord ! merci pour le tuyau !!
jjacques68 Posté(e) le 13 mars 2020 Auteur Signaler Posté(e) le 13 mars 2020 (modifié) Le 11/03/2020 à 16:44, Krikroff a dit : je te conseil très fortement de faire un get sur /api/devices/?type=com.fibaro.rollerShutter ça marche pas local ListeVolet = api.get("/api/devices/?type=com.fibaro.FGRM222") et j'ai trouvé la fonction fibaro.callGroupAction(action_name, arguments) dans l'aide : local ListeVolet = { "args" : [], "filters" : [ { "filter" : "type", "value" : ["com.fibaro.FGRM222"] } ] } fibaro.callGroupAction("close", ListeVolet) mais ça bug niveau syntaxe, pourtant je fais comme dans l'exemple.. Citation [ERROR] 13.03.2020 19:39:56: (load):2: '}' expected (to close '{' at line 1) near ':' je suis entrain de chercher... Modifié le 13 mars 2020 par jjacques68
jjacques68 Posté(e) le 13 mars 2020 Auteur Signaler Posté(e) le 13 mars 2020 (modifié) alors ça marche avec le fibaro.callGroupAction(action_name, arguments) local ListeVolet = { args = {}, filters = { { filter = "type", value = {"com.fibaro.FGRM222"} } } } fibaro.callGroupAction("close", ListeVolet) Modifié le 13 mars 2020 par jjacques68
jjacques68 Posté(e) le 13 mars 2020 Auteur Signaler Posté(e) le 13 mars 2020 (modifié) et si on veut filter encore plus, genre exclure un ID : local ListeVolet = { args = {}, filters = { { filter = "type", value = {"com.fibaro.FGRM222"}, }, { filter = "not", value = { filter = "id", value = {38} } } } } étrange comme syntaxe... Modifié le 13 mars 2020 par jjacques68
jjacques68 Posté(e) le 13 mars 2020 Auteur Signaler Posté(e) le 13 mars 2020 Par contre je galère avec le filtre sur les catégories : local ListeLumiere = { args = {}, filters = { { filter = "categories", value = "lights" } } } en effet "categories" est un tableau (on peut le voir dans l'API) et je trouve pas la syntaxe...... ...
Krikroff Posté(e) le 13 mars 2020 Signaler Posté(e) le 13 mars 2020 ce n’est pas supporté tout simplement et donc inutilisable selon moi.Pour info derrière un getDeviceIds ou callActionGroup c’est bien un api.get() sur le endpoint /devices/?... et en plus en LUA donc même pas des performances d’une intégration native en C ou autre Étrange que cela ne fonctionne pas le filtre sur RollerShutter directement sur /devices/ j’utilise cela sur HC2 et c’est idem sur HC3
jjacques68 Posté(e) le 13 mars 2020 Auteur Signaler Posté(e) le 13 mars 2020 ah zut, dommage ! pourtant il me semble avoir réussi à fair un truc du genre : api.get(/api/devices/32).categories[1] == "lights"
jjacques68 Posté(e) le 13 mars 2020 Auteur Signaler Posté(e) le 13 mars 2020 oui le voilà : c'était pour les volets local ListeDevice = api.get("/devices/") print("Nb Device = "..#ListeDevice) for i = 1, #ListeDevice do if ListeDevice[i].properties.categories then if ListeDevice[i].properties.categories[1] == "blinds" then print(ListeDevice[i].id.." = "..ListeDevice[i].name) end end end
Krikroff Posté(e) le 13 mars 2020 Signaler Posté(e) le 13 mars 2020 Oui du coup il faudrait bouclé sur le tableau de devices retourné cat il peut y avoir plusieurs catégories retournées
jjacques68 Posté(e) le 13 mars 2020 Auteur Signaler Posté(e) le 13 mars 2020 oui là va pas avoir le choix de boucler sur tous les device... c’est étonnant d’ailleurs de pouvoir choisir plusieurs catégories, je vois pas encore l’intérêt...
jjacques68 Posté(e) le 13 mars 2020 Auteur Signaler Posté(e) le 13 mars 2020 @Krikroff, j’ai un doute : la commande local ListeVolet = api.get("/api/devices/?type=com.fibaro.FGRM222") retourne bien un tableau json sous la forme {38,42, ... , ... } ? ou autre chose ?
Krikroff Posté(e) le 13 mars 2020 Signaler Posté(e) le 13 mars 2020 Non cela retourne la liste de tous les devices filtrés et pas que les IDPs: désolé j’utilise Tapatalk et le code lua dans les messages est illisible du coup pas simple
Krikroff Posté(e) le 13 mars 2020 Signaler Posté(e) le 13 mars 2020 Pour le retour d’un tableau d’ID il faudrait utiliser Fibaro.getIDs mais qui n’est pas porté e sur HC3. Je connais le code qui se cache derrière, je peux le partager si cela intéresse quelqu’un
jjacques68 Posté(e) le 13 mars 2020 Auteur Signaler Posté(e) le 13 mars 2020 ce serait pas ça ? Citation fibaro.getDevicesID fibaro.getDevicesID(filter) Returns a list of device IDs that match the given filters. Parameters: filter – the way we want to filter the devices.
jjacques68 Posté(e) le 13 mars 2020 Auteur Signaler Posté(e) le 13 mars 2020 il y a 39 minutes, Krikroff a dit : Étrange que cela ne fonctionne pas le filtre sur RollerShutter directement sur /devices/ il faut te que je ré-essaye, j’ai peut être pas traité le retour de la bonne façon. j’avais fait une simple boucle pour afficher chaque occurrence de la table. et j’avais "nil" comme réponse...
Krikroff Posté(e) le 13 mars 2020 Signaler Posté(e) le 13 mars 2020 GetIDs et GetDevicesId ne sont pas implémentés sur le HC3, pourtant pas compliqué à adapter Oui essaie de nouveau logiquement le filtre directement sur /devices/? Fonctionne
jjacques68 Posté(e) le 14 mars 2020 Auteur Signaler Posté(e) le 14 mars 2020 (modifié) si c’est ok ça marche : local ListeVolet = api.get("/devices/?type=com.fibaro.FGRM222") for k,v in pairs(ListeVolet) do print(k,v.id) end L’erreur était : j’avais mis “/api/devices/...“ au lieu de “/devices/...“ Modifié le 14 mars 2020 par jjacques68
jjacques68 Posté(e) le 14 mars 2020 Auteur Signaler Posté(e) le 14 mars 2020 Donc ça simplifie beaucoup la scène initiale : fibaro.debug("Volets", "Volets - start Scene") local Trigger = sourceTrigger local Tel = tonumber(fibaro.getGlobalVariable("Phone_JJ")) local Message = "" local ListeDevice = api.get("/devices/?type=com.fibaro.FGRM222") local IDVoletSalon = 38 ---------------------- --SUNSET ---------------------- if Trigger.property == "sunset" then fibaro.debug("Volets", "Volets - Sunset Trigger") Message = "Fermeture des volets" for k,v in pairs(ListeDevice) do --Volet du salon : le fermer que si absent et porte fermée if v.id == IDVoletSalon then if fibaro.getValue(56, "value") == false and fibaro.getValue(36, "value") == false then fibaro.call(38, "close") end else fibaro.call(v.id, "close") end end end ---------------------- --SUNRISE ---------------------- if Trigger.property == "sunrise" then fibaro.debug("Volets", "Volets - Sunrise Trigger") Message = "Ouverture des volets" for k,v in pairs(ListeDevice) do fibaro.call(v.id, "open") end end fibaro.alert("push", {Tel}, Message) merci @Krikroff ! ah c’est dommage qu’on ne puisse pas mettre ce genre de filtre sur la “catégories“ du module... 1
Krikroff Posté(e) le 14 mars 2020 Signaler Posté(e) le 14 mars 2020 Il y a 9 heures, jjacques68 a dit : --Volet du salon : le fermer que si absent et porte fermée if v.id == IDVoletSalon then if fibaro.getValue(56, "value") == false and fibaro.getValue(36, "value") == false then fibaro.call(38, "close") end else fibaro.call(v.id, "close") end Tu as oublié de passer ta variable comme ceci il me semble fibaro.call(IDVoletSalon, "close")
jjacques68 Posté(e) le 14 mars 2020 Auteur Signaler Posté(e) le 14 mars 2020 ah oui zut, copier coller trop vite... est ce qu'on peut cumuler des filtres dans cette commande ? par exemple là j'ai la commande qui me retourne tous les device de la room 232 : local ListeDeviceInRoom = api.get("/devices/?roomID=232") Mais est ce que je peux ajouter un truc du genre "?isLight = true" ?
jjacques68 Posté(e) le 14 mars 2020 Auteur Signaler Posté(e) le 14 mars 2020 (modifié) j'essaye avec ça mais sans succès : local ListeLights = { args = {}, filters = { {filter = "roomID", value = {roomID}}, {filter = "and", value = {filter = "isLight", value = {true}}} } } Je souhaite avoir la liste ID des device qui : - sont dans une pièce précise (roomID) -> ça ça marche - sont des lumières "isLight" = true -> marche pas Modifié le 14 mars 2020 par jjacques68
Messages recommandés