J3R3M Posté(e) le 14 novembre 2017 Auteur Signaler Posté(e) le 14 novembre 2017 Merci de ta réponse Steven. Désolé de ne répondre que maintenant, je n'ai plus internet chez moi et je reviens tout juste de l'étranger. J'ai vérifié et les IDs sont bons. J'ai quand même essayé en ne laissant qu'une ligne, mais j'obtiens la même erreur. J'ai aussi rajouté une virgule à la fin de la 2ème ligne de la variable "detecteurs", mais même résultat. À savoir qu'il faut que je sois sur la page de configuration de la scène et que j'appuie sur "Démarrer" pour voir cette erreur. Peut être est-ce normal ? En tous cas, la variable ne change pas en fonction du dernier capteur enclenché Merci encore énormément...
Steven Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 Si tu appuie sur "Démarrer" tu auras automatiquement une erreur car il cherche l'ID du déclencheur de la scène et il n'y en a pas quand tu cliques sur "Démarrer"
J3R3M Posté(e) le 17 novembre 2017 Auteur Signaler Posté(e) le 17 novembre 2017 Merci de cette réponse, je vais donc essayer cela. Sommes-nous bien d'accords sur le fait qu'il suffit que je crée une nouvelle scène avec ce code ? J'ai soudainement un doute... Et je m'en excuse !
Steven Posté(e) le 20 novembre 2017 Signaler Posté(e) le 20 novembre 2017 Oui c'est bien cela. Tu crées une nouvelle scène, y colle le code, change les ID (1 et 2 dans l'exemple) et cela devrait le faire.
J3R3M Posté(e) le 22 novembre 2017 Auteur Signaler Posté(e) le 22 novembre 2017 Le 20/11/2017 à 10:06, Steven a dit : Oui c'est bien cela. Tu crées une nouvelle scène, y colle le code, change les ID (1 et 2 dans l'exemple) et cela devrait le faire. C'est ce que j'avais fait et ça semblait fonctionnel. Merci beaucoup !! Malheureusement, je suis désolé de dire que je ne vais finalement pas pouvoir utiliser ce script pour détecter quel est le dernier détecteur délenché... En effet, je dispose de plusieurs types de détecteurs. Enfin, des FGMS-001 qui sont Z-Wave et d'autres périphériques non Z-Wave que j'ai intégré tant bien que mal dans la HC2. Pour utiliser ton script, j'ai souhaité créer un VD des FGMS pour y intégrer mes autres détecteurs. Cette recherche s'est effectuée via ce sujet et malheureusement il s'avère que ça ne soit pas possible. Je pensais vraiment que ça serait quelque chose de simple à faire ! Pour le coup, j'ai réfléchi et ai mis en place une autre solution. Du moins, un autre début de solution... Le principe : J'ai créé une variable globale par détecteur, quel qu'il soit. Dès qu'un détecteur se déclenche, je mets à jour cette variable avec des informations horaires. J'ai donc x variables contenant des informations de temps. En les comparant toutes, il devrait être possible de déterminer lequel s'est déclenché en dernier je suppose ? Mes restes du langage PHP m'ont fait repenser à une fonction qui existe (existait ?), qui était un nombre en sans cesse augmentation qu'on appelé timestamp. Avec celui-ci, il était possible de retrouver les informations horaires précises. J'ai donc orienté mes recherches vers quelque chose de similaire et ai créé une variable dans un script... Après quelques recherches, j'ai réussi à faire ce code. J'ai supprimé tout ce qui concernait l'enclenchement de mes lampes pour que ça soit plus clair. --[[ %% properties 5 value 5 armed %% globals HOME_DOMO MOI_DODO MOI_SEUL HOME_MISE_LUM --]] local iddetecteur = '5' local VG = 'MOUVEMENT_CUISINE' local VD_PIECE = '166' local startSource = fibaro:getSourceTrigger(); local timestamp = { year=tonumber(os.date('%Y')), month=tonumber(os.date('%m')), day=tonumber(os.date('%d')), hour=tonumber(os.date('%H')), min=tonumber(os.date('%M')), sec=tonumber(os.date('%S'))} local hour = tonumber(os.time(timestamp)) if ( ( (tonumber(fibaro:getValue(iddetecteur, "value")) > 0 and tonumber(fibaro:getValue(iddetecteur, "armed")) > 0) ) or startSource["type"] == "other" ) then -- Changement Variable Timestamp du module fibaro:setGlobal(VG, hour); -- On met à jour la variable fibaro:setGlobal('MOI_PIECE', 'Cuisine') end Ça met bien à jour mes variables au déclenchement des capteurs, c'est parfait !. Par exemple, l'une d'entre-elles contient la valeur 1511348907. Même si je ne comprends pas trop ces chiffres, je me suis dit qu'un script pourrait les comparer et en déduire lequel a été déclenché en dernier ? Mais, dans un premier temps, est-ce que ma variable timestamp est correcte ? Est-il possible d'en faire ce que je souhaite ? Merci d'avance
pepite Posté(e) le 23 novembre 2017 Signaler Posté(e) le 23 novembre 2017 Bonjour, SI tu veux une table pour ta variable "timestamp" tu peux utiliser : os.date("*t") qui cree une table avec : year (complet) ; month (1–12) ; day (1–31) ; hour (0–23) ; min (0–59) ; sec (0–60) ; wday (jour de la semaine, dimanche valant 1) ; yday (jour de l'année) ; Tu peux donc faire comme ceci : local timestamp = os.date("*t") local hour = tonumber(os.time(timestamp)) Ensuite pour connaitre le timestamp de la modification d'une variable globale il existe : fibaro:getGlobalModificationTime("VG")
J3R3M Posté(e) le 23 novembre 2017 Auteur Signaler Posté(e) le 23 novembre 2017 Merci de ta réponse ! Merci également de ces indications. Cette table complète peut-elle être contenue dans une seule variable globale ? Il y a 4 heures, pepite a dit : Ensuite pour connaitre le timestamp de la modification d'une variable globale il existe : fibaro:getGlobalModificationTime("VG") Grâce à cette fonction, je pourrais donc ne créer qu'une seule variable globale type "PIECE" que je mettrai à jour dès détection d'un mouvement, à condition qu'elle ne contient pas déjà le nom de cette pièce. Et je pourrais mettre à jour ma variable "PRESENCE" en comparant le timestamp actuel au timestamp de la modification de la variable. local hour = tonumber(os.time(os.date("*t"))) local last_modif = fibaro:getGlobalModificationTime("VG") -- Délai en minutes local delai = 15 if ( ( hour - last_modif ) >= ( 60 * 1000 * delai ) ) then fibaro:setGlobalValue("PRESENCE", "Dehors") end Vais-je dans la bonne direction ?
pepite Posté(e) le 23 novembre 2017 Signaler Posté(e) le 23 novembre 2017 Ca me semble pas mal, regarde ici ca va t'aider http://www.fibarouk.co.uk/support/lua/library/fibarogetglobalmodificationtime/
OJC Posté(e) le 26 novembre 2017 Signaler Posté(e) le 26 novembre 2017 @J3R3M Citation Cette table complète peut-elle être contenue dans une seule variable globale ? Pour enregistrer une table complète dans une variable globale : fibaro:setGlobal("MaVariable", json.encode(MaTable)) Et pour la récupérer : MaTable = json.decode(fibaro:getGlobalValue("MaVariable")) 1
J3R3M Posté(e) le 1 décembre 2017 Auteur Signaler Posté(e) le 1 décembre 2017 (modifié) Le 23/11/2017 à 15:21, pepite a dit : Ca me semble pas mal, regarde ici ca va t'aider http://www.fibarouk.co.uk/support/lua/library/fibarogetglobalmodificationtime/ Je te remercie, j'ai finalement fait le tour de toute cette petite librairie afin d'avoir tout en tête et ainsi songer aux possibilités de la bête ! @OJC, merci de cette indication. Je n'imaginais pas ça aussi "simple". J'ai mis un peu de temps à revenir vers vous puisque j'ai essayé de me débrouiller par moi-même pour l'écriture du script correspondant à mes besoins, suite à mes dernières modifications (capteurs différents)... Malheureusement et malgré mes nombreuses heures de lecture de tutoriels d'apprentissage du LUA, je me retrouve confronté à ma situation de débutant. Pour réexpliquer clairement ma situation : - Je dispose d'une variable globale par pièce contenant le timestamp du dernier déclenchement du module (donc GetGlobalValue("MOUVEMENT_XX") == fibaro:GetGLobalModificationTime("MOUVEMENT_XX")) - Je souhaite comparer les valeurs de toutes ces VG - Dès que l'une d'entre-elles a été éditée depuis plus de x minutes (temps défini par une variable en début de script), fibaro:startScene(123) - Mettre en valeur la dernière des variables globales modifiée et, en fonction de celle-ci, engendrer des actions (comme fibaro:setGlobalValue("MOI_DEHORS", 1)) si rien de nouveau depuis x minutes Je n'ose même pas montrer les tentatives de programmation effectuées, ça n'est qu'une succession d'erreurs ! Modifié le 1 décembre 2017 par J3R3M
J3R3M Posté(e) le 18 décembre 2017 Auteur Signaler Posté(e) le 18 décembre 2017 Je reviens vers vous. J'ai réussi à pondre un script fonctionnel qui gère le mode "DODO" de mon domicile. En ce qui concerne le fait que je sois sorti ou non, je vais plutôt m'arracher les cheveux du côté des tests de PING sur l'adresse IP de mon iPhone. Lorsqu'un mouvement est détecté dans une pièce, une autre scène met à jour une variable associée à cette pièce. Si je n'étais pas déjà dans cette pièce, cette autre scène met à jour la variable "MOI_PIECE". C'est la modification de cette variable qui déclenche la scène ci-dessous. La variable "HOME_DOMO" est une simple variable qui me permet de désactiver toute la domotique de mon domicile, au cas où. Le VD 162 met la variable MOI_DODO à 1 sur le bouton 1 et à 0 sur le bouton 2. Les VD 168, 202, 203, 204, 205 et 206 sont de simples VD qui contiennent les valeurs voulues pour mes pièces. Le bouton 2 est une extinction de toutes les lampes de la pièce. Voici le code LUA contenu dans ma scène DODO : --[[ %% globals MOI_PIECE --]] if tonumber(fibaro:getGlobalValue("MOI_DODO")) == 0 and fibaro:countScenes() > 1 then print("Changement de pièce détecté."); fibaro:killScenes(46); end local delai_verif = 12 -- Minutes local piece_active = fibaro:getGlobalValue("MOI_PIECE"); if piece_active == "Chambre" and tonumber(fibaro:getGlobalValue("MOI_DODO")) == 0 and tonumber(fibaro:getGlobalValue("HOME_DOMO")) == 1 then -- Délai attente print("Début de l'attente de ".. delai_verif .. "mn."); fibaro:sleep(delai_verif * 60 * 1000); -- On active le mode nuit fibaro:call("162", "pressButton", 1); -- On éteint toutes les lumières au cas où fibaro:call(168, "pressButton", "2") fibaro:call(202, "pressButton", "2") fibaro:call(206, "pressButton", "2") fibaro:call(204, "pressButton", "2") fibaro:call(205, "pressButton", "2") fibaro:call(203, "pressButton", "2") -- Flash info print("Mode nuit activé."); elseif tonumber(fibaro:getGlobalValue("MOI_DODO")) == 1 and tonumber(fibaro:getGlobalValue("HOME_DOMO")) == 1 and fibaro:countScenes() <= 1 then print("Réveil au cours de la nuit..."); fibaro:sleep(delai_verif * 60 * 1000); if fibaro:getGlobalValue("MOI_PIECE") ~= "Chambre" then print("Sorti du lit depuis plus de "..delai_verif.."mn. Désactivation du mode Nuit."); fibaro:call("162", "pressButton", 2); else print("De nouveau couché. Mode nuit conservé."); end end La scène a un maximum de 2 instances simultanées. Qu'en pensez-vous ? Comment aurais-je pu l'optimiser davantage ? Merci d'avance
Messages recommandés