Module Xiaomi Flower Care


#81

Conflit résolu, reste à @pierre-gilles à merger… :wink:


#82

Ah super merci ! :slight_smile:
Je vais attendre encore un peu alors :slight_smile:


#83

Tu peux me mettre une réponse sur la PR pour que je vois que c’est bon pour merge?

Je regarde ça la semaine prochaine après le lancement du Gladys Gateway lundi soir!


#84

Bonjour,

après installation du module gladys-bluetooth j’arrive bien a voir dans les périphériques le mi flora mais je n’ai que le rssi de visible.

Comment dois je faire pour avoir les autres mesures?

Merci


#85

@euguuu, il faut attendre que @pierre-gilles merge ma PR dans le module officiel :blush:


#86

@Pti_Nico, ok merci pourl’info je vais patienter


#87

Hello!

Je viens de voir ce message, comme je l’ai fais avec beaucoup de modules, je passe la main sur des modules pour que je puisse rester focus sur d’autres chantiers plus généraux comme le core de Gladys ou le Gladys Gateway, j’ai donc donné accès au module à @spenceur qui est capable de merger les PR normalement :slight_smile:


#88

Yes je regarderais ça, j’ai vue que vous aviez commencé un peut les travaux dessus :
N’ayant pas l’historique @Pti_Nico @pierre-gilles, l’un d’entre vous peut il me dire quel branche est la dernière version entre la branche faite par PG (45 commits) et ton fork (49 commits) ?
@Pti_Nico, as tu repris les modifications de PG si c’est ton fork ?
Au vu des commits sur ton fork cela semble être la “version” à mergé et je vois les commits de PG d’intégré mais je préfère m’en assuré avec vous que l’on ne fasse pas n’importe quoi :slight_smile:.


#89

Salut @spenceur,

Tu peux merger ma branche (version avec la gestion des capteurs bluetooth) sur master, j’avais repris les modifs de PG, de plus, je pense que la branche “fix-multiple-device-creation” est une ancienne branche dont j’ai repris les modifs (peut-être à supprimer…).


#90

Merci @Pti_Nico, j’ai mergé ta branche dans master :slight_smile:


#91

Bonjour à tous :slight_smile:
@spenceur et @Pti_Nico : j’ai reçu ce midi mon xiaomi flower, j’avais déjà gladys bluetooth pour me detecter quand j’arrive à la maison, mais je fais un git pull dans le dossier en conservant bien mon fichier config.js, que je remplace une fois le git pull effectué.
J’ai ensuite lancé la découverte qui a bien fonctionné puisque les devices sont bien créés (mit à part rssi). par contre je n’ai aucunes remonté d’infos (pas de température, rien de rien) et le module bluetooth qui reboot sans cesse (250 fois en 5mn) avec cette erreur:

1|gladys-b | TypeError: Cannot read property 'split' of undefined
1|gladys-b |     at Object.<anonymous> (/home/pi/gladys-bluetooth/app.js:7:32)
1|gladys-b |     at Module._compile (module.js:643:30)
1|gladys-b |     at Object.Module._extensions..js (module.js:654:10)
1|gladys-b |     at Module.load (module.js:556:32)
1|gladys-b |     at tryModuleLoad (module.js:499:12)
1|gladys-b |     at Function.Module._load (module.js:491:3)
1|gladys-b |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:83:21)
1|gladys-b |     at Module._compile (module.js:643:30)
1|gladys-b |     at Object.Module._extensions..js (module.js:654:10)
1|gladys-b |     at Module.load (module.js:556:32)
1|gladys-b |     at tryModuleLoad (module.js:499:12)
1|gladys-b |     at Function.Module._load (module.js:491:3)
1|gladys-b |     at Function.Module.runMain (module.js:684:10)
1|gladys-b |     at startup (bootstrap_node.js:187:16)
1|gladys-b |     at bootstrap_node.js:608:3

Merci d’avance pour votre aide.


#92

Salut @Jean34 !
Peux tu vérifier ton fichier de configuration (plus précisément sur la variable services) car l’application plante sur var services = config.services.split(',');

si tu ne vois rien envoie nous le en modifiant gladysurl et token s’il te plait


#93

