Gladys et Imperihome


#62

Une question justement (qui me servira pour plus tard aussi) : Est il possible d’enchainer les conditions dans un script ?

Ex : je viens de faire un script pour récupérer la couleur du jour. Le voici :

    var url = "http://domogeek.entropialux.com/tempoedf/now/json"
    gladys.utils.request(url)
    .then((response) => {
    console.log(response.tempocolor)
    var tempocolor = response.tempocolor
    if (tempocolor === "BLANC") {
    gladys.deviceType.exec({
        devicetype: 599,
        value: 100
    })
    .then(function() {
    console.log('Couleur du jour');
    }).catch(console.error);    
    }
    }) 

Il fonctionne parfaitement.

Si je veux ne faire qu’un seul script pour qu’il réagisse en fonction des 3 couleurs, puis-je le rédiger ainsi :

    var url = "http://domogeek.entropialux.com/tempoedf/now/json"
    gladys.utils.request(url)
    .then((response) => {
    console.log(response.tempocolor)
    var tempocolor = response.tempocolor
    if (tempocolor === "BLEU") {
    gladys.deviceType.exec({
        devicetype: 599,
        value: 0
    if (tempocolor === "BLANC") {
    gladys.deviceType.exec({
        devicetype: 599,
        value: 50
    if (tempocolor === "ROUGE") {
    gladys.deviceType.exec({
        devicetype: 599,
        value: 100
    })
    .then(function() {
    console.log('Couleur du jour');
    }).catch(console.error);    
    }
    })

Ou dois-je séparer les “if …” par quelque chose ? (je ne peux malheureusement pas faire de tests car impossible de changer la couleur du jour … lol)


#63

Faut surtout que ça soit intégré de base dans Gladys selon moi.


#64

Je ferais plutôt un truc comme ça :

    var url = "http://domogeek.entropialux.com/tempoedf/now/json";
    var value = '';
    gladys.utils.request(url)
      .then(function(response) {
        switch (response.tempcolor) {
          case 'BLEU':
            value = 0;
            break;
          case 'BLANC':
            value = 50;
            break;
          case 'ROUGE':
            value = 100;
            break;
          default:
            value = 50;
        }
        return gladys.deviceType.exec({ devicetype: 599, value: value })
      })
      .then(function(result) {
        console.log(result)
      })
      .catch(function(err) {
        console.log(err)
      });

Après, je galère encore avec les promises, donc pas garanti que ce code soit juste … Mais l’idée général est là :wink:


#65

Ce serait encore mieux ! A voir avec @pierre-gilles :wink:

Un truc que je ne comprends pas avec ton code, c’est la value définie en début de code. De ce que je comprends, elle prendra la valeur donnée par rapport à la couleur et injectée à la fin par gladys.deviceType.exec.

Mais où est stockée la couleur du jour ? (dans mon code, il y a la ligne
var tempocolor = response.tempocolor, dans ton code, est-ce remplacé par switch (response.tempocolor ?)


#66

Elle va servir à stocker le résultat du switch et sera injecté dans le return gladys.deviceType.exec({ devicetype: 599, value: value }) à l’issue.

gladys.utils.request(url)
  .then(function(response) {...

Le résultat de la première ligne est le response de la 2ième, qui a donc une propriété tempocolor :slight_smile:
Du coup, on test cette valeur selon 3 possibilités (bleu, blanc ou rouge), on en définit la valeur de valueque l’on injecte dans la commande.


#67

OK, donc ma deuxième analyse était la bonne ! (je m’endormirai moins con ce soir ! )

Mais par curiosité, ma première proposition aurait elle fonctionné ?


#68

Avec quelques modifications, oui :). il te manque pas mal de parenthèses fermantes.
Après, le ‘if’ est utilisé pour tester en général une seule valeur (genre true ou false), voir 2 avec un else. Au delà, mieux vaut utiliser un ‘switch’. C’est plus rapide car en empilant les ‘if’, tous seront testés ; avec un ‘switch’, le système arrête les tests dés qu’il a trouvé la correspondance.


#69

Ça y est, perso je pilote mes volets grâce au widget. j’arrive mème à piloter la position par délais proportionnel.


#70

Pour ça, Gladys est sympa, elle le signale dans les scripts :wink:

OK ! Je ne connaissais pas ça !

Donc si je transpose à mon autre besoin, une fois que le capteur d’ouverture désigné s’ouvre et lance ce script, la valeur du fake-device choisi changera. (bon, je suis sûr à 99,9% que je me suis planté quelque part, mais je tente quand même)

     setTimeout(function(){
      gladys.deviceType.getById({id: 1})
            .then((deviceType) => {
        switch (deviceType) {
              case '0':
                value = 0;
                break;
              case '1':
                value = 100;
                break;
            }
            return gladys.deviceType.exec({ devicetype: 599, value: value })
          })
          .then(function(result) {
            console.log(result)
          })
          .catch(function(err) {
            console.log(err)
          });
    }, 1000);

Ah !! Qu’appelles tu par délais proportionnel ?


#71

Juste avant le switch, met un console.log(deviceType) pour voir la tête que ça a :wink:
Tu as bien déclaré ta variable value avant ?


#72

j’ai chronométré combien de temps le volet prenait pour descendre et après, je fais une fraction de ce temps pour la hauteur choisie


#73

Juste à noter qu’avec l’usure mécanique cette valeur évolue dans le temps, et relativement vite ( quelques mois).


#74

Faut graisser :smile:

Je sors…


#75

Arf… Je me doutais bien que ça ne serait pas bon… lol

Donc ça donnerait ça :

setTimeout(function(){
    var value = ' ';
    gladys.deviceType.getById({id: 1})
            .then((deviceType) => {
console.log(deviceType)
        switch (deviceType) {
              case '0':
                value = 0;
                break;
              case '1':
                value = 100;
                break;
            }
            return gladys.deviceType.exec({ devicetype: 599, value: value })
          })
          .then(function(result) {
            console.log(result)
          })
          .catch(function(err) {
            console.log(err)
          });
    }, 1000);

OK ! Tout simplement !
J’avais bien pensé à faire ça, mais la flemme passant par là, je me suis dit qu’à distance, j’avais finalement peu d’intérêt à utiliser les positions intermédiaires. :yum:


#76

Alors c’est bon, mais lance ton script et regarde la tête du deviceType, tu verras ton erreur :slight_smile:


#78

Au lancement du script, le deviceType 599 ne bouge pas, mais les logs me disent effectivement que je me suis planté quelque part :thinking:
Quand on est mauvais…

0|gladys   | RowDataPacket {
0|gladys   |   name: 'Oscillo salle manger',
0|gladys   |   type: 'binary',
0|gladys   |   category: null,
0|gladys   |   identifier: 'binary',
0|gladys   |   tag: 'DevDoor',
0|gladys   |   sensor: 1,
0|gladys   |   unit: null,
0|gladys   |   min: 0,
0|gladys   |   max: 1,
0|gladys   |   display: 0,
0|gladys   |   device: 38,
0|gladys   |   id: 37,
0|gladys   |   createdAt: 2017-12-28T21:20:45.000Z,
0|gladys   |   updatedAt: 2018-10-21T16:34:25.000Z,
0|gladys   |   lastValue: 1,
0|gladys   |   lastValueDatetime: 2018-10-21T16:34:25.000Z,
0|gladys   |   lastChanged: 2018-10-21T16:34:25.000Z,
0|gladys   |   roomName: 'Salle à manger' }
0|gladys   | Fake module: Exec for deviceType: 10000, with value: NaN
0|gladys   | { devicetype: 599, value: NaN }
0|gladys   | Error (E_VALIDATION) :: 1 attribute is invalid
0|gladys   |     at WLValidationError.WLError (/home/pi/gladys/node_modules/waterline/lib/waterline/error/WLError.js:25:15)
0|gladys   |     at new WLValidationError (/home/pi/gladys/node_modules/waterline/lib/waterline/error/WLValidationError.js:19:28)
0|gladys   |     at _afterValidating (/home/pi/gladys/node_modules/waterline/lib/waterline/query/validate.js:53:23)
0|gladys   |     at allValidationsChecked (/home/pi/gladys/node_modules/waterline/lib/waterline/core/validations.js:265:12)
0|gladys   |     at /home/pi/gladys/node_modules/async/lib/async.js:52:16
0|gladys   |     at Object.async.forEachOf.async.eachOf (/home/pi/gladys/node_modules/async/lib/async.js:236:30)
0|gladys   |     at Object.async.forEach.async.each (/home/pi/gladys/node_modules/async/lib/async.js:209:22)
0|gladys   |     at module.exports.Validator.validate (/home/pi/gladys/node_modules/waterline/lib/waterline/core/validations.js:144:9)
0|gladys   |     at /home/pi/gladys/node_modules/waterline/lib/waterline/query/validate.js:42:25
0|gladys   |     at /home/pi/gladys/node_modules/async/lib/async.js:718:13
0|gladys   |     at Immediate.iterate (/home/pi/gladys/node_modules/async/lib/async.js:262:13)
0|gladys   |     at runCallback (timers.js:789:20)
0|gladys   |     at tryOnImmediate (timers.js:751:5)
0|gladys   |     at processImmediate [as _immediateCallback] (timers.js:722:5)
0|gladys   | Invalid attributes sent to DeviceState:
0|gladys   |  • value
0|gladys   |    • Value should be a float
0|gladys   |    • "required" validation rule failed for input: NaN
0|gladys   | Specifically, it threw an error.  Details:
0|gladys   |  undefined

Et le pire, c’est que je pense que la solution est toute bête…

Edit : N’y a t’il pas un conflit dans les value ?


#79

Non, le RowDataPacket, c’est le résultat de ton console.log.
Toi, tu ne veux pas tout le devicetype, mais seulement la dernière valeur.
Donc, tu dois faire switch(deviceType.lastValue), puisque c’est la dernière valeur que tu veux tester.
Et comme to switch n’a pas trouver de correspondance, ta variable value n’est pas définie, ce que tu peux voir juste après :

 Fake module: Exec for deviceType: 10000, with value: NaN
0|gladys   | { devicetype: 599, value: NaN }

NaN signifie « Not A Number », façon pour JavaScript de te dire que value n’est pas un nombre, ce qui lui pose un petit problème :wink:


#80

Bizarre, Maintenant, Gladys redémarre quand je lance le script… :joy:


#81

Vire les guillemets simple du 0 et du 1 des case, car tu testes une valeur numérique. Et Tu montres les logs si c’est pas mieux ?


#82

OK, sans les guillemets simples, ça fonctionne à merveille. C’est la dernière chose à laquelle j’aurais pensé…

Merci pour ton aide ! :clap: