Aller au contenu
J3R3M

[Résolu] Créer variable d'état en fonction du capteur qui a détecté un mouvement en dernier

Recommended Posts

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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"

Partager ce message


Lien à poster
Partager sur d’autres sites

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 !

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ? :D

Partager ce message


Lien à poster
Partager sur d’autres sites

@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"))

 

  • Like 1

Partager ce message


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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

×