Aller au contenu

Recommended Posts

Bonjour à tous, j'ai un soucis avec (l'exceptionnel) GEA, qui étant déjà présent en 6.07, même si je suis passé en 6.10 entre temps.

 

J'ai un détecteur vision sur une porte de garage et je veux être averti si elle reste ouverte trop longtemps, puis éventuellement si elle a été refermée. Deux lignes simplissimes sur le principe:

 


GEA.add(148, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes",{{"Global","pushover", "La porte du garage est ouverte depuis plus de 10 minutes"},{"Global","PorteG1", "1"},{"Repeat"}})
GEA.add( {{"Global","PorteG1", "1"},{"Value",148,"0"}}, -1, "La porte du garage est refermée...",{{"Global","pushover", "La porte du garage est refermée"}, {"Global","PorteG1", "0"} })  

 

La VG PorteG1 est positionnée a 1 quand elle est restée ouverte trop longtemps pour déclencher la notification qu'elle est maintenant fermée.

La 1ere ligne fonctionne, la VG est bien positionnée à 1. La seconde jamais.


Pour vérifier la partie variable, j'ai ajouté cette ligne, cela fonctionne.
GEA.add( {"Global","PorteG1", "1"}, 30, "la VG PorteG1 vaut 1..., mise à zéro",{{"Global","pushover", "la VG PorteG1 vaut 1..., mise à zéro"}, {"Global","PorteG1", "0"} })  

 

Quand je mets les deux conditions, pas de déclenchement. J'ai vérifié que "value" est bien a zéro sur le Vision (148) quand est elle fermée.

 

J'ai 30 autres règles, plus compliquées que cela et pas de problème. Une idée ??

Merci pour votre aide

 

Partager ce message


Lien à poster
Partager sur d’autres sites

 

Citation

utilises tu les plugins ? Cela te le fait pour tous les déclenchements instantanés ? Peux tu mettre ta ligne correspondant au module 791 stp ? Commente la ligne pour tester stp. 

@pepiteSalut, non je n'utilise pas de plugins. Oui cela me le fait pour tous le déclenchements instantanés. J'ai fait la mise à jour GEA 6.10.

Je précise qu'avant de passer sur les firmwares 4.510 puis 4.511b, tous fonctionnait bien. Je n'ai rien modifié. Les autres déclenchements instantanés sont sur le même schéma et ne concernent que des lampes.

--LAMPE COULOIR (791)
    --La lampe s'allume à 05% de 23h à 06h si il n'y a pas d'invité
GEA.add({id["LAMPE_VAR_COULOIR"], {"Time", "23:01", "07:00"},{"Global","Invites_Maison","NON"}}, -1, "", {"Value", id["LAMPE_VAR_COULOIR"], 05})
    --La lampe s'allume à 65% de 23h à 06h si il y a des invités
GEA.add({id["LAMPE_VAR_COULOIR"], {"Time", "23:01", "07:00"},{"Global","Invites_Maison","OUI"}}, -1, "", {"Value", id["LAMPE_VAR_COULOIR"], 65})
    --La lampe s'allume à 65% en journée
GEA.add({id["LAMPE_VAR_COULOIR"], {"Time", "07:01", "23:00"}}, -1, "", {"Value", id["LAMPE_VAR_COULOIR"], 65})
    --Éteindre la lampe du couloir au bout de 1 mn si pas de détection avec le capteur du couloir.
GEA.add({id["DETECTEUR_MOUVEMENT_COULOIR"], {"Value+", id["LAMPE_VAR_COULOIR"],1}}, 60, "", {{"Inverse"}, {"turnOff", id["LAMPE_VAR_COULOIR"]}})
    --Mise à jour Variable Prédéfinie LampeCouloir
GEA.add(id["LAMPE_VAR_COULOIR"], -1, "", {"Global", "LampeCouloir", "ON"})
GEA.add(id["LAMPE_VAR_COULOIR"], -1, "", {{"Inverse"},{"Global", "LampeCouloir", "OFF"}})

Merci.

Partager ce message


Lien à poster
Partager sur d’autres sites

GEA 6.10 installé... pour le moment ça tourne. Je le trouve même plus rapide à démarrer :)

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@pepite Bon j'en ai eu marre de ce bug alors hier j'ai décidé de tout effacer (GEA + ses variables). Ensuite j'ai créé une nouvelle scène et remis GEA et la depuis j'ai l'impression que tout re-fonctionne comme avant.