Salut @spenceur et merci pour ton aide, il devait me manquer une partie de configuration parce que j’ai gardé mon ancien fichier (version de PG avant modifs) par flemme de refaire la config via putty ^^. Pour être tranquille j’ai réinstallé et ça fonctionne bien maintenant.

Mes excuses @spenceur pour le dérangement :relieved:

@Pti_Nico super module, merci à toi :+1:


#94

Je pense aue @Pti_Nico ajoutait un new param.
Et ton probleme devait être là. En ecrasant ton fichier PG sur PN, tu as perdus la variable services.

En tout cas lerreur est assez explicite pour le comprendre :stuck_out_tongue:.

Coté dev il aurait été bien de catcher ce genre derreur pour quun utilisateur puisse le lire simplement @Pti_Nico


#95

Salut :slightly_smiling_face:

Sache que pour ma part non ^^ et ça a tendance à m’agacer de pas comprendre ce que je fais… Mais je vais remédier à cela (enfin j’espère), je me suis prit la grosse formation nodejs de elephorm, les bases et techniques avancées avec websocket et tout le tralala.

Enfin, il est vrai que j’aurais pu faire quelques essais avant de poster bêtement mon log… Notamment réinstaller le module complet.


#96

Au début c’était pareil :stuck_out_tongue:

du coup tu avais cette erreur là :
Je tente d’accéder à split sur quelque chose que je ne connais pas :
Cannot read property 'split' of undefined
ligne 7 de ce fichier app.js dans gladys-bluetooth au 32 eme characteres :
at Object.<anonymous> (/home/pi/gladys-bluetooth/app.js:7:32)

Du coup j’en ai déduis que config.services n’étais pas définis dans ton fichier de configuration :slight_smile:


#97

Bonjour,

je reviens sur l’article car depuis peu le module ne remonte plus les infos de la batterie (le % de la batterie), donc j’ai supprimé mon device et refait la découverte des bluetooth, avec gladys-bluetooth et voici l’erreur que j’obtiens:

