Hue - Sonos - NFC

#1

Bonjour à tous,

je cherche à allumer 3 lampes hue par l’intermédiaire d’un script et d’un badge nfc (j’ai bien suivi l’exemple sur le nfc). En me basant sur le script de Tlse-vins, je parviens à allumer une lampe mais je ne vois pas comment en allumer trois. J’aimerai également lancer ma Sonos One en même temps que l’allumage des 3 lampes Hue et l’éteindre en même temps que j’éteins les lampes.

J’ai bien installé les modules Hue et Sonos dans Gladys.

gladys.deviceType.getById({ id: 2})

.then((result) => {

if(result.lastValue === 0) {

// la lampe est éteinte, on l’allume

return gladys.deviceType.exec({devicetype: 2, value: 1});

} else {

// la lampe est allumée, on l’éteint

return gladys.deviceType.exec({devicetype: 2, value: 0});

}

});

Si j’utilise le script suivant pour allumer ma Sonos, rien ne se passe :

gladys.deviceType.exec({devicetype: 13, value: 1});

Donc, pour faire simple, je passe avec mon smartphone en entrant sur le badge nfc allumage des 3 lampes Hue et de la Sonos et si je repasse sur le badge nfc, les lampes et la Sonos doivent se couper.

Merci pour votre aide.

#2

Tu fais la même chose que pour une lampe mais pour les autres? :smiley: Copie colle le code!

Pour la sonos c’est différent, il faut que tu lui envoie une playlist/musique à jouer.

Tu as un exemple sur la page du README du module.

Si tu veux lancer une radio par exemple, tu peux faire:

gladys.modules.sonos.music.playTuneinRadio({
    deviceType: {
        device: YOUR_SONOS_DEVICE_ID
    },
    stationId: 50776,
    stationTitle: 'NRJ'
});
#3

Merci pour ta réponse Pierre-Gilles.
Je voulais pour les lampes faire quelque chose de propre mais vu que je suis nul en codage… Faire par exemple une boucle dans le script ou alors utiliser un tableau et ceci afin d’éviter une redondance dans le script. Mettre 3 fois la même commande semble alourdir le code. Je ne suis pas un expert :/).
Où puis-je trouver toutes les commandes pour la sonos et pour Tunein ? Cela m’aiderait à diminuer un peu mon incompétence… Enfin, je l’espère :slight_smile:

Après avoir testé :
gladys.modules.sonos.music.playTuneinRadio({
deviceType: {
device: YOUR_SONOS_DEVICE_ID
},
stationId: 50776,
stationTitle: ‘NRJ’
});

j’ai bien dans le panneau de contrôle “NRJ” qui s’affiche, mais lorsque je click sur le bouton de lancement de la radio, rien ne se passe et j’ai bien défini le device de ma Sonos.

Heu… ?

#4

C’est si lourd de faire:

gladys.deviceType.exec({devicetype: 1, value: 1});
gladys.deviceType.exec({devicetype: 2, value: 1});
gladys.deviceType.exec({devicetype: 3, value: 1});

? :slight_smile:

J’avais posté des petits morceaux de codes ici si ça peut t’aider =>

Pour TuneIn c’est bizarre. Pas d’erreur dans les logs? Sur l’app Sonos tu vois quoi? la musique se joue?

#5

Bonjour Pierre-Gilles,
sur l’appli Sonos, j’ai bien NRJ qui apparaît et son logo, mais pas de son même lorsque j’active par l’application Sonos ?

Dans le log :

