Aller au contenu

Messages recommandés

Posté(e)

Bon bah en fait, désolé de la fausse joie ça ne marche pas, la détection était un faux positif.

 

Mais je ne vois pas de raison pour laquelle ça foirerait donc ça vient forcément de mon code, je remets mon ouvrage sur le métier...

Posté(e)

C'est bon ça marche, il y a une latence de 10 à 15s environ, il me faut bien plus de temps que ça pour m'extraire du lit :P

 

voici le code fonctionnel, bien évidemment il peut être largement optimisé :

 

le 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 = "DashButtonChambre";
---------------------------------------------------------------------------------------------------------------
local current_icon_absent = 1027     -- icone absent
local current_icon_present = 1026    -- icone present
local current_icon_recherche = 1028  -- icone recherche du tel
local ID_Tel = 259                   -- Id du Tel laisser vide pour ne pas recevoir de notifications
---------------------------------------------------------------------------------------------------------------
local maxRetry_Process = 2;
local check_wait = 1;        -- (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 existe 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 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 msg = "Tentative(s) ".. retry+1 .. "/"..maxRetry_Process+1;
	fibaro:call(selfId, "setProperty", "ui.Message.value", msg)
	
    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é");
             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();

---------------------------------------------------------------------------------------------------------------
-- Recuperation 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)
---------------------------------------------------------------------------------------------------------------
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

et la mainLoop

 

local selfId = fibaro:getSelfId();

fibaro:call(selfId, "pressButton", "3")
instance.lastrun = os.time()
fibaro:debug("executed")

 

avec un essai par seconde et 3 essais à chaque fois ça fait au final un test toutes les secondes (puisque si j'ai bien compris la mainLoop est exécuté toutes les 3 secondes)

 

Posté(e)

houlà, beau travail, faut pas s'emballer, je n'ai fait que récupérer le VD des cadors du forum et le détourner honteusement pour mon usage.

 

En parlant de honte, le Dash button disparait très rapidement du réseau donc j'ai mis en commentaire le sleep entre chaque essai (qui prends déjà une bonne seconde chez moi) et j'ai mis le maxRetry à 3 mais la RAM de ma box est à 39%.

Même avec ça j'ai pas un taux de reconnaissance de 100%, je dirais dans les 80%. Ok pour déclencher le café du matin mais pour le reste...

Posté(e)

J'étais en déplacement désolé, c'est l'adresse MAC (pas l'IP) qu'il faut mettre dans le champ adresse IP et tu laisse le port à 0

  • 1 mois après...
Posté(e)

Plutôt qu'une boucle après un json.decode, un string.match directement sur le json ne serait pas plus efficace ?

×
×
  • Créer...