Aller au contenu

Detection De Présence


sebcbien

Messages recommandés

il y a une heure, Did a dit :

 Oui, et c'est donc la Delorean qui est en panne? :)

 

yep ! :2:

 

Non, c'est râlant, une grosse panne a l'ancienne, juste quelques jours avant de la revendre... en plus on est "a pieds" 

Lien vers le commentaire
Partager sur d’autres sites

Nouvelle mise a jour du VD version 2.31b

 

version 2.31b

  • Creation automatique de la Variable Globale si elle n'existe pas
  • Possibilité d’envoyé une notification lorsque le WIFI s'allume ou s'éteint
  • Ajout de l'affichage de l'icone rechercher dans le code
  • Ajout du code pour presser le bouton dans le menu principale

 

version 2.30b

  • Nettoyage du code avec la suppression de la fonction ping qui ne sert pas puisque l'on utilise l'adresse MAC
  • Ajout d'une icône lorsque la recherche est en cours
  • Ajout d'une étiquette qui vous informe de l'etat de la recherche
  • Ajout de la vérification de la longueur de l'adresse mac et la conversion en minuscule des lettres (Chez moi en majuscules cela ne fonctionne pas)

 

 

Mise en place du VD

 

Renseigné les lignes suivantes :

local variable_globale_phone = "Phone_DIEU"; -- Nom de la variable globale
---------------------------------------------------------------------------------------------------------------
local current_icon_absent = 1022     -- icone absent
local current_icon_present = 1021    -- icone present
local current_icon_recherche = 1020  -- icone recherche du tel

Activation des notifications (Trés pratique pour faire des tests)

local ID_Tel = 189

Suppression des notification

local ID_Tel = ""

Reglage du nombres et temps de recherche

local maxRetry_Process = 2;
local scheduler_value = 2;   -- (minutes) scheduled time of this process (must match the mainloop scheduled time)
local check_wait = 15;        -- (seconds) to wait between each poll device

Activation du debug

local debug = true

 

Code du Bouton

-- IP Smartphone Presence Check V2.2 using arp table
-- Copyright © 2014 Sébastien Jauquet.
-- http://www.domotique-fibaro.fr/index.php/topic/2613-detection-de-pr%C3%A9sence/
-- mac adress check: Roman
-- http://forum.fibaro.com/index.php?/topic/21062-idea-how-to-monitor-people-at-home/#entry86009
-- modifier le 08-02-2017 V2.31 beta 

local variable_globale_phone = "Phone_DIEU";
---------------------------------------------------------------------------------------------------------------
local current_icon_absent = 1022     -- icone absent
local current_icon_present = 1021    -- icone present
local current_icon_recherche = 1020  -- icone recherche du tel
local ID_Tel = 189                   -- Id du Tel laisser vide pour ne pas recevoir de notifications
---------------------------------------------------------------------------------------------------------------
local maxRetry_Process = 2;
local scheduler_value = 2;   -- (minutes) scheduled time of this process (must match the mainloop scheduled time)
local check_wait = 15;        -- (seconds) to wait between each poll device
local debug = true

---------------------------------------------------------------------------------------------------------------
-- Ne rien toucher en dessous de cette ligne
---------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------
-- Fonction affichage debugage
---------------------------------------------------------------------------------------------------------------
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
-------------------------------------------------------------------------------------------------------
-- Verification si Global Variable n'existe pas by @LAZER
-------------------------------------------------------------------------------------------------------
function VG(VG_phone)
         fibaro:debug("Verification VG "..VG_phone)
         local HC2 = Net.FHttp("127.0.0.1", 11111)
         local response, status, errorCode = HC2:GET("/api/globalVariables/"..VG_phone)
         if tonumber(errorCode) == 0 and tonumber(status) == 404 then
            -- Create global variable if it does not exist
            local payload = '{"name":"'..VG_phone..'", "isEnum":0, "value":""}'
            local response, status, errorCode = HC2:POST("/api/globalVariables", payload)
            if tonumber(errorCode) == 0 and (tonumber(status) == 200 or tonumber(status) == 201) and response ~= nil and response ~= "" then
               fibaro:debug('<span style="display:inline;color:green;">Global variable "'..VG_phone..'" created</span>')
            else
               fibaro:debug('<span style="display:inline;color:red;">Error : Cannot create global variable "'..VG_phone..'", errorCode='..errorCode..', status='..status..', payload='..payload..', response='..(response or "")..'</span>')
            end
         end
end
---------------------------------------------------------------------------------------------------------------
-- Mise à jour de l'etiquette message
---------------------------------------------------------------------------------------------------------------
function Label(couleur, mesg)
        if couleur ~= "" then
           fibaro:call(selfId, "setProperty", "ui.Message.value", '<font color="'..couleur..'">'..mesg..'</font>')
        else 
		   fibaro:call(selfId, "setProperty", "ui.Message.value", mesg)
        end
end		

---------------------------------------------------------------------------------------------------------------
-- Fonction Heure secondes
---------------------------------------------------------------------------------------------------------------
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

---------------------------------------------------------------------------------------------------------------
-- fonction recherche MAC adresse
---------------------------------------------------------------------------------------------------------------
function FindMac(retry)
    retry = retry or 0;
    local foundUser = false;
-- notify state
	local elapsed = os.difftime(os.time(), tonumber(time));
	local msg = "Tentative(s) ".. retry+1 .. "/"..maxRetry_Process+1 .. " depuis "..SecondsToClock(elapsed);
	fibaro:call(selfId, "setProperty", "ui.Message.value", msg)
	
-- 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'].." trouvé en moins de "..elapsed+check_wait.." 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

---------------------------------------------------------------------------------------------------------------
-- DEBUT DU PROGRAMME -- Ne rien toucher en dessous de cette ligne
---------------------------------------------------------------------------------------------------------------
selfId = fibaro:getSelfId();
time = tonumber(os.time());
maxtime = (scheduler_value*60) - (check_wait+1);

---------------------------------------------------------------------------------------------------------------
-- Recuperation de l'adresse MAC et vérification de la longueur et conversion en minuscules
---------------------------------------------------------------------------------------------------------------
VG(variable_globale_phone) -- verification VG et creation si not exist
mac = string.lower(fibaro:get(selfId, 'IPAddress')); -- recupere la mac adresse en minuscules

if string.len(mac) ~= 17 then -- test la longueur de la MAC adresse
   Label ("red", "Erreur adresse MA : "..mac)
   fibaro:abort()
end 
---------------------------------------------------------------------------------------------------------------
-- mise a jour label
---------------------------------------------------------------------------------------------------------------
fibaro:call(selfId, "setProperty", "ui.TEL.value", variable_globale_phone)
fibaro:call(selfId, "setProperty", "currentIcon", current_icon_recherche)
---------------------------------------------------------------------------------------------------------------
current_icon_recherche
HC2 = Net.FHttp("127.0.0.1", 11111)



fibaro:log("Starting process");
Debug("yellow","Recherche adresse MAC: "..mac)

local f, result = pcall(FindMac);

if (f) then
   local Valeur_VG = fibaro:getGlobal(variable_globale_phone)
   if (result == true) then
      fibaro:log("Device trouvé.");
      fibaro:setGlobal(variable_globale_phone,"1")
      local heureVariable = fibaro:getGlobalModificationTime(variable_globale_phone)
      Label ("green", os.date("Le %d/%m/%y a %HH%M : ", heureVariable).."WIFI ON.")
      if ID_Tel ~="" and Valeur_VG ~= "1" then
         fibaro:call(ID_Tel, "sendPush", os.date("Le %d/%m/%y a %HH%M : ", heureVariable).."WIFI ON.")
      end
      Debug("green","Global Var: "..variable_globale_phone.." = 1");
      fibaro:call(selfId, "setProperty", "currentIcon", current_icon_present)
   else
      fibaro:log("Device Non trouvé!");
      fibaro:setGlobal(variable_globale_phone,"0")
      local heureVariable = fibaro:getGlobalModificationTime(variable_globale_phone)
      Label ("red", os.date("Le %d/%m/%y a %HH%M : ", heureVariable).."WIFI OFF")
      if ID_Tel ~="" and Valeur_VG ~= "0" then
         fibaro:call(ID_Tel, "sendPush", os.date("Le %d/%m/%y a %HH%M : ", heureVariable).."WIFI OFF.")
      end
      Debug("red","Device "..mac.." Non trouvé");
      Debug("red","Global Var: "..variable_globale_phone.." = 0");
      fibaro:call(selfId, "setProperty", "currentIcon", current_icon_absent)
   end
else
   fibaro:log("Error: " .. tostring(f));
end

 

Code de la boucle principale :

local selfId = fibaro:getSelfId();

-- 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", "3")
   instance.lastrun = os.time()
   fibaro:debug("executed")
end

 

 

Icones pour ce VD :

 

User_GG_icon_Absent.pngUser_GG_icon_present.pngUser_Seb_icon_Absent.pngUser_Seb_icon_present.png1397.png.419524d5961be3d39ed23baf2d439ee3.png

 

 

Apercu du VD :

 

dieu off.jpgdieu recherche.jpgdieu on.jpg

 

Modules Virtuel :

  • Upvote 2
Lien vers le commentaire
Partager sur d’autres sites

@mprinfo

TOP !! Avec creation automatique de la VG et push

 

Tu n'aurais pas inverse tes push ? entre Id_Tel et Valeur_VG

voila ce que je comprends, mais ne pas oublier je suis loin d'etre un expert à côté de toi et les boss

Il y a 4 heures, mprinfo a dit :

fibaro:setGlobal(variable_globale_phone,"1") local heureVariable = fibaro:getGlobalModificationTime(variable_globale_phone) Label ("green", os.date("Le %d/%m/%y a %HH%M : ", heureVariable).."WIFI ON.") if ID_Tel ~="" and Valeur_VG ~= "1" then fibaro:call(ID_Tel, "sendPush", os.date("Le %d/%m/%y a %HH%M : ", heureVariable).."WIFI ON.") end

 

Valeur_VG different de 1 (donc 0 dans ce cas), pas de push WIFI ON puisque le setGlobal l'a mis à 1 juste avant non ?

 

fibaro:setGlobal(variable_globale_phone,"0") 
local heureVariable = fibaro:getGlobalModificationTime(variable_globale_phone) 
Label ("red", os.date("Le %d/%m/%y a %HH%M : ", heureVariable).."WIFI OFF") 
if ID_Tel ~="" and Valeur_VG ~= "0" then 
fibaro:call(ID_Tel, "sendPush", os.date("Le %d/%m/%y a %HH%M : ", heureVariable).."WIFI OFF.") 
end

Idem la non, si VG différente de 0 (donc 1) envoie du push WIFI OFF, alors que le setGlobal met à 0 la VG si result = false ?

Lien vers le commentaire
Partager sur d’autres sites

Bonjour  à tous, 

D'abord je dois remercié pour l'effort et l'énergie mis .

J'ai installé la version 2.31 b et j'ai cette erreur . dans le debug button  

 

Bien a vous ,


[ERROR] 19:24:27: line 150: '=' expected near 'HC2'
[ERROR] 19:24:28: line 150: '=' expected near 'HC2'
[ERROR] 19:24:29: line 150: '=' expected near 'HC2'
[ERROR] 19:24:29: line 150: '=' expected near 'HC2'
[ERROR] 19:24:29: line 150: '=' expected near 'HC2'
[ERROR] 19:25:37: line 150: '=' expected near 'HC2'
[ERROR] 19:27:37: line 150: '=' expected near 'HC2'

 

Lien vers le commentaire
Partager sur d’autres sites

Voila la ligne ...

--------------------------------------------------------------------------------------------------------------
-- mise a jour label
---------------------------------------------------------------------------------------------------------------
fibaro:call(selfId, "setProperty", "ui.TEL.value", variable_globale_phone)
fibaro:call(selfId, "setProperty", "currentIcon", current_icon_recherche)
---------------------------------------------------------------------------------------------------------------
current_icon_recherche
HC2 = Net.FHttp("127.0.0.1", 11111)



fibaro:log("Starting process");
Debug("yellow","Recherche adresse MAC: "..mac)

 

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...
×
×
  • Créer...