HELP script(s) sur retour ou départ de la maison déclenché par un scénario


#1

Bonjour,

Je souhaite qu’un scénario déclenché par l’ouverture de la porte d’entrée lance un script qui regarde si quelqu’un est partit ou revenu et m’envoie un script en cas de départ ou de retour d’un utilisateur (personnalisé selon l’utilisateur).

J’aimerais pouvoir également, passé une certaine heure, vérifier si l’état de présence d’un utilisateur à changer, et recevoir un message “untel n’est toujours pas rentré” (pourquoi pas sa position… ou sa zone) (souci d’ado fugueuse :wink: besoin d’enclencher le plan hors sec le plus tôt possible :sweat_smile: )

J’ai compris que les scripts étaient en Javascript. C’est pas le pire, même si je ne connais pas le langage, la logique comparé à du BASIC devrait pas être très différente, donc avec de l’aide y a pas de raison.

Ce qui me manque le plus, ça va être :

  • comment on récupère les informations, c’est à dire la syntaxe type :
    gladys.eventType.getByCategory(options)
  • Qu’est-ce qui nous est renvoyé, et comment l’utiliser, le comparer? Je pensais avoir compris, mais visiblement, non…

J’ai par exemple voulu que Gladys m’envoie un message télégram si j’étais de retour chez moi, dans un premier temps, juste un consol.log.

J’ai déjà galéré à trouver ce qui potentiellement pouvais me renvoyer une information, et les code de retour… enfin je suis pas sure de ce que j’ai trouvé… API Gladys, GitHub events… Ce serait bien si c’était centralisé et le plus exhaustif possible, et plus d’aide sur une formulation avec un exemple concret de ce qu’on peut faire.

J’ai testé gladys.house.isUserAtHome(), gladys.eventType.getByCode(), j’ai testé en mettant des options, sans options, impossible d’avoir qui est partit, rentré, ou si un utilisateur donné est partit, rentré…

voilà la dernière mouture :

setTimeout(function(){ // temporisation 
// ce que vous voulez faire : présentement si les utilisateurs ont left ou back home
// house id = 1 -- type.code recherché left-home ou back-home
var optionsUser1 = {
    house: 1,
    code: "back-at-home",
    user: 1
};

var optionsUser3 = {
     house: 1,
     code: "back-at-home",
     user : 3,
}

// tester la présence de l'utilisateur
gladys.house.checkUsersPresence(); // il faut enregistrer le log? ça cré un event automatiquement?

// tester User 1 at home
gladys.house.isUserAtHome(optionsUser1)
    .then((userAtHome) => {
        if(userAtHome) {
            console.log(`User 1 is at home !`);
            //gladys.modules.telegram.notify({text:'Noémie viens de rentrer'},{id:1});
            // gladys.modules.telegram.notify({text:'Bon retour Noémie, pense à rassurer maman!'},{id:2}); //par exemple lol
        } else {
            console.log(`User 1 is not at home !`);
            //gladys.modules.telegram.notify({text:'Noémie viens de partir'},{id:1});
            // gladys.modules.telegram.notify({text:'Bonne journée Noémie, à ce soir'},{id:2}); //par exemple lol
        }
    });

// tester User 2 at home
gladys.house.isUserAtHome(optionsUser3)
    .then((userAtHome) => {
        if(userAtHome) {
            console.log(`User 3 is at home !`);
            gladys.modules.telegram.notify({text:'Noémie viens de rentrer'},{id:1});
            // gladys.modules.telegram.notify({text:'Bon retour Noémie, pense à rassurer maman!'},{id:2}); //par exemple lol
        } else {
            console.log(`User 3 is not at home !`);
            gladys.modules.telegram.notify({text:'Noémie viens de partir'},{id:1});
            // gladys.modules.telegram.notify({text:'Bonne journée Noémie, à ce soir'},{id:2}); //par exemple lol
        }
    });

//esayer de récupérer le code d'évènement

gladys.eventType.getByCode(optionsUser1)
     .then(function(eventType){
         if(eventType=="back-at-home") {
            console.log(`User 1 is at home !`);
            //gladys.modules.telegram.notify({text:'Noémie viens de rentrer'},{id:1});
            // gladys.modules.telegram.notify({text:'Bon retour Noémie, pense à rassurer maman!'},{id:2}); //par exemple lol
        } else {
            console.log(`User 1 is not at home !`);
            //gladys.modules.telegram.notify({text:'Noémie viens de partir'},{id:1});
            // gladys.modules.telegram.notify({text:'Bonne journée Noémie, à ce soir'},{id:2}); //par exemple lol
        }
    
     });



//then ()
// Si "Départ de la maison" de USER 2 --> telegram

//gladys.modules.telegram.notify({text:'Noémie viens de partir'},{id:1});
// gladys.modules.telegram.notify({text:'Bonne journée Noémie, à ce soir'},{id:2}); //par exemple lol

// Si "Retour à la maison" de User 2 --> test présence USER1 si présent ne rien faire, si absent Télégram

//gladys.modules.telegram.notify({text:'Noémie viens de rentrer'},{id:1});
// gladys.modules.telegram.notify({text:'Bon retour Noémie, pense à rassurer maman!'},{id:2}); //par exemple lol

//;

//fin de ce que vous voulez faire
}, 1000); //1000 = 1s  donc 5 minutes = 60*5*1000=300 000


