Aymkdn / assistant-plugins

Des plugins pour les Assistant (comme Google Home, Cortana, Alexa)
https://aymkdn.github.io/assistant-plugins/
MIT License
92 stars 21 forks source link

Bluetooth multi enceinte #137

Closed Pr0killer closed 6 years ago

Pr0killer commented 6 years ago

Bonjour,

Tout d'abord merci pour tous ces plugins qui m'aident énormément dans la gestion de ma maison avec ma google home mini.

Je rencontre actuellement un problème avec le plugin bluetooth. J'ai créé 2 applets IFTTT pour pouvoir connecter à l'une ou l'autre des enceintes en fonction de la pièce souhaitée et malgré le fait que dans la console je vois bien la bonne commande reçue (avec le bon nom de l'enceinte), la google home mini se connecte systématiquement à la dernière enceinte à laquelle elle a été connectée. Est-ce moi qui fait une fausse manip ou est-ce la google home mini qui ne permet pas cela ?

bluetooth

Aymkdn commented 6 years ago

Alors déjà, c'est pas disconnect tout seul, mais disconnect NOM_ENCEINTE. Ensuite je n'ai qu'une enceinte Bluetooth à la maison donc je ne peux pas en tester plusieurs, mais j'imagine que ça doit fonctionner. Je pense que cela fonctionne sans devoir passer par un disconnect.

Donc :

  1. Vérifie que tu as utilisé les bons noms d'enceintes (le nom doit être tel qu'il apparait dans l'application Google Home)
  2. Crée 2 applets : une bluetooth_connect V1-C et l'autre bluetooth_connect Poweradd, puis teste.

Dis moi ce qu'il en est.

Pr0killer commented 6 years ago

Alors pour avoir tester le disconnect tout seul, ça fonctionne bien... même si cela n'était peut-être pas prévu... ça fonctionne aussi très bien avec le nom de l'enceinte derrière ;)

Pour la connexion par contre que j'utilise 1 des 2 applets, j'ai toujours la même enceinte qui prend la connexion malgré la bonne commande.

Sans le disconnect j'ai une erreur par contre bluetooth1

Aymkdn commented 6 years ago

Est-ce qu'une des enceintes est tout le temps allumée et définie par défaut sur le Google Home ?

Pr0killer commented 6 years ago

à partir du moment ou le disconnect est effectué, j'ai vérifié il n'y en a plus.

Par contre je remarque que c'est la dernière utilisée dans l'application qui est prise en compte systématiquement peut importe la commande

Aymkdn commented 6 years ago

Ma configuration : je n'ai aucune enceinte définie par défaut pour mon Google Home Mini puisque je n'ai qu'une enceinte (dans la douche, sur batterie) et qu'on l'allume à la demande. J'avais essayé de la définir par défaut, mais GH l'oublie dès qu'elle est éteinte.... Du coup si je voulais balancer la musique du GH sur l'enceinte, je devais allumer mon écran de téléphone, lancer l'application Google Home, trouver le bon endroit, puis sélectionner mon enceinte et la définir par défaut... Fastidieux. Désormais j'utilise mon plugin pour balancer le son sur l'enceinte, à la demande, et dès que je la coupe, la musique revient sur le Google Home.

J'utilise l'API qui est "décrite" ici : https://rithvikvibhu.github.io/GHLocalApi/#connectivity-connect-disconnect-bluetooth-device-post

Moi j'ai rajouté le nom de l'enceinte dans la requête qui est envoyée vers le GH. Mais c'est possible que le seul paramètre qu'il prend en compte c'est le "connect" / "disconnect" et ne le fasse que pour l'enceinte par défaut ?! Du coup je ne sais pas trop... D'autant que je n'ai qu'une seule enceinte donc je ne peux pas effectuer de tests

Aymkdn commented 6 years ago

J'ai une piste... J'effectue quelques tests et je mettrai à jour le plugin si c'est concluant, et tu pourras tester

Pr0killer commented 6 years ago

Pas de problème, ça me soulage déjà pas mal ;)

C'était juste histoire de savoir si c'est moi qui faisait la boulette ;)

edit: ok pour ton second post ;)