Starting Bluetooth Scan for 30 seconds !
Bluetooth Scan started
Just received 1 devices from "miflora" service, from Gladys. Saving them locally in RAM.
Just received 0 devices from "xiaomiht" service, from Gladys. Saving them locally in RAM.
Just received 1 devices from "bluetooth" service, from Gladys. Saving them locally in RAM.
Just received 0 devices from "flowerpower" service, from Gladys. Saving them locally in RAM.
Found Bluetooth peripheral, name = Flower care, id = c47c8d6a457d, address = c4:7c:8d:6a:45:7d.
Bluetooth Scan stopped
miflora - updating batteryLevel
miflora - updating fertility
miflora - updating light
miflora - updating temperature
miflora - updating moisture
miflora - data received OK
miflora - firmware received OK
miflora - Error while sending batteryLevel to Gladys:
{ StatusCodeError: 400 - undefined
    at new StatusCodeError (/home/pi/gladys-bluetooth/node_modules/request-promise-core/lib/errors.js:32:15)
    at Request.plumbing.callback (/home/pi/gladys-bluetooth/node_modules/request-promise-core/lib/plumbing.js:104:33)
    at Request.RP$callback [as _callback] (/home/pi/gladys-bluetooth/node_modules/request-promise-core/lib/plumbing.js:46:31)
    at Request.self.callback (/home/pi/gladys-bluetooth/node_modules/request/request.js:185:22)
    at emitTwo (events.js:126:13)
    at Request.emit (events.js:214:7)
    at Request.<anonymous> (/home/pi/gladys-bluetooth/node_modules/request/request.js:1161:10)
    at emitOne (events.js:116:13)
    at Request.emit (events.js:211:7)
    at IncomingMessage.<anonymous> (/home/pi/gladys-bluetooth/node_modules/request/request.js:1083:12)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:111:20)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1055:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)
  name: 'StatusCodeError',
  statusCode: 400,
  message: '400 - undefined',
  error: undefined,
  options:
   { method: 'POST',
     uri: 'http://192.168.1.38:8080/devicestate?token=mon-token',
     body: { devicetype: 62, value: undefined },
     json: true,
     callback: [Function: RP$callback],
     transform: undefined,
     simple: true,
     resolveWithFullResponse: false,
     transform2xxOnly: false },
  response:
   IncomingMessage {
     _readableState:
      ReadableState {
        objectMode: false,
        highWaterMark: 16384,
        buffer: [Object],
        length: 0,
        pipes: null,
        pipesCount: 0,
        flowing: true,
        ended: true,
        endEmitted: true,
        reading: false,
        sync: true,
        needReadable: false,
        emittedReadable: false,
        readableListening: false,
        resumeScheduled: false,
        destroyed: false,
        defaultEncoding: 'utf8',
        awaitDrain: 0,
        readingMore: false,
        decoder: null,
        encoding: null },
     readable: false,
     domain: null,
     _events:
      { end: [Array],
        close: [Array],
        data: [Function],
        error: [Function] },
     _eventsCount: 4,
     _maxListeners: undefined,
     socket:
      Socket {
        connecting: false,
        _hadError: false,
        _handle: null,
        _parent: null,
        _host: null,
        _readableState: [Object],
        readable: false,
        domain: null,
        _events: [Object],
        _eventsCount: 8,
        _maxListeners: undefined,
        _writableState: [Object],
        writable: false,
        allowHalfOpen: false,
        _bytesDispatched: 216,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: null,
        _server: null,
        parser: null,
        _httpMessage: [Object],
        read: [Function],
        _consuming: true,
        _idleNext: null,
        _idlePrev: null,
        _idleTimeout: -1,
        [Symbol(asyncId)]: 127,
        [Symbol(bytesRead)]: 347 },
     connection:
      Socket {
        connecting: false,
        _hadError: false,
        _handle: null,
        _parent: null,
        _host: null,
        _readableState: [Object],
        readable: false,
        domain: null,
        _events: [Object],
        _eventsCount: 8,
        _maxListeners: undefined,
        _writableState: [Object],
        writable: false,
        allowHalfOpen: false,
        _bytesDispatched: 216,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: null,
        _server: null,
        parser: null,
        _httpMessage: [Object],
        read: [Function],
        _consuming: true,
        _idleNext: null,
        _idlePrev: null,
        _idleTimeout: -1,
        [Symbol(asyncId)]: 127,
        [Symbol(bytesRead)]: 347 },
     httpVersionMajor: 1,
     httpVersionMinor: 1,
     httpVersion: '1.1',
     complete: true,
     headers:
      { vary: 'X-HTTP-Method-Override',
        'x-powered-by': 'Sails <sailsjs.org>',
        'set-cookie': [Array],
        date: 'Tue, 19 Feb 2019 21:41:01 GMT',
        connection: 'close',
        'transfer-encoding': 'chunked' },
     rawHeaders:
      [ 'Vary',
        'X-HTTP-Method-Override',
        'X-Powered-By',
        'Sails <sailsjs.org>',
        'set-cookie',
        'sails.sid=s%3AKQj09hwU7ArE7MfA6SObK1OMcI1oRu5l.wklV2tp2pQ8rG%2BO%2BoXcmc7pZdoBPcvwg5iXkUyaXjmI; Path=/; Expires=Wed, 06 Mar 2019 21:41:01 GMT; HttpOnly',
        'Date',
        'Tue, 19 Feb 2019 21:41:01 GMT',
        'Connection',
        'close',
        'Transfer-Encoding',
        'chunked' ],
     trailers: {},
     rawTrailers: [],
     upgrade: false,
     url: '',
     method: null,
     statusCode: 400,
     statusMessage: 'Bad Request',
     client:
      Socket {
        connecting: false,
        _hadError: false,
        _handle: null,
        _parent: null,
        _host: null,
        _readableState: [Object],
        readable: false,
        domain: null,
        _events: [Object],
        _eventsCount: 8,
        _maxListeners: undefined,
        _writableState: [Object],
        writable: false,
        allowHalfOpen: false,
        _bytesDispatched: 216,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: null,
        _server: null,
        parser: null,
        _httpMessage: [Object],
        read: [Function],
        _consuming: true,
        _idleNext: null,
        _idlePrev: null,
        _idleTimeout: -1,
        [Symbol(asyncId)]: 127,
        [Symbol(bytesRead)]: 347 },
     _consuming: true,
     _dumped: false,
     req:
      ClientRequest {
        domain: null,
        _events: [Object],
        _eventsCount: 5,
        _maxListeners: undefined,
        output: [],
        outputEncodings: [],
        outputCallbacks: [],
        outputSize: 0,
        writable: true,
        _last: true,
        upgrading: false,
        chunkedEncoding: false,
        shouldKeepAlive: false,
        useChunkedEncodingByDefault: true,
        sendDate: false,
        _removedConnection: false,
        _removedContLen: false,
        _removedTE: false,
        _contentLength: null,
        _hasBody: true,
        _trailer: '',
        finished: true,
        _headerSent: true,
        socket: [Object],
        connection: [Object],
        _header: 'POST /devicestate?token=mon-token HTTP/1.1\r\nhost: 192.168.1.38:8080\r\naccept: application/json\r\ncontent-type: application/json\r\ncontent-length: 17\r\nConnection: close\r\n\r\n',
        _onPendingData: [Function: noopPendingOutput],
        agent: [Object],
        socketPath: undefined,
        timeout: undefined,
        method: 'POST',
        path: '/devicestate?token=mon-token',
        _ended: true,
        res: [Circular],
        aborted: undefined,
        timeoutCb: null,
        upgradeOrConnect: false,
        parser: null,
        maxHeadersCount: null,
        [Symbol(outHeadersKey)]: [Object] },
     request:
      Request {
        domain: null,
        _events: [Object],
        _eventsCount: 5,
        _maxListeners: undefined,
        method: 'POST',
        uri: [Object],
        body: '{"devicetype":62}',
        readable: true,
        writable: true,
        explicitMethod: true,
        _qs: [Object],
        _auth: [Object],
        _oauth: [Object],
        _multipart: [Object],
        _redirect: [Object],
        _tunnel: [Object],
        _rp_resolve: [Function],
        _rp_reject: [Function],
        _rp_promise: [Object],
        _rp_callbackOrig: undefined,
        callback: [Function],
        _rp_options: [Object],
        headers: [Object],
        setHeader: [Function],
        hasHeader: [Function],
        getHeader: [Function],
        removeHeader: [Function],
        localAddress: undefined,
        pool: {},
        dests: [],
        __isRequestRequest: true,
        _callback: [Function: RP$callback],
        proxy: null,
        tunnel: false,
        setHost: true,
        originalCookieHeader: undefined,
        _disableCookies: true,
        _jar: undefined,
        port: '8080',
        host: '192.168.1.38',
        path: '/devicestate?token=mon-token',
        _json: true,
        httpModule: [Object],
        agentClass: [Object],
        agent: [Object],
        _started: true,
        href: 'http://192.168.1.38:8080/devicestate?token=mon-token',
        req: [Object],
        ntick: true,
        response: [Circular],
        originalHost: '192.168.1.38:8080',
        originalHostHeaderName: 'host',
        responseContent: [Circular],
        _ended: true,
        _callbackCalled: true },
     toJSON: [Function: responseToJSON],
     caseless: Caseless { dict: [Object] },
     read: [Function] } }