Sending 500 ("Server Error") response: 
0|gladys   |  Error: Cannot parse DIDTL result
0|gladys   |     at /home/pi/gladys/api/hooks/sonos/node_modules/sonos/lib/sonos.js:1187:25
0|gladys   |     at Parser.<anonymous> (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:303:18)
0|gladys   |     at emitOne (events.js:116:13)
0|gladys   |     at Parser.emit (events.js:211:7)
0|gladys   |     at SAXParser.onclosetag (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:261:26)
0|gladys   |     at emit (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:624:35)
0|gladys   |     at emitNode (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:629:5)
0|gladys   |     at closeTag (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:889:7)
0|gladys   |     at SAXParser.write (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:1436:13)
0|gladys   |     at Parser.exports.Parser.Parser.parseString (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:322:31)
0|gladys   |     at Parser.parseString (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:5:59)
0|gladys   |     at /home/pi/gladys/api/hooks/sonos/node_modules/sonos/lib/sonos.js:1179:34
0|gladys   |     at /home/pi/gladys/api/hooks/sonos/node_modules/sonos/lib/services/Service.js:67:14
0|gladys   |     at Parser.<anonymous> (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:303:18)
0|gladys   |     at emitOne (events.js:116:13)
0|gladys   |     at Parser.emit (events.js:211:7)
0|gladys   |     at SAXParser.onclosetag (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:261:26)
0|gladys   |     at emit (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:624:35)
0|gladys   |     at emitNode (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:629:5)
0|gladys   |     at closeTag (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:889:7)
0|gladys   |     at SAXParser.write (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:1436:13)
0|gladys   |     at Parser.exports.Parser.Parser.parseString (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:322:31)
0|gladys   | Server Error:
0|gladys   | Error: Cannot parse DIDTL result
0|gladys   |     at /home/pi/gladys/api/hooks/sonos/node_modules/sonos/lib/sonos.js:1187:25
0|gladys   |     at Parser.<anonymous> (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:303:18)
0|gladys   |     at emitOne (events.js:116:13)
0|gladys   |     at Parser.emit (events.js:211:7)
0|gladys   |     at SAXParser.onclosetag (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:261:26)
0|gladys   |     at emit (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:624:35)
0|gladys   |     at emitNode (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:629:5)
0|gladys   |     at closeTag (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:889:7)
0|gladys   |     at SAXParser.write (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:1436:13)
0|gladys   |     at Parser.exports.Parser.Parser.parseString (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:322:31)
0|gladys   |     at Parser.parseString (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:5:59)
0|gladys   |     at /home/pi/gladys/api/hooks/sonos/node_modules/sonos/lib/sonos.js:1179:34
0|gladys   |     at /home/pi/gladys/api/hooks/sonos/node_modules/sonos/lib/services/Service.js:67:14
0|gladys   |     at Parser.<anonymous> (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:303:18)
0|gladys   |     at emitOne (events.js:116:13)
0|gladys   |     at Parser.emit (events.js:211:7)
0|gladys   |     at SAXParser.onclosetag (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:261:26)
0|gladys   |     at emit (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:624:35)
0|gladys   |     at emitNode (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:629:5)
0|gladys   |     at closeTag (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:889:7)
0|gladys   |     at SAXParser.write (/home/pi/gladys/api/hooks/sonos/node_modules/sax/lib/sax.js:1436:13)
0|gladys   |     at Parser.exports.Parser.Parser.parseString (/home/pi/gladys/api/hooks/sonos/node_modules/xml2js/lib/parser.js:322:31)
0|gladys   | gladys.utils.sqlUnique was not able to find element
0|gladys   | Query = "SELECT * FROM device WHERE identifier = ? AND service = ?;"
0|gladys   | Params = "["5","hue"]"
0|gladys   | Unhandled rejection Error: NotFound
0|gladys   |     at /home/pi/gladys/api/core/utils/utils.sqlUnique.js:11: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   | gladys.utils.sqlUnique was not able to find element
0|gladys   | Query = "SELECT * FROM device WHERE identifier = ? AND service = ?;"
0|gladys   | Params = "["5","hue"]"
0|gladys   | Unhandled rejection Error: NotFound
0|gladys   |     at /home/pi/gladys/api/core/utils/utils.sqlUnique.js:11: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)
#6

Salut @JanPat, pense à utiliser le bouton code lorsque tu post des logs. Ça sera plus simple à lire pour tout le monde. (j’ai édité ton message)

