Aller au contenu

OJC

Membres confirmés
  • Compteur de contenus

    390
  • Inscription

  • Dernière visite

  • Jours gagnés

    8

Tout ce qui a été posté par OJC

  1. OJC

    VD Sonos TTS Remote

    Pour la variable, je viens de retester en supprimant la mienne, pas de soucis. Tu as un message d'erreur ?
  2. OJC

    VD Sonos TTS Remote

    @MAM78 A la base, mon idée de départ était d'avoir juste à cliquer sur un bouton pour indiquer à ma femme que je quitte le taff, et qu'elle soit prévenue de l'heure de mon arrivée. Donc c'est du moitié fixe, moitié dynamique. Bon, y'avais sûrement plus simple pour arriver à ce résultat, mais bon...
  3. OJC

    VD Sonos TTS Remote

    @pepite le VD se contente de cliquer sur le bouton Process du VD Sonos Remote . Plus exactement, la fonction SonosTTS:sendTTS va renseigner une variable globale puis cliquer sur le bouton Transmission du VD qui, lui, va récupérer les données de la variable globale et exécuter le code de @Krikroff.
  4. VD Sonos TTS Remote v. 1.0.0 - 06/01/2018 Je vous présente le VD Sonos TTS Remote, qui requiert impérativement pour fonctionner le SONOS Remote V1.0.1 RC pour Fibaro HC2 de @Krikroff. Le but de ce VD est de disposer de favoris pour faire du TTS avec les Sonos ainsi que d'un clavier pour une utilisation dynamique : Sonos_TTS_Remote.vfib Pour le fonctionnement du clavier, il faut renseigner le champ Port du VD avec le nombre de secondes au-delà un clic sur le bouton insère un nouveau caractère. Il n'y a aucun autre paramétrage à effectuer, le VD identifie automatiquement les VD SONOS Remote V1.0.1 RC pour Fibaro HC2 présents sur la box pour interagir avec eux. Il y a deux boutons Favoris, mais vous pouvez en rajouter autant que nécessaire en faisant un copier-coller du code : local SonosTTS={credits="Sonos TTS Remote v. 1.1.0 - Copyright 2018 Olivier Meyer - GNU GPLv3",f=fibaro,global="x_sonos_tts",button="btnTransmission",language="fr-FR",duration="auto",getRemoteId=function(s)local x=s.f:getGlobalValue(s.global)if string.len(x or "")>0 then x = json.decode(x)if x and type(x)=="table" then if x.remote then return true, x.remote end end end return false,"[Sonos TTS Remote] Unable to retrieve Sonos TTS Remote ID from x_sonos_tts, please check variable" end,setTTS=function(s,i,m,v,l,d)local x=s.f:getGlobalValue(s.global)if string.len(x or "")>0 then x = json.decode(x)if x and type(x)=="table" then x.tts={};x.tts.sonos=i;x.tts.message=m;x.tts.volume=v;x.tts.language=l or s.language;x.tts.duration=d or s.duration;s.f:setGlobal(s.global,json.encode(x));return true end end return false, "[Sonos TTS Remote] Unable to set x_sonos_tts, please check variable" end,getBtn=function(s,i,n)local c,r=0,api.get("/devices/"..tostring(i))["properties"]["rows"] local x=#r for a=1,x do local y=#r[a].elements for b=1,y do c=c+1 if n==r[a].elements[b].name then return c end end end s.f:debug("[Sonos TTS Remote] Unable to locate button "..n..", check virtual device "..i);return nil end,sendTTS=function(s,i,m,v,l,d)r,c=s:setTTS(i,m,v,l,d)if r then r,c=s:getRemoteId()if r then s.f:call(tonumber(c),"pressButton",s:getBtn(c,s.button))return end end s.f:debug(c)end,} local _f = fibaro local _i = _f:getSelfId() local getSonos=function()local _c=_f:getValue(_i,"ui.lblSonos.value");local _x=_f:getGlobalValue("x_sonos_tts")if string.len(_x or "")>0 then _x=json.decode(_x)if _x and type(_x)=="table" then if _x.sonos then for i,j in ipairs(_x.sonos)do if _c==j.name then return j.id end end return nil end end end end local sid = getSonos() local message = "Votre message" local volume = _f:getValue(_i,"ui.sliderVolume.value") local language = "fr_FR" local duration = "auto" _f:call(_i, "setProperty", "ui.favo.value", message) SonosTTS:sendTTS(sid, message, volume, language, duration) A noter, bien que le VD de @Krikroff se suffise à lui-même pour cela, que ce code est du coup fonctionnel dans n'importe quelle scène ou module virtuel, de la manière suivante : local SonosTTS={credits="Sonos TTS Remote v. 1.1.0 - Copyright 2018 Olivier Meyer - GNU GPLv3",f=fibaro,global="x_sonos_tts",button="btnTransmission",language="fr-FR",duration="auto",getRemoteId=function(s)local x=s.f:getGlobalValue(s.global)if string.len(x or "")>0 then x = json.decode(x)if x and type(x)=="table" then if x.remote then return true, x.remote end end end return false,"[Sonos TTS Remote] Unable to retrieve Sonos TTS Remote ID from x_sonos_tts, please check variable" end,setTTS=function(s,i,m,v,l,d)local x=s.f:getGlobalValue(s.global)if string.len(x or "")>0 then x = json.decode(x)if x and type(x)=="table" then x.tts={};x.tts.sonos=i;x.tts.message=m;x.tts.volume=v;x.tts.language=l or s.language;x.tts.duration=d or s.duration;s.f:setGlobal(s.global,json.encode(x));return true end end return false, "[Sonos TTS Remote] Unable to set x_sonos_tts, please check variable" end,getBtn=function(s,i,n)local c,r=0,api.get("/devices/"..tostring(i))["properties"]["rows"] local x=#r for a=1,x do local y=#r[a].elements for b=1,y do c=c+1 if n==r[a].elements[b].name then return c end end end s.f:debug("[Sonos TTS Remote] Unable to locate button "..n..", check virtual device "..i);return nil end,sendTTS=function(s,i,m,v,l,d)r,c=s:setTTS(i,m,v,l,d)if r then r,c=s:getRemoteId()if r then s.f:call(tonumber(c),"pressButton",s:getBtn(c,s.button))return end end s.f:debug(c)end,} local sid = -- id du VD correspondant au Sonos à utiliser local message = -- votre message local volume = -- le volume à utiliser local language = -- la langue à utiliser, paramètre optionnel à défaut duquel "fr_FR" qui est utilisé local duration = -- la durée à utiliser, paramètre optionnel à défaut duquel "auto" qui est utilisé SonosTTS:sendTTS(sid, message, volume, [language], [duration]) Voici les icônes, respectivement l'icône principale du VD qui est aussi prévue pour aller sur les boutons du clavier et le slider du volume, l'icône pour les boutons de sélection du Sonos, l'icône pour les boutons des favoris et l'icône pour le bouton Transmission : CREDITS Outre, bien évidemment, @Krikroff et son VD Sonos Remote sans lequel le présent VD serait sans le moindre intérêt, @seiq et son VD Keyboard publié sur le forum officiel.
  5. OJC

    VD Yeelight Controller

    J'ai du mal à saisir ? EDIT = Comme ça ? cf post précédent
  6. OJC

    VD Yeelight Controller

    @Lazer Chef, oui Chef ! getBtn=function(i,n) r = api.get("/devices/"..tostring(i))["properties"]["rows"] for a=1,#r do for b=1,#r[a].elements do if n == r[a].elements[b].name then return a+b end end end return nil end getBtn=function(i,n)r=api.get("/devices/"..tostring(i))["properties"]["rows"] for a=1,#r do for b=1,#r[a].elements do if n == r[a].elements[b].name then return a+b end end end return nil end
  7. OJC

    VD Yeelight Controller

    Dernière petite modification : il est désormais possible de modifier le VD à loisir (ajouter ou supprimer des boutons, des étiquettes...) en fonction des besoins et de la lampe (par exemple, l'ampoule blanche n'a pas besoin de tout ce qui concerne la couleur), et ce sans avoir à s'inquiéter du changement de numérotation des boutons Connexion TCP et Transmission . Pour ceux que ça intéresse, voici la fonction qui permet au VD de se débrouiller tout seul pour savoir où appuyer (fonction générique pouvant être reprise telle qu'elle dans n'importe quel VD ou scène pourvu qu'on ait besoin de faire un pressButton) : function getBtn(id, name) count,rows = 0, api.get("/devices/"..tostring(id))["properties"]["rows"] for a, b in pairs(rows) do for c, d in pairs(b) do if c == "elements" then for e, f in pairs(d) do for g, h in pairs(f) do if g == "name" then count = count + 1 if h == n then return count end end end end end end end fibaro:debug("Unable to locate button "..n..", check virtual device "..id) return nil end Et la version minifiée : getBtn=function(i,n)x,r=0,api.get("/devices/"..tostring(i))["properties"]["rows"];for a,b in pairs(r)do for c,d in pairs(b)do if c == "elements" then for e,f in pairs(d)do for g,h in pairs(f)do if g=="name" then x=x+1 if h==n then return x end end end end end end end fibaro:debug("Unable to locate button "..n..", check virtual device "..i);return nil end
  8. OJC

    VD Yeelight Controller

    Petite mise à jour avec notamment l'ajout du ModificationTime pour chaque propriété de la lampe et l'envoi des logs dans la zone de debug de la scène ou du VD d'où a été envoyée la commande.
  9. @pepite@Lazer C'est étrange... Quand je clique sur le bouton du VD, j'ai bien mon message qui vient s'ajouter dans la zone de debug de la scène. En revanche, quand depuis cette scène, je clique sur le bouton, rien ne s'affiche (alors que je clique bien sur le bon bouton). Auriez-vous une idée du problème ? EDIT = Compris, en fait ça va trop vite pour c'te pauvre HC2... Du coup, j'ai ajouté un fibaro:sleep(1000) juste avant de faire fibaro:startScene() et ça roule impec'
  10. @pepite oué, du coup c'est ce que je suis en train de coder . Merci !
  11. @Lazer Existe-t-il une fonction équivalente permettant de faire l'inverse, c'est-à-dire que le VD envoie un message dans le debug d'une scène ?
  12. @DGDIM Salut, Si tes dimmers sont des FGD-212 et que l'éclairage de ton salon est piloté par l'un d'eux, alors tu peux utiliser leur fonction sceneActivation pour détecter l'extinction via l'interrupteur et allumer ton éclairage LED.
  13. VD Yeelight Controller v. 1.3.1 - 18/11/2019 Je vous présente le VD Yeelight Manager qui, comme son nom l'indique, permet d'intégrer les produits Yeelight avec la HC2. Pour être très précis, je ne dispose que d'une Bedside Lamp et je n'ai donc pas testé ce VD avec d'autres produits. Cependant, l'API étant générique, il n'y a pas de raisons que ça ne fonctionne pas aussi. Seule limite, je n'ai pas intégré dans le VD la gestion de la background light puisque la Bedside Lamp n'en a pas. Trêve de bavardages, voici l'usine à gaz : VD Yeelight Controller v. 1.3.1 Paramétrage des plus classiques, il vous suffit de renseigner l'IP de la Yeelight dans le champ IP du VD, et le port dans le champ Port du VD (c'est le port 55443 qui est utilisé par les Yeelights). Avant d'importer le VD, je vous conseille de l'ouvrir dans un éditeur de texte et de faire un rechercher/remplacer pour définir l'ID de l'icône des boutons (rechercher la chaîne "buttonIcon":1011). IMPORTANT = Il faut activer le Contrôle sur le réseau local depuis l'application Yeelight, pour chaque lampe. Pour pouvoir gérer une Yeelight 'presque' comme un module, il suffit d'insérer dans la scène ou le code du bouton ou du Main Loop le code suivant : _y={credits='Yeelight Controller v. 1.3.0 - Copyright 2018 Olivier Meyer - GNU GPLv3',global='y_yeelight_global',item='y_yeelight_',props={power=true,bright=true,ct=true,rgb=true,hue=true,sat=true,color_mode=true,flowing=true,delayoff=true,flow_params=true,music_on=true,name=true,bg_power=true,bg_flowing=true,bg_flow_params=true,bg_ct=true,bg_lmode=true,bg_bright=true,bg_rgb=true,bg_hue=true,bg_sat=true,nl_br=true},f=fibaro,debug=function(s,m,c)s.f:debug(string.format('<span style="color:%s;">%s</span>', c, m))end,here=function(s)local h=type(s.f.getSelfId)=='nil' if h then return h,__fibaroSceneId else return h,s.f:getSelfId(),_elementID_ end end,log=function(s)local h=s:here()if h then local a=s.f:args()if a then if a[1].yeelight then s:debug(a[1].debug,a[1].color);s:debug(a[1].command,a[1].color);os.exit()end end end end,getBtn=function(s,i,n)local c,r=0,api.get('/devices/'..tostring(i))['properties']['rows'] local x=#r for a=1,x do local y=#r[a].elements for b=1,y do c=c+1 if n==r[a].elements[b].name then return c end end end s:debug('[Yeelight] Unable to locate button '..n..', check virtual device '..i,'Tomato');return nil end,build=function(s,m,p)local c='{"id":1, "method":"'..m..'", "params":['for i=1,#p do if type(p[i])=="number"then c=c..p[i]else c=c..'"'..p[i]..'"'end;if i~=#p then c=c..', 'end end;c=c..']}\r\n'return c end,load=function(s,v)local g=s.f:getGlobalValue(v)if string.len(g or '')>0 then local d=json.decode(g)if d and type(d)=='table'then return d else s:debug('[Yeelight] Unable to process data, check variable','Tomato')end else s:debug('[Yeelight] No data found!','Tomato')end return nil end,set=function(s,i,d)local g=s:load(s.global)if g[tostring(i)]then local a,b,c=s:here();g[tostring(i)].scene=a;g[tostring(i)].id=b;g[tostring(i)].button=c;g[tostring(i)].command=d;s.f:setGlobal(s.global,json.encode(g))end end,call=function(s,i,m,p)local b=s:getBtn(i,'btnTransmission')if b==nil then return nil end;local c=s:build(m,p)s:set(i,c)s.f:call(i,'pressButton',b)end,getValue=function(s,i,p,g)if s:checkP(p) then if type(g)~='table' then g=s:load(s.item..i)end if g.properties then if g.properties[p] then if g.properties[p].value then return g.properties[p].value end end end s:debug('[Yeelight] Unable to get value of '..tostring(p)..', please check variable.','Tomato');end return nil end,getModificationTime=function(s,i,p,g)if s:checkP(p) then if type(g)~='table' then g=s:load(s.item..i)end if g.properties then if g.properties[p] then if g.properties[p].modificationTime then return g.properties[p].modificationTime end end end s:debug('[Yeelight] Unable to get modification time of '..tostring(p)..', please check variable.','Tomato');end return nil end,get=function(s,i,p)local g=s:load(s.item..i);return s:getValue(i,p,g),s:getModificationTime(i,p,g)end,getStatus=function(s,i)local g=s:load(s.item..i)if g then if g.status then return g.status end end return nil end,getLastChange=function(s,i)local g=s:load(s.item..i)if g then if g.last then return g.last end end return nil end,checkP=function(s,p)if not s.props[p] then s:debug('[Yeelight] '..p..' is not an existing property!','Tomato') return false end return true end} _y:log() Ce code ci-dessus contient les fonctions suivantes : _y:call(id, method, params) qui permet d'envoyer une commande à la lampe. Les différents boutons du VD permettent d'avoir un aperçu du fonctionnement. Pour aller plus loin, je vous renvoie à la documentation de l'API Yeelight : Yeelight_Inter-Operation_Spec.pdf _y:get(id, property) qui fait exactement la même chose que fibaro:get() _y:getValue(id, property) qui fait exactement la même chose que fibaro:getValue() _y:getModificationTime(id, property) qui fait exactement la même chose que fibaro:getModificationTime() _y:getStatus(id) qui retourne "online" si la lampe est connectée au réseau wifi, et "offline" dans le cas contraire _y:getLastChange(id) qui retourne une table contenant les propriétés qui viennent d'être modifiées et leur nouvelle valeur Les logs générés par l'utilisation de la fonction call() s'affichent dans la zone de debug de la scène (ne pas oublier pour cela la ligne _y:log() et d'autoriser suffisamment d'instances) ou dans celle du bouton / main loop du module virtuel d'où a été utilisé la fonction. Pour pouvoir utiliser ces lampes comme déclencheurs de scène, le VD crée automatiquement une variable globale y_yeelight_XXX, où XXX est l'ID du VD. Cette variable globale contient toutes les propriétés de la lampe et est mise à jour en temps réel. Par exemple, pour lancer l'exécution d'une scène à l'allumage d'une Yeelight : --[[ %% globals y_yeelight_XXX --]] _y={credits='Yeelight Controller v. 1.3.0 - Copyright 2018 Olivier Meyer - GNU GPLv3',global='y_yeelight_global',item='y_yeelight_',props={power=true,bright=true,ct=true,rgb=true,hue=true,sat=true,color_mode=true,flowing=true,delayoff=true,flow_params=true,music_on=true,name=true,bg_power=true,bg_flowing=true,bg_flow_params=true,bg_ct=true,bg_lmode=true,bg_bright=true,bg_rgb=true,bg_hue=true,bg_sat=true,nl_br=true},f=fibaro,debug=function(s,m,c)s.f:debug(string.format('<span style="color:%s;">%s</span>', c, m))end,here=function(s)local h=type(s.f.getSelfId)=='nil' if h then return h,__fibaroSceneId else return h,s.f:getSelfId(),_elementID_ end end,log=function(s)local h=s:here()if h then local a=s.f:args()if a then if a[1].yeelight then s:debug(a[1].debug,a[1].color);s:debug(a[1].command,a[1].color);os.exit()end end end end,getBtn=function(s,i,n)local c,r=0,api.get('/devices/'..tostring(i))['properties']['rows'] local x=#r for a=1,x do local y=#r[a].elements for b=1,y do c=c+1 if n==r[a].elements[b].name then return c end end end s:debug('[Yeelight] Unable to locate button '..n..', check virtual device '..i,'Tomato');return nil end,build=function(s,m,p)local c='{"id":1, "method":"'..m..'", "params":['for i=1,#p do if type(p[i])=="number"then c=c..p[i]else c=c..'"'..p[i]..'"'end;if i~=#p then c=c..', 'end end;c=c..']}\r\n'return c end,load=function(s,v)local g=s.f:getGlobalValue(v)if string.len(g or '')>0 then local d=json.decode(g)if d and type(d)=='table'then return d else s:debug('[Yeelight] Unable to process data, check variable','Tomato')end else s:debug('[Yeelight] No data found!','Tomato')end return nil end,set=function(s,i,d)local g=s:load(s.global)if g[tostring(i)]then local a,b,c=s:here();g[tostring(i)].scene=a;g[tostring(i)].id=b;g[tostring(i)].button=c;g[tostring(i)].command=d;s.f:setGlobal(s.global,json.encode(g))end end,call=function(s,i,m,p)local b=s:getBtn(i,'btnTransmission')if b==nil then return nil end;local c=s:build(m,p)s:set(i,c)s.f:call(i,'pressButton',b)end,getValue=function(s,i,p,g)if s:checkP(p) then if type(g)~='table' then g=s:load(s.item..i)end if g.properties then if g.properties[p] then if g.properties[p].value then return g.properties[p].value end end end s:debug('[Yeelight] Unable to get value of '..tostring(p)..', please check variable.','Tomato');end return nil end,getModificationTime=function(s,i,p,g)if s:checkP(p) then if type(g)~='table' then g=s:load(s.item..i)end if g.properties then if g.properties[p] then if g.properties[p].modificationTime then return g.properties[p].modificationTime end end end s:debug('[Yeelight] Unable to get modification time of '..tostring(p)..', please check variable.','Tomato');end return nil end,get=function(s,i,p)local g=s:load(s.item..i);return s:getValue(i,p,g),s:getModificationTime(i,p,g)end,getStatus=function(s,i)local g=s:load(s.item..i)if g then if g.status then return g.status end end return nil end,getLastChange=function(s,i)local g=s:load(s.item..i)if g then if g.last then return g.last end end return nil end,checkP=function(s,p)if not s.props[p] then s:debug('[Yeelight] '..p..' is not an existing property!','Tomato') return false end return true end} _y:log() local function run() --Code à exécuter à l''allumage de la Yeelight end local trigger = fibaro:getSourceTrigger() if trigger.type == "global" then if trigger.name == "y_yeelight_XXX" then if _y:getLastChange(XXX)["power"] == "on" then run() end end end Et voici les icônes que j'utilise pour l'état on/off de la lampe, celle qui est sur chaque bouton pour signifier l'envoi de la commande, et celle qui indique que la lampe est hors ligne : REMERCIEMENTSun grand merci à @ADN182 qui m'a fourni le VD qu'il avait commencé à développer et qui m'a fait gagner beaucoup de temps dans la compréhension de la manière d'envoyer les commandes à la lampe, vu que l'objet Net.FTcpSocket ne semble documenté nulle part (ou alors je n'ai pas trouvé ). Egalement, je dois pas mal à @Krikroff et à son VD Sonos Remote puisque c'est de là que vient l'idée d'utiliser une variable globale pour faire passer les commandes depuis n'importe quelle scène jusqu'au VD pour qu'il l'envoie à la lampe. De même pour le principe du ping que j'utilise pour détecter quand la lampe est déconnectée du réseau wifi, de manière à relancer automatiquement la connexion TCP lorsqu'elle revient en ligne, ce qui était le souci de @ADN182. Et, enfin, un grand merci également à @Talwayseb pour son VD Philips Hue qui m'a grandement inspiré pour l'esthétique du VD Yeelight Manager. Et aussi à @pepite et @Lazer pour leurs tuyaux pour faire passer les debug entre un VD et un autre VD (_elementID_ !!) ou une scène (fibaro:args()).
  14. OJC

    Ampoule yeelight xiaomi

    ok, merci pour la précision. Je n'ai pas encore eu le pb du coup avec des lampes de chevet. Je pense que je vais coupler avec le Network Monitor de @Lazer pour vérifier la connexion au réseau wifi et relancer le socket en cas de besoin.
  15. Oui, c'est à aussi, mais là, il s'agit d'un dépassement de pile = le script dépasse la mémoire qui lui est allouée. La dernière fois que cela m'étais arrivé (en v. 4.140), la Debian avait géré et killé le logiciel HC2. J'avais dû faire un recovery. Là, ça sort juste une erreur dans le debug et ça arrête l'exécution du script.
  16. OJC

    Ampoule yeelight xiaomi

    Salut @ADN182 et bonne année Quand tu parles de couper, cela veut dire débrancher ou éteindre ?
  17. Je ne sais pas si c'est lié à la v. 4.153b ou une précédente depuis v. 4.150, mais j'ai constaté que la HC2 gère désormais le stack overflow en générant une erreur dans le debug, là où c'est l'OS qui gérait le truc et faisait planter la box. Pour tester (à vos risques et périls, bien sûr) : local function testOverflow() testOverlow() end testOverflow() Je n'ai bien sûr pas fait de test plus poussés, c'est juste une fonction (nettoyée ici) codée après la quatrième bouteille à la fin du réveillon ...
  18. Bonsoir, Je partage le squelette de scène que j'utilise pour domotiser mon éclairage, en espérant que cela pourra être utile. Elle est conçue pour fonctionner avec des FGD-212. Ce qu'elle peut faire en natif : allumer l'éclairage à un niveau donné sur détection de mouvement et l'éteindre en l'absence de mouvement depuis un temps défini, avec une diminution préalable de luminosité paramétrable pour prévenir allumer l'éclairage lorsque la luminosité (lux retournée par un FGMS-001 par exemple) descend sous un seuil donné ou, au contraire, éteindre si elle dépasse un seuil donné bloquer l'allumage automatique pendant un laps de temps défini lorsque la lumière est éteinte via l'interrupteur avec retour au fonctionnement automatique en l'absence de mouvement dans ce délai Elle peut également, ce qui implique de mettre les mains dans le cambouis, être actionnée via une variable globale ou l'utilisation de l'interrupteur (sceneActivation). Les paramètres sont documentés dans la scène. --[[ %% killOtherInstances %% properties %% events %% globals --]] -- CONFIGURATION ------------------------------------------------------------ ----------------------------------------------------------------------------- function configure() _LIGHT = -- id du FGD-212 _LUX = -- id du détecteur de luminosité _MOTION = -- id du détecteur de mouvement brightness = { default = 99 -- luminosité utilisée en cas de détection de mouvement ou de lux > minLux } minLux = -1 -- luminosité en dessous de laquelle la lumière doit être allumée ; mettre -1 si pas utilisé maxLux = -1 -- luminosité au dessus de laquelle la lumière doit être éteinte ; mettre -1 si pas utilisé fadeFactor = 0.5 -- facteur de diminution de luminosité avant l extinction de la lumière fadeDelay = 10 -- délai en secondes entre la baisse de luminosité et l extinction de la lumière -- mettre -1 pour extinction immédiate et nil pour ne pas éteindre litDelay = 60 * 3 -- délai en secondes pendant laquelle la lumière reste allumée après la fin de l alarme du détecteur de mouvement manOffDelay = 60 * 15 -- délai en secondes entre un arrêt de la lumière via l interrupteur et la reprise du fonctionnement automatique -- (concerne uniquement le mouvement et la luminosité) -- function G.XXXX end -- fonction exécutée quand la variable globale XXXX est utilisée comme trigger -- function S.S1.on() end -- fonctions exécutées avec le trigger sceneActivation -- function S.S1.off() end -- function S.S1.hold() end -- function S.S1.release() end -- function S.S1.double() end -- function S.S1.single() end -- function S.S2.on() end -- function S.S2.off() end -- function S.S2.hold() end -- function S.S2.release() end -- function S.S2.double() end -- function S.S2.triple() end -- function S.S2.single() end end -- VARIABLES ---------------------------------------------------------------- ----------------------------------------------------------------------------- _f = fibaro LM, G, S = {}, {}, {S1 = {}, S2 = {}} trigger = _f:getSourceTrigger() switch = {} switch["10"] = {"S1", "on"} switch["11"] = {"S1", "off"} switch["12"] = {"S1", "hold"} switch["13"] = {"S1", "release"} switch["14"] = {"S1", "double"} switch["16"] = {"S1", "single"} switch["20"] = {"S2", "on"} switch["21"] = {"S2", "off"} switch["22"] = {"S2", "hold"} switch["23"] = {"S2", "release"} switch["24"] = {"S2", "double"} switch["25"] = {"S2", "triple"} switch["26"] = {"S2", "single"} -- FUNCTIONS ---------------------------------------------------------------- ----------------------------------------------------------------------------- function LM.checkFading() if tonumber(LM.getGlobal("fading")) == 1 then minLux = -1; LM.setGlobal("fading", 0) end end function LM.checkGlobal() if (type(_f:getGlobalValue("LightManager")) == "nil") then api.post("/globalVariables", {name="LightManager", isEnum=0}) end; local g = _f:getGlobalValue("LightManager"); if (tostring(g) == "") then g = "{}" end; g = json.decode(g); if (not g[tostring(__fibaroSceneId)]) then g[__fibaroSceneId] = {force = -1, fading = 0, manOff = 0}; _f:setGlobal("LightManager", json.encode(g)) end end function LM.forceBrightness(v) if v >= 0 then _f:call(_LIGHT, "setValue", v) end; LM.setGlobal("force", v) end function LM.getGlobal(i) local g = json.decode(_f:getGlobalValue("LightManager")); if type(i) == "nil" then return g else return g[tostring(__fibaroSceneId)][i] end end function LM.getTimestamp(d) return _f:getModificationTime(d, "value") end function LM.getValue(d) return tonumber(_f:getValue(d, "value")) end function LM.iif(a,b,c) if a then return b else return c end end function LM.isManOff() local n = tonumber(LM.getGlobal("manOff")); local bool = LM.getValue(_MOTION) == 0 and LM.getTimestamp(_MOTION) - manOffDelay >= n; if not (bool) and n ~= 0 then LM.setGlobal("manOff", 0) end; return bool end function LM.isNumber(v) return type(tonumber(v)) == "number" end function LM.isOff(d) return tonumber(LM.getValue(d)) == 0 end function LM.setGlobal(i, v) local g = LM.getGlobal(); g[tostring(__fibaroSceneId)][i] = v; _f:setGlobal("LightManager", json.encode(g)) end function LM.setLight(v) if LM.isNumber(v) then _f:call(_LIGHT, "setValue", v) else _f:call(_LIGHT, v) end end function LM.luxManager() if LM.isOff(_LIGHT) then if LM.getValue(_MOTION) == 1 and LM.getValue(_LUX) < minLux then LM.setLight(brightness.default) end else if LM.getValue(_MOTION) == 1 and maxLux ~= -1 and LM.getValue(_LUX) > maxLux then LM.setLight(0) end end end function LM.motionManager() if LM.getValue(_MOTION) == 1 then local f = LM.getGlobal("force") if tonumber(f) ~= -1 then brightness.default = f end if minLux == -1 then if LM.getValue(_LIGHT) ~= brightness.default then LM.setLight(brightness.default) end else if LM.getValue(_LUX) < minLux then if LM.getValue(_LIGHT) ~= brightness.default then LM.setLight(brightness.default) end end end else if LM.isOff(_LIGHT) or type(fadeDelay) == "nil" then _f:abort() end setTimeout( function() if fadeDelay == -1 then LM.setLight(0) else local dim = math.min(math.floor(LM.getValue(_LIGHT) * fadeFactor), 99) LM.setGlobal("fading", 1) LM.setLight(dim) setTimeout( function() if LM.getValue(_LIGHT) == dim then LM.setLight(0) LM.setGlobal("fading", 0) end end, fadeDelay * 1000) end end, litDelay * 1000) end end -- RUN ---------------------------------------------------------------------- ----------------------------------------------------------------------------- LM.checkGlobal() configure() if trigger.type == "property" then if trigger.deviceID == _MOTION and trigger.propertyName == "value" then if LM.isManOff() then _f:abort() end LM.checkFading() LM.motionManager() elseif trigger.deviceID == _LUX and trigger.propertyName == "value" then if isManOff() then f:abort() end checkFading() LM.luxManager() elseif trigger.deviceID == _LIGHT then if trigger.propertyName == "sceneActivation" then LM.checkFading() local s = _f:getValue(_LIGHT, "sceneActivation") if tonumber(s) == 11 or tonumber(s) == 21 then LM.setGlobal("manOff", os.time()) else if tonumber(LM.getGlobal("manOff")) ~= 0 then LM.setGlobal("manOff", 0) end end if (S[switch[s][1]][switch[s][2]]) then S[switch[s][1]][switch[s][2]]() end end end elseif trigger.type == "global" then LM.checkFading() if (G[trigger.name]) then G[trigger.name]() end else _f:abort() end
  19. Bonjour et bonne année à tous Je suis en train de peaufiner la scène avec laquelle je gère l'éclairage, et j'essaie de faire en sorte de prendre en compte les différentes manières d'intervenir sur l'éclairage. En l'état, la scène peut-être déclenchée en cas de changement de la luminosité, de détection de mouvement, d'utilisation de l'interrupteur ou de modification d'une variable globale. Je souhaite également pouvoir la déclencher lorsque la valeur du dimmer est modifiée via l'application mobile. Le problème est que si je me contente de mettre un %% [id dimmer] value dans l'en-tête de la scène, je vais capter toutes les modifications de valeur, y compris celles résultant de l'exécution de la scène. Avec un %% killOtherInstances dans l'en-tête, vous imaginez le bordel... D'où ma question : quelqu'un saurait-il comment distinguer en fonction de "l'auteur" de la modification de valeur du dimmer (sachant que c'est un FGD-212) ?
  20. OJC

    %%killOtherInstances

    Merci ! Et bonne année à toi aussi !
  21. OJC

    %%killOtherInstances

    Bonsoir, J'ai un souci avec %%killOtherInstances, que je ne parviens pas à utiliser. J'ai fait une scène de test : --[[ %%killOtherInstances --]] local num = fibaro:countScenes() local count = 1 local function run() print("Instance n°" .. tostring(num) .. " & Loop n°" .. tostring(count)) count = count +1 setTimeout(run, 1000) end run() Logiquement, la variable num devrait systématiquement être à 1 dans le debug. Ben non donc, visiblement, mon %%killOtherInstances ne fait pas le job et les instances s'empilent... Y a-t-il une subtilité qui m'échappe ??
  22. OJC

    Ampoule yeelight xiaomi

    Nickel comme base de départ, ce VD Pour ceux que ça intéresse, voici ma solution pour avoir une mise à jour en continu sans passer par le Main Loop qui impose un délai de trois secondes. Code du bouton Actualisation : function RefreshLoop() -- Recup de l id du module local selfID = fibaro:getSelfId(); local ip = fibaro:get(selfID, 'IPAddress') local port = fibaro:get(selfID, 'TCPPort') local Name = tostring(fibaro:getName(selfID)); -- Fonction de simplification to set label Device function setDevicePropertyValue(id, label, value) fibaro:call(id, "setProperty", "ui."..label..".value", value); end -- Initialisation du Socket TCP if (tcpSocket == nil) then tcpSocket = Net.FTcpSocket(ip, tonumber(port)) --tcpSocket:setReadTimeout(1000); fibaro:debug("Creation de la connexion avec "..Name); end state, err = tcpSocket:read() or string.char(); fibaro:debug("test"); fibaro:debug(state); if (state ~= "") then State_decoded = json.decode(state); -- Gestion de l'état if State_decoded.params.power then fibaro:debug("Change state to "..State_decoded.params.power) setDevicePropertyValue(selfID, "state", State_decoded.params.power); end -- Gestion de la Luminosité if State_decoded.params.bright then fibaro:debug("Change brightness to "..State_decoded.params.bright) setDevicePropertyValue(selfID, "brightness", State_decoded.params.bright); end else fibaro:debug("Connexion Impossible") fibaro:sleep(10000) tcpSocket:disconnect(); tcpSocket=nil; end RefreshLoop() end RefreshLoop()
  23. OJC

    Ampoule yeelight xiaomi

    Je ne sais pas depuis combien de temps, les miennes sont arrivées de Chine juste avant Noël, commandées début décembre sur Gearbest.
  24. OJC

    Ampoule yeelight xiaomi

    @ADN182 J'ai la version wifi , celle avec le socle doré
  25. Mise à jour faite. Le problème d'affichage des paramètres avancés en français est réglé.
×
×
  • Créer...