Page 1 sur 2

Script detection de presence

Publié : 13 janv. 2016, 05:46
par shadow001
bonjour,
je souhaite m'inspirer de ce script LUA, pour vérifier la présence de 2 smartphones chez moi. tout en utilisant la latence de 30mn.
exemple:
phone1: 192.168.1.100
phone2: 192.168.1.101

Avoir 2 switch virtuel
phone1
phone2.

Si le phone1 est est détecté a la maison =>passer sur ON le switch phone1, et pas de changement d'état du switch phone2 =OFF si ce dernier est absent.

Code : Tout sélectionner

	
---------------------------------------------------------------------------
-- Script       : script_time_PRESENCE_MAISON.lua
--
-- Objectif     : Script de détection de la présence des occupants d'un 
--                lieu en fonction de la connexion de leurs périphériques 
--                réseau au réseau wifi du lieu.
--
-- Auteur       : Bastien DUMAS 
-- Date         : 27/05/2015
-- Version      : 2.0
---------------------------------------------------------------------------
---------------------------------------------------------------------------
-- Fonctions 
---------------------------------------------------------------------------
local debugging = false
function crache_des_log (s)
    if (debugging) then 
        print (s);
    end
end
---------------------------------------------------------------------------
-- Variables 
---------------------------------------------------------------------------
----------------------------------------------------------------
-- Tableau des personnes
----------------------------------------------------------------
personne = {};
-- 1ere personne :
--    - nom de la personne // du périphérique 
--    - ip du périphérique
personne[1] = {nom="phone1", ip = "192.168.1.100"}
--2eme personne : 
--    - nom de la personne // du périphérique 
--    - ip du périphérique
personne[2] = {nom="phone2", ip = "192.168.1.101"}
----------------------------------------------------------------
-- Tableau des périphériques à controler
-- ATTENTION seul les périphériques "ON/OFF" sont gérés
----------------------------------------------------------------
devices = {'phone1','phone2'}; ==>>>?!!!
----------------------------------------------------------------
 -- Initialisation des variables
 ---------------------------------------------------------------
local temps_latence = 30 -- Temps de latence admis pour passer la présence à Off
crache_des_log ("temps_latence : " .. temps_latence)
local user_variable_name = "last_ping" -- Nom de la variable utilisateur représentant le temps d'absence
local virtual_device_name= "PRESENCE_MAISON" -- Nom du périphérique virtuel représentant la présence
 
 
-- Variables de travail - NE PAS TOUCHER
local ping_success = false
local last_ping = tonumber(uservariables[user_variable_name]) 
local last_update = otherdevices_lastupdate[virtual_device_name]
local device_presence = otherdevices[virtual_device_name]
crache_des_log ("device_presence : " .. device_presence)
 
 
 
---------------------------------------------------------------------------
-- Script
---------------------------------------------------------------------------
commandArray = {}
 
print "=========== Script de détection de présence des habitants (v2.0) ==========="
print ("Derniere mise à jour de la presence : "..last_update.."....")
--Pour chaque personne
for i, v in pairs(personne) do
    local ping = false;
    local string = 'ping -c1 '..v.ip
    crache_des_log ("chaine de ping : " .. string)
    ping = os.execute(string); -- on ping l'appareil associé
    if (ping) then 
        crache_des_log ("==> "..v.nom.." est là")
    else
        crache_des_log ("==> "..v.nom.." n'est pas là")
    end
    ping_success = ping_success or ping
end
 
--Traitement du résultat
if (ping_success) then 
    last_ping = 0
    crache_des_log ("ping succes ! ==> last_ping = 0")
    crache_des_log ("device presence "..device_presence)
    if (device_presence=='Off') then
        crache_des_log ("device presence "..device_presence.. " otherdevices[virtual_device_name] : "..otherdevices[virtual_device_name])
        -- On allume le device
        for i, v in pairs(devices) do
            commandArray[v]='On'
            crache_des_log ("Allumage du device "..v)
        end
        -- On passe le périphérique virtuel à On
        commandArray[virtual_device_name]='On'
        crache_des_log ("Présence On")
    else 
        crache_des_log ("déja présent avant ... on ne change rien")
    end
