Bonjour à tous !
Aujourd’hui je vais vous présenter un petit script qui permet de détecter la présence des individus de votre maison à partir de la détection de leur téléphone. Je tiens à préciser que je ne suis pas développeur, il y a donc sûrement moyen de rendre le script plus « beau », si vous avez des idées, pistes, liens : n’hésitez pas à poster un commentaire
Détection de présence : explication du principe
Le principe est assez simple. Je détermine si il y a quelqu’un chez moi en me basant sur la présence des périphériques connectés au réseau Wifi. Si on arrive à les trouver à l’aide de la commande ‘ping’, il y a quelqu’un sinon … ben il n’y a personne.
Afin d’éviter les faux « négatifs » (personne à la maison parce que l’on est en dehors de la portée du wifi), j’ai introduit une tolérance de 30 minutes.
Bon allé, assez parlé, je vous explique comment faire.
Etape 1 : Déclaration des périphériques
Pour commencer, j’ai fixé les adresses ip des téléphones à l’aide de ma freebox. Pour cela, il faut se rendre dans l’admin de votre freebox en utilisant l’adresse http://mafreebox.free.fr puis choisir l’icône
Rendez-vous ensuite dans l’onglet « Mode avancé » puis choisissez l’icone « DHCP » de la section « Réseau local ».
Choisissez alors l’onglet « Baux statiques » puis « Ajouter un bail DHCP Statique ».
Vous devez ensuite remplir les champs de l’interface en précisant :
- l’adresse MAC de votre appareil, pour cela, utilisez le menu déroulant
- l’adresse ip qui sera votre adresse permanente
- le champ commentaire afin de donner un nom à votre appareil pour le reconnaître sur votre interface d’administration (non obligatoire).
Voilà, répétez cette opération pour l’ensemble de vos appareils (téléphone de chacun des habitants, tablettes…) et on peut ensuite passer à la suite !
Etape 2 : Création du périphérique virtuel dans Domoticz
Afin de représenter la présence dans la maison, j’utilise un périphérique virtuel qui change d’état à l’aide d’un script LUA. Avant de passer à la partie script, je vais donc vous détailler les étapes pour même en place le périphérique virtuel.
La création du périphérique se fait en deux étapes :
- Création du périphérique :
Choisir le menu « Configuration » puis « Matériel ». Une fois sur la page des matériels, rendez-vous en bas de celle-ci pour remplir le formulaire en saisissant les informations suivantes :
– Nom : nom de votre périphérique
– Type : choisir ici « Dummy (does nothing, use for virtual switches only) »
– Délais d’attente des données : « Désactiver »
Puis cliquez sur « Ajouter » - Ajout de l’indicateur dans l’interface de domoticz :
Choisir le menu « Interrupteur », puis cliquez sur le bouton « AJout manuel » en haut à gauche de la page puis remplissez les informations suivantes :
– Hardware : Utilisez le menu déroulant pour retrouver le périphérique précédemment créé (normalement c’est le dernier de la liste)
– Name : choisissez le nom de l’indicateur, c’est aussi le nom de l’on utilisera dans le script LUA
– Switch Type : « On/Off »
Laissez lerestedesinformationsavec leur valeur par défautVoilà ! Nous pouvons maintenant passer à la suite : la création de la variable utilisateur « last_ping ».
Etape 3 : Création de la variable utilisateur représentant le temps depuis le dernier ping « OK ».
Pour créer une variable utilisateur, il faut choisir le menu « Configuration » puis « Plus d’options » et enfin « Variables utilisateur ».
Une fois sur la page, remplissez le formulaire qui se trouve en bas, puis cliquez sur « Ajouter ».
Et voila 😉 on en a fini avec les étapes de déclaration. Passons maintenant à la partie script.
Etape 4 : Ecriture du script LUA
Allé hop, nous rentrons maintenant dans le vif du sujet : l’écriture du script LUA. Si vous n’avez jamais entendu parler de LUA, je vous invite à parcourir ce site que j’ai trouvé assez complet pour débuter : http://lua.gts-stolberg.de/fr/index.php.
Bon, je vais essayer de vous expliquer ce que j’ai fait… euh non 😉 j’espère qu’avec les commentaires vous comprendrez et si vous ne comprenez pas un truc …. demandez en commentaire
Le script est nommé : script_time_PRESENCE_MAISON.lua pour être déclenché toutes les minutes. En effet, avec la solution Domoticz, les scripts doivent :
- être placé dans le répertoire « scripts/lua » du répertoire domoticz
- être nommés :
- script_time_XXXXXX.lua (pour être lancé toutes les minutes)
- script_event_XXXXXXX.lua (à chaque changement d’état. Dans ce cas, attention à bien tester le changement d’état de votre périphérique)
Voili voilou
Allé hop, c’est parti, voici le code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
--------------------------------------------------------------------------- -- 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="Laurel", ip = "192.168.1.45"} --2eme personne : -- - nom de la personne // du périphérique -- - ip du périphérique personne[2] = {nom="Hardy", ip = "192.168.1.87"} ---------------------------------------------------------------- -- Tableau des périphériques à controler -- ATTENTION seul les périphériques "ON/OFF" sont gérés ---------------------------------------------------------------- devices = {'Prise cuisine','Prise Salon'}; ---------------------------------------------------------------- -- 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 |
Pour aller plus loin
Pour aller plus loin, on peut imaginer maintenant de commander de façon un peu plus pointue les autres périphériques de la maison.
On peut désormais imaginer commander les volets roulant pour minimiser les effets de la chaleur l’été.
On peut aussi penser à commander automatiquement l’envoie de notifications si on est parti depuis trop longtemps sans passer en mode vacance ou encore le passage dans le mode en automatique.
Comme d’hab, si vous avez des questions, remarques, ou encore précisions à apporter, n’hésitez pas à laisser un commentaire !
cialis online scarcely
Hello,
ça fait 2 jours que j’essaie de me dépatouillé de cette erreur ( la même que netstf…) :
2016-09-19 19:00:00.203 Error: EventSystem: in /usr/local/domoticz/var/scripts/lua/script_time_PRESENCE_MAISON.lua: …domoticz/var/scripts/lua/script_time_PRESENCE_MAISON.lua:17: unexpected symbol near char(160)
Avez-vous une idée ,
j ‘ai copié/collé dans plusieurs éditeurs …mais rien y fait …!!
You got this script in english? I can figure out what to do translating this page, but the comments inside the script don’t translate well. So I have no idea where to change values
Merci pour ce script. Malheureusement, après quelques tests, il s’avère que même si les baux restent actifs sur la freebox, les devices (iphones dans mon cas) ne répondent plus au pring lorsqu’ils sont en veille. Du coup, le résultat reste hasardeux car la détection ne se fait que lorsque la personne utilise activement son smartphone.
Ceci dit, c’était toujours sympa de pouvoir apprendre le lua avec cet exemple
Bonjour,
je suis debutant je ne comprends pas quels espaces doivent etre enlevées pour éviter l’erreur:
“Error: EventSystem: …/pi/domoticz/scripts/lua/script_time_PRESENCE_MAISON.lua:17: unexpected symbol near char(194)”
Merci
Merci pour ce script qui fonctionne parfaitement sur une implémentation Synology. (Jumbotroll)
Bonjour,
Je débute sur Domoticz et n’y connait pas grand chose en script LUA.
J’ai ce message dans le log
: »Domoticz\scripts\lua\script_time_PRESENCE_MAISON.lua:55: attempt to concatenate local ‘device_presence’ (a nil value) »
A quoi cela correspond ?
Cordialement.
Bonjour , je rencontre un erreur sur le scripts :
Error: EventSystem: /home/pi/domoticz/scripts/lua/script_time_presence.lua:17: unexpected symbol near char(160)
Pouvez vous m orientez ? merci
Bonjour,
J’ai eu ce problème et celà venait du copier coller du site internet dans Notepad.
En supprimant les espaces coller, le problème a été résolu.
Cordialement.
Bonjour et bravo pour votre travail et ce script !
Meme ci celui ne fonctionne que partiellement chez moi.
– En effet si je laisse « -c1″ (local string = ‘ping -c1 ‘..v.ip) , le smartphone (connecté) ne repond pas au ping.
Alors que la detection du smartphone fonctionne bien sans le « -c1″ et allume l’interrupteur virtuel.
– Et vice versa, sans « -c1″ l’absence du smartphone (deconnecté), n’est pas detecté par le script qui genere un message d’erreur (script_time_PRESENCE_MAISON.lua has been running for more than 10 seconds) et n’éteint pas l’interrupteur virtuel.
c’est un casse tete…
Merci d’avance a ceux qui ont une idée
Oui, test ceci :
Remplace -c1 par -w1 et voit ce qui ce passe, normalement tu ne devrais plus recevoir de message d’erreur dans les log.
Bonjour,
Pouvez-vous m’éclairer sur ce message d’erreur dans le log Domoticz ?
2016-01-24 18:23:10.461 Error: EventSystem: Warning!, lua script /home/pi/domoticz/scripts/lua/script_time_PRESENCE_MAISON.lua has been running for more than 10 seconds
En vous remerciant par avance pour votre aide.
Cordialement
Bonjour,
est-il possible avec ce même script LUA, contrôler la présence de 2 smartphones, avec des boutons virtuels pour chaque smartphone. si le smartphone 1 est détecté via le ping, c le bouton virtuel smartphone 1 qui s’allume. ou le contraire. tout en gardant la latence de 30mn.
car un script par smartphone, génère beaucoup de log.
merci
Bonsoir,
j’essaie depuis 3 jour a faire fonctionner ce script, mais ce dernier me remonte un message d’erreur (log)
« Error: EventSystem: …/pi/domoticz/scripts/lua/script_time_PRESENCE_MAISON.lua:17: unexpected symbol near char(194) », en desactivant ces lignes directement dans le script, j’ai une autre erreur a la ligne 42 ensuite 68. je n’ai modifié que l’IP,!!!
merci pour votre aide.
J’ai trouvé, l’erreur venait de mon éditeur de texte, je suis sous Mac, aucun problème avec notepad+++.
@+
Je débute sur Domoticz et n’y connait pas grand chose en script LUA.
J’ai ce message dans le log : script_time_PRESENCE_MAISON.lua:55: attempt to concatenate local ‘device_presence’ (a nil value)
Sais-tu ou j’ai loupé quelque chose ?
Bonjour,
Pour le problème de attempt to concatenate local ‘device_presence’ (a nil value) vérifie ton virtual_device_name
J’ai rencontré le même souci que Jay. Et effectivement Drabo, le souci était bien sur le virtual switch. Il fallait pour mon cas (Domoticz sur Synology) « simplement » changer manuellement au moins une fois le statut du virtual switch (indicateur) de présence (PRESENCE_MAISON) (positionner à on ou off via Domoticz). Je suppose qu’à la création le virtual switch n’a pas de statut exploitable (ni on, ni off) et que donc le script ne peut l’exploiter.
Merci à vous.
Ping : Domoticz : Automatiser la gestion des volets roulants en LUA - Debrouil'Home
Bonjour,
merci pour ce script, ça fait plusieurs scripts que j’essai de faire pour « pinger » mon téléphone, mais tous y compris le tiens ne voit pas le téléphone en continu, je voulais savoir si tu rencontrai aussi le problème et au cas ou si tu avais une solution.
merci
Salut !
Je pense que ça vient de ton téléphone qui doit couper le wifi quand il est en veille. Essaie de regarder de ce coté là
A bientôt j’espère !
Bast’
Bonjour et merci pour le tuto. Etant nouveau dans la domotique et entre autre Linux, mais ayant des connaissances en programmation, je n’arrive pas à trouver la manière de pouvoir exécuter le script LUA. Je sais qu’il faut mettre le programme dans domoticz..lua mais comment lancer ce script dans domoticz.
merci pour votre réponse
V.Farese
Bonjour et merci pour votre commentaire !
En effet je n’avais pas détaillé ce point et voilà qui est maintenant fait. Je viens d’éditer l’article pour ajouter :
Le script est nommé : script_time_PRESENCE_MAISON.lua pour être déclenché toutes les minutes. En effet, avec la solution Domoticz, les scripts doivent :
* être placé dans le répertoire « scripts/lua » du répertoire domoticz
* être nommés :
* script_time_XXXXXX.lua (pour être lancé toutes les minutes)
* script_event_XXXXXXX.lua (à chaque changement d’état. Dans ce cas, attention à bien tester le changement d’état de votre périphérique)
Voili voilou
Bonjour,
lien vers un vrai faux site domotique qui ne cache que des liens vers des sites marchands de télécommandes !! appartenant surement à l’auteur de ce post…. et ne parlant pas de domotique!
et Merci pour vos partages d’expériences qui sont très utiles aux débutants et autres curieux , mais qui se font trop rares! on en veut d’autres!!!
Aris
Merci pour votre commentaire !
il vient d’être supprimé !
Effectivement le commentaire précédent n’est pas approprié
A très bientôt j’espère