Présence via ping smartphone

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
DrFloW
Messages : 38
Inscription : 02 mars 2015, 18:08

Présence via ping smartphone

Message par DrFloW »

Bonjour,

J'ai trou un script LUA de Alexandre Dubois qui est bien pratique pour détecter la présence à la maison via ping du smartphone. Seul truc qui me pose souci c'est que ce script controle la préence toute les 10 minutes et envoie une nouvelle commande ON pour la présence. Je voudrais que le script regarde si je suis toujorus présent toutes les 10 minutes mais ne fasse rien si je suis chez moi, par contre il devra continuer de passer le switch de présence à OFF si je suis parti.

J'ai donc modifié le script comme suit, et je pense qu'il y a un souci aux alentours de la ligne 43, est qu'une bonne âme pourrait m'aider?

Code : Tout sélectionner

-- Alexandre DUBOIS - 2014
-- Ce script vérifie la présence de 2 téléphones sur le réseau pour savoir si quelqu'un est là.
-- La vérification est effectuée une fois par minute tant qu'aucun téléphone n'est à portée,
-- puis une fois toute les 10 minutes quand au moins un téléphone est connecté pour ne pas trop stresser sa batterie.
 
commandArray = {}
 
--Cette fonction calcule la différence de temps (en secondes) entre maintenant
--et la date passée en paramètre.
function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 16)
  seconds = string.sub(s, 18, 19)
  t1 = os.time()
  t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
  difference = os.difftime (t1, t2)
  return difference
end
 
--Si le téléphone n'est pas détecté ou qu'il est présent depuis plus de 10 minutes (600 secondes),
--alors on vérifie à nouveau sa présence
if (otherdevices['Presence']=='Off' or (otherdevices['Presence']=='On' and timedifference(otherdevices_lastupdate['Presence']) > 600)) then
	ping_success_tel1=os.execute('ping -c1 192.168.0.13')
	ping_success_tel2=os.execute('ping -c1 192.168.0.99')
	
	if ping_success_tel1 or ping_success_tel2 then
	  commandArray['Presence']='On'
	else
	  if otherdevices['Presence']=='On' then --On ne passe l'interrupteur virtuel à Off que s'il est sur On.
          commandArray['Presence']='Off'
          end
	end
end
 
return commandArray
hobbe
Messages : 111
Inscription : 15 déc. 2014, 15:33

Re: Présence via ping smartphone

Message par hobbe »

DrFloW a écrit :J'ai donc modifié le script comme suit, et je pense qu'il y a un souci aux alentours de la ligne 43, est qu'une bonne âme pourrait m'aider?
Bonsoir,

Tu n'as que 38 lignes... :?
hobbe
Messages : 111
Inscription : 15 déc. 2014, 15:33

Re: Présence via ping smartphone

Message par hobbe »

Voici ma version d'un script dont le but est faire un ping sur les IP des téléphones, et mettre les interrupteurs "Présence X" à ON ou OFF.

Code : Tout sélectionner

-- domoticz/scripts/lua/script_time_presence.lua
-- Check availability of cell phone on network

commandArray = {}
time = os.date("*t")

-- On every 2 minutes, starting from 1 (1, 3, 5, ...)
if((time.min % 2) == 1) then

  local list_ip = {}
  local list_device = {}

  -- Devices to monitor
  list_ip[0] = '192.168.1.90'
  list_device[0] = 'Présence Papa'
  list_ip[1] = '192.168.1.91'
  list_device[1] = 'Présence Maman'
  list_ip[2] = '192.168.1.92'
  list_device[2] = 'Présence Lulu'

  for key, m_ip in pairs(list_ip) do
    local m_device = list_device[key]
    ping_success = os.execute('ping ' .. m_ip .. ' -n 2 -w 500>nul')
    if ping_success then
      print("¤¤¤ Ping " .. m_ip .. " (" .. m_device .. ") OK")
      if (otherdevices[m_device] == 'Off') then
        commandArray[m_device] = 'On'
      end
    else
      print("¤¤¤ Ping " .. m_ip .. " (" .. m_device .. ") failure")
      if (otherdevices[m_device] == 'On') then
        commandArray[m_device] = 'Off'
      end
    end
  end
end

return commandArray
La commande ping dans le os.execute correspond à une utilisation sous Windows.
DrFloW
Messages : 38
Inscription : 02 mars 2015, 18:08

Re: Présence via ping smartphone

Message par DrFloW »

hobbe a écrit :Tu n'as que 38 lignes... :?
Oups! :lol: oui en effet, Pardon j'ai remis le script d'origine qui ping toutes les 10min et réactive le switch ON même s'il est déjà ON, ce qui m'embête car ca remet tous les paramètres modifés entre temps à la normale (volets fermés, mumières alumées...)