Bluetooth Scan started
miflora - DeviceType "63" and DeviceState "fertility" inserted with success !
miflora - DeviceType "65" and DeviceState "temperature" inserted with success !
miflora - DeviceType "66" and DeviceState "moisture" inserted with success !
miflora - DeviceType "64" and DeviceState "light" inserted with success !
Stopping Bluetooth Scan for 30 seconds !
Bluetooth Scan stopped

Merci d’avance pour votre aide @spenceur et @Pti_Nico

ps: dans les logs que j’ai mit j’ai modifié le token par “mon-token


#98

Ce qui est étrange @Jean34,
c’est que tu as une URL avec mon-token :
http://192.168.1.38:8080/devicestate?token=mon-token

Allez j’arrête mes boutades :smiley:
Je regarderais si j’ai le temps ce soir sinon @Pti_Nico s’en occupera se sera plus simple vu que c’est son code :slight_smile:


#99

Moqueur va ! :grin::joy: @spenceur

Suite à ton message un peu plus haut, j’ai regardé tous les fichiers concernés pour voir si je pouvais me débrouiller tout seul, mais non, je ne vois/comprends pas .

En tout cas merci à toi :wink:


#100

@Jean34,
Pour afficher plus de log, dans le fichier “lib/compatibilities/miflora/exec.js”, tu peux décommenter la ligne 85:

	//console.log(`miflora - ${origin} received: ${JSON.stringify(data)}`);

On dirait que ton capteur ne renvois pas l’info sur le “batteryLevel”…