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


#21

Si on reprend déjà cette partie, et vu qu’il y a un délai de 2 min entre la sortie et la détection par Gladys du départ, je te propose la logique suivante pour cette partie, déjà :

La porte vient d’etre Ouverte, alors j’enregistre les users présent dans Gladys.
3 min plus tard, je tests de nouveaux les users présent et je compare avec le premier enregistrement.
Selon l’user qui a changé d’etat, j’encoi Une notification.

Tu es ok avec ça ?


#22

Salut @beatrice,
Si je reprends ta demande faite dans un autre post, je te propose déjà cette partie là, pour la première partie :

setTimeout(function () {
  if (!checkUser(2)) {
    if (!checkUser(1)) {
      alerteMaman()
    }
  }
}, 180000);

// return true if user at home
function checkUser(idUser) {
  return gladys.house.isUserAtHome({ user: idUser, house: 1 })
    .then(function (data) {
      return data
    })
}

function alerteMaman() {
  gladys.modules.telegram.notify({ text: 'USER 2 est partie' }, { id: 1 })
    .then(function (result) {
      console.log(result)
    })
    .catch(function (err) {
      console.log(err)
    });
} 

Sauf erreur de ma part à cette heure tardive, 3mn après l’appel de ce script, il test si l’user dont l’id est 2 est la maison, et s’il n’y est pas et que l’user id 1 n’est pas là non plus, alors envois un message telegram à l’user 1.
Si ça te convient, on continuera.


#23

Yes Merci pour ton aide!

Oui ça à l’air bon, en tout cas c’est l’idée.

J’essaye de tester ça dans la matinée ou ce soir.


#24

J’aimerais aussi savoir si elle est rentrée, c’est la ou ça deviens plus compliqué je trouve


#25

On verra juste après cette étape, pas de soucis :slight_smile:


#26

J’ai enlevé la pile du nut de ma fille, j’ai mis son user id (3) à la place de (2), et j’ai lancé le script.

Pour “débuguer” ce qui se passe, y a moyen d’avoir des logs ? la il se passe rien. Ça fait bien les 3 minutes


#27

Hello !

oui, bien sûr :slight_smile:

setTimeout(function () {
   console.log('test user3')
  if (!checkUser(3)) {
    if (!checkUser(1)) {
      alerteMaman()
    }
  }
}, 180000);

// return true if user at home
function checkUser(idUser) {
  return gladys.house.isUserAtHome({ user: idUser, house: 1 })
    .then(function (data) {
     console.log(data)
      return data
    })
    .catch(function(err) {
     console.log(err)
    });
}

function alerteMaman() {
  console.log('alerte Maman !')
  gladys.modules.telegram.notify({ text: 'USER 3 est partie' }, { id: 1 })
    .then(function (result) {
      console.log(result)
    })
    .catch(function (err) {
      console.log(err)
    });
}  

ta house a bien l’id 1 ?


#28

J’étais en train de mettre des consol log aussi :wink: oui house id 1, moi id1 ma fille id 3

 console.log(data)

C’était ça mon souci, mettre en consol log ce qu’il y a dans ma fonction


#29

Voilàce qu’il se passe : (je peux avoir des logs avec un horodatage en faisant un pm2 logs spécifique?)