else
    last_ping = last_ping + 1    
    if (last_ping >= temps_latence and device_presence=='On') then 
        
        -- On Eteind le device
        for i, v in pairs(devices) do
            commandArray[v]='Off'
                        crache_des_log ("Extinction du device"..v) 
        end
        -- On passe le périphérique virtuel à Off
        commandArray[virtual_device_name]='Off'
        crache_des_log ("Présence Off")
    end
 
end
if (last_ping == 0) then 
    print (" ==> Présent")
else    
    print (" ==> Absent depuis " .. last_ping .. " minute(s)")
end
commandArray['Variable:last_ping'] = tostring(last_ping)
print "=========== Fin Script de détection de présence ==========="
return commandArray
Merci encore pour votre aide.

Re: Script detection de presence

Publié : 13 janv. 2016, 06:02
par vil1driver
Salut,

Quel est ton problème ?

La ligne devices ? Tu peux la supprimer..

Re: Script detection de presence

Publié : 13 janv. 2016, 08:28
par shadow001
actuellement, le script allume les devices, si l'un ou l'autre phone est détecté dans la maison.
Moi, j'aimerais allumer le switch phone1 si le phone1 est détecté et pas le phone2 si il n'est pas présent. Ou le contraire. Ét toujours avec la latence.
Merci

Re: Script detection de presence