Aymkdn commented 6 years ago

Je viens de publier la v1.1.0

Arrête assistant-plugins puis utilise update.bat qui devrait mettre à jour le plugin, puis relance assistant-plugins et dis moi ce que ça donne !

Pr0killer commented 6 years ago

Merci ça fonctionne bien.

Si on veut chipoter ça fonctionne uniquement si on fait un disconnect (ça sera très rare dans mon cas que je passe de l'une à l'autre en direct) sinon j'ai l'erreur suivante (si tu veux essayer de corriger mais perso ça me gêne pas comme dit avant ;)) :

[assistant] Commande reçue: [ 'bluetooth_disconnect V1-C' ] [assistant] Appelle du plugin 'bluetooth' [assistant-bluetooth] Connexion à V1-C V1-C 1e:44:25:e9:a1:36 [assistant] Commande reçue: [ 'bluetooth_connect Poweradd' ] [assistant] Appelle du plugin 'bluetooth' [assistant-bluetooth] Connexion à Poweradd V1-C 1e:44:25:e9:a1:36 Poweradd f4:4e:fd:cd:6a:63 [assistant] Commande reçue: [ 'bluetooth_connect V1-C' ] [assistant] Appelle du plugin 'bluetooth' [assistant-bluetooth] Connexion à V1-C Poweradd f4:4e:fd:cd:6a:63 V1-C 1e:44:25:e9:a1:36 [assistant-bluetooth] Erreur : la connexion au Google Home a eu un problème : { StatusCodeError: 400 - undefined at new StatusCodeError (D:\Bureau\assistant-plugins\assistant-plugins\node_modules\request-promise-core\lib\errors.js:32:15) at Request.plumbing.callback (D:\Bureau\assistant-plugins\assistant-plugins\node_modules\request-promise-core\lib\plumbing.js:104:33) at Request.RP$callback [as _callback] (D:\Bureau\assistant-plugins\assistant-plugins\node_modules\request-promise-core\lib\plumbing.js:46:31) at Request.self.callback (D:\Bureau\assistant-plugins\assistant-plugins\node_modules\request\request.js:186:22) at Request.emit (events.js:182:13) at Request. (D:\Bureau\assistant-plugins\assistant-plugins\node_modules\request\request.js:1163:10) at Request.emit (events.js:182:13) at IncomingMessage. (D:\Bureau\assistant-plugins\assistant-plugins\node_modules\request\request.js:1085:12) at Object.onceWrapper (events.js:273:13) at IncomingMessage.emit (events.js:187:15) name: 'StatusCodeError', statusCode: 400, message: '400 - undefined', error: undefined, options: { url: 'http://192.168.0.50:8008/setup/bluetooth/connect', method: 'POST', json: true, body: { connect: true, mac_address: '1e:44:25:e9:a1:36', profile: 2 }, headers: { 'Content-Type': 'application/json' }, callback: [Function: RP$callback], transform: undefined, simple: true, resolveWithFullResponse: false, transform2xxOnly: false }, response: IncomingMessage { _readableState: ReadableState { objectMode: false, highWaterMark: 16384, buffer: BufferList { length: 0 }, length: 0, pipes: null, pipesCount: 0, flowing: true, ended: true, endEmitted: true, reading: false, sync: true, needReadable: false, emittedReadable: false, readableListening: false, resumeScheduled: false, emitClose: true, destroyed: false, defaultEncoding: 'utf8', awaitDrain: 0, readingMore: true, decoder: null, encoding: null }, readable: false, _events: { end: [Array], close: [Array], data: [Function], error: [Function] }, _eventsCount: 4, _maxListeners: undefined, socket: Socket { connecting: false, _hadError: false, _handle: [TCP], _parent: null, _host: null, _readableState: [ReadableState], readable: true, _events: [Object], _eventsCount: 7, _maxListeners: undefined, _writableState: [WritableState], writable: false, allowHalfOpen: false, _sockname: null, _pendingData: null, _pendingEncoding: '', server: null, _server: null, parser: null, _httpMessage: [ClientRequest],

    [Symbol(lastWriteQueueSize)]: 0,
    [Symbol(timeout)]: null,
    [Symbol(kBytesRead)]: 0,
    [Symbol(kBytesWritten)]: 0 },
 connection:
  Socket {
    connecting: false,
    _hadError: false,
    _handle: [TCP],
    _parent: null,
    _host: null,
    _readableState: [ReadableState],
    readable: true,
    _events: [Object],
    _eventsCount: 7,
    _maxListeners: undefined,
    _writableState: [WritableState],
    writable: false,
    allowHalfOpen: false,
    _sockname: null,
    _pendingData: null,
    _pendingEncoding: '',
    server: null,
    _server: null,
    parser: null,
    _httpMessage: [ClientRequest],
    [Symbol(asyncId)]: 803,
    [Symbol(lastWriteQueueSize)]: 0,
    [Symbol(timeout)]: null,
    [Symbol(kBytesRead)]: 0,
    [Symbol(kBytesWritten)]: 0 },
 httpVersionMajor: 1,
 httpVersionMinor: 1,
 httpVersion: '1.1',
 complete: true,
 headers:
  { 'access-control-allow-headers': 'Content-Type',
    'cache-control': 'no-cache',
    'content-length': '0' },
 rawHeaders:
  [ 'Access-Control-Allow-Headers',
    'Content-Type',
    'Cache-Control',
    'no-cache',
    'Content-Length',
    '0' ],
 trailers: {},
 rawTrailers: [],
 aborted: false,
 upgrade: false,
 url: '',
 method: null,
 statusCode: 400,
 statusMessage: 'Bad Request',
 client:
  Socket {
    connecting: false,
    _hadError: false,
    _handle: [TCP],
    _parent: null,
    _host: null,
    _readableState: [ReadableState],
    readable: true,
    _events: [Object],
    _eventsCount: 7,
    _maxListeners: undefined,
    _writableState: [WritableState],
    writable: false,
    allowHalfOpen: false,
    _sockname: null,
    _pendingData: null,
    _pendingEncoding: '',
    server: null,
    _server: null,
    parser: null,
    _httpMessage: [ClientRequest],
    [Symbol(asyncId)]: 803,
    [Symbol(lastWriteQueueSize)]: 0,
    [Symbol(timeout)]: null,
    [Symbol(kBytesRead)]: 0,
    [Symbol(kBytesWritten)]: 0 },
 _consuming: false,
 _dumped: false,
 req:
  ClientRequest {
    _events: [Object],
    _eventsCount: 5,
    _maxListeners: undefined,
    output: [],
    outputEncodings: [],
    outputCallbacks: [],
    outputSize: 0,
    writable: true,
    _last: true,
    chunkedEncoding: false,
    shouldKeepAlive: false,
    useChunkedEncodingByDefault: true,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    _contentLength: null,
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    socket: [Socket],
    connection: [Socket],
    _header: 'POST /setup/bluetooth/connect HTTP/1.1\r\nContent-Type: application/json\r\nhost: 192.168.0.50:8008\r\naccept: application/json\r\ncontent-length: 62\r\nConnection: close\r\n\r\n',
    _onPendingData: [Function: noopPendingOutput],
    agent: [Agent],
    socketPath: undefined,
    timeout: undefined,
    method: 'POST',
    path: '/setup/bluetooth/connect',
    _ended: true,
    res: [Circular],
    aborted: undefined,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    [Symbol(isCorked)]: false,
    [Symbol(outHeadersKey)]: [Object] },
 request:
  Request {
    _events: [Object],
    _eventsCount: 5,
    _maxListeners: undefined,
    method: 'POST',
    body: '{"connect":true,"mac_address":"1e:44:25:e9:a1:36","profile":2}',
    headers: [Object],
    readable: true,
    writable: true,
    explicitMethod: true,
    _qs: [Querystring],
    _auth: [Auth],
    _oauth: [OAuth],
    _multipart: [Multipart],
    _redirect: [Redirect],
    _tunnel: [Tunnel],
    _rp_resolve: [Function],
    _rp_reject: [Function],
    _rp_promise: [Promise],
    _rp_callbackOrig: undefined,
    callback: [Function],
    _rp_options: [Object],
    setHeader: [Function],
    hasHeader: [Function],
    getHeader: [Function],
    removeHeader: [Function],
    localAddress: undefined,
    pool: {},
    dests: [],
    __isRequestRequest: true,
    _callback: [Function: RP$callback],
    uri: [Url],
    proxy: null,
    tunnel: false,
    setHost: true,
    originalCookieHeader: undefined,
    _disableCookies: true,
    _jar: undefined,
    port: '8008',
    host: '192.168.0.50',
    path: '/setup/bluetooth/connect',
    _json: true,
    httpModule: [Object],
    agentClass: [Function],
    agent: [Agent],
    _started: true,
    href: 'http://192.168.0.50:8008/setup/bluetooth/connect',
    req: [ClientRequest],
    ntick: true,
    response: [Circular],
    originalHost: '192.168.0.50:8008',
    originalHostHeaderName: 'host',
    responseContent: [Circular],
    _ended: true,
    _callbackCalled: true },
 toJSON: [Function: responseToJSON],
 caseless: Caseless { dict: [Object] } } } 400 undefined
Aymkdn commented 6 years ago

Remet à jour : c'est la v1.2.0 maintenant. Dis moi si tout fonctionne ?

Pr0killer commented 6 years ago

Toujours la même chose :

[assistant] Commande reçue: [ 'bluetooth_disconnect Poweradd' ] [assistant] Appelle du plugin 'bluetooth' [assistant-bluetooth] Déconnexion de l'enceinte Bluetooth [assistant] Commande reçue: [ 'bluetooth_connect V1-C' ] [assistant] Appelle du plugin 'bluetooth' [assistant-bluetooth] Connexion à V1-C [assistant] Commande reçue: [ 'bluetooth_connect Poweradd' ] [assistant] Appelle du plugin 'bluetooth' [assistant-bluetooth] Connexion à Poweradd [assistant-bluetooth] Erreur : la connexion au Google Home a eu un problème : { StatusCodeError: 400 - undefined at new StatusCodeError (D:\Bureau\assistant-plugins\assistant-plugins\node_modules\request-promise-core\lib\errors.js:32:15) at Request.plumbing.callback (D:\Bureau\assistant-plugins\assistant-plugins\node_modules\request-promise-core\lib\plumbing.js:104:33) at Request.RP$callback [as _callback] (D:\Bureau\assistant-plugins\assistant-plugins\node_modules\request-promise-core\lib\plumbing.js:46:31) at Request.self.callback (D:\Bureau\assistant-plugins\assistant-plugins\node_modules\request\request.js:186:22) at Request.emit (events.js:182:13) at Request. (D:\Bureau\assistant-plugins\assistant-plugins\node_modules\request\request.js:1163:10) at Request.emit (events.js:182:13) at IncomingMessage. (D:\Bureau\assistant-plugins\assistant-plugins\node_modules\request\request.js:1085:12) at Object.onceWrapper (events.js:273:13) at IncomingMessage.emit (events.js:187:15) name: 'StatusCodeError', statusCode: 400, message: '400 - undefined', error: undefined, options: { url: 'http://192.168.0.50:8008/setup/bluetooth/connect', method: 'POST', json: true, body: { connect: true, mac_address: 'f4:4e:fd:cd:6a:63', profile: 2 }, headers: { 'Content-Type': 'application/json' }, callback: [Function: RP$callback], transform: undefined, simple: true, resolveWithFullResponse: false, transform2xxOnly: false }, response: IncomingMessage { _readableState: ReadableState { objectMode: false, highWaterMark: 16384, buffer: BufferList { length: 0 }, length: 0, pipes: null, pipesCount: 0, flowing: true, ended: true, endEmitted: true, reading: false, sync: true, needReadable: false, emittedReadable: false, readableListening: false, resumeScheduled: false, emitClose: true, destroyed: false, defaultEncoding: 'utf8', awaitDrain: 0, readingMore: true, decoder: null, encoding: null }, readable: false, _events: { end: [Array], close: [Array], data: [Function], error: [Function] }, _eventsCount: 4, _maxListeners: undefined, socket: Socket { connecting: false, _hadError: false, _handle: [TCP], _parent: null, _host: null, _readableState: [ReadableState], readable: true, _events: [Object], _eventsCount: 7, _maxListeners: undefined, _writableState: [WritableState], writable: false, allowHalfOpen: false, _sockname: null, _pendingData: null, _pendingEncoding: '', server: null, _server: null, parser: null, _httpMessage: [ClientRequest],

    [Symbol(lastWriteQueueSize)]: 0,
    [Symbol(timeout)]: null,
    [Symbol(kBytesRead)]: 0,
    [Symbol(kBytesWritten)]: 0 },
 connection:
  Socket {
    connecting: false,
    _hadError: false,
    _handle: [TCP],
    _parent: null,
    _host: null,
    _readableState: [ReadableState],
    readable: true,
    _events: [Object],
    _eventsCount: 7,
    _maxListeners: undefined,
    _writableState: [WritableState],
    writable: false,
    allowHalfOpen: false,
    _sockname: null,
    _pendingData: null,
    _pendingEncoding: '',
    server: null,
    _server: null,
    parser: null,
    _httpMessage: [ClientRequest],
    [Symbol(asyncId)]: 493,
    [Symbol(lastWriteQueueSize)]: 0,
    [Symbol(timeout)]: null,
    [Symbol(kBytesRead)]: 0,
    [Symbol(kBytesWritten)]: 0 },
 httpVersionMajor: 1,
 httpVersionMinor: 1,
 httpVersion: '1.1',
 complete: true,
 headers:
  { 'access-control-allow-headers': 'Content-Type',
    'cache-control': 'no-cache',
    'content-length': '0' },
 rawHeaders:
  [ 'Access-Control-Allow-Headers',
    'Content-Type',
    'Cache-Control',
    'no-cache',
    'Content-Length',
    '0' ],
 trailers: {},
 rawTrailers: [],
 aborted: false,
 upgrade: false,
 url: '',
 method: null,
 statusCode: 400,
 statusMessage: 'Bad Request',
 client:
  Socket {
    connecting: false,
    _hadError: false,
    _handle: [TCP],
    _parent: null,
    _host: null,
    _readableState: [ReadableState],
    readable: true,
    _events: [Object],
    _eventsCount: 7,
    _maxListeners: undefined,
    _writableState: [WritableState],
    writable: false,
    allowHalfOpen: false,
    _sockname: null,
    _pendingData: null,
    _pendingEncoding: '',
    server: null,
    _server: null,
    parser: null,
    _httpMessage: [ClientRequest],
    [Symbol(asyncId)]: 493,
    [Symbol(lastWriteQueueSize)]: 0,
    [Symbol(timeout)]: null,
    [Symbol(kBytesRead)]: 0,
    [Symbol(kBytesWritten)]: 0 },
 _consuming: false,
 _dumped: false,
 req:
  ClientRequest {
    _events: [Object],
    _eventsCount: 5,
    _maxListeners: undefined,
    output: [],
    outputEncodings: [],
    outputCallbacks: [],
    outputSize: 0,
    writable: true,
    _last: true,
    chunkedEncoding: false,
    shouldKeepAlive: false,
    useChunkedEncodingByDefault: true,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    _contentLength: null,
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    socket: [Socket],
    connection: [Socket],
    _header: 'POST /setup/bluetooth/connect HTTP/1.1\r\nContent-Type: application/json\r\nhost: 192.168.0.50:8008\r\naccept: application/json\r\ncontent-length: 62\r\nConnection: close\r\n\r\n',
    _onPendingData: [Function: noopPendingOutput],
    agent: [Agent],
    socketPath: undefined,
    timeout: undefined,
    method: 'POST',
    path: '/setup/bluetooth/connect',
    _ended: true,
    res: [Circular],
    aborted: undefined,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    [Symbol(isCorked)]: false,
    [Symbol(outHeadersKey)]: [Object] },
 request:
  Request {
    _events: [Object],
    _eventsCount: 5,
    _maxListeners: undefined,
    method: 'POST',
    body: '{"connect":true,"mac_address":"f4:4e:fd:cd:6a:63","profile":2}',
    headers: [Object],
    readable: true,
    writable: true,
    explicitMethod: true,
    _qs: [Querystring],
    _auth: [Auth],
    _oauth: [OAuth],
    _multipart: [Multipart],
    _redirect: [Redirect],
    _tunnel: [Tunnel],
    _rp_resolve: [Function],
    _rp_reject: [Function],
    _rp_promise: [Promise],
    _rp_callbackOrig: undefined,
    callback: [Function],
    _rp_options: [Object],
    setHeader: [Function],
    hasHeader: [Function],
    getHeader: [Function],
    removeHeader: [Function],
    localAddress: undefined,
    pool: {},
    dests: [],
    __isRequestRequest: true,
    _callback: [Function: RP$callback],
    uri: [Url],
    proxy: null,
    tunnel: false,
    setHost: true,
    originalCookieHeader: undefined,
    _disableCookies: true,
    _jar: undefined,
    port: '8008',
    host: '192.168.0.50',
    path: '/setup/bluetooth/connect',
    _json: true,
    httpModule: [Object],
    agentClass: [Function],
    agent: [Agent],
    _started: true,
    href: 'http://192.168.0.50:8008/setup/bluetooth/connect',
    req: [ClientRequest],
    ntick: true,
    response: [Circular],
    originalHost: '192.168.0.50:8008',
    originalHostHeaderName: 'host',
    responseContent: [Circular],
    _ended: true,
    _callbackCalled: true },
 toJSON: [Function: responseToJSON],
 caseless: Caseless { dict: [Object] } } } 400 undefined

