NEWS
Hilfe bei der Verwendung von serialport
-
Guten Morgen,
über einen Arduino erhalte ich zyklisch alle 5 Sekunden Messwerte (Temperatur, Luftfeuchte und CO2) über ein serielle Schnittstelle. Die Messwerte kommen sauber an und werden z.B. in hterm angezeigt. Jetzt würde ich die Werte gerne in Datenpunkte in iobroker schreiben, um sie weiter zu verarbeiten. Folgendes Testprogramm verwende ich in JS, um die Kommunikation zu testen (Erstmal öffnen der Schnittstelle und etwas schreiben):
var SerialPort = require('serialport'); var port = new SerialPort('COM3', { baudRate: 9600 }); port.write('Test');
Bei mir wird 'serialport' rot unterstrichen und ich erhalte folgende Fehlermeldung:
javascript.0 07:22:42.312 error script.js.common.Sensoren_allgemein.Skript_1: TypeError: SerialPort is not a constructor javascript.0 07:22:42.312 error at script.js.common.Sensoren_allgemein.Skript_1:3:12 javascript.0 07:22:42.312 error at script.js.common.Sensoren_allgemein.Skript_1:12:3
Unter der Instanz javascript.0 habe ich bei zusätzlichen npm-Modulen serialport eingetragen.
Woran könnte der Fehler noch liegen? iobroker ist auf einem Windows 10 PC installiert.
Schon einmal danke. Ich bin etwas ratlos. -
So sieht das bei den npm-Modulen aus:
-
@benejan Versuch mal so:
const { SerialPort } = require('serialport'); var port = new SerialPort('COM3', { baudRate: 9600 }); port.write('Test');
-
@asgothian Das serialport bleibt weiterhin rot unterstrichen, nur die Fehlermeldung hat sich geändert:
javascript.0 09:31:46.062 error script.js.common.Sensoren_allgemein.Skript_1: TypeError: "path" is not defined: undefined javascript.0 09:31:46.062 error at script.js.common.Sensoren_allgemein.Skript_1:3:12 javascript.0 09:31:46.062 error at script.js.common.Sensoren_allgemein.Skript_1:12:3
-
@benejan hast du die Doku zum Serialport gelesen (die aktuelle, und nicht Beispiele zur Nutzung von vor x Jahren ?)
da steht eindeutig:
import { SerialPort } from 'serialport' const serialport = new SerialPort({ path: '/dev/example', baudRate: 9600 }) serialport.write('ROBOT POWER ON')
das
import { SerialPort } from 'serialport'
ist gleichzusetzen mitconst { SerialPort } = require('serialport');
A.
-
@asgothian
etwas off topic.Kannst du mir mal einen link geben warum man dies nun in {} setzt.
Hab ich in keinem meiner Scripte.
-
@bahnuhr sagte in Hilfe bei der Verwendung von serialport:
@asgothian
etwas off topic.Kannst du mir mal einen link geben warum man dies nun in {} setzt.
Hab ich in keinem meiner Scripte.
Das hat etwas damit zu tun was du importierst.
Man nehme:
ein Modul
myModule
welches 2 Klassen exportiert,A
undB
.Wenn du das benutzen willst kannst du das auf verschiedene Art tun:
const module = require('myModule') const instance_of_a = new module.A(); const classA = require('myModule').A const another_Instance_of_a = new classA() const {A} = require('myModule') const thirdinstanceofa = new A(); const {A,B} = require('myModule');
Insbesondere der letzte require Befehl ist dabei interessant - er gibt Dir zugriff auf beide Klassen ohne das du den Umweg über module.A und module.B machen musst.
Ob diese Syntax also notwendig ist hängt davon ab was du per require importierst
A.
-
@asgothian Ja das hatte ich gelesen und auch schon ausprobiert.
Dann ist das serialport immer noch rot unterstrichen und es wird folgende Fehlermeldung ausgegeben:javascript.0 16:37:39.743 error script.js.common.Sensoren_allgemein.Skript_1 compile failed: at script.js.common.Sensoren_allgemein.Skript_1:2
-
Das rot unterstrichene bedeutet, das der Editor den Typ nicht finden kann. Das ist aber nur eine Editor Geschichte und passiert immer dann wenn die Bibliothek keine typdefinitionen mitliefert.
Wenn der Code funktioniert, kann das ignoriert werden. -
@benejan Du hast gelesen was ich über
import
undrequire
geschrieben habe ?A.
-
Du musst dann nochmal den aktuellen Code zeigen.
Die Fehlermeldung bedeutet, das die Compilation, also die Übersetzung von typescript nach JavaScript nicht funktioniert.
Also hast Du da noch einen Syntax Fehler drin.Zum selber lesen auch hier mal die Dokumentation
https://serialport.io/docs/api-serialportDu musst allerdings, glaube ich, immer require verwenden,
Da der JavaScript Adapter noch commonjs ist und nicht ein richtiges Node Modul. -
Ja, in die Doku habe ich geschaut, aber kann dort nichts finden, was mich weiterbringt in diesem Fall. Als Code habe ich genau das zum testen genommen, was @Asgothian vorgegeben hat:
import { SerialPort } from 'serialport' const serialport = new SerialPort({ path: '/dev/example', baudRate: 9600 }) serialport.write('ROBOT POWER ON')
-
sorry, nein, du hast nicht das selbe wie @Asgothian übernommen.
Selbst nachdem ich es nochmals geschrieben habe (weil ich es vermutet habe)
Hast du das auch nicht übernommen.Das läuft ohne Fehler:
const { SerialPort } = require('serialport'); const serialport = new SerialPort({ path: '/dev/example', baudRate: 9600 }) serialport.write('ROBOT POWER ON')
Warum machen manche einem die Hilfe so schwer in dem sie die anghebotene Hilfe nicht sorgfältig genug lesen?
@asgothian sagte in Hilfe bei der Verwendung von serialport:
import { SerialPort } from 'serialport' const serialport = new SerialPort({ path: '/dev/example', baudRate: 9600 }) serialport.write('ROBOT POWER ON')
das import { SerialPort } from 'serialport' ist gleichzusetzen mit const { SerialPort } = require('serialport');
und
@oliverio sagte in Hilfe bei der Verwendung von serialport:
Du musst allerdings, glaube ich, immer require verwenden,
Da der JavaScript Adapter noch commonjs ist und nicht ein richtiges Node Modul.Den konkreten Pfad musst du selbst herausfinden, da das Geräte und Hardwareabhängig ist auf deinem Rechner. /dev/example ist nur ein dummy wert
Ausserdem empfehle ich, die ; am Ende einer Befehlszeile immer zu setzen, da es ein paar Fälle gibt, wo javascript das Zeilenende nicht richtig interpretieren kann:
https://javascript.info/structure#semicolonNachtrag:
wei es mir erst gerade aufgefallen ist:Der wahre Grund des Fehlers ist dann im iobroker log sichtbar, falls man debug level debug für den javascript adapter aktiviert hat:
javascript.0 2025-03-16 23:06:05.577 error SyntaxError: Cannot use import statement outside a module javascript.0 2025-03-16 23:06:05.576 error ^^^^^^ javascript.0 2025-03-16 23:06:05.576 error import { SerialPort } from 'serialport' javascript.0 2025-03-16 23:06:05.575 error script.js.Skript_1 compile failed: at script.js.Skript_1:4
wäre glaube ich auch mal etwas was man im skriptlog mit anzeigen könnte @haus-automatisierung
Nur die letzte Zeile im Skriptlog ist nicht immer ganz erklärend -
@oliverio sagte in Hilfe bei der Verwendung von serialport:
Nur die letzte Zeile im Skriptlog ist nicht immer ganz erklärend
Ja, das Problem ist, dass das Log innerhalb der Scripts nach der Script ID sucht. Alles, wo nicht die Script ID enthalten ist, wird ausgeblendet. Dadurch fehlt meistens die (wichtige) erste Zeile des Logs und nur der Stack wird angezeigt.