Sauf que, que ben ça colle pas avec ce que j’ai vraiment (je fais des test en virant mes NUT, en les remettant…)

D’ailleurs, quand mon NUT est hors de la maison, l’utilisateur correspondant n’est pas “left-home” après un chek user présence… (je pense créer un post spécifique).

Merci d’avance!


#2

J’ai également mis des choses ici :


#3

On va rester sur ce topic pour essayer de régler ton souci.

Ton code s’exécute bien ? Pas d’erreurs ? Juste un comportement qui ne correspond pas à ce que tu veux ?

Je vois pas trop la nécessité de ta temporisation.


#4

Alors, la temporisation c’est pour laisser le temps à la presonne de partir, puisque le BT peut être capté le temps que la porte soit bien fermé (la j’ai mis 1s juste pour garder ma tempo en place mais avoir le test rapide).

Les logs :

0|gladys              | House : checkUsersPresence
0|gladys              | User 1 is not at home !
0|gladys              | Unhandled rejection Error: Param USER_TIME_BEFORE_CONSIDERING_LEFT_HOME not found
0|gladys              |     at /home/pi/gladys/api/core/param/param.getValue.js:32:31
0|gladys              |     at tryCatcher (/home/pi/gladys/node_modules/bluebird/js/release/util.js:16:23)
0|gladys              |     at Promise._settlePromiseFromHandler (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:512:31)
0|gladys              |     at Promise._settlePromise (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:569:18)
0|gladys              |     at Promise._settlePromise0 (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:614:10)
0|gladys              |     at Promise._settlePromises (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:693:18)
0|gladys              |     at Promise._fulfill (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:638:18)
0|gladys              |     at /home/pi/gladys/node_modules/bluebird/js/release/nodeback.js:42:21
0|gladys              |     at /home/pi/gladys/node_modules/sails-mysql/lib/connections/spawn.js:120:16
0|gladys              |     at Object.poolfully [as releaseConnection] (/home/pi/gladys/node_modules/sails-mysql/lib/connections/release.js:28:12)
0|gladys              |     at Query._callback (/home/pi/gladys/node_modules/sails-mysql/lib/connections/spawn.js:105:35)
0|gladys              |     at Query.Sequence.end (/home/pi/gladys/node_modules/mysql/lib/protocol/sequences/Sequence.js:96:24)
0|gladys              |     at Query._handleFinalResultPacket (/home/pi/gladys/node_modules/mysql/lib/protocol/sequences/Query.js:144:8)
0|gladys              |     at Query.EofPacket (/home/pi/gladys/node_modules/mysql/lib/protocol/sequences/Query.js:128:8)
0|gladys              |     at Protocol._parsePacket (/home/pi/gladys/node_modules/mysql/lib/protocol/Protocol.js:280:23)
0|gladys              |     at Parser.write (/home/pi/gladys/node_modules/mysql/lib/protocol/Parser.js:73:12)
0|gladys              |     at Protocol.write (/home/pi/gladys/node_modules/mysql/lib/protocol/Protocol.js:39:16)
0|gladys              |     at Socket.<anonymous> (/home/pi/gladys/node_modules/mysql/lib/Connection.js:96:28)
0|gladys              |     at emitOne (events.js:116:13)
0|gladys              |     at Socket.emit (events.js:211:7)
0|gladys              |     at addChunk (_stream_readable.js:263:12)
0|gladys              |     at readableAddChunk (_stream_readable.js:250:11)
0|gladys              |     at Socket.Readable.push (_stream_readable.js:208:10)
0|gladys              |     at TCP.onread (net.js:594:20)
0|gladys              | User 1 is at home !
0|gladys              | User 3 is at home !

Merci pour ton aide


#5

Mon erreur de log est lié au tableau dans lequel je met

USER_TIME_BEFORE_CONSIDERING_LEFT_HOME

#6

Tu as renseigné cette donnée dans l’onglet paramètres de Gladys ?

Si je comprends bien :

  • ouverture de porte
  • vérif présence utilisateur précis
  1. présent mais absent avant : utilisateur de retour à la maison
  2. présent et avant présent : pas de changement, tout va bien
  3. absent alerte, utilisateur parti.

#7

C’est tout à fait ça!

bon, j’ai caché mon nut au fond d’un tiroir :

0|gladys              | House : checkUsersPresence
0|gladys              | User 1 is not at home !
0|gladys              | User 1 is at home !
0|gladys              | User 3 is at home !
2|gladys-bluetooth    | Stopping Bluetooth Scan for 60 seconds !
2|gladys-bluetooth    | Bluetooth Scan stopped

On dirait que ça marche (à moitié)


#8

Tu as mis quoi comme durée en paramètres ?


#9

Durée de considéré comme absent? 2 minutes la pour aller plus vite lol


#10

j’ai rajouté un débugage suplémentaire :

setTimeout(function(){ // temporisation 
// ce que vous voulez faire : présentement si les utilisateurs ont left ou back home
// house id = 1 -- type.code recherché left-home ou back-home
var optionsUser1 = {
    house: 1,
    code: "back-at-home",
    user: 1
};

var optionsUser3 = {
     house: 1,
     code: "back-at-home",
     user : 3,
}

// tester la présence de l'utilisateur
gladys.house.checkUsersPresence(); // il faut enregistrer le log? ça cré un event automatiquement?

// tester User 1 at home
gladys.house.isUserAtHome(optionsUser1)
    .then((userAtHome) => {
        if(userAtHome) {
            console.log(` ligne 23 User 1 is at home !`);
            //gladys.modules.telegram.notify({text:'Noémie viens de rentrer'},{id:1});
            // gladys.modules.telegram.notify({text:'Bon retour Noémie, pense à rassurer maman!'},{id:2}); //par exemple lol
        } else {
            console.log(`ligne  27 User 1 is not at home !`);
            //gladys.modules.telegram.notify({text:'Noémie viens de partir'},{id:1});
            // gladys.modules.telegram.notify({text:'Bonne journée Noémie, à ce soir'},{id:2}); //par exemple lol
        }
    });

// tester User 2 at home
gladys.house.isUserAtHome(optionsUser3)
    .then((userAtHome) => {
        if(userAtHome) {
            console.log(`ligne 37 User 3 is at home !`);
            gladys.modules.telegram.notify({text:'Noémie viens de rentrer'},{id:1});
            // gladys.modules.telegram.notify({text:'Bon retour Noémie, pense à rassurer maman!'},{id:2}); //par exemple lol
        } else {
            console.log(`ligne 41 User 3 is not at home !`);
            gladys.modules.telegram.notify({text:'Noémie viens de partir'},{id:1});
            // gladys.modules.telegram.notify({text:'Bonne journée Noémie, à ce soir'},{id:2}); //par exemple lol
        }
    });

//esayer de récupérer le code d'évènement

gladys.eventType.getByCode(optionsUser1)
     .then(function(eventType){
         if(eventType=="back-at-home") {
            console.log(`ligne 52 User 1 is at home !`);
            //gladys.modules.telegram.notify({text:'Noémie viens de rentrer'},{id:1});
            // gladys.modules.telegram.notify({text:'Bon retour Noémie, pense à rassurer maman!'},{id:2}); //par exemple lol
        } else {
            console.log(`ligne 56 User 1 is not at home !`);
            //gladys.modules.telegram.notify({text:'Noémie viens de partir'},{id:1});
            // gladys.modules.telegram.notify({text:'Bonne journée Noémie, à ce soir'},{id:2}); //par exemple lol
        }
    
     });



//then ()
// Si "Départ de la maison" de USER 2 --> telegram

//gladys.modules.telegram.notify({text:'Noémie viens de partir'},{id:1});
// gladys.modules.telegram.notify({text:'Bonne journée Noémie, à ce soir'},{id:2}); //par exemple lol

// Si "Retour à la maison" de User 2 --> test présence USER1 si présent ne rien faire, si absent Télégram

//gladys.modules.telegram.notify({text:'Noémie viens de rentrer'},{id:1});
// gladys.modules.telegram.notify({text:'Bon retour Noémie, pense à rassurer maman!'},{id:2}); //par exemple lol

//;

//fin de ce que vous voulez faire
}, 1000); //1000 = 1s  donc 5 minutes = 60*5*1000=300 000