Voici mon script modifié qui doit présenter un souci vers la ligne 43:

Code : Tout sélectionner

commandArray = {}
 
--Cette fonction calcule la différence de temps (en secondes) entre maintenant
--et la date passée en paramètre.
function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 16)
  seconds = string.sub(s, 18, 19)
  t1 = os.time()
  t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
  difference = os.difftime (t1, t2)
  return difference
end
 
--Si le téléphone n'est pas détecté,
--alors on vérifie sa présence
if (otherdevices['Presence']=='Off') then
	ping_success_tel1=os.execute('ping -c1 192.168.0.13')
	ping_success_tel2=os.execute('ping -c1 192.168.0.99')
	
	if ping_success_tel1 or ping_success_tel2 then
	  commandArray['Presence']='On'
	  end
	end
end

--Si le téléphone est présent depuis plus de 10 minutes (600 secondes),
--alors on vérifie à nouveau sa présence
if (otherdevices['Presence']=='On' and timedifference(otherdevices_lastupdate['Presence']) > 600) then
	ping_success_tel1=os.execute('ping -c1 192.168.0.13')
	ping_success_tel2=os.execute('ping -c1 192.168.0.99')
	
	if ping_success_tel1 or ping_success_tel2 and otherdevices['Presence']=='On'  then
--On ne passe l'interrupteur virtuel à Off que s'il est sur On.
	commandArray['Presence']='Off'
			 end
    end
end

return commandArray
Dernière modification par DrFloW le 07 mars 2015, 23:02, modifié 1 fois.
DrFloW
Messages : 38
Inscription : 02 mars 2015, 18:08

Re: Présence via ping smartphone

Message par DrFloW »

hobbe a écrit :Voici ma version d'un script dont le but est faire un ping sur les IP des téléphones, et mettre les interrupteurs "Présence X" à ON ou OFF.
Bonsoir Hobbe! On script a l'air enore plus ambitieux! Il assigne un swith de présence a chaque membre de la maison si je comprends bien, c'est une excellente idée.

Ensuite il ping toutes les 2 min, par contre je n'ai pas compris ce qui se passe après la requête de ping, comment sont actionné les switch? Comment se passe la déconnexion si le ping revient négatif?
DrFloW
Messages : 38
Inscription : 02 mars 2015, 18:08

Re: Présence via ping smartphone

Message par DrFloW »

Nouvelle version qui me semble mieux: le switch ne passe donc ON que s'il était OFF avant, ce qui devrait éviter mon souci! Qu'en pensez vous?


Code : Tout sélectionner

-- Alexandre DUBOIS - Modification 2015
-- Ce script vérifie la présence de 2 téléphones sur le réseau pour savoir si quelqu'un est là.
-- La vérification est effectuée une fois par minute tant qu'aucun téléphone n'est à portée,
-- puis une fois toute les 10 minutes quand au moins un téléphone est connecté pour ne pas trop stresser sa batterie. 

commandArray = {}--Cette fonction calcule la différence de temps (en secondes) entre maintenant
--et la date passée en paramètre.
function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 16)
  seconds = string.sub(s, 18, 19)
  t1 = os.time()
  t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
  difference = os.difftime (t1, t2)
  return difference
end
 
--Si le téléphone n'est pas détecté ou qu'il est présent depuis plus de 10 minutes (600 secondes),
--alors on vérifie à nouveau sa présence
if (otherdevices['Presence']=='Off' or (otherdevices['Presence']=='On' and timedifference(otherdevices_lastupdate['Presence']) > 600)) then
	ping_success_tel1=os.execute('ping -c1 192.168.0.13')
	ping_success_tel2=os.execute('ping -c1 192.168.0.99')
	
	if ping_success_tel1 or ping_success_tel2 then
		if ( otherdevices['presence'] == 'Off') then -- Passage du switch ON que s'il était OFF avant
                  print(" ping connect success ")
                 commandArray['presence']='On'
	else
	  if otherdevices['Presence']=='On' then --On ne passe l'interrupteur virtuel à Off que s'il est sur On.
	  		print(" ping connect failure ")
          commandArray['Presence']='Off'
          end
	end
end
 
return commandArray
mercusot
Messages : 116
Inscription : 05 janv. 2017, 14:05

Re: Présence via ping smartphone

Message par mercusot »

Ne manquerait-il pas un end à la fin de la séquence que tu as modifiée ?

if ( otherdevices['presence'] == 'Off') then -- Passage du switch ON que s'il était OFF avant
                  print(" ping connect success ")
                 commandArray['presence']='On'
end
Ghislain
Messages : 120
Inscription : 15 janv. 2017, 16:47
Localisation : Bourges (18)

Re: Présence via ping smartphone

Message par Ghislain »

Beau déterrage :roll:
Répondre