Par contre je n'ai jamais eu de plugins et la variables GEA_Plugins existait. Penses-tu que cela pouvait être à l'origine du problème?

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

@fredokl, quelle bonne nouvelle ;-)

aucune idée, pourtant cette variable n'est créée que lorsque GEA trouve une correspondance et qu'elle n'existe pas.

Le 03/11/2018 à 10:42, Dgille a dit :

GEA.add( {{"Global","PorteG1", "1"},{"Value",148,"0"}}, -1, "La porte du garage est refermée...",{{"Global","pushover", "La porte du garage est refermée"}, {"Global","PorteG1", "0"} })  

Bonjour @Dgille

Ta variable "PorteG1" est-elle dans ton entête puisqu'en déclenchement instantané ? Si tel est le cas, est-ce que la ligne ci-dessous fonctionne ?

GEA.add( {{"Global","PorteG1", "1"},{"Value",148,"0"}}, 30, "La porte du garage est refermée...",{{"Global","pushover", "La porte du garage est refermée"}, {"Global","PorteG1", "0"} })  

Peux-tu tester ceci aussi après avoir vérifié que ta variable "PorteG1" soit bien dans ton entête stp ?

GEA.add( {{"Global","PorteG1", "1"},{"(Value)",148,"0"}}, -1, "La porte du garage est refermée...",{{"Global","pushover", "La porte du garage est refermée"}, {"Global","PorteG1", "0"} })  

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Je me permet une légère correction, c'est l'ID 148 qui doit être dans l'entête car c'est la fermeture de la porte qui doit déclenché la ligne. La VG elle ne change pas car elle a été positionnée sur "1" lors de l'ouverture de la porte.

  • Like 1
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

ah oui exact, merci pour la relecture lol @Steven trop vite sur ce coup là lol

 

Dans ce cas

GEA.add( {{"(Global)","PorteG1", "1"},{"Value",148,"0"}}, -1, "La porte du garage est refermée...",{{"Global","pushover", "La porte du garage est refermée"}, {"Global","PorteG1", "0"} })  

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci à tous les deux.

Au départ, je n'avais pas besoin de l'information en instantané, je pensais que les deux conditions seraient évaluées lors du contrôle toutes les 30s, mais si le déclencheur peut aider, pourquoi pas.

 

Modification effectuée à distance, je vous donne le résultat dès que je suis sur place.

Partager ce message


Lien à poster
Partager sur d’autres sites

Cela fonctionne avec la modification de l'entête !! Merci encore.

Juste sur le principe (et histoire de faire avance rle smilblic), pourquoi la condition (value du 148)  n'est elle pas évaluée lors du lancement régulier ?

Partager ce message


Lien à poster
Partager sur d’autres sites

salut

@pepite

 

il y un moment de ça tu m'avais aidée a intégrée une nouvelle option à GEA

 

