Ouverture/fermeture de portes


#1

Bonjour à tous,
Je cherche à mettre en place une détection d’ouverture de porte pour me faire une alarme m’indiquant qu’une porte est restée ouverte au moment où je vais partir.

Pour cela, j’ai installé des détecteurs 433 mhz au dessus de mes portes et j’arrive à déclencher un scénario pour avoir une notification lorsqu’on ouvre une porte. Pour la porte du garage (devicetype=25) j’ai donc :

trigger:
  title: 'Garage : Porte'
  condition_template: devicetype == 25 && value == 1
  active: 1
  code: devicetype-new-value
  user: 1
conditions: []
actions:
  - code: notification.create
    params:
      title: Port garage
      user: '1'
      icon: fa fa-exclamation-triangle
      iconColor: bg-red
      text: Ouverture de la porte du garage
      priority: '1'

Le problème c’est que si je fais un graphique sur l’état de la porte, j’ai toujours la valeur 1 qui s’affiche. J’ai bien trouvé une astuce sur le forum disant qu’il faut passer l’état à 0 au bout d’un moment. Le problème c’est que je ne vois pas comment faire car lorsque je tente de changer la valeur du deviceType j’ai l’erreur suivante dans le logs de Gladys :

0|gladys | 03-04 01:31:54: Ouverture porte garage
0|gladys | 03-04 01:31:55: TypeError: Cannot read property ‘exec’ of undefined
0|gladys | at /home/pi/gladys/api/core/devicetype/deviceType.exec.js:26:57
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. (/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 | 03-04 01:31:56: Derniere valeur du deviceType 189 = null

Voila mon script pour changer la valeur du devicetype :

console.log(“Ouverture porte garage”);

setTimeout(function(){

// Changement de la valeur du detecteur d'ouverture.
gladys.deviceType.exec({
    devicetype: 189,
    value: 0
})
.then((result) => console.log(result))
.catch((err) => console.log(err));

// Lecture de la valeur du detecteur d'ouverture.
gladys.deviceType.getById({id: 189})
    .then((deviceType) => {
        console.log(`Derniere valeur du deviceType ${deviceType.id} = ${deviceType.lastValue}`); 
    });

}, 1000);

Et j’ai bien le deviceType qui est défini :

Je fais certainement un truc de travers, mais quoi ?


#2

Salut !

Ton erreur indique que le module associé a ton device ne possède pas de fonciton “exec” (celle que tu essai d’appeler) donc essai de créer une devicestate directement. Par contre ce que je comprend pas c’est pourquoi ton devicetype189 n’est pas catégorisé en tant que capteur ?


#3

En fait, le 189 est un “faux” device que j’ai créé pour essayer de stocker une valeur booleen du genre ouvert/fermé, mais je n’y arrive pas. (Le capteur physique rattaché à ma porte est le devicetype 25)

Je viens de faire un essai en créant un autre devicetype avec capteur = oui mais j’ai la même erreur lorsque j’essaie de lui attribuer une valeur.

… heu… comment on fait ça ?


#4

OK,
j’ai fait la même chose chez moi pour un inter qui est monostable(donc envoi toujours “1”).
fait le même code avec ton deviceType=25.
comme ça ta porte sera automatiquement “fermée”(si seulement :wink: ).
De cette manière tu pourra créer des script sur le passage à "1’.


#5

Dans un script tu fait =>

var options = {
    devicetype: 25,
    state: 1
}

gladys.deviceState.create(options)
    .then(function(result) {
        console.log(result)
    })
    .catch(function(err) {
        console.log(err)
    })
    

#6

Ha ok ! j’avais pas capté que tu parlais d’une fonction :smile:

Par contre il faut faire :

var options = {
    devicetype: 25,
    value: 1
}

( cf doc : DeviceType-execDeviceType )

Bon du coup j’avance dans mon script, et voila le changement d’état :

console.log("Ouverture porte garage");

var StatePorte  = 0;

// Récupération de l'état de la porte
// 0 : Fermée
// 1 : Ouverte
gladys.deviceType.getById({id: 25})
    .then((deviceType) => {
    StatePorte  = deviceType.lastValue;
    console.log(`Etat de la porte = ${StatePorte}`); 
    
    
    // Changement de la valeur du detecteur d'ouverture.
    gladys.deviceState.create({devicetype: 25,value: !StatePorte})
        .catch((err) => console.log(err))
        .then((result) => {
            console.log(result);
        });
    
});

#7

Si ça fonctionne comme ça tant mieux haha
Mais attention ne confond pas tout !
La doc que tu as mentionné est la doc de l’API REST (l’API HTTP si tu préfère) hors la tu ne passe pas par elle tu passe directement par les fonctions du core donc ne prend pas exemple sur cette doc pour tes scripts ^^


#8

Oui, tout à fait, je me suis basé sur l’API REST. Mais je me suis dit que l’appel de la fonction via REST ou dans le core devait avoir les même paramètres c’est à dire en utilisant un value au lieux de state et ç am’a permis de comprendre l’erreur de syntaxe.

Pour ceux qui cherchent l’API core, la fonction est disponible sur Github ici : deviceState.create

En tout cas, merci @LepetitGeek . Maintenant que j’ai l’état de la porte qui est correct, je vais pouvoir lancer un script pour vérifier que les portes sont fermées au passage de la maison en mode “nuit” (par exemple).


#9

Pouuuhhhh l’erreur ! En plus c’est moi qui ai documenté la fonction :joy:

Tiens nous au courant de ton avancement ^^


#10

En parlant de ça il faut que je bosse sur le deploiement de la nouvelle doc :slight_smile: Je vais mettre ça sur un GitHub pages, buildé automatiquement à chaque push taggué sur master Gladys