duch Posté(e) le 27 octobre 2017 Signaler Posté(e) le 27 octobre 2017 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...
pepite Posté(e) le 27 octobre 2017 Signaler Posté(e) le 27 octobre 2017 Excellent, pas bete du tout, reste à voir si tu auras de la latence :-)
duch Posté(e) le 27 octobre 2017 Signaler Posté(e) le 27 octobre 2017 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 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)
yoim Posté(e) le 27 octobre 2017 Signaler Posté(e) le 27 octobre 2017 Je test ca rapidement. Beau travail !
duch Posté(e) le 27 octobre 2017 Signaler Posté(e) le 27 octobre 2017 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...
yoim Posté(e) le 27 octobre 2017 Signaler Posté(e) le 27 octobre 2017 Où tu rentres l'adresse mac du boutton ? tu rentres l'ip dans le VD ?
duch Posté(e) le 3 novembre 2017 Signaler Posté(e) le 3 novembre 2017 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
Sidiwalker Posté(e) le 6 décembre 2017 Signaler Posté(e) le 6 décembre 2017 Ce serait possible que tu nous exportes ton VD? @duch Merci d'avance!!
OJC Posté(e) le 7 décembre 2017 Signaler Posté(e) le 7 décembre 2017 Plutôt qu'une boucle après un json.decode, un string.match directement sur le json ne serait pas plus efficace ?
Messages recommandés