@oliverio
Vielen Dank für Deine Erklärung.
Jetzt funktionieren beide Versionen des Scripts! Vielen Dank.
@oliverio
Vielen Dank für Deine Erklärung.
Jetzt funktionieren beide Versionen des Scripts! Vielen Dank.
@ticaki
Danke für den Tipp, aber die Fehlermeldungen bleiben leider gleich?
Noch ein Nachtrag:
Die Dateien von 'net' sehe ich hier, aber soll das alles sein?
pi@raspi4:/opt/iobroker/node_modules/@iobroker-javascript.0/net $ ls
index.js LICENSE package.json README.md test.js
pi@raspi4:/opt/iobroker/node_modules/@iobroker-javascript.0/net $
Hallo,
ich möchte in einem JS ein paar TCP-Daten an einen Server schicken.
Dazu wollte ich das 'net' Modul von node.js verwenden.
Also habe ich in den Instanzeinstellungen des JavaScript-Adapters unter "Additional npm modules" das Modul "net" eingetragen.
Das Log brachte keine Fehler:
javascript.0 2025-03-11 12:04:43.952 debug Installed custom library: "net@latest"
javascript.0 2025-03-11 12:04:37.797 debug Found custom library in config: "net@latest"
javascript.0 2025-03-11 12:04:37.675 debug Installed custom library: "axios@latest"
javascript.0 2025-03-11 12:04:31.536 debug Found custom library in config: "axios@latest"
javascript.0 2025-03-11 12:04:31.487 debug Installed custom library: "mail-listener4@latest"
javascript.0 2025-03-11 12:04:24.925 debug Found custom library in config: "mail-listener4@latest"
javascript.0 2025-03-11 12:04:24.923 debug Found installed libraries: ["axios","mail-listener4"]
javascript.0 2025-03-11 12:04:24.897 debug Custom libraries in config: "mail-listener4 axios net": ["mail-listener4","axios","net"]
Unter Putty sieht es so aus:
pi@raspi4:~ $ node -v
v20.18.3
pi@raspi4:~ $ nodejs -v
v20.18.3
pi@raspi4:~ $ npm -v
10.8.2
pi@raspi4:~ $ cd /opt/iobroker
pi@raspi4:/opt/iobroker $ npm ls --depth 0
iobroker.inst@3.0.0 /opt/iobroker
├── @iobroker-javascript.0/axios@npm:axios@1.8.2
├── @iobroker-javascript.0/mail-listener4@npm:mail-listener4@1.1.3
├── @iobroker-javascript.0/net@npm:net@1.0.2
├── iobroker.adguard@1.0.1
├── iobroker.admin@7.5.2
├── iobroker.alexa2@3.26.7
├── iobroker.backitup@3.1.0
├── iobroker.daswetter@3.2.3
├── iobroker.email@1.3.1
├── iobroker.ical@1.16.1
├── iobroker.javascript@8.9.1
├── iobroker.js-controller@7.0.6
├── iobroker.mqtt@6.1.2
├── iobroker.ping@1.7.9
├── iobroker.pvforecast@4.1.0
├── iobroker.samsung@0.6.1
├── iobroker.simple-api@2.8.0
├── iobroker.sonoff@3.2.1
├── iobroker.tr-064@4.3.0
├── iobroker.tuya@3.17.0
└── iobroker.zigbee@1.10.14
Was mich allerdings gewundert hat:
Unter "/opt/iobroker/node_modules" ist 'net' nicht zu finden? Ich dachte, dies wäre Bestandteil von node.js?
Mein JS sieht so aus:
var net = require('net'); // Node.js Modul für TCP-Verbindungen
/**
* Sendet HEX-Daten an eine angegebene IP-Adresse und Port.
* @param {string} ipAddress - Die Ziel-IP-Adresse.
* @param {number} port - Der Ziel-Port.
* @param {string} hexData - Die HEX-Daten, die gesendet werden sollen.
*/
function sendHexData(ipAddress, port, hexData) {
// Umwandlung der HEX-Daten in ein Buffer-Objekt
const bufferData = Buffer.from(hexData, 'hex');
// Verwendung von net.connect() anstelle von new net.Socket()
const client = net.connect(port, ipAddress, function() {
console.log('Verbunden mit: ${ipAddress}:${port}');
// Senden der HEX-Daten an den Server
client.write(bufferData, function() {
console.log('Daten gesendet: ${hexData}');
});
});
// Ereignisbehandlung bei Empfang von Daten vom Server
client.on('data', function(data) {
console.log('Daten empfangen: ' + data.toString());
});
// Ereignisbehandlung bei Verbindungsfehler
client.on('error', function(err) {
console.error('Verbindungsfehler: ' + err.message);
});
// Ereignisbehandlung bei Verbindungsende
client.on('close', function() {
console.log('Verbindung geschlossen');
});
}
// Beispielaufruf der Funktion mit dynamischen Parametern
const ipAddress = '192.168.1.243'; // Ziel-IP-Adresse
const port = 8899; // Zielport
const hexData = '553361390201020A93A2AAAA';
// Funktion mit den obigen Parametern aufrufen
sendHexData(ipAddress, port, hexData);
Es erzeugt allerdings den Fehler:
TypeError: net.connect is not a function
Eine 2. Version des Scriptes:
var net = require('net'); // Node.js Modul für TCP-Verbindungen
/**
* Sendet HEX-Daten an eine angegebene IP-Adresse und Port.
* @param {string} ipAddress - Die Ziel-IP-Adresse.
* @param {number} port - Der Ziel-Port.
* @param {string} hexData - Die HEX-Daten, die gesendet werden sollen.
*/
function sendHexData(ipAddress, port, hexData) {
// Umwandlung der HEX-Daten in ein Buffer-Objekt
const bufferData = Buffer.from(hexData, 'hex');
// Erstellung des TCP-Clients
const client = new net.Socket();
// Verbindung mit dem Ziel-Server
client.connect(port, ipAddress, function() {
console.log('Verbunden mit: ${ipAddress}:${port}');
// Senden der HEX-Daten an den Server
client.write(bufferData, function() {
console.log('Daten gesendet: ${hexData}');
});
});
// Ereignisbehandlung bei Empfang von Daten vom Server
client.on('data', function(data) {
console.log('Daten empfangen: ' + data.toString());
});
// Ereignisbehandlung bei Verbindungsfehler
client.on('error', function(err) {
console.error('Verbindungsfehler: ' + err.message);
});
// Ereignisbehandlung bei Verbindungsende
client.on('close', function() {
console.log('Verbindung geschlossen');
});
}
// Beispielaufruf der Funktion mit dynamischen Parametern
const ipAddress = '192.168.1.243'; // Ziel-IP-Adresse
const port = 8899; // Zielport
const hexData = '553361390201020A93A2AAAA'; //HEX-Daten
// Funktion mit den obigen Parametern aufrufen
sendHexData(ipAddress, port, hexData);
Dieses Script bringt den Fehler:
TypeError: net.Socket is not a constructor
Hätte bitte jemand einen Tipp für mich, wo der Fehler liegt?
Vielen Dank.
@thorkillar Danke. Das bedeutet, ich sollte den Alexa2-Adapter mal komplett löschen und neu installieren?
@frankyboy73
Den DP "player - Volume" habe ich noch nie benutzt.
Sobald im DP "speak-volume" ein anderer Wert als 0 drin ist, erzeugt jede speak-Ausgabe den Piepton. Egal, ob beim Speak-Command nur der reine Text drin steht oder die Lautstärke per "30;Text..." mit gesetzt wird.
Man kann also keine Textausgabe mit fester Lautstärke mehr machen, ohne das der blöde Piepton kommt.
@thorkillar Also hast Du jetzt seit kurzem auch diesen Piepton?
Wie schon gesagt, beim Dot2 ist der Ton nicht da, nur beim Dot3.
Ich habe den Alexa2-Adapter gerade mal von V3.12.0 auf V3.11.1 zurückgesetzt, bringt aber keine Änderung.
@frankyboy73
Ich hatte gedacht, dass sich per ssml die Lautstärke einstellen lässt:
<speak>
Ein Satz mit normaler Lautstärke.
<prosody volume="loud">Ein Satz mit hoher Lautstärke.</prosody>
<prosody volume="x-loud">Ein Satz mit ganz hoher Lautstärke.</prosody>
<prosody volume="+6dB">Ein weiterer Satz mit 6db höherer Lautstärke.</prosody>
<prosody volume="+10dB">Ein weiterer Satz mit 10dB höherer Lautstärke.</prosody>
</speak>
Das ganze funktioniert auch (und ohne Piep).
Allerdings kann auch damit die Lautstärke leider nur geringfügig angehoben werden. Ich dachte, man kann hier den Parameter bis zur maximalen Lautstärke setzen. Geht aber leider nicht?
@frankyboy73 Hallo, Danke für die Erklärung.
Das bedeutet allerdings, dass man neuerdings keine Ausgaben mit dem Speak-Command mehr ohne diese Piepse machen kann wenn man eine feste Lautstärke vorgeben will. Schade.
Dann werde ich wohl auf ssml umstellen müssen...
Danke an alle.
paulinchen
@liv-in-sky Du bist mein Held für heute!
Wenn ich den DP speak-volume auf 0 setze und dann direkt am Gerät die Lautstärke einstelle, funktioniert der speak-Befehl ohne die Pieps.
Aber ich dachte immer, der DP speak-volume enthält die aktuell am Gerät eingestellte Lautstärke?
Wie kann ich denn dann im Script die aktuelle Lautstärke abfragen?
Bisher habe ich den DP speak-volume in eine Variable ausgelesen, die Speak-Ansage gemacht (mit höherer Lautstärke) und dann den DP speak-volume wieder mit der Variablen gesetzt. Ging ja bisher auch. Jetzt bleibt der DP speak-volume bei mir aber auf 0 stehen?
@liv-in-sky Das Weglassen der Lautstärkeeinstellung im Speak-Command bringt keine Besserung.
Also auch nur mit dem reinen Text kommen die beiden Pieps.
Beim ssml-Befehl kommt auch am Anfang ein Piep.
Wie gesagt, auf dem Dot2 geht alles. Und auf den Dot3 ging es ja auch bis vor ein paar Tagen.