NEWS
USB Sendkey auslesen im Script
-
Hallo zusammen,
hat hier wer mal versucht ein Geräte, welches über USB angeschlossen ist, den Sendkey abzufangen?
Es geht um einen USB RFID Sensor, der sendet was per Sendkey. Das würde ich gerne mit einem Script abfangen.
Erste Versuche mit dem Adapter HID, Node-HID, Node-HID-Stream gehen soweit, aber nur unter Node 8.
Bei Node 10 hapert es noch. Alles recht aufwendig.Ich frag mich daher, geht es nicht einfacher? Es gibt viele Adapter, die über USB kommunizieren, also denke ich, es muss einfacher gehen. Ich muss ja nur auf die Schnittstelle irgendwie hören.
Wäre schön, wenn ein Entwickler, der Ahnung davon hat, mir ein paar Tipps gehen könnte.Gruß und Danke Ple
-
@ple sagte in USB Sendkey auslesen im Script:
Es gibt viele Adapter, die über USB kommunizieren, also denke ich, es muss einfacher gehen. Ich muss ja nur auf die Schnittstelle irgendwie hören.
da ich das gerät nicht habe kan ich dies bezüglich keine aussage machen.
Generell unterstützt das node framework ein NPM Modul genannt "serial port", dieses ist dafür zuständig alles seriellen (USB ist im principe eine serielle Schnittstelle) aus zu lesen und die daten die da reinkommen weiter zu übertragen.Also theoretisch kan javascript oder ein adapter mit diesem Protokoll reden und die daten aus der Schnittstelle auslesen.
Dan kommt die frage, wie kommen die daten rein, alle meine adapter die mit serial port reden bekommen die Sachen binär und müssen dan noch weiter ausgewertet werden das kan man aber nur wissen wen man das geraet hat und probiert.
Bezüglich zendkey hab ich so schnell kein NPM Modul gefunden was hier helfen könnte.
-
Also, serial port klingt schon mal gut.
Bisher hatte ich folgende Lösung, aber die ist umständlich.
Es gibt das Node-Hid npm, dieses wir auch mitinstalliert mit dem Community-HID-Adapter. Der alte von SOEF scheint nicht mehr zu funktionieren, ist aber noch in der Repo. Könnte man bei Gelegenheit mal ändern.
Also, der HID installiert Node-HID mit. Jetzt gibt es die npm Module Node-HID-Stream sowie usb-barcode-transform.
Die hochen auf der Vendor ID und wandeln den Buffer dann in Integer.
Aber die Lösung ist nicht so dolle, da der User iobroker erst noch Rechte braucht. Also alles sehr umständlich.Serial Port klingt da einfacher und besser. Hast du zufällig ein Beispiel parat? Per Sendkey kommen HEX blöcke rein, die wandeln wir jetzt auch schon in Integer um mit einer Schleife, wollte das aber mal mit dem Readbuffer machen. Scheint wohl so ne Funktion zu sein von Node.
sonst, ich könnte dir auch 2 Geräte mal zukommen lassen, wenn du gerade Langeweile hast
Könnte mir vorstellen, dass es für einige User interessant sein könnte, da die über USB angeschlossen werden können und kosten nur 6€. Die anderen Varianten kenne ich nur mit Wemos und mqtt z.B. , Aber das auch wieder frickellei.Gruß und Danke
Update:
So es gibt anscheinend noch einen einfacheren Weg, der auch unter Node 10 usw. läuft. Da der RFID als HID erkannt wird, geht Serialport soweit auch nicht, zumindest was ich gelesen habe.
Die Vollständige Anleitung mache ich morgen fertig. Auf die schnelle:- usb-barcode-scanner im Javascript mit eintragen, wird soweit auch alles mitinstalliert auch Node-HID.
- udev Regel anlegen, da der User Iobroker keine Rechte hat, das HID Device zu lesen. Es ist ein Hidraw Devices.
sudo nano /etc/udev/rules.d/90-hidraw-permission.rules KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"
- User iobroker mit in die Gruppe plugdev.
sudo usermod -aG plugdev iobroker
Script für USB Device erkennen
var hid = require('node-hid'); console.log(JSON.stringify(hid.devices()));
Script für ID der RFIDReader auszulesen.
let UsbScanner = require('usb-barcode-scanner').UsbScanner; let scanner = new UsbScanner({ vendorId: 65535, productId: 53 }); scanner.on('data', (data) => { console.log(decimalToHex(data)); }); scanner.startScanning(); function decimalToHex(d, padding) { var hex = Number(d).toString(16); padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding; while (hex.length < padding) { hex = "0" + hex; } var s = ""; var i = hex.length; while (i>0) { s += hex.substring(i-2,i); i=i-2; } return s; }
Gruß