[V4] Dev service RFlink

Bonjour ,

J’ai commencé a developper le backend du service RFlink (pas encore de PR car j’ai un mauvais niveau en JS et je ne pensais pas arriver a le faire) et je cherche quelqun qui voudrait faire le frontend .

Je ne peux pas m’en occuper moi même, je n’arrive pas a apprendre React et je ne sais meme pas vraiment développer en JS.

Le front serait simple , un onglet setup qui liste les ports usb et un onglet pour les devices.

Si personne ne peux aider , j’essayerai de copier collé les pages qui m’interessent dans les autres modules.

Et j’en profite pour poser des questions :

  • pour l’api , il suffit de retourner un object controllers qui associe a chaque requete une fonction?

  • RFlink gere milight et le 433 , on aura donc 2 service pour gérer le Milight et 2 pour le 433, c’est pas genant?

  • est ce que je dois faire une PR meme si le module n’est pas sur de sortir et ne depend pas que de moi (pour le front)?

Merci pour vos réponses

Hello!

J’ai du mal à voir comment tu peux développer le backend si tu ne sais pas développer en JS ^^

Preact est assez simple, duplique le code d’un autre service et vas-y à tâtons, ça vaut le coup d’apprendre :slight_smile:

En fait j’apprend JS en faisant le service (et ca marche vraiment bien :grinning:).

Pour Preact je vais essayer.

Je pose d’autres autre question :

  • pourquoi est ce que j’ai une erreur qui me dit que je n’ai pas mis de external_id quand je crée un device alors que quand je log le device , je vois bien la proprieté external_id?

l’erreur :

2020-02-02T13:04:33+0100 <log> device.create.js:68 () {
  device: {
    service_id: undefined,
    name: 'TriState switch',
    selector: 'rflink:808a90',
    external_id: 'rflink:808a90',
    model: 'TriState',
    features: [ [Object] ]
  }
}
2020-02-02T13:04:33+0100 <warn> functionsWrapper.js:15 (EventEmitter.<anonymous>) Error while executing function () { [native code] }
2020-02-02T13:04:33+0100 <warn> functionsWrapper.js:16 (EventEmitter.<anonymous>) BadParameters [Error]: A device must have an external_id.
    at E:\admin\Documents\MOI\Projets\Gladys\gladys\server\lib\device\device.create.js:70:13
  • Je me demande aussi comment savoir si un device existe déjà dans la base de données?

Tu es sur de bien l’envoyer? Regarde dans l’onglet « Network » de ton navigateur, à mon avis tu n’envoie pas l’external_id;

Je pense que tu as raison , je vais regarder. J’ai mis le code sur github : Gladys/server/services/rflink at rflink · mTondenier/Gladys · GitHub

quelqun pourrais me dire si c bon pour l’object controllers parce que j’ai l’impression que mes routes renvoient des erreurs

1 « J'aime »

Bonjour j’amerai savoir si un developpeur peut m’aider a comprendre pourquoi mon api ne fonctionne pas

je pense que le problème est dans l’index car l’object controllers est correct. est ce que ça viens du fait que je retourne controllers dans la fonctionne start?

index.js :

const logger = require('../../utils/logger');

const RfLinkManager = require('./lib');

const RflinkController = require('./api/rflink.controller');

const { ServiceNotConfiguredError } = require('../../utils/coreErrors');

let rfLinkManager;

module.exports = function RfLink(gladys, serviceId) {

    

    const Serialport = require('serialport');

    const Readline = require('@serialport/parser-readline');

/**

 * @description start rflink module

 * @example

 * gladys.services.rflink.start();

 */

    async function start() {

      logger.log('Starting Rflink service');

      const RflinkPath = await gladys.variable.getValue('RFLINK_PATH', serviceId);

      

      if (!RflinkPath) {

        throw new ServiceNotConfiguredError('RFLINK_PATH_NOT_FOUND');

      }

      const port = new Serialport(RflinkPath, {baudRate : 57600});

      const readline = new Readline();

      port.pipe(readline);

      rfLinkManager = new RfLinkManager(readline, gladys, serviceId);

      if (rfLinkManager === undefined)  {

        throw new ServiceNotConfiguredError('RFLINK_GATEWAY_ERROR');

      } else {

        rfLinkManager.connect(RflinkPath);

        return Object.freeze({

          device : rfLinkManager,

          controllers : RflinkController(gladys, rfLinkManager, serviceId), 

        });

      }

      

    }

    

/**

 * @description stop rfllink module

 * @example

 * gladys.services.rflink.stop();

 */

    async function stop() {

      logger.log('Stopping Rflink service');

      rfLinkManager.disconnect();

    }

    return Object.freeze({

      start,

      stop, 

    }) 

    ;

};

Le lien github : Gladys/server/services/rflink at master · mTondenier/Gladys · GitHub

Merci d’avance pour l’aide et j’espere pouvoir sortir le module rapidement .

Effectivement ça ne peut pas fonctionner!

Il faut que le controllers soit retourné par le constructeur du service, pas par la fonction start

Ducoup je suis obligé d’empecher le service de démarrer si l’utilisateur n’a pas defini rflinkpath mais si j’arrete mon service Rflinkpath ne peut pas changer de valeur?

Je pense que tu dois revoir la façon dont tes classes sont organisées. Ton controller doit pouvoir démarrer sans tout ça, pareil pour ton object RfLinkManager !

Fait tout ça à l’extérieur de la fonction start.

