Script detection de presence

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 <\>.
shadow001
Messages : 14
Inscription : 13 janv. 2016, 05:15

Script detection de presence

Message 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.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Script detection de presence

Message par vil1driver »

Salut,

Quel est ton problème ?

La ligne devices ? Tu peux la supprimer..
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
shadow001
Messages : 14
Inscription : 13 janv. 2016, 05:15

Re: Script detection de presence

Message 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
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Script detection de presence

Message 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
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
shadow001
Messages : 14
Inscription : 13 janv. 2016, 05:15

Re: Script detection de presence

Message 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
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Script detection de presence

Message 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
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
shadow001
Messages : 14
Inscription : 13 janv. 2016, 05:15

Re: Script detection de presence

Message 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
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Script detection de presence

Message par vil1driver »

copie ici ton script que je te dise où tu as fais l'erreur..
quel est le nom exacte de ton inter ?
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
shadow001
Messages : 14
Inscription : 13 janv. 2016, 05:15

Re: Script detection de presence

Message 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]
Pièces jointes
Capture d’écran 2016-01-14 à 20.03.14.jpg
Capture d’écran 2016-01-14 à 20.03.14.jpg (225.48 Kio) Consulté 10190 fois
shadow001
Messages : 14
Inscription : 13 janv. 2016, 05:15

Re: Script detection de presence

Message par shadow001 »

[img]

[/img]
Répondre