#7

Oups, désolé, je ne savais pas. Merci.

#8

J’avance un peu dans mon projet :wink:
J’ai fait un script pour allumer la Sonos et les 3 lampes Hue et le script fonctionne sauf que je n’arrive pas à changer les couleurs des lampes dans le script et que je ne vois pas comment lancer ce script par l’intermédiaire d’un tag nfc. Ce que je vois dans la démo de Pierre_Gilles ne lance pas un script…

gladys.deviceType.getById({ id: 2})

.then((result) => {

if(result.lastValue === 0) {

// Si la lampe 2 est éteinte, on l’allume


return gladys.deviceType.exec({devicetype: 2, value: 1}),
//gladys.deviceType.exec({devicetype: 2, brightness: 255}),
//gladys.deviceType.exec({devicetype: 2, hue: 65535}),
//gladys.deviceType.exec({devicetype: 2, saturation: 255}),

// on allume la sonos

gladys.music.play({salon:1});

} else {

// Si la lampe 2 est allumée, on l’éteint

return gladys.deviceType.exec({devicetype: 2, value: 0}),

// on coupe la sonos

gladys.music.stop({salon:1});

}

}

);

gladys.deviceType.getById({ id: 4})
.then((result) => {

if(result.lastValue === 0) {

// Si la lampe 4 est éteinte, on l’allume

return gladys.deviceType.exec({devicetype: 4, value: 1});

} else {

// Si la lampe 4 est allumée, on l’éteint

return gladys.deviceType.exec({devicetype: 4, value: 0});

}

}

);

gladys.deviceType.getById({ id: 9})
.then((result) => {

if(result.lastValue === 0) {

// Si la lampe 3 est éteinte, on l’allume

return gladys.deviceType.exec({devicetype: 9, value: 1});

} else {

// Si la lampe 3 est allumée, on l’éteint

return gladys.deviceType.exec({devicetype: 9, value: 0});

}

}

);

Voilà, je pense qu’il y a moyen de mieux faire et principalement s’il y avait 30 lampes :wink:
Je cherche encore. Si vous avez des idées, d’avance grand merci.

#9

Pour changer les couleurs des lampes, il faut que tu repère les deviceType ID de ces propriétés sur les Philips Hue.

Pour cela, tu vas dans les périphériques, et tu cliques sur ton ampoule Philips Hue. Normalement tu devrais avoir 4 deviceTypes:

  • Binary (on/off)
  • brightness
  • hue
  • saturation

Si tu veux jouer sur la couleur, tu peux tenter de modifer la hue/saturation en faisant comme pour l’allumage:

gladys.deviceType.exec({devicetype: DEVICE_TYPE_ID_HUE, value: 50 });
#10

Merci pour l’info.
J’ai encore 2 problèmes, le premier (voir code ci-dessous), lorsque je lance le script, les lampes s’allument avec leur ancienne valeur prédéfinie avec l’appli Hue. Donc, si la dernière valeur était par ex. “Bleu” et bien lorsque je lance mon script une première fois, alors à la place d’être rouges mes lampes s’allument en bleu Si je lance une seconde fois le script alors seulement mes lampes deviennent rouges. Comment mettre tout directement en rouge ?

//gladys.deviceType.exec({devicetype: 1, value: 255});
gladys.deviceType.exec({devicetype: 3, value: 255});
gladys.deviceType.exec({devicetype: 7, value: 65535});

//gladys.deviceType.exec({devicetype: 8, value: 255});
gladys.deviceType.exec({devicetype: 5, value: 255});
gladys.deviceType.exec({devicetype: 6, value: 65535});

//gladys.deviceType.exec({devicetype: 11, value: 255});
gladys.deviceType.exec({devicetype: 12, value: 255});
gladys.deviceType.exec({devicetype: 10, value: 65535});

gladys.deviceType.getById({ id: 2})