La fonction start doit uniquement appeler le “.connect” avec la valeur du RFLINK_PATH

Je te conseille de t’inspirer des autres services :slight_smile:

Merci pour ta rapidité , je vais tout revoir pour que ça fonctionne

C’est bon j’ai deja trouvé une solution :grinning: .

J’aimerai juste savoir si tu peux m’expliquer pourquoi j’ai des erreurs 404 quand j’appelle les routes de mon controllers.

voila l’erreur du serveur (ca resemble a un probleme d’authentification):

2020-02-08T15:25:37+0100 <debug> index.js:95 (WebSocketServer.<anonymous>) New user connected in websocket, [object Object]
2020-02-08T15:25:37+0100 <debug> index.js:117 (WebSocket.<anonymous>) JsonWebTokenError: invalid signature
    at E:\admin\Documents\MOI\Projets\Gladys\gladys\server\node_modules\jsonwebtoken\verify.js:133:19
    at getSecret (E:\admin\Documents\MOI\Projets\Gladys\gladys\server\node_modules\jsonwebtoken\verify.js:90:14)
    at Object.module.exports [as verify] (E:\admin\Documents\MOI\Projets\Gladys\gladys\server\node_modules\jsonwebtoken\verify.js:94:10)
    at Session.validateAccessToken (E:\admin\Documents\MOI\Projets\Gladys\gladys\server\lib\session\session.validateAccessToken.js:15:23)
    at WebSocket.<anonymous> (E:\admin\Documents\MOI\Projets\Gladys\gladys\server\api\websockets\index.js:109:49)
    at WebSocket.emit (events.js:304:20)
    at Receiver.receiverOnMessage (E:\admin\Documents\MOI\Projets\Gladys\gladys\server\node_modules\ws\lib\websocket.js:789:20)
    at Receiver.emit (events.js:304:20)
    at Receiver.dataMessage (E:\admin\Documents\MOI\Projets\Gladys\gladys\server\node_modules\ws\lib\receiver.js:422:14)
    at Receiver.getData (E:\admin\Documents\MOI\Projets\Gladys\gladys\server\node_modules\ws\lib\receiver.js:352:17)
    at Receiver.startLoop (E:\admin\Documents\MOI\Projets\Gladys\gladys\server\node_modules\ws\lib\receiver.js:138:22)
    at Receiver._write (E:\admin\Documents\MOI\Projets\Gladys\gladys\server\node_modules\ws\lib\receiver.js:74:10)
    at doWrite (_stream_writable.js:463:12)
    at writeOrBuffer (_stream_writable.js:445:5)
    at Receiver.Writable.write (_stream_writable.js:325:11)
    at Socket.socketOnData (E:\admin\Documents\MOI\Projets\Gladys\gladys\server\node_modules\ws\lib\websocket.js:864:35)
    at Socket.emit (events.js:304:20)
    at addChunk (_stream_readable.js:341:12)
    at readableAddChunk (_stream_readable.js:316:11)
    at Socket.Readable.push (_stream_readable.js:250:10)
    at TCP.onStreamRead (internal/stream_base_commons.js:186:23) {
  name: 'JsonWebTokenError',
  message: 'invalid signature'
}

c’est la derniere question pour ajourd’hui apres j’arrete :innocent:

A mon avis c’est autre chose ces logs… Ces logs c’est juste quand tu redémarre ton serveur de dev, les tokens d’accès sont invalidés, c’est du debug, pas des erreurs

Tes routes sont vraiment en 404? Tu es sur que ton controller est bien exposé?

ces logs apparaissent a chaque fois quand j’appuie sur mon bouton sur l’UI , je continue de chercher.

Pendant que je suis la je vais donenr un peu l’avancement du module :

Ce qui est fait :

  • Backend :

    • creer des devices
    • recevoir une nouvelle valeur d’un device
    • changer la valeur d’un device
    • pair et unpair des milight
  • Frontend :

    • page configuration

Ce qui reste a faire :

  • reussir a afficher tous les devices sur une page ( j’ai recopier la page de philips hue mais ça marche pas)

  • recevoir les requetes de status sans avoir de 404

  • gérer les changements de couleur, intensité ,… des milights et

Voila le module est pas loin d’etre fini

Le github : GitHub - mTondenier/Gladys at rflink

Peut être que je ne comprend pas, mais quel est le rapport avec les milight? :slight_smile:

RFlink gere les ampoule milight donc si quelqun veut utiliser ces ampoules sans avoir de pont , il faut pouvoir les appairer.

Pour mon problème de 404 ça ne concerne qu’une seule route c’est

/api/v1/service/rflink/status

et j’ai regardé c’est la même chose pour le service zwave qui recupère un 404 aussi sur sa route :

/api/v1/service/zwave/status

Sans cette route le front ne sais pas si le gateway RFlink est connecté

Est ce que c’est normal dans le module zwave?

Tu pourra rajouter WIP dans le titre de ta PR @joeypic ?

C’est juste pour indiquer que le dev est en cours.
Merci :+1:

Donc personne ne comprend pourquoi les routes “status” ne fonctionnent pas?

@pierre-gilles J’aimerai bien savoir si c’est possible dans mon service de faire une condition pour savoir si un device existe dans la BDD ou pas ?

Je penses que personne n’a eu le temps de jeter un œil sur ton code.

Un peu de patience :wink:

Tu dois avoir raison :upside_down_face:
c’est juste que comme la RC sort le 21 je voulais voir si j’étais capable de sortir le service avant