GEA.add(condition , 30, "Interrupteur Bloquée",{ {"Protection", 452, 2}}

 

GEA.options.protection = {name="Protection",
                    optimize=true,
                    control=function(id) if (not id) then id = GEA.currentMainId end return GEA.options.number.control(id) end,
                    action=function(id, value) if (not id) then id = GEA.currentMainId end if (type(id) ~= "table") then id = {id} end for i=1, #id do fibaro:call(id[i],"setProtection", value) end end
     
               },

 

Option que j'ai intégré a GEA 6.10  sans problème

 

mai voilà aujourd’hui je cherche a offrir a GEA   une option de protection plus complète  ( Local protection  et RF protection*) 

*Local protection = blocage de l’interrupteur en local

*RF protection = blocage de l’interrupteur  depuis un smartphone ou autre 

 

le code suivant permet d'activée et désactivée Local protection  et RF protection mai il fonctionne en  method = 'POST' en mettant à  jour l'argument d'un module 

 

---Mode Protection active----  
SI ---{ "args": [2,0]} uniquelent Local
SI ---{ "args": [0,1]} uniquement RF
SI ---{ "args": [2,1]} Local et RF

 

Si ---Mode protection inactive---
Si ---{ "args": [0,1]} uniquelent Local
SI ---{ "args": [2,0]} uniquelent RF
SI ---{ "args": [0,0]} Local et RF

 

ma question comment intégrée ce code ou la méthode a GEA ?

local function postMethod(requestUrl, data, successCallback, errorCallback) 
    local http = net.HTTPClient() 
  
  print (data)
  
      http:request(requestUrl, {
        options = { 
            method = 'POST', 
              headers = {}, 
              data = data, 
              timeout = data.timeout or 5000 }, 
      success = successCallback,
      error = errorCallback
    }) 
end


local function fibaroBlindProtection(id, onOff) -- ID , [on/off]

  local url = 'http://127.0.0.1:11111/api/devices/'..id..'/action/setProtection'

---Mode Protection active----  
---{ "args": [2,0]} uniquelent Local
---{ "args": [0,1]} uniquement RF
---{ "args": [2,1]} Local et RF

---Mode protection inactive
---{ "args": [0,1]} uniquelent Local
---{ "args": [2,0]} uniquelent RF
---{ "args": [0,0]} Local et RF



  local data = '{"args": [0,0]}'
    if onOff == "on" then 
	
       data = '{ "args": [2,1]}'  ----Protection active de Local et RF
  end
  
  postMethod(url, data, function(resp)
    
    if resp.status < 300 then
      print('Connection successful, status ' .. resp.status)
    else
      print('Connection failed, status ' .. resp.status)
    end
      
    end,
    
    function(err)
      print('error ' .. err)
    end
    )
  
end

-- Utilisez fibaroBlindProtection  ( deviceID , "on" ou "off")
                        
fibaroBlindProtection (123, "on")

 

 

Modifié par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 15 heures, Dgille a dit :

pourquoi la condition (value du 148)  n'est elle pas évaluée lors du lancement régulier ?

Bonjour,

 

Tu as mis -1 donc en déclenchement instantané et non en automatique. La condition n'est donc évaluée qu'au changement de valeur de ton module 148 qui lance la scène sur le changement de valeur.

 

@971jmd

 

Je regarde et te tiens au courant.

Tu peux mettre le json de ton 452 pour RF lorsqu'il est active ou non active stp ?

Pour le local, Protection active : 2 et pour le desactiver : 0 ?

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

@971jmd

 A toi de jouer tu peux tester ;-) stp. Attention, non testé. Code à mettre dans config()

GEA.options.protection = {name="Protection",
                    optimize=true,
                    control=function(id) if (not id) then id = GEA.currentMainId end return GEA.options.number.control(id) end,
                    action=function(id,type,args) if (type(id) ~= "table") then id = {id} end  for i=1, #id do
                        local url = 'http://127.0.0.1:11111/api/devices/'..id..'/action/setProtection'
                        local datas  
                        if (not type) then if args:lower() == "on" then datas = '{ "args": [2,1]}' else datas = '{"args": [0,0]}' end end
                        if type:lower() == "local" then if args:lower() == "on" then datas = '{ "args": [2,0]}' else datas = '{"args": [0,1]}' end end
                        if type:lower() == "rf" then if args:lower() == "on" then datas = '{ "args": [0,1]}' else datas = '{"args": [2,0]}' end end
                        local http = net.HTTPClient()
                        http:request(url,  { options =  { method =  "POST", data = datas }, success = function(response) end, error  = function(err) tools.error(err) end })
                    end end

Puis les lignes :

-- Pour LOCAL et RF
GEA.add(condition , 30, "Interrupteur Bloqué RF & LOCAL",{ {"Protection", 452, "On"}}
GEA.add(condition , 30, "Interrupteur Bloqué RF & LOCAL",{ {"Protection", {452, 32}, "On"}}
GEA.add(condition , 30, "Interrupteur DEBloqué RF & LOCAL",{ {"Protection", 452, "Off"}}
GEA.add(condition , 30, "Interrupteur DEBloqué RF & LOCAL",{ {"Protection", {452, 32}, "Off"}}

-- Pour LOCAL UNIQUEMENT
GEA.add(condition , 30, "Interrupteur Bloqué LOCAL UNIQUEMENT",{ {"Protection", 452, "Local", "On"}}
GEA.add(condition , 30, "Interrupteur Bloqué LOCAL UNIQUEMENT",{ {"Protection", {452,32}, "Local", "On"}}
GEA.add(condition , 30, "Interrupteur DEBloqué LOCAL UNIQUEMENT",{ {"Protection", 452, "Local", "Off"}}
GEA.add(condition , 30, "Interrupteur DEBloqué LOCAL UNIQUEMENT",{ {"Protection", {452,32}, "Local", "Off"}}

-- Pour RF UNIQUEMENT
GEA.add(condition , 30, "Interrupteur Bloqué RF UNIQUEMENT",{ {"Protection", 452, "RF", "On"}}
GEA.add(condition , 30, "Interrupteur Bloqué RF UNIQUEMENT",{ {"Protection", {452, 32}, "RF", "On"}}
GEA.add(condition , 30, "Interrupteur DEBloqué RF UNIQUEMENT",{ {"Protection", 452, "RF", "Off"}}
GEA.add(condition , 30, "Interrupteur DEBloqué RF UNIQUEMENT",{ {"Protection", {452, 32}, "RF", "Off"}}

Amuse toi bien

Partager ce message


Lien à poster
Partager sur d’autres sites

@Pepite

Ok, je pensais que les -1 étaient évaluées lors des déclenchements réguliers ET lors sur événements liés au module.

Donc si je supprime de l'entête, il faut mettre une condition minimale, style 30s dans l'état 0. C'est plus clair et on en apprend tous les jours :60:

 

Merci pour ce support efficace (comme d'hab).

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 2 heures, Dgille a dit :

il faut mettre une condition minimale, style 30s

Exactement, En fait avec GEA, toutes les durées multiples de 30 restent dans la même instance, alors que les "-1" créent une autre instance.

Partager ce message


Lien à poster
Partager sur d’autres sites

@pepite

 

salut oui effectivement je m'amuse ;)

 

j'ai tester plusieurs combinaison 

et j'ai comme erreur :

 

[DEBUG] 07:25:48:    [Démarrage] #7 [true][Protection, [452,"Local","On"]]
[DEBUG] 07:25:48: Erreur, vérifier : [Protection, [452,"Local","On"]]
[DEBUG] 07:26:18: ... vérification en cours #2 @60s...

 

 protection = {name="Protection",
                    optimize=true,
                    control=function(id) if (not id) then id = GEA.currentMainId end return GEA.options.number.control(id) end,
                    action=function(id,type,args) if (type(id) ~= "table") then id = {id} end  for i=1, #id do
                        local url = 'http://127.0.0.1:11111/api/devices/'..id..'/action/setProtection'
                        local datas  
                        if (not type) then if args:lower() == "on" then datas = '{ "args": [2,1]}' else datas = '{"args": [0,0]}' end end
                        if type:lower() == "local" then if args:lower() == "on" then datas = '{ "args": [2,0]}' else datas = '{"args": [0,1]}' end end
                        if type:lower() == "rf" then if args:lower() == "on" then datas = '{ "args": [0,1]}' else datas = '{"args": [2,0]}' end end
                        local http = net.HTTPClient()
                        http:request (url,  { options =  { method =  "POST", data = datas }, success = function(response) end, error  = function(err) tools.error(err) end })
                    end end	
  
    },

si on le code lua qui fonctionne, nous avons :

  local data = '{"args": [0,0]}'
    if onOff == "on" then 
	
       data = '{ "args": [2,1]}'
  end

 

 

Modifié par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

Ce n'est pas du tout le code que je t'ai proposé, tu as tout modifié.

Quand tu te demandes de l'aide, fais au moins semblant de tester le code qu'on te propose. Certes c'est certainement sur que j'ai fait des erreurs...fait au moins semblant avant de tout modifier

Partager ce message


Lien à poster
Partager sur d’autres sites

désolé j'ai pas coller le bon code, j'ai rectifiée 

Modifié par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai toujours le code erreur 

Erreur, vérifier : [Protection, [452,"Local","On"]]

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour info reçois bien la notif :  Interrupteur Bloqué RF & LOCAL

GEA.add(true, 30, "Interrupteur Bloqué RF & LOCAL",{ {"Protection", 452, "local", "On"}} ) 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

 

bon je n'y a rive pas :(

 

je pense que ça vient de la méthode post 

 

 

Modifié par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

@971jmd

Essaie cela dans config() pour voir :

 

GEA.options.protection = {name="Protection",
                    optimize=true,
                    control=function(id) if (not id) then id = GEA.currentMainId end return GEA.options.number.control(id) end,
                    action=function(id,type,args) if (type(id) ~= "table") then id = {id} end  for i=1, #id do
                        local url = 'http://127.0.0.1:11111/api/devices/'..id[i]..'/action/setProtection'
                        local datas  
                        if (not type) then if args:lower() == "on" then datas = '{ "args": [2,1]}' else datas = '{"args": [0,0]}' end end
                        if type:lower() == "local" then if args:lower() == "on" then datas = '{ "args": [2,0]}' else datas = '{"args": [0,1]}' end end
                        if type:lower() == "rf" then if args:lower() == "on" then datas = '{ "args": [0,1]}' else datas = '{"args": [2,0]}' end end
                        local http = net.HTTPClient()
                        http:request(url,  { options =  { method =  "POST", data = datas }, success = function(response) end, error  = function(err) tools.error(err) end })
                    end end
                },

 

Partager ce message


Lien à poster
Partager sur d’autres sites

enfin mai

 

il  y avait des problèmes au niveau des arguments mai le plus gros problème est sur la ligne   local url = 'http://127.0.0.1:11111/api/devices/340/action/setProtection'

ne prend pas en compte ID

pour que ça fonctionne j'ai du placée ID manuellement ID340 

     protection = {name="Protection",
                    optimize=true,
                    control=function(id) if (not id) then id = GEA.currentMainId end return GEA.options.number.control(id) end,
                    action=function(id,typee,args) if (type(id) ~= "table") then id = {id} end  for i=1, #id do
                    
					action=function(id, property, value) if (type(id) ~= "table") then id = {id} end for i=1, #id do fibaro:call(id[i], "setProperty", property, GEA.getMessage(GEA.incdec(value, GEA.options.property.getValue(id, property)))) end end
               

					local url = 'http://127.0.0.1:11111/api/devices/340/action/setProtection'
                        local datas  
                 
                       if typee:lower() == "local_rf" then if args:lower() == "on" then datas =  '{ "args": [2,1]}'  end end
                       if typee:lower() == "local_rf" then if args:lower() == "off" then datas = '{ "args": [0,0]}' end end
                       
          
          
					   if typee:lower() == "local" then if args:lower() == "on" then datas =  '{ "args": [2,0]}'  end end
                       if typee:lower() == "local" then if args:lower() == "off" then datas = '{ "args": [0,2]}' end end
                       

					   if typee:lower() == "rf" then if args:lower() == "on" then datas =  '{ "args": [0,1]}'  end end
                       if typee:lower() == "rf" then if args:lower() == "off" then datas = '{ "args": [1,0]}'  end end
                        
						
						local http = net.HTTPClient()
                        http:request (url,  { options =  { method =  "POST", data = datas }, success = function(response) end, error  = function(err) tools.error(err) end })
                    end end	
  
    },
    

id.thumb.PNG.b144cc9574ea9ddae78394c05db079f9.PNG

Modifié par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

oufffff :60:

 

voila tout semble bien fonctionné 

     protection = {name="Protection",
                    optimize=true,
                    control=function(id) if (not id) then id = GEA.currentMainId end return GEA.options.number.control(id) end,
                    action=function(id,typee,args) if (type(id) ~= "table") then id = {id} end  for i=1, #id do
                    
					GEA.getMessage(GEA.incdec(value, GEA.options.property.getValue(id, property)))) end end
               

					local url = 'http://127.0.0.1:11111/api/devices/'..id[i]..'/action/setProtection'
                        local datas  
                 
                       if typee:lower() == "local_rf" then if args:lower() == "on" then datas =  '{ "args": [2,1]}'  end end
                       if typee:lower() == "local_rf" then if args:lower() == "off" then datas = '{ "args": [0,0]}' end end
                       
          
          
					   if typee:lower() == "local" then if args:lower() == "on" then datas =  '{ "args": [2,0]}'  end end
                       if typee:lower() == "local" then if args:lower() == "off" then datas = '{ "args": [0,2]}' end end
                       

					   if typee:lower() == "rf" then if args:lower() == "on" then datas =  '{ "args": [0,1]}'  end end
                       if typee:lower() == "rf" then if args:lower() == "off" then datas = '{ "args": [1,0]}'  end end
                        
						
						local http = net.HTTPClient()
                        http:request (url,  { options =  { method =  "POST", data = datas }, success = function(response) end, error  = function(err) tools.error(err) end })
                    end end	
  
    },
-- Pour LOCAL et RF
--Bloqué
GEA.add(condition , 30,  "Interrupteur Bloqué RF & LOCAL",{ {"Protection", 340, "local_rf", "on"}})
GEA.add(condition , 30,  "Interrupteur Bloqué RF & LOCAL",{ {"Protection", {340,452}, "local_rf", "on"}}) 
--Débloqué
GEA.add(condition , 30,  "Interrupteur Débloqué RF & LOCAL",{ {"Protection", 340, "local_rf", "off"}})
GEA.add(condition , 30,  "Interrupteur Débloqué RF & LOCAL",{ {"Protection", {340,452}, "local_rf", "off"}}) 

-- Pour LOCAL uniquement
--Bloqué 
GEA.add(condition , 30,  "Interrupteur Bloqué LOCAL",{ {"Protection", 340, "local", "on"}})
GEA.add(condition , 30,  "Interrupteur Bloqué LOCAL",{ {"Protection", {340,452}, "local", "on"}}) 
--Débloqué
GEA.add(condition , 30,  "Interrupteur Débloqué LOCAL",{ {"Protection", 340, "local", "off"}}) 
GEA.add(condition , 30,  "Interrupteur Débloqué LOCAL",{ {"Protection", {340,452}, "local", "off"}}) 

-- Pour RF uniquement
--Bloqué 
GEA.add(condition , 30,  "Interrupteur Bloqué RF ",{ {"Protection", 340, "rf", "on"}})
GEA.add(condition , 30,  "Interrupteur Bloqué RF ",{ {"Protection", {340,452}, "rf", "on"}}) 
--Débloqué
GEA.add(condition , 30,  "Interrupteur Débloqué RF ",{ {"Protection", 340, "rf", "off"}}) 
GEA.add(condition , 30,  "Interrupteur Débloqué RF ",{ {"Protection", {340,452}, "rf", "off"}})

merci a toi @pepite

Modifié par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

mon premier code avec la fonctionne protection

 

couvre feu de la chambre des enfants a 21h00

---extinction de la suspension et blocage de l'interupteur
GEA.add( true, 30   "Interrupteur CH Bloqué",{ {"Time", "21:00", "21:01"}, {"turnOff", id["SUSPLMAPEENFANT"]}, {"Protection", id["SUSPLMAPEENFANT"], "local", "on"}}) 

---Déblocaghe de l'interupteur
GEA.add(true, 30,   "Interrupteur CH Débloqué",{{"Time", "00:00", "00:01"}, {"Protection", id["SUSPLMAPEENFANT"], "local", "off"}}) 

 

 

Modifié par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

tant mieux si cela fonctionne mais perso, je ne ferais pas un httpRequest mais un api.post() ;). Mais vu que cela fonctionne, ne touche plus rien.

Partager ce message


Lien à poster
Partager sur d’autres sites

×