[V4] Dev-Dienst RFlink

Hallo,

Ich habe mit der Entwicklung des Backends des RFlink-Dienstes begonnen (noch kein PR, weil ich ein schlechtes Niveau in JS habe und nicht dachte, dass ich es schaffen würde) und suche jemanden, der das Frontend machen möchte.

Ich kann mich selbst nicht darum kümmern, ich schaffe es nicht, React zu lernen, und ich kann auch nicht wirklich in JS entwickeln.

Das Frontend wäre einfach, ein Setup-Tab, der die USB-Ports auflistet, und ein Tab für die Geräte.

Falls niemand helfen kann, werde ich versuchen, die Seiten, die mich interessieren, aus den anderen Modulen zu kopieren.

Und ich nutze die Gelegenheit, um Fragen zu stellen:

  • Für die API reicht es, ein Object controllers zurückzugeben, das jeder Anfrage eine Funktion zuordnet?

  • RFlink verwaltet Milight und 433, wir werden also 2 Dienste für Milight und 2 für 433 haben, ist das nicht störend?

  • Sollte ich einen PR machen, auch wenn das Modul nicht sicher herauskommt und nicht nur von mir abhängt (für das Frontend)?

Danke für eure Antworten.

Hallo!

Ich kann mir nicht vorstellen, wie du den Backend entwickeln kannst, wenn du nicht in JS entwickeln kannst ^^

Preact ist recht einfach, dupliziere den Code eines anderen Dienstes und probiere es einfach aus, es lohnt sich, es zu lernen :slight_smile:

Eigentlich lerne ich JS, indem ich den Service mache (und das funktioniert wirklich gut :grinning:).

Bei Preact werde ich es versuchen.

Ich habe eine weitere Frage:

  • Warum bekomme ich eine Fehlermeldung, dass ich keine external_id angegeben habe, wenn ich ein Gerät erstelle, obwohl ich beim Loggen des Geräts die Eigenschaft external_id sehe?

Der Fehler:

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
  • Ich frage mich auch, wie ich herausfinden kann, ob ein Gerät bereits in der Datenbank existiert?

Bist du sicher, dass du sie auch sendest? Schau im Reiter « Netzwerk » deines Browsers nach, ich glaube, du sendest die „external_id“ nicht.

Ich denke, du hast recht, ich werde es mir ansehen. Ich habe den Code auf GitHub hochgeladen: Gladys/server/services/rflink at rflink · mTondenier/Gladys · GitHub

Kann mir jemand sagen, ob das für den Controller-Objekt in Ordnung ist, denn ich habe das Gefühl, dass meine Routen Fehler zurückgeben.

Hallo, ich würde gerne wissen, ob ein Entwickler mir helfen kann, zu verstehen, warum meine API nicht funktioniert

Ich denke, das Problem liegt im Index, da das Object controllers korrekt ist. Kommt das daher, dass ich controllers in der Funktion start zurückgebe?

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, 

    }) 

    ;

};

Der GitHub-Link: Gladys/server/services/rflink at master · mTondenier/Gladys · GitHub

Vielen Dank im Voraus für die Hilfe und ich hoffe, das Modul bald veröffentlichen zu können.

Das kann tatsächlich nicht funktionieren!

Der Controller muss vom Konstruktor des Dienstes zurückgegeben werden, nicht von der Funktion start.

Ducoup muss ich den Dienst am Start hindern, wenn der Benutzer nicht rflinkpath definiert hat, aber wenn ich meinen Dienst Rflinkpath stoppe, kann rflinkpath dann nicht mehr geändert werden?

Ich denke, du solltest die Art und Weise, wie deine Klassen organisiert sind, überarbeiten. Dein Controller sollte ohne all das starten können, genauso wie dein RfLinkManager-Objekt!

Mach das alles außerhalb der Start-Funktion.

Die Start-Funktion sollte nur « .connect » mit dem Wert von RFLINK_PATH aufrufen

Ich empfehle dir, dich von den anderen Diensten inspirieren zu lassen :slight_smile:

Danke für deine Schnelligkeit, ich werde alles überprüfen, damit es funktioniert.

Alles klar, ich habe bereits eine Lösung gefunden :grinning: .

Ich möchte nur wissen, ob du mir erklären kannst, warum ich 404-Fehler bekomme, wenn ich die Routen meines Controllers aufrufe.

Hier ist der Server-Fehler (sieht aus wie ein Authentifizierungsproblem):

2020-02-08T15:25:37+0100 <debug> index.js:95 (WebSocketServer.<anonymous>) Neuer Benutzer verbunden in WebSocket, [object Object]
2020-02-08T15:25:37+0100 <debug> index.js:117 (WebSocket.<anonymous>) JsonWebTokenError: ungültige Signatur
    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'
}

Das ist die letzte Frage für heute, danach höre ich auf :innocent:

Meiner Meinung nach sind das ganz andere Logs… Diese Logs treten nur auf, wenn du deinen Entwicklerserver neu startest. Die Zugriffstoken werden ungültig, das ist Debugging, keine Fehler

Sind deine Routen wirklich 404? Bist du sicher, dass dein Controller richtig exponiert ist?

Diese Logs erscheinen jedes Mal, wenn ich auf meine Schaltfläche in der UI drücke, ich suche weiter.

Solange ich schon dabei bin, gebe ich mal den Fortschritt des Moduls bekannt:

Was bereits erledigt ist:

  • Backend:

    • Geräte erstellen
    • neuen Wert von einem Gerät empfangen
    • Wert eines Geräts ändern
    • Milight-Geräte paaren und entpaaren
  • Frontend:

    • Konfigurationsseite

Was noch zu tun ist:

  • Anzeige aller Geräte auf einer Seite (ich habe die Seite von Philips Hue kopiert, aber es funktioniert nicht)

  • Statusanfragen ohne 404-Fehler empfangen

  • Änderungen von Farbe, Helligkeit, … der Milight-Geräte verwalten

So, das Modul ist nicht mehr weit von der Fertigstellung entfernt

Der GitHub: GitHub - mTondenier/Gladys at rflink · GitHub

Vielleicht verstehe ich es nicht, aber was hat das mit Milight zu tun? :slight_smile:

RFlink unterstützt die Milight-Lampen, daher sollte es möglich sein, diese Lampen ohne eine Bridge zu paaren, wenn jemand sie verwenden möchte.

Bei meinem 404-Problem betrifft es nur eine Route, nämlich

/api/v1/service/rflink/status

und ich habe überprüft, dass es dasselbe für den Z-Wave-Dienst ist, der ebenfalls einen 404 auf seiner Route erhält:

/api/v1/service/zwave/status

Ohne diese Route weiß die Frontend-Anwendung nicht, ob das RFlink-Gateway verbunden ist.

Ist das im Z-Wave-Modul normal?

Könntest du bitte WIP in den Titel deines PRs schreiben @joeypic?

Es ist nur, um anzuzeigen, dass die Entwicklung noch läuft. Danke :+1:

Also versteht niemand, warum die „status“-Routen nicht funktionieren?

@pierre-gilles Ich würde gerne wissen, ob es in meinem Dienst möglich ist, eine Bedingung zu erstellen, um zu überprüfen, ob ein Gerät in der Datenbank existiert oder nicht?

Ich glaube, niemand hatte Zeit, sich deinen Code anzusehen.

Ein bisschen Geduld :wink:

Du musst Recht haben :upside_down_face:
Es ist nur so, dass die RC am 21. erscheint und ich sehen wollte, ob ich den Service vorher veröffentlichen kann