0|gladys            | lancement du script 25 - attente 3 minutes
0|gladys            | Access with token to user Béatrice
2|gladys-bluetooth  | Just received 5 devices from Gladys. Saving them locally in RAM.
2|gladys-bluetooth  | Starting Bluetooth Scan for 30 seconds !
2|gladys-bluetooth  | Scanned device [TV] Samsung 7 Series (49) but devices does not exist in Gladys. Not saving anything.
2|gladys-bluetooth  | Device Prodigio_F1A5DE9D95CA is not assigned to any user, so we do nothing
2|gladys-bluetooth  | Stopping Bluetooth Scan for 60 seconds !
2|gladys-bluetooth  | Bluetooth Scan stopped
0|gladys            | Socket disconnected, but session could not be loaded to pass to configured disconnect handler: `sails.config.sockets.afterDisconnect()`.  Will pass a fake, empty session as argument to lifecycle callback.  Details:
0|gladys            |  Error: Could not parse session id from cookie of connecting socket, and then failed again when trying to use a generated cookie. Something has probably gone wrong with your session store configuration.
0|gladys            |     at _createError (/home/pi/gladys/node_modules/sails-hook-sockets/lib/load-session-from-socket.js:44:17)
0|gladys            |     at loadSessionFromSocket (/home/pi/gladys/node_modules/sails-hook-sockets/lib/load-session-from-socket.js:47:7)
0|gladys            |     at Socket.onSocketDisconnect (/home/pi/gladys/node_modules/sails-hook-sockets/lib/on-connect.js:43:7)
0|gladys            |     at emitOne (events.js:116:13)
0|gladys            |     at Socket.emit (events.js:211:7)
0|gladys            |     at Socket.emit (/home/pi/gladys/node_modules/socket.io/lib/socket.js:141:10)
0|gladys            |     at Socket.onclose (/home/pi/gladys/node_modules/socket.io/lib/socket.js:441:8)
0|gladys            |     at Client.onclose (/home/pi/gladys/node_modules/socket.io/lib/client.js:235:24)
0|gladys            |     at emitTwo (events.js:131:20)
0|gladys            |     at Socket.emit (events.js:214:7)
0|gladys            |     at Socket.onClose (/home/pi/gladys/node_modules/engine.io/lib/socket.js:311:10)
0|gladys            |     at Object.onceWrapper (events.js:313:30)
0|gladys            |     at emitNone (events.js:106:13)
0|gladys            |     at WebSocket.emit (events.js:208:7)
0|gladys            |     at WebSocket.Transport.onClose (/home/pi/gladys/node_modules/engine.io/lib/transport.js:127:8)
0|gladys            |     at Object.onceWrapper (events.js:317:30)
0|gladys            |     at emitTwo (events.js:126:13)
0|gladys            |     at WebSocket.emit (events.js:214:7)
0|gladys            |     at WebSocket.cleanupWebsocketResources (/home/pi/gladys/node_modules/ws/lib/WebSocket.js:950:8)
0|gladys            |     at emitNone (events.js:111:20)
0|gladys            |     at Socket.emit (events.js:208:7)
0|gladys            |     at endReadableNT (_stream_readable.js:1055:12)
0|gladys            |     at args.(anonymous function) (/usr/local/lib/node_modules/pm2/node_modules/event-loop-inspector/index.js:138:29)
0|gladys            |     at _combinedTickCallback (internal/process/next_tick.js:138:11)
0|gladys            |     at process._tickDomainCallback (internal/process/next_tick.js:218:9)
2|gladys-bluetooth  | Starting Bluetooth Scan for 30 seconds !
2|gladys-bluetooth  | Scanned device [TV] Samsung 7 Series (49) but devices does not exist in Gladys. Not saving anything.
2|gladys-bluetooth  | Device Prodigio_F1A5DE9D95CA is not assigned to any user, so we do nothing
2|gladys-bluetooth  | Stopping Bluetooth Scan for 60 seconds !
2|gladys-bluetooth  | Bluetooth Scan stopped
2|gladys-bluetooth  | Starting Bluetooth Scan for 30 seconds !
2|gladys-bluetooth  | Scanned device [TV] Samsung 7 Series (49) but devices does not exist in Gladys. Not saving anything.
2|gladys-bluetooth  | Device Prodigio_F1A5DE9D95CA is not assigned to any user, so we do nothing
2|gladys-bluetooth  | Stopping Bluetooth Scan for 60 seconds !
2|gladys-bluetooth  | Bluetooth Scan stopped
2|gladys-bluetooth  | Starting Bluetooth Scan for 30 seconds !
2|gladys-bluetooth  | Scanned device [TV] Samsung 7 Series (49) but devices does not exist in Gladys. Not saving anything.
2|gladys-bluetooth  | Device Prodigio_F1A5DE9D95CA is not assigned to any user, so we do nothing
2|gladys-bluetooth  | Stopping Bluetooth Scan for 60 seconds !
2|gladys-bluetooth  | Bluetooth Scan stopped
0|gladys            | lancement du script 25 - attente 3 minutes
2|gladys-bluetooth  | Starting Bluetooth Scan for 30 seconds !
2|gladys-bluetooth  | Device Prodigio_F1A5DE9D95CA is not assigned to any user, so we do nothing
2|gladys-bluetooth  | Scanned device [TV] Samsung 7 Series (49) but devices does not exist in Gladys. Not saving anything.
2|gladys-bluetooth  | Stopping Bluetooth Scan for 60 seconds !
2|gladys-bluetooth  | Bluetooth Scan stopped
2|gladys-bluetooth  | Starting Bluetooth Scan for 30 seconds !
2|gladys-bluetooth  | Scanned device [TV] Samsung 7 Series (49) but devices does not exist in Gladys. Not saving anything.
2|gladys-bluetooth  | Device Prodigio_F1A5DE9D95CA is not assigned to any user, so we do nothing
2|gladys-bluetooth  | Stopping Bluetooth Scan for 60 seconds !
2|gladys-bluetooth  | Bluetooth Scan stopped
0|gladys            | test user3
0|gladys            | true

Ma fille n’est pas passé en “partie de la maison” alors que j’ai enlevé la pile.

Je dois filer. Je m’y remettrais ce soir (je récup justement USER ID 3 pour la journée :wink: )


#30

Me revoilà!

J’ai donc mis ce matin la pile dans le NUT du USER ID 3, comme par enchantement instantanément j’ai eu un retour maison… J’ai ensuite lancé le script, forcément tout va bien.

J’ai à nouveau enlevé la pile il y a 12 minutes, rien, lancé le script, rien… elle est toujours la. Voilà le log :

0|gladys              | lancement du script 25 - attente 3 minutes
2|gladys-bluetooth    | Stopping Bluetooth Scan for 60 seconds !
2|gladys-bluetooth    | Bluetooth Scan stopped
2|gladys-bluetooth    | Starting Bluetooth Scan for 30 seconds !
2|gladys-bluetooth    | Scanned device [TV] Samsung 7 Series (49) but devices does not exist in Gladys. Not saving anything.
2|gladys-bluetooth    | Device Prodigio_F1A5DE9D95CA is not assigned to any user, so we do nothing
2|gladys-bluetooth    | Stopping Bluetooth Scan for 60 seconds !
2|gladys-bluetooth    | Bluetooth Scan stopped
2|gladys-bluetooth    | Starting Bluetooth Scan for 30 seconds !
2|gladys-bluetooth    | Device Prodigio_F1A5DE9D95CA is not assigned to any user, so we do nothing
2|gladys-bluetooth    | Scanned device [TV] Samsung 7 Series (49) but devices does not exist in Gladys. Not saving anything.
0|gladys              | test user3
0|gladys              | User 2 is at home true or false : true

#31

Il me semble qu’il nous manque ça :

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

C’est pour ça que je mettais plusieurs phase d’abord on attends un peut après l’ouverture de porte pour tester

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

Ensuite on attends un peut pour lancer ce qui est au dessus.

j’ai tester les tempo juste avec un log de débugage, pas de commadnes :

2018-11-24-07:14:30 0|gladys            | lancement du script 25 - attente 3 minutes check user présence puis 4 test user
2018-11-24-07:14:40 2|gladys-bluetooth  | Stopping Bluetooth Scan for 60 seconds !
2018-11-24-07:14:40 2|gladys-bluetooth  | Bluetooth Scan stopped
2018-11-24-07:15:40 2|gladys-bluetooth  | Starting Bluetooth Scan for 30 seconds !
2018-11-24-07:15:40 2|gladys-bluetooth  | Scanned device [TV] Samsung 7 Series (49) but devices does not exist in Gladys. Not saving anything.
2018-11-24-07:15:40 2|gladys-bluetooth  | Device Prodigio_F1A5DE9D95CA is not assigned to any user, so we do nothing
2018-11-24-07:16:10 2|gladys-bluetooth  | Stopping Bluetooth Scan for 60 seconds !
2018-11-24-07:16:10 2|gladys-bluetooth  | Bluetooth Scan stopped
2018-11-24-07:17:10 2|gladys-bluetooth  | Starting Bluetooth Scan for 30 seconds !
2018-11-24-07:17:10 2|gladys-bluetooth  | Scanned device [TV] Samsung 7 Series (49) but devices does not exist in Gladys. Not saving anything.
2018-11-24-07:17:11 2|gladys-bluetooth  | Device Prodigio_F1A5DE9D95CA is not assigned to any user, so we do nothing
2018-11-24-07:17:30 0|gladys            | Check user présence
2018-11-24-07:17:40 2|gladys-bluetooth  | Stopping Bluetooth Scan for 60 seconds !
2018-11-24-07:17:40 2|gladys-bluetooth  | Bluetooth Scan stopped
2018-11-24-07:18:30 0|gladys            | test user3
2018-11-24-07:18:30 0|gladys            | User 2 is at home true or false : true

