NEWS
Hex an TCP Client senden
-
Ich habe einen Modbus fähigen Dali Controller. Leider hat das mit Modbus nicht wirklich geklappt, daher bin ich auf die Idee gekommen den ganzen Hex Wert an das Gerät zu schicken. Den Hex Wert habe ich per Wireshark ausgelesen. Nun bin ich mir nicht sicher, wie ich den Wert per JavaScript oder NodeRed an das Gerät schicke.
Bei JavaScript sieht das immoment so aus:
var T1 = "javascript.0.Hilfswerte.Fernbedienung.T1"; on({id: T1 , change: "any"}, schalten); var net = require('net'); function schalten(){ if (getState(T1).val==true){ var hex_data = [0x01,0x9b,0x00,0x00,0x00,0x17,0x01,0x17,0x00,0x65,0x00,0x05,0x00,0x64,0x00,0x06,0x0c,0x12,0x8a,0x00,0x03,0x00,0x00,0x01,0xa0,0x00,0x00,0x00,0x00] var data = Buffer.from(hex_data); var ip = '192.168.178.36'; var port = 502; sendMessage(ip, port, data); } } function sendMessage(host, port, message) { var client = net.connect({host:host, port: port}, function () { // 'connect' listener console.log('connected to server!'); client.write(message); }); client.on('data', function (data) { console.log(data.toString()); client.end(); }); client.on('end', function () { console.log('disconnected from server'); }); client.on('error', function (error) { console.error('error: ' + error); client.end(); }); }
Und bei NodeRed so (Hatte noch nie was mit NodeRed zu tun):
Ich hab auch schon versucht den Hex Wert in verschiedene Formate umzuformen.
z.B.:["0x01“,"0x9b","0x00","0x00","0x00","0x17","0x01","0x17","0x00","0x65","0x00","0x05","0x00","0x64","0x00","0x06","0x0c","0x12","0x8a","0x00","0x03","0x00,"0x00","0x01","0xa0","0x00","0x00","0x00","0x00"]
Oder
\x01\x9b\x00\x00\x00\x17\x01\x17\x00\x65\x00\x05\x00\x64\x00\x06\x0c\x12\x8a\x00\x03\x00\x00\x01\xa0\x00\x00\x00\x00
-
@Malaus sagte in Hex an TCP Client senden:
"0x01“
Das “ ist kein " sondern ein “. Deswegen wird ein Fehler geworfen.
Versuch es mal mit:
["0x01","0x9b","0x00","0x00","0x00","0x17","0x01","0x17","0x00","0x65","0x00","0x05","0x00","0x64","0x00","0x06","0x0c","0x12","0x8a","0x00","0x03","0x00","0x00","0x01","0xa0","0x00","0x00","0x00","0x00"]
-
das hat funktioniert! Vielen Dank!
Jetzt muss ich mir nur noch was ausdenken, wie ich am sinnvollsten die Helligkeit der Lampe schalte. Am besten eine Dezimal in Hex umrechnen. -
@Malaus sagte in Hex an TCP Client senden:
Am besten eine Dezimal in Hex umrechnen.
Hier, falls du das noch benötigst:
const brightness = 60; const brightnessHex = brightness.toString(16);
-
nochmal Danke!
Hab das nun eingebaut und laut log rechnet er es auch um allerdings schaltet er nur bei sehr kleinen Zahlen (1,3,6,..) und bei den größeren geht es aus. Und auch immer nur die gleiche Helligkeit. Nimm ich z.B. "0xC8" und ersetze das mit brightnessHex, geht die Lampe auf die jeweilige Helligkeit.function schalten(){ const brightness = getState(T1).val; const brightnessHex = brightness.toString(16); console.log("Level " + brightnessHex); var hex_data = ["0x00","0x6f","0x00","0x00","0x00","0x17","0x01","0x17","0x00","0x65","0x00","0x05","0x00","0x64","0x00","0x06","0x0c","0x12","0x5f","0x00","0x03","0x00","0x00","0x00",brightnessHex,"0x00","0x00","0x00","0x00"] var data = Buffer.from(hex_data); var ip = '192.168.178.36'; var port = 502; sendMessage(ip, port, data); }
Edit: Hab das problem beim absenden erkannt es fehlt 0x also so:
const brightness = getState(T1).val; const brightnessHex = brightness.toString(16); const level = "0x" + brightnessHex
-
Durch:
client.on('data', function (data) { console.log(data.toString()); client.end(); });
Erhalte ich ja eine Antwort vom Client. Wie kann ich diese auswerten? Im Log bekomme ich nur seltsame Zeichen:
-
@Malaus ich weiß nicht genau was da ankommt, vermutlich ein Array? Dann versuch mal folgendes:
log(JSON.stringify(data));
-
Ja das funktioniert soweit:
Jetzt kann ich doch mit
JSON.parse();
das in Number umwandeln und danach wieder in Hex. Also mein Ziel wäre, es mit der gesendeten Hex Datei zu vergleichen.
Nur leider spuckt er mir nur [object][object] aus.
Wo ist da mein Denkfehler? -
@Malaus wenn du ein Buffer in ein JSON Object umwandeln möchtest, dann versuch mal folgendes:
const obj = JSON.parse(data.toString());
bzw.
const obj = data.toJSON().data;
-
@J-A-R-V-I-S ich hätte da noch eine Frage:
Gibt es eine simple Möglichkeit ein bestimmtes Modbus Register per Javascript abzufragen? Also das ich den Modbus Adapter umgehe. -
@Malaus mit Modbus habe ich leider nichts am Hut, da kann ich die leider nicht weiterhelfen.