Publié : 13 janv. 2016, 12:09
par vil1driver
Oh je te raconte des conneries en plus.. :(
La ligne devices est utile dans ce script

Mais le script est tordu du coups,...

Si tu veux je tu peux essayer le miens.. Il fonctionne impec et permet de choisir le delai par device

Code : Tout sélectionner

--[[

name: script_time_ping.lua

ip = ip à pinguer
device = périphérique à mettre à jour
loops = ping toutes les X minutes
count = nombre d'échecs successifs avant de valider offLine

--]]


--------------------------------
------ Tableau à éditer ------
--------------------------------

local url = '192.168.22.100:8080'	-- user:pass@ip:port de domoticz
  
local ping={
--{ip,device,loops,count} 
{'192.168.22.153','room',1,1},
{'192.168.22.200','nas',5,2},
{'www.free.fr','adsl',5,2},
{'192.168.22.70','sms gateway',5,2}	-- pas de , à la dernière ligne !
--etc..
}

		
--------------------------------
-- Fin du tableau à éditer --
--------------------------------
 
function url_encode(str)
  if (str) then
    str = string.gsub (str, "\n", "\r\n")
    str = string.gsub (str, "([^%w %-%_%.%~])",
        function (c) return string.format ("%%%02X", string.byte(c)) end)
    str = string.gsub (str, " ", "+")
  end
  return str	
end 
 
commandArray={}

date = os.date("*t")


for i, switch in pairs(ping) do

	ip = switch[1]
	device = switch[2]
	loops = switch[3]
	count = switch[4]


	if (date.min % loops == 0) then	
		-- Le Ping ! : -c1 = Un seul ping  ,   -w3 délai de 3 seconde d'attente de réponse
		ping_success=os.execute('ping -c1 -w3 '..ip)
	 
	 
		-- création des variables utilisateur pour comptabiliser les échecs de ping
		if(uservariables['PING_'..device] == nil) then
			commandArray[i]={['OpenURL']=url..'/json.htm?type=command&param=saveuservariable&vname=PING_'..url_encode(device)..'&vtype=2&vvalue=0'}
			print('PING : création variable manquante PING_'..device)
			print('PING : script supendu')
	 
		-- Si le ping à répondu
		elseif ping_success then
			-- remise à zéro du compteur d'échec
			commandArray[i]={['Variable:PING_'..device] = '0'}
			print('PING : ' .. device .. ' -> success')
	   
		-- si le device etait sur off on l'allume
			if(otherdevices[device] == 'Off') then
				commandArray[i+1]={[device] = 'On'}
			end
	   
		else	-- Si pas de réponse
			-- on incrémente le compteur d'échec
			commandArray[i]={['Variable:PING_'..device] = tostring(uservariables['PING_'..device] + 1)}
			print('PING : ' .. device .. ' -> fail ('..(uservariables['PING_'..device]+1)..')')
		   
			-- si le device etait sur On et que le compt total est atteint, on l'éteind
			if(otherdevices[device] == 'On' and tonumber(uservariables['PING_'..device]) >= count - 1) then
				commandArray[i+1]={[device] = 'Off'}
			end
		end
		 		 
	end
end  
 
return commandArray

Re: Script detection de presence

Publié : 13 janv. 2016, 18:01
par shadow001
merci ta réponse, j'ai testé le script, mais dans le log, "LUA: PING : création variable manquante PING_phone1, j'ai pourtant renommer mon device (interrupteur) PING_phone1.
merci

Re: Script detection de presence

Publié : 13 janv. 2016, 19:02
par vil1driver
c'est normal de lire
création variable manquante PING_phone1
si tu as correctement indiqué l'ip de ton domoticz tu ne dois voir cette ligne qu'une seule fois dans les logs..
au pire crée toi même la variable.

ne confonds pas variable et interrupteur

la variable sert à compter les échecs, ton inter, tu le nommes comme tu le veux, heureusement

Re: Script detection de presence

Publié : 14 janv. 2016, 17:10
par shadow001
je vois a présent dans les log un "2016-01-14 17:08:00.591 LUA: PING : phone1 -> success" mais mon switch virtuel phone1 ne s'allume pas.
merci

Re: Script detection de presence

Publié : 14 janv. 2016, 17:22
par vil1driver
copie ici ton script que je te dise où tu as fais l'erreur..
quel est le nom exacte de ton inter ?

Re: Script detection de presence

Publié : 14 janv. 2016, 20:14
par shadow001
voici mon script:

Code : Tout sélectionner

--[[

name: script_time_ping.lua

ip = ip à pinguer
device = périphérique à mettre à jour
loops = ping toutes les X minutes
count = nombre d'échecs successifs avant de valider offLine

--]]


--------------------------------
------ Tableau à éditer ------
--------------------------------

local url = '192.168.5.40:8095'   -- user:pass@ip:port de domoticz

local ping={
--{ip,device,loops,count}
{'192.168.5.5','iPhone-Heddy',2,5},
{'192.168.5.7','iPhone-MC',2,5},
--{'www.free.fr','adsl',5,2},
--{'192.168.22.70','sms gateway',5,2}   -- pas de , à la dernière ligne !
--etc..
}


--------------------------------
-- Fin du tableau à éditer --
--------------------------------

function url_encode(str)
  if (str) then
    str = string.gsub (str, "\n", "\r\n")
    str = string.gsub (str, "([^%w %-%_%.%~])",
        function (c) return string.format ("%%%02X", string.byte(c)) end)
    str = string.gsub (str, " ", "+")
  end
  return str
end

commandArray={}

date = os.date("*t")


for i, switch in pairs(ping) do

   ip = switch[1]
   device = switch[2]
   loops = switch[3]
   count = switch[4]


   if (date.min % loops == 0) then
      -- Le Ping ! : -c1 = Un seul ping  ,   -w3 délai de 3 seconde d'attente de réponse
      ping_success=os.execute('ping -c1 -w3 '..ip)


      -- création des variables utilisateur pour comptabiliser les échecs de ping
      if(uservariables['PING_'..device] == nil) then
         commandArray[i]={['OpenURL']=url..'/json.htm?type=command&param=saveuservariable&vname=PING_'..url_encode(device)..'&vtype=2&vvalue=0'}
         print('PING : création variable manquante PING_'..device)
         print('PING : script supendu')

      -- Si le ping à répondu
      elseif ping_success then
         -- remise à zéro du compteur d'échec
         commandArray[i]={['Variable:PING_'..device] = '0'}
         print('PING : ' .. device .. ' -> success')

      -- si le device etait sur off on l'allume
         if(otherdevices[device] == 'Off') then
            commandArray[i+1]={[device] = 'On'}
         end
capture des interrupteurs:
[img]
Capture d’écran 2016-01-14 à 20.03.37
[/img]

Viable utilisateurs:
[img]
Capture d’écran 2016-01-14 à 20.03.14
[/img]

Re: Script detection de presence

Publié : 14 janv. 2016, 20:18
par shadow001
[img]

[/img]