7h14’30" = lancement
7h17’30" = log d’un petentiel check user présence
7h18’30" = log des tests user 3 et retour true or false

Je vais faire le test avec la commande gladys.house.checkUsersPresence();


#32

Si je met de setTimeout l’un après l’autre, les deux commencent au moment ou je lance le script c’est bien ça?

2018-11-24-07:27:12 0|gladys              | lancement du script 25 - attente 3 minutes check user présence puis 4 test user
[---]
2018-11-24-07:30:12 0|gladys              | Check user présence
2018-11-24-07:30:12 0|gladys              | House : checkUsersPresence
2018-11-24-07:30:12 0|gladys              | House : checkUserPresence : Putting user 3 as left house : 1
2018-11-24-07:30:12 0|gladys              | Event : create : new Event with code : left-home
2018-11-24-07:30:12 0|gladys              | Scenario : Trigger : New event : left-home
2018-11-24-07:30:12 0|gladys              | Scenario : Trigger : Found 0 launchers with code left-home.
[---]
2018-11-24-07:31:12 0|gladys              | test user3
2018-11-24-07:31:12 0|gladys              | User 2 is at home true or false : false

Donc, dans sa timeline ma fille est bien “départ de la maison”
Dans les log :

  • la tempo est plutôt bonne (on a bien 3 minutes avant le checkuserpresence, puis 1 de plus avant le isuserathome)
  • on a bien un retour “false” puisque ma fille est bien partie

donc voilà mon le script modifié :

console.log ( 'lancement du script 25 - attente 3 minutes check user présence puis 4 test user')

setTimeout(function () {
    console.log('Check user présence')
    // tester la présence de l'utilisateur 
    gladys.house.checkUsersPresence();
}, 180000);  

setTimeout(function () {
  console.log('test user3')
  if (!checkUser(3)) { //Noémie is USER ID 3
    if (!checkUser(1)) { //Maman is USER ID 1
      alerteMaman();
    }
  }
}, 240000);

// return true if user at home
function checkUser(idUser) {
  return gladys.house.isUserAtHome({ user: idUser, house: 1 })
    .then(function (data) {
      console.log('User 2 is at home true or false :',data);
      return data;
    });
}

function alerteMaman() {
  gladys.modules.telegram.notify({ text: 'USER 2 est partie' }, { id: 1 })
    .then(function (result) {
      console.log(result);
    })
    .catch(function (err) {
      console.log(err);
    });
} 

Maintenant, la suite


#33

Important : pas de notification télégram! (pourtant je reçoit bien les réponses de Gladys sur mon téléphone)


#34

Salut @beatrice,

Bien vu ! Effectivement, j’avais zappé le partie front de Gladys. Tu as bien un scénario qui test toutes les 5 min la présence ou non ?

Pour telegram, rajoute un console log entre les 2 if de test de présence pour tester ta présence :slight_smile:


#35

Non, je part du principe que les gens sont obligés de passer par la porte et ne sont pas des passes-murailles :wink:

Je teste ça


#36

Je pense un truc, la on ne teste pas si elle est “left home” mais si elle est “non vue”? C’est bien ça?


#37
2018-11-24-14:10:20 0|gladys              | Check user présence
2018-11-24-14:10:20 0|gladys              | House : checkUsersPresence
2018-11-24-14:11:11 2|gladys-bluetooth    | Starting Bluetooth Scan for 30 seconds !
2018-11-24-14:11:11 2|gladys-bluetooth    | Scanned device [TV] Samsung 7 Series (49) but devices does not exist in Gladys. Not saving anything.
2018-11-24-14:11:12 2|gladys-bluetooth    | Device Prodigio_F1A5DE9D95CA is not assigned to any user, so we do nothing
2018-11-24-14:11:20 0|gladys              | test users 1 et 3
2018-11-24-14:11:20 0|gladys              | User 2 is at home true or false : false