.then((result) => {

// Si les lampes sont eteintes, on allume

if(result.lastValue === 0)
{
    return gladys.deviceType.exec({devicetype: 2, value: 1}),
            gladys.deviceType.exec({devicetype: 4, value: 1}),
            gladys.deviceType.exec({devicetype: 9, value: 1}),
    // on allume la sonos
    gladys.music.play({salon:1});
}
else
    {
        // Si les lampes sont allumées, on éteint
        return gladys.deviceType.exec({devicetype: 2, value: 0}),
                gladys.deviceType.exec({devicetype: 4, value: 0}),
                gladys.deviceType.exec({devicetype: 9, value: 0}),
        // on coupe la sonos
        gladys.music.stop({salon:1});
    }
}

);

Deuxième question, comment lancer ce script avec un tag nfc. Ce script n’est pas comme dans l’exemple de Pierre-Gilles uniquement préciser à Gladys que je me couche, il faut une réaction du système qui doit lancer mon script (voir ci-dessus). Je rame encore sur la plage :wink:
Merci pour vos idées.

#11

Lance d’abord les commandes de changement de couleurs. Il faut que ta commande soit exécutée en premier et que la commande d’après attende.

(async () => { 
  await gladys.deviceType.exec({devicetype: 3, value: 255}); 
  await gladys.deviceType.exec({devicetype: 7, value: 65535});
  await gladys.deviceType.exec({devicetype: 2, value: 1});
})();

Normalement ça devrait faire le boulot…

Pour les tags NFC, tu fais comme dans mon tuto, sauf que tu rajoutes un scénario qui écoute sur l’événènement que tu “lance”, et qui en action de ce scénario lance ce script. Tu devrais trouver dans l’interface de création de scénario :slight_smile:

#12

Merci pour ta réponse P.-G. Lorsque je rentre ton code dans un script, j’ai des messages d’erreur.

(async () => { 
  await gladys.deviceType.exec({devicetype: 3, value: 255}); 
  await gladys.deviceType.exec({devicetype: 7, value: 65535});
  await gladys.deviceType.exec({devicetype: 2, value: 1});
})();

Message d’erreur en ligne 1:
Expected '() and instead saw ‘{’.

Messages d’erreur en ligne 2:
Expected ‘)’ to match ‘{’ from line 1 and instead saw ‘gladys’
Expected and indentifier and instead saw ‘.’.
Expected ‘)’ to match ‘(’ from line 1 and instead saw ‘device type’.

Message ligne 5:
Expected ‘(end’ and instead saw ‘}’.
Que faire à ton avis ?

#13

Tu as installé Gladys comment?

Il semblerait que tu l’ai installée manuellement, non? Tu es en quelle version de Node.js dans ce cas là ?

Il faut que tu sois en Node.js version >= 8 pour que le async/await fonctionne.

#14

Bonsoir,

j’ai la version V8.9.4 de Node.js et j’avais réalisé l’installation de Gladys avec une image… De plus, j’ai effectué les mises à jour de Gladys avec ./rpi-update.sh ?
Bien à toi.

#15

ça sent juste l’erreur de copier coller ça… Tu peux m’envoyer une capture d’écran de ton script?

#16

Voici.
Gladys_Erreur

#17

J’ai essayé ceci et aussi des messages d’erreur.
Gladys_Erreur_02

#18

Tout me semble bon pourtant… et les même commandes tournent chez moi. Tu peux essayer de faire enregistrer avant d’exécuter le script ? (normalement pas besoin mais bon on sait jamais…)

#19

Bonsoir Pierre-Gilles.
Je sauve à chaque fois les scripts…
Je vais attendre la nouvelle version de Gladys et recommencer une installe complète, je ne vois pas d’autre solution. N’empêche que c’est étrange que cela ne fonctionne pas (grande déception !).
Merci pour ton aide et merci pour ce beau projet.

#20

C’est dommage! A mon avis c’est vraiment un tout petit quelque chose… fais sans async/await sinon, juste avec les promise c’était bien aussi :slight_smile: