Aller au contenu
jjacques68

Exemple gestion des volets tout simple

Recommended Posts

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é par jjacques68
  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :60: 

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites
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 ! :huh:

 

oui je comprends, cela évite de devoir parcourir tous les device, afin de connaître leur catégories...

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites
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é par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

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...:15:... ...

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

ah zut, dommage !

 

pourtant il me semble avoir réussi à fair un truc du genre :

api.get(/api/devices/32).categories[1] == "lights"

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui du coup il faudrait bouclé sur le tableau de devices retourné cat il peut y avoir plusieurs catégories retournées ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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...

Partager ce message


Lien à poster
Partager sur d’autres sites

@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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Non cela retourne la liste de tous les devices filtrés et pas que les ID

Ps: désolé j’utilise Tapatalk et le code lua dans les messages est illisible du coup pas simple ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

 

Partager ce message


Lien à poster
Partager sur d’autres sites
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...

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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/...“

 

:13:

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

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...

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites
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")

Partager ce message


Lien à poster
Partager sur d’autres sites

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" ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

×