désolé pour les pavés mais ça ne me parle pas ;)

Aymkdn commented 6 years ago

Donc c'est quand tu essaies de te connecter à Poweradd que ça fait ça, et seulement à celle-ci ?

Est-ce que malgré l'erreur ça fonctionne comme attendu ?

Pr0killer commented 6 years ago

Pas forcément, c'est quand je teste de passer de l'une à l'autre sans disconnect que ça plante, le son reste sur la première. Si on disconnect, on peut passer de l'une à l'autre sans problème

Aymkdn commented 6 years ago

OK donc je vais ajouter un disconnect avant pour voir

Pr0killer commented 6 years ago

Ok, j'attends ton feu vert pour update et re-tester alors ;)

Aymkdn commented 6 years ago

v1.2.1 publiée ! :)

Pr0killer commented 6 years ago

Je viens de tester et ça déconnecte bien mais ça ne reconnecte pas sur l'autre enceinte et ça relance donc sur la GH

Aymkdn commented 6 years ago

Mmmhhh.... Peut-être faut-il un délai de quelques secondes entre les 2 commandes ? Je veux bien essayer de rajouter un délai entre les deux commandes...

Pr0killer commented 6 years ago

à mon avis il faut au moins 5 à 10 sec de délai si tel est le cas

Aymkdn commented 6 years ago

Mise à jour publiée (v1.2.2)

Aymkdn commented 6 years ago

Je regarde d'abord si un appareil est connecté, et si c'est le cas je le déconnecte, puis j'attends 5 secondes, et je connecte l'appareil demandé.

S'il n'y a aucun appareil déjà connecté, alors cela se fait immédiatement.

Et si l'appareil demandé est déjà connecté, rien ne se passe.

Pr0killer commented 6 years ago

Perfect :D

Un grand merci à toi pour ce boulot et cette réactivité ;)

[HS On]ps : j'ai installer le plugin bluetooth hier et ça m'a installer le template à la place, j'ai modifier le .bat pour installer le bon ;) je ne sais pas si tu l'avais vu ou pas...[HS Off]

Aymkdn commented 6 years ago

OK Cool !

(Merci, non j'avais pas vu !)

Aymkdn commented 6 years ago

Merci pour tes tests, ça m'a bien aidé ;-)

Pr0killer commented 6 years ago

Pas de problème ;)

Si besoin de tester autre chose et que je peux aider hésite pas ;)

[HS]le plugin template va être publié ? Il va servir à quoi ? (si tu veux bien y répondre ^^, je n'ai rien vu encore dessus) [HS Off]