Aller au contenu
sebcbien

Detection De Présence

Recommended Posts

petite question comment tu sais que la ligne de code GEA fonctionne bien je debut avec vos textes ,car dans le debug j'ai une erreur si tu peux m'aider merci l'ami

[DEBUG] 22:02:14: [1;31m2015-11-12 22:02:14.001425 [ fatal] Runtime error: /opt/fibaro/scenes/190.lua:3: attempt to index global 'GEA' (a nil value)[0m

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu dois d'abord apprendre ce que c'est gea...

Tu ne peux pas mettre ta ligne comme ça n'importe où.

Regarde dans ma signature, showroom gea et de la tu trouvera des exemples et un lien vers le fil du support gea.

Sent from my Note4

Partager ce message


Lien à poster
Partager sur d’autres sites

De mémoire, Locale permet également de lancer des notif à  tasker basées sur les calendriers Google (mais comme dit plus haut, je n'ai pas eu le temps de m'y remettre depuis un certain temps).

 

Bonjour,

 

C'est quoi Locale ? une appli smartphone ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui une applications Android style tasker pour automatiser

Sent from my Note4

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut Sebcbien,

 

je souhaite push mon iphone, afin de le sortir de veille, ca fonctionne, mais aléatoirement

cela varie en fonction du tps de reveil, il faudrait en moyen 3 à  10sec max (avant que la routine de recherche du phone démarre) pour être sur que le phone soit ou ne soit pas présent

 

qu'en pensez vous?

-- IP Smartphone Presence Check V1.2
-- Copyright © 2014 Sébastien Jauquet.
-- http://www.domotique-fibaro.fr/index.php/topic/2613-detection-de-pr%C3%A9sence/
--Using code from:
-- Ping v 1.0.1 [05-2013]
-- Copyright © 2013 Jean-christophe Vermandé
-- http://www.domotique-fibaro.fr/index.php/topic/109-ping-dun-%C3%A9quipement-r%C3%A9seau/page-2
fibaro:call(130, "sendDefinedPushNotification", "99"); 
fibaro:log("Starting process");

local variable_globale_phone = "Phone_Alex_Present";
local thismodule=fibaro:getSelfId()
local _deviceIp = fibaro:get(thismodule, 'IPAddress')
local _devicePort = fibaro:get(thismodule, 'TCPPort')
local _maxRetryProcess = 1;
local time = tonumber(os.time());
--local maxtime = 14;
local maxtime = 20;
-- local _deviceIp = "192.168.10.112";
-- local _devicePort = 3500;
-- fibaro:debug(_deviceIp .. " " .. _devicePort)
-- fibaro:setGlobal("Lock_Away","Unlocked") 

function SecondsToClock(sSeconds)
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
    return "00:00:00";
  else
    nHours = string.format("%02.f", math.floor(nSeconds/3600));
    nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
    nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
    return nHours..":"..nMins..":"..nSecs
  end
end

-- recursive function to ping device
local function _ping(retry)
  retry = retry or 0;

-- notify state
local elapsed = os.difftime(os.time(), tonumber(time));
local msg = "Boucle #".. retry .." depuis "..SecondsToClock(elapsed);    
fibaro:log(msg);  

-- check for no more than 30 seconds
  if elapsed > maxtime then 
  return false; 
  end

  --open the socket
  local tcpSocket = Net.FTcpSocket(_deviceIp, _devicePort);
    fibaro:debug(_deviceIp .. " " .. _devicePort)
  --set the read timeout
  tcpSocket:setReadTimeout(250);
  --send packet
  local bytes, errorCode = tcpSocket:write("test");
  fibaro:debug(errorCode)

  --check for error   
  if errorCode == 0 then
    return true;
  else
    if retry < _maxRetryProcess then
      --fibaro:log("Retry process, please wait...");
      fibaro:sleep(1*750);
      return _ping(retry + 1);
    end
    return false;
  end
end

--ping device, secure with pcall to catch errors.
local f, result = pcall(_ping);
local Lock_Away = fibaro:getGlobal("Lock_Away")


if (f) then
--  if (result == true) and (Lock_Away == "Unlocked") then
  if result == true then
    fibaro:log("Appareil a été trouvé.");
    fibaro:setGlobal(variable_globale_phone,"1") 
-- évolution future possible: stocker la date et l'heure de la dernière présence détectée
    -- fibaro:setGlobal("Present_Phones",os.time()) 
  else
    fibaro:log("Appareil non trouvé!");
    fibaro:setGlobal(variable_globale_phone,"0") 
  end
else
  fibaro:log("Error: " .. f);
end

Partager ce message


Lien à poster
Partager sur d’autres sites

Bjr,

Suite àla mise en place de la détection de présence V 1,03; j'obtiens cette ligne d'erreur en debug du bouton : ERROR 11:25:25: line 88:attempt to concatenate local if'(a boolean value' ). Quelqu'un àune idée de l'origine? merci d'avance

Cdt

Partager ce message


Lien à poster
Partager sur d’autres sites

tu as probablement pas déclaré la VG ou tu as ait une faute de frappe dans le nom d'une variable.

 

pour @flamalex , désolé mais je ne comprends pas ton explication ni ta demande

Partager ce message


Lien à poster
Partager sur d’autres sites

oui en effet, ça ne l'est pas

le téléphone est en veille donc wifi en veille (iphone),

il faudrait qu'au clic sur le bouton du VD,

(1ere étape) il envoie un push pour sortir le phone de veille

(2eme etape)  il lance la routine pour détecter le phone

en fait il faudrait que cela ce fasse en 2 tps, mais que la première étape est le tps d'envoyer le push sans que la deuxième étape ne se superpose

 

je ne sais pas si c'est plus clair

 

actuellement, les 2 étapes sont envoyées en mm tps, donc si le push est trop long à  réveiller le téléphone, résultat il dit que je ne suis pas présent, ce qui est faux

et de tps en tps, le push arrive plus vite que la détection, de ce fait il dit que je suis présent et la c'est bon (c'est donc ce schéma qu'il me faudrait constamment)

 

mais cela est aléatoire

le but étant de mettre en place un ordre chronologique

 

je ne sais tjr pas si je suis clair :)

Partager ce message


Lien à poster
Partager sur d’autres sites

ok, j'ai compris... mais tu vas avoir un push otutes les minutes sur ton téléphone... ça risque de saouler àla longue non ?

Sinon il y a une autre methode avec un raspberry pour les iPhone, avec fing...

Partager ce message


Lien à poster
Partager sur d’autres sites

Je n'y arrive pas ... la variable globale est bien déclarée, je fais une erreur dans l'enregistrement de l'IP (adresse factice) et du port?

fibaro:log("Starting process");
 
local variable_globale_phone = "TEL_JMG_PRE";
local thismodule=fibaro:getSelfId()
local _deviceIp = fibaro:get(thismodule,"192.000.0.00")
local _devicePort = fibaro:get(thismodule, "3401")
local _maxRetryProcess = 20;
local time = tonumber(os.time());
local maxtime = 56;

Partager ce message


Lien à poster
Partager sur d’autres sites

cette fonction:

fibaro:get(thismodule,

 

va récupérer les ip et ports déclarés dans les paramètres du module.

Mets l'ip au bon endroit, pas dans le script

Partager ce message


Lien à poster
Partager sur d’autres sites

dans un deuxième tps je regarderai la méthode Raspberry

mais dans un premier tps, je souhaite résoudre ce probleme de push avant la detection wifi

 

je comprends bien que cela risque de me saouler à  la longue,

mais je pourrais également m'en servir pour d'autres usages que la détection de présence "constante"

 

j'aimerai que le script, un peu plus haut, fonctionne

Partager ce message


Lien à poster
Partager sur d’autres sites

super :-)

@flamalex, rajute simplement un sleep de 3 secondes alors.

fibaro:sleep(3*1000);

Partager ce message


Lien à poster
Partager sur d’autres sites

ensuite, je démarre ta deuxième solution

http://blog-fibaro.fr/tuto-hc2-et-hcl-ping-telephone-en-veille-ou-tester-votre-presence-2-le-retour/

 

ceci dit, j'ai un synology et iphone, le wifi vient du routeur numericable

bref, je ne vais jamais m'en sortir, c'est un mix de plusieurs tutossss :(

Partager ce message


Lien à poster
Partager sur d’autres sites

Le sleep tu le met juste après ton push

Sent from my Note4

Partager ce message


Lien à poster
Partager sur d’autres sites

Le monde ne s'est pas fait en un jour. La tu es sur des tutos "avancés"... Prends ton temps

Sent from my Note4

Partager ce message


Lien à poster
Partager sur d’autres sites

le sleep c'est bon, ça fonctionne, merci SEB

 

"Le monde ne s'est pas fait en un jour. La tu es sur des tutos "avancés"..."

oui il n'y a que les tutos qui sont avancés!!! :D  c'est pas comme moi :P

Partager ce message


Lien à poster
Partager sur d’autres sites

concernant, le synology, test ping, fibaro, as tu un lien, une piste à  communiquer?

 

à  savoir:

je ne sais pas comment exécuter du code sur le syno par exemple

je n'ai aucune idée de l'architecture, fibaro, iphone, syno, routeur

Partager ce message


Lien à poster
Partager sur d’autres sites

ce n'est pas moi qui ai fait cette solution, elle est seulement basée sur le même principe que cette methode-ci.

Mais bonne chance, elle demande encore plus de connaissances que cette méthode-ci... ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

Avec les dernières mises à  jour Android, l'appli sonos installée pour répondre aux pings de ce module se met en veille et donc je n'ai plus de détection (très aléatoire)

J'ai donc cherché une autre solution et je suis tombé sur un bout de code sur le forum officiel: http://forum.fibaro.com/index.php?/topic/21062-idea-how-to-monitor-people-at-home/#entry86009

Ce code permet de récupérer la table ARP et la liste des MAC adresses du réseau... remplaçant avantageusement les solutions externes basées sur linux/raspberry/fing

J'ai néanmoins laissé la fonction ping, elle aura peut être un intérêt dans certains cas, avec d'autres devices...

Après quelques tests, ça semble très bien fonctionner et j'ai donc mis tout ça en musique...

Après 1 jour de tests, ça fonctionne toujours aussi bien.

 

Installation:

Téléchargez la Version 2.1:

http://www.domotique-fibaro.fr/index.php/topic/2613-detection-de-pr%C3%A9sence/page-12#entry121547

(Ou modifiez les deux scripts si vous aviez la version précédente)

 

Mettez simplement la mac adresse dans le champ IP du VD (en minuscules, séparé par des ":"

02-04-16 14-37-18.jpg

post-826-0-46848100-1459601065_thumb.jpg

Pour ne pas bousculer la HC2, j'ai réglé le timing comme suit:

- Si le téléphone est présent: 1 check toutes les 2 minutes

- Si le téléphone est absent, 1 check toutes les 5 secondes

Ceci permet d'éviter les fausses "alertes".

il faudra donc deux minutes max à  la HC2 pour se rendre compte que un téléphone est parti, mais seulement 5 secondes losqu'il sera de retour.

 

Tout est paramétrable, j'ai mis pas mal de variables pour que vous puissiez ajuster ça à  votre goà»t  :)

 

il suffit de remplacer les deux codes ci-dessous (bouton et main loop) dans le VD présenté en début de fil.

Merci à  @krikroff @steven (main loop) pour certains bouts de codes et @mprinfo pour l'astuce du port 11111 permettant d'éviter d'encoder login et pass admin

 

Voici le nouveau code du bouton (attention, V2.0, pour la V2.1, voir plus bas):

-- IP Smartphone Presence Check V1.2 - check with ping on port sonos
-- IP Smartphone Presence Check V2.0 - sonos not reliable anymore, using arp table
-- Copyright © 2014 Sébastien Jauquet.
-- http://www.domotique-fibaro.fr/index.php/topic/2613-detection-de-pr%C3%A9sence/
-- Using code from:
-- Ping v 1.0.1 [05-2013] Copyright © 2013 Jean-christophe Vermandé
-- http://www.domotique-fibaro.fr/index.php/topic/109-ping-dun-%C3%A9quipement-r%C3%A9seau/page-2
-- mac adress check: Roman
-- http://forum.fibaro.com/index.php?/topic/21062-idea-how-to-monitor-people-at-home/#entry86009

local variable_globale_phone = "Phone_Seb_Present";
local current_icon_absent = 1035 -- homme
local current_icon_present = 1034 -- homme
-- local variable_globale_phone = "Phone_GG_Present";
-- local current_icon_absent = 1037 -- femme
-- local current_icon_present = 1036 -- femme

local maxRetry_Process = 20;
local scheduler_value = 2; -- (minutes) scheduled time of this process (must match the mainloop scheduled time)
local check_wait = 5; -- (seconds) to wait between each poll device
local debug = true
-- local login = "admin";
-- local pass = "not needed with port 11111";

local selfId=fibaro:getSelfId();
local time = tonumber(os.time());
local maxtime = (scheduler_value*60) - (check_wait+1);
local mac = fibaro:get(selfId, 'IPAddress');
local HC2 = Net.FHttp("127.0.0.1", 11111);
-- HC2:setBasicAuthentication(login, pass);

function Debug(color, message)
if debug then 
	if color and color ~= "" then
		fibaro:debug('<span style="color:'..color..';">'..message..'</span>');
	else
		fibaro:debug(message);
	end
end
end

function SecondsToClock(sSeconds)
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
	return "00:00:00";
  else
	nHours = string.format("%02.f", math.floor(nSeconds/3600));
	nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
	nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
	return nHours..":"..nMins..":"..nSecs
  end
end

local function _ping(retry)
retry = retry or 0;

-- notify state
  local elapsed = os.difftime(os.time(), tonumber(time));
  local msg = "Loop #".. retry .." since "..SecondsToClock(elapsed);
  fibaro:log(msg);  

  if elapsed > maxtime then
  return false; 
  end

--open the socket
  local tcpSocket = Net.FTcpSocket(_deviceIp, _devicePort);
    fibaro:debug(_deviceIp .. " " .. _devicePort)
  --set the read timeout
  tcpSocket:setReadTimeout(250);
  --send packet
  local bytes, errorCode = tcpSocket:write("test");
  fibaro:debug(errorCode)
 
  --check for error  	
  if errorCode == 0 then
    return true;
  else
	if retry < maxRetry_Process then
	--fibaro:log("Retry process, please wait...");
	fibaro:sleep(1*750);
	return _ping(retry + 1);
	end
	return false;
  end
end

local function FindMac(retry)
retry = retry or 0;
local foundUser = false;
-- notify state
	local elapsed = os.difftime(os.time(), tonumber(time));
	local msg = "Loop #".. retry .." since "..SecondsToClock(elapsed);

-- check for no more than maxtime seconds
  if elapsed > maxtime then
	return false; 
  end

	fibaro:log(msg);  
	Debug("yellow",msg)

	local response, status, errorCode = HC2.POST(HC2, "/api/networkDiscovery/arp", "{}");
	local jsonTable = json.decode(response) 
	--fibaro:debug("errorcode:"..errorCode.."status: "..status)
	if (tonumber(errorCode)==0 and tonumber(status)==200) then  
	  for i, name in ipairs(jsonTable) do
		if foundUser == false then
		--Debug("grey",i.." found mac:"..name['mac'])
		  if(name['mac'] == mac) then
			foundUser = true;
			Debug("green","Device "..name['mac'].." Has been found after "..elapsed.." s");
		  end
		end
	end
	else Debug("red","error json decode")
	end

  --check for error
  if foundUser == true then
	return true;
  else
	if retry < maxRetry_Process then
		--fibaro:log("Retry process, please wait...");
		fibaro:sleep(check_wait*1000);
		return FindMac(retry + 1);
	end
  return false;
  end
end

fibaro:log("Starting process");
Debug("yellow","Searching for Mac Address: "..mac)
--ping device, secure with pcall to catch errors.
--local f, result = pcall(_ping);
local f, result = pcall(FindMac);

if (f) then
  if (result == true) then
	fibaro:log("Device has been found.");
	fibaro:setGlobal(variable_globale_phone,"1")
	Debug("green","Global Var: "..variable_globale_phone.." Set to 1");
	fibaro:call(selfId, "setProperty", "currentIcon", current_icon_present)
	-- évolution future possible: stocker la date et l'heure de la dernière présence détectée
	-- fibaro:setGlobal("Present_Phones",os.time()) 
  else
	fibaro:log("Device was not found!");
	fibaro:setGlobal(variable_globale_phone,"0")
	Debug("red","Device "..mac.." Has been NOT been found");
	Debug("red","Global Var: "..variable_globale_phone.." Set to 0");
	fibaro:call(selfId, "setProperty", "currentIcon", current_icon_absent)
  end
else
  fibaro:log("Error: " .. tostring(f));
end

et le code du main loop:
local selfId = fibaro:getSelfId();
local current_icon_absent = 1035 -- homme
local current_icon_present = 1034 -- homme
-- local current_icon_absent = 1037 -- femme
-- local current_icon_present = 1036 -- femme
-- local Verification = fibaro:get(selfId,"TCPPort");

-- 1ère fois que le main loop s'exécute, on crée une variable nommée "instance" car elle n'existe pas. Elle existera au 2ème passage donc ne sera pas recrée.
if (not instance) then
    -- on indique la fréquence d'execution souhaitée (en minutes)
    instance = { lastrun = 0, every = 2 }
    fibaro:debug("first run")
end
 
-- on vérifie la différence entre cette exéction et la dernière (stocké dans instance.lastrun)
diff = os.date("*t", os.difftime(os.time(), instance.lastrun))
 
-- si la différence en minutes et supérieure ou égale à  la fréquence souhaitée (instance.every)
if (diff.min >= instance.every) then
   -- TON CODE ---
  		fibaro:call(selfId, "pressButton", "1")
		--[[local status = fibaro:getGlobal("Phone_Seb_Present")

		if status == "0" then 
			fibaro:call(selfId, "setProperty", "currentIcon", current_icon_absent)
		end

		if status == "1" then 
			fibaro:call(selfId, "setProperty", "currentIcon", current_icon_present)
		end --]]
   -- FIN DE TON CODE ---
   -- on stock l'heure de la nouvelle exécution
   instance.lastrun = os.time()
   fibaro:debug("executed")
end

et le code du main loop:

local selfId = fibaro:getSelfId();
local current_icon_absent = 1035 -- homme
local current_icon_present = 1034 -- homme
-- local current_icon_absent = 1037 -- femme
-- local current_icon_present = 1036 -- femme
-- local Verification = fibaro:get(selfId,"TCPPort");

-- 1ère fois que le main loop s'exécute, on crée une variable nommée "instance" car elle n'existe pas. Elle existera au 2ème passage donc ne sera pas recrée.
if (not instance) then
    -- on indique la fréquence d'execution souhaitée (en minutes)
    instance = { lastrun = 0, every = 2 }
    fibaro:debug("first run")
end
 
-- on vérifie la différence entre cette exéction et la dernière (stocké dans instance.lastrun)
diff = os.date("*t", os.difftime(os.time(), instance.lastrun))
 
-- si la différence en minutes et supérieure ou égale à  la fréquence souhaitée (instance.every)
if (diff.min >= instance.every) then
   -- TON CODE ---
  		fibaro:call(selfId, "pressButton", "1")
		--[[local status = fibaro:getGlobal("Phone_Seb_Present")

		if status == "0" then 
			fibaro:call(selfId, "setProperty", "currentIcon", current_icon_absent)
		end

		if status == "1" then 
			fibaro:call(selfId, "setProperty", "currentIcon", current_icon_present)
		end --]]
   -- FIN DE TON CODE ---
   -- on stock l'heure de la nouvelle exécution
   instance.lastrun = os.time()
   fibaro:debug("executed")
end
  • Upvote 5

Partager ce message


Lien à poster
Partager sur d’autres sites

×