@piznel, le log entre les deux if n’apparait pas


#38

ok, je vois pourquoi, je te refais le truc demain, avec la suite :slight_smile:


#39

Salut @beatrice,

Le checkUserPresence déclenche l’évènement “left-home” si la personne n’a pas été vu depuis le nombre de min du paramètre ‘USER_TIME_BEFORE_CONSIDERING_LEFT_HOME’.

Voici le script qui corrige le pb du telegram, auquel j’ai ajouté quelques modifs pour apporter de la souplesse :

var noemie = 3;
var maman = 1;
var maison = 1;

const myParameterName = 'USER_TIME_BEFORE_CONSIDERING_LEFT_HOME';
var myParametervalue ='';

gladys.param.getValue(myParameterName)
.then(function(value){
    myParametervalue = value
    console.log(`lancement du script 25 - attente ${value} minutes check user présence puis ${value+1} test user`)
    testPresence()
});

function testPresence() {
    setTimeout(function() {
      console.log('Check user présence')
      // tester la présence de l'utilisateur 
      gladys.house.checkUsersPresence();
    }, myParametervalue * 1000 * 60);
    
    setTimeout(function() {
      var p1 = gladys.house.isUserAtHome({ user: noemie, house: maison });
      var p2 = gladys.house.isUserAtHome({ user: maman, house: maison });
      Promise.all([p1, p2]).then(function(presences) {
          console.log('presences', presences)
        if(!presences[0] && !presences[1]) {
            alerteMaman()
        }
      })
    }, myParametervalue * 1000 * 60 + 60000);
}

function alerteMaman() {
  gladys.modules.telegram.notify({ text: 'Noémie est partie !' }, { id: maman })
    .then(function(result) {
      console.log(result);
    })
    .catch(function(err) {
      console.log(err);
    });
}

Une question : si tu as suivi la procédure du module bluetooth, tu as déjà un script ‘checkuserPresence’ qui est déclenché par scénario en fonction de l’alarme. Du coup, ça fait doublon avec l’appel de ce script. J’imagine que tu l’as supprimé/déscativé ?

A noter également que tu recevras un message à chaque fois que ce script est déclenché, si vous n’êtes pas à la maison.

Pour la suite, si j’ai bien compris, tu veux recevoir une alarme quand elle rentre à la maison est que tu es absente, c’est ça ?

Voici une fonction qui récupère le dernier événement si c’est ‘back-at-home’ :

//renvoie le dernier évènement si le dernier évènement est 'back-at-home' sinon rien
// on peut tester aussi la présence à la maison en remplaçant 'back-at-home' par 'user-seen-at-home'

function retourMaison(userId, houseId) {
    var query = `SELECT user.*,
          ( 
            SELECT eventtype.code
            FROM event 
            JOIN eventtype ON event.eventtype = eventtype.id
            WHERE 
            ( eventtype.code = 'back-at-home')
            AND user = user.id 
            AND house = ?
            ORDER BY datetime DESC LIMIT 1 ) AS lastHouseEvent
          FROM user 
          WHERE user.id = ?
          HAVING ( lastHouseEvent = 'back-at-home');`
    return gladys.utils.sql(query, [userId, houseId])
    .then(function(rows) {
        return(rows)
    })
} 

Pour l’appeler, tu peux faire un truc comme ça :

 retourMaison(3,1)
 .then(function(row) {
     if (row.length === 1) {
      console.log('retour user', row[0].updatedAt.toLocaleString("fr-FR"))
     }
 })

#40

Salut @piznel! Merci! Je m’en va tester tout ça. (Il ne manque rien au dessus de var noemie = 3;)

Oui, tout à fait, mon but est de n’avoir de test que lors de l’ouverture de la porte, car c’est notre seul accès (ok, elle pourrait filer par la fenêtre, on est au premier :sweat_smile: ) , et je part du principe que une fois rentrée, on est la tant qu’on a pas ouvert la porte.

Ça me va, je vais paramétrer les différents messages Télégram, savoir si c’est un utilisateur de la maison (et lequel), ou une potentielle intrusion.