0|gladys              | House : checkUsersPresence
0|gladys              | ligne 56 User 1 is not at home !
0|gladys              |  ligne 23 User 1 is at home !
0|gladys              | ligne 37 User 3 is at home !

#11

Donc, visiblement, c’est le eventype.getBycode qui marcherait


#12

Sauf que Gladys dit qu’elle me voit… je vais mettre mon nut sur le balcon…
Edit, j’ai viré la pile


#13

Déjà, au bout de 3 minutes, je ne suis toujours pas “left-home”, je suis “vu à la maison il y a 3 minutes”


#14

Je viens de relancer le script deux fois (sans le modifier, j’ai juste commenté les envoies télégram) et voici les logs Gladys :

0|gladys              | House : checkUsersPresence
0|gladys              | ligne 56 User 1 is not at home !
0|gladys              | ligne 70 User 3 is not at home !
0|gladys              | ligne 37 User 3 is at home !
0|gladys              |  ligne 23 User 1 is at home !
0|gladys              | House : checkUserPresence : Putting user 1 as left house : 1
0|gladys              | Event : create : new Event with code : left-home
0|gladys              | Scenario : Trigger : New event : left-home
0|gladys              | Scenario : Trigger : Found 0 launchers with code left-home.
0|gladys              | House : checkUsersPresence
0|gladys              | ligne 56 User 1 is not at home !
0|gladys              | ligne 70 User 3 is not at home !
0|gladys              | ligne  27 User 1 is not at home !
0|gladys              | ligne 37 User 3 is at home !

#15

On note donc que premier lancement, tout à coup il me passe “left-home” MAIS me considère toujours à la maison en ligne 23

deuxième lancement, la ligne 27 je suis not at home!


#16

Donc, il me faut 2 tempo :

  • la porte s’ouvre, tempo de x minutes,
checkUsersPresence
  • sauf que
USER_TIME_BEFORE_CONSIDERING_LEFT_HOME = 2 minutes

ça veux dire que si je teste mais qu’une fois, ça ne va pas le faire? si ça fait moins de 2 minutes que le cron précédent à été lancé par exemple… ou je vire le cron et je ne garde que le déclenchement sur ouverture de porte?

Autre option :

  • la porte s’ouvre
checkUsersPresence
  • tempo de 3 minutes
checkUsersPresence
  • tempo de 3 minutes
// tester User 1 at home
gladys.house.isUserAtHome(optionsUser1)
    .then((userAtHome) => {
        if(userAtHome) {
            console.log(` ligne 23 User 1 is at home !`);
            //gladys.modules.telegram.notify({text:'Noémie viens de rentrer'},{id:1});
            // gladys.modules.telegram.notify({text:'Bon retour Noémie, pense à rassurer maman!'},{id:2}); //par exemple lol
        } else {
            console.log(`ligne  27 User 1 is not at home !`);
            //gladys.modules.telegram.notify({text:'Noémie viens de partir'},{id:1});
            // gladys.modules.telegram.notify({text:'Bonne journée Noémie, à ce soir'},{id:2}); //par exemple lol
        }
    });

// tester User 2 at home
gladys.house.isUserAtHome(optionsUser3)
    .then((userAtHome) => {
        if(userAtHome) {
            console.log(`ligne 37 User 3 is at home !`);
            gladys.modules.telegram.notify({text:'Noémie viens de rentrer'},{id:1});
            // gladys.modules.telegram.notify({text:'Bon retour Noémie, pense à rassurer maman!'},{id:2}); //par exemple lol
        } else {
            console.log(`ligne 41 User 3 is not at home !`);
            gladys.modules.telegram.notify({text:'Noémie viens de partir'},{id:1});
            // gladys.modules.telegram.notify({text:'Bonne journée Noémie, à ce soir'},{id:2}); //par exemple lol
        }
    });

#17

J’ai pas tout lu, mais par contre, un point qui me semble important est les 2 min nécessaires à Gladys pour tester la présence ou non des users.
Donc tu ne peux tester qu’après ce délai de 2 min si les users sont présent ou pas sur la détection de l’ouverture De la porte.


#18

C’est bien ce qu’il me semble, et aussi, si il n’y a qu’une détection, Gladys ne saura pas dire depuis combien de temps je suis partie non?


#19

Humm, pas sûr, ça doit être récupérable.


#20

Oui, d’un autre côté, l’utilisateur à été noté"'retour à la maison" donc forcément vu il y a peut-être 2h, donc plus que les 2 minutes nécessaire? ce serait l’idée?