NEWS
JavaScript… und mühsam ernährt sich das Eichhörnchen!
-
Hi,
ich versuche mich aktuell an einem Javascript zum Auslesen einer Waterkotte Wärmepumpe mit Resümat CD4 Steuergerät.
Die WP kann über eine RS232 Schnittstelle ausgelesen werden.
Wenn ich folgendes Script starte und parallel auf den Serial Port sniffe kann ich sehen das die Wärmepumpe antwortet:
! ````
createState('Waterkotte.Daten.Rohdaten');
var SerialPort = require("serialport");
var buffer = new Buffer(12);
buffer[0] = 0x10;
buffer[1] = 0x02;
buffer[2] = 0x01;
buffer[3] = 0x15;
buffer[4] = 0x00;
buffer[5] = 0x00;
buffer[6] = 0x00;
buffer[7] = 0xf3;
buffer[8] = 0x10;
buffer[9] = 0x03;
buffer[10] = 0x7c;
buffer[11] = 0x32;
var port = new SerialPort("/dev/ttyUSB0", {
baudRate: 9600,
dataBits : 8,
parity : 'none',
stopBits: 1,
flowControl : false,
},
function (err) {
if (err) {
return console.log('Error1: ', err.message);
! }
! // Flush input
port.flush();
! // send hello
port.write(buffer, function(err) {
if (err) {
return console.log('Error on write: ', err.message);
! }
console.log('Daten gesendet');
// port.close();
});
});
! port.on('data', function (data) {
console.log('Data: ' + data.toString('hex'));
var daten=[];
daten=data.toString('hex');
setState('Waterkotte.Daten.Rohdaten', daten & 0xFF,true);
port.close();
});
! port.on('open', function() {
console.log('Connected');
});
! port.on('error', function(err) {
console.log('Error2: ', err.message);
// port.close();
});
! // close port if the script stopped (to be able to open it again)
onStop(function (callback) {
if (port && port.isOpen) {
port.close();
console.log('port closed');
}
// callback();
! });Antwort der WP im sniffer welchen ich hiermit gestartet habe:
jpnevulator --ascii --timing-print --tty /dev/ttyUSB0:SB9600d --read
Lautet wie erwartet so: >! ```` 2018-02-27 14:00:41.299950: FF 10 02 00 17 1F BE 12 0C 06 03 05 29 BE CE 0D ............)... C0 B0 45 A0 C0 AD 64 1E C0 F9 35 D0 41 A3 60 D1 ..E...d...5.A.`. 41 C5 54 D2 41 D3 FF 33 42 C1 C0 34 42 52 38 DE A.T.A..3B..4BR8. C2 00 00 70 41 D6 DA 87 40 4E 6F BA 40 14 36 C2 ...pA...@No.@.6. 40 2C 21 41 00 00 A0 41 00 00 00 00 45 75 28 40 @,!A...A....Eu(@ E4 66 BB 40 F9 35 D0 41 A3 60 D1 41 00 00 90 41 .f.@.5.A.`.A...A A3 60 D1 41 C1 C0 34 42 03 39 0E 1B 02 12 F0 DC .`.A..4B.9...... 5C 46 66 A8 1B 46 B2 F2 82 45 00 00 00 00 01 01 \Ff..F...E...... 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 C7 ................ 53 00 00 0A 09 25 2A 12 12 01 0D 01 E3 20 00 00 S....%*...... .. 4E 5B 1D C0 82 E9 43 40 92 E6 17 40 E1 51 FE 3E N[....C@...@.Q.> 09 6F 14 42 B5 8B 00 42 CC 77 1B 41 3F 3F 47 42 .o.B...B.w.A??GB 02 00 00 00 A0 41 00 00 00 00 00 00 00 00 29 74 .....A........)t 03 00 00 00 20 00 05 00 00 8B B5 00 00 00 00 00 .... ........... 00 00 00 40 08 08 00 00 00 00 00 00 00 01 27 00 ...@..........'. A2 01 27 00 28 35 12 10 03 02 5E FF ..'.(5....^. >! ```` Im Log/Console erscheinen immer verschiedene Werte: >! ```` 14:00:41.247 [info] javascript.0 Stop script script.js.Skript1 14:00:41.277 [info] javascript.0 Start javascript script.js.Skript1 14:00:41.278 [info] javascript.0 script.js.Skript1: registered 0 subscriptions and 0 schedules 14:00:41.279 [info] javascript.0 script.js.Skript1: Connected 14:00:41.279 [info] javascript.0 script.js.Skript1: Daten gesendet 14:00:41.391 [info] javascript.0 script.js.Skript1: Data: d0 14:00:54.192 [info] javascript.0 Stop script script.js.Skript1 14:11:15.612 [info] javascript.0 Stop script script.js.Skript1 14:11:18.807 [info] javascript.0 Start javascript script.js.Skript1 14:11:18.808 [info] javascript.0 script.js.Skript1: registered 0 subscriptions and 0 schedules 14:11:18.814 [info] javascript.0 script.js.Skript1: Connected 14:11:18.818 [info] javascript.0 script.js.Skript1: Daten gesendet 14:11:18.843 [info] javascript.0 script.js.Skript1: Data: 14:11:28.669 [info] javascript.0 Stop script script.js.Skript1 14:11:29.698 [info] javascript.0 Start javascript script.js.Skript1 14:11:29.699 [info] javascript.0 script.js.Skript1: registered 0 subscriptions and 0 schedules 14:11:29.700 [info] javascript.0 script.js.Skript1: Connected 14:11:29.700 [info] javascript.0 script.js.Skript1: Daten gesendet 14:11:29.753 [info] javascript.0 script.js.Skript1: Data: @ 14:11:45.748 [info] javascript.0 Stop script script.js.Skript1 14:11:47.483 [info] javascript.0 Start javascript script.js.Skript1 14:11:47.485 [info] javascript.0 script.js.Skript1: registered 0 subscriptions and 0 schedules 14:11:47.485 [info] javascript.0 script.js.Skript1: Connected 14:11:47.485 [info] javascript.0 script.js.Skript1: Daten gesendet
Jemand eine Idee warum die Ausgabe nicht im logfile erscheint?
Problem vom Script oder vom JS Adapter?
Danke und Gruß
Mirko
-
Sieht irgendwie so aus, als ob beim
data.toString('hex')
dein Script abschmiert. Was wird denn ins log geschrieben, wenn du nur ein einfaches
console.log(data);
ausführst?
-
Hi,
da wird nichts geschrieben.
Das hatte ich schon probiert und vergessen zu erwähnen.
-
Hi. Hm. Das ist ja kurios. Bin jetzt nicht der Experte, sondern beschäftige mich einfach aktuell mit JavaScript und schaue mir ein paar Online-Kurse an. Auf der Grundlage hätte ich jetzt erwartet, dass da auf jeden Fall irgendwas kommt. Und sei es ein 'undefined' oder 'null'.
Sorry… Da muss ich wohl doch noch ein bisschen weiter lernen :oops: :?
-
Kein Thema… ich lerne ja auch noch.
Wobei mich das gerade zur Verzweiflung treibt
-
Ohne detailierte Analyse: das "read"-Event wird jedes mal aufgerufen, wenn Daten eintreffen, im Allgemeinen also nur Bruchstücke der gesamten Übertragung. Schau dir nochmal die Dokumentation und Beispiele des Serial-Port Moduls an. Es wird vermutlich ein bestimmtes Zeichen zum Ende der Übertragung gesendet, dieses musst du z.B. mit dem ReadLineParser oder dem ReadyParser nutzen. Der Parser "sammelt" die Daten bis zum definierten Zeichen für dich.
-
OK.
Da muss ich mal schauen ob ich damit klar komme.
-
Ohne detailierte Analyse: das "read"-Event wird jedes mal aufgerufen, wenn Daten eintreffen, im Allgemeinen also nur Bruchstücke der gesamten Übertragung. Schau dir nochmal die Dokumentation und Beispiele des Serial-Port Moduls an. Es wird vermutlich ein bestimmtes Zeichen zum Ende der Übertragung gesendet, dieses musst du z.B. mit dem ReadLineParser oder dem ReadyParser nutzen. Der Parser "sammelt" die Daten bis zum definierten Zeichen für dich. `
Bevor ich versuche das zu vertiefen habe ich noch eine Frage.
Sollte ich denn nicht bereits vor dem Parsen die Antwort Daten zumindest in der Konsole sehen?
-
Wenn ich das richtig sehe kommt manchmal ein Zeichen, manchmal nicht. Du konvertierst natürlich auch einfach irgendwelche bits und bytes in text, das muss nicht immer etwas sinnvolles ergeben. Und du schließt den Port dann ja auch sofort, nachdem das erste mal ein Daten-Fragment rein kommt.
-
Hi PMAN,
danke für deine Antwort aber das ist mein erstes Javascript und ich stehe auf dem Schlauch.
Wieso schließe ich den Port sofort wieder?
Wenn dem so ist, warum sehe ich am Sniffer die komplette Antwort der Wärmepumpe?
Danke und Gruß
-
OK.
bin ein Stück weiter.
Daten werden gelesen nachdem ich das geändert habe:
port.on('data', function (data) { console.log('Data: ' + data.toString('hex')); var daten=[]; daten=data.toString('hex'); setState('Waterkotte.Daten.Rohdaten', daten & 0xFF,true); //port.close(); --> Port wurde zu schnell geschlossen! });
aber nicht als HEX sondern so:
! ````
18:08:40.617 [info] javascript.0 script.js.Skript1: registered 0 subscriptions and 0 schedules
18:08:40.621 [info] javascript.0 script.js.Skript1: Connected
18:08:40.625 [info] javascript.0 script.js.Skript1: Daten gesendet
18:08:40.652 [info] javascript.0 script.js.Skript1: Data: �
18:08:40.667 [info] javascript.0 script.js.Skript1: Data: �)��
18:08:40.681 [info] javascript.0 script.js.Skript1: Data: �����p���
18:08:40.698 [info] javascript.0 script.js.Skript1: Data: �A��Aw�B��3 18:08:40.714 [info] javascript.0 script.js.Skript1: Data: Bsr6BR8��pA 18:08:40.729 [info] javascript.0 script.js.Skript1: Data: �"@ 18:08:40.745 [info] javascript.0 script.js.Skript1: Data: ���� B�? 18:08:40.762 [info] javascript.0 script.js.Skript1: Data: ���?Y��@�� 18:08:40.777 [info] javascript.0 script.js.Skript1: Data: A�
�A�A�`�
18:08:40.793 [info] javascript.0 script.js.Skript1: Data: Asr6B�
18:08:40.810 [info] javascript.0 script.js.Skript1: Data: ]F�F�E
18:08:40.826 [info] javascript.0 script.js.Skript1: Data:
18:08:40.841 [info] javascript.0 script.js.Skript1: Data: �S
18:08:40.857 [info] javascript.0 script.js.Skript1: Data: %* � N
18:08:40.874 [info] javascript.0 script.js.Skript1: Data: [���C@��@�
18:08:40.889 [info] javascript.0 script.js.Skript1: Data: Q�> oB��B�
18:08:40.905 [info] javascript.0 script.js.Skript1: Data: wA??GB�A
18:08:40.922 [info] javascript.0 script.js.Skript1: Data: +�
18:08:40.937 [info] javascript.0 script.js.Skript1: Data: �
18:08:40.953 [info] javascript.0 script.js.Skript1: Data: �
18:08:40.970 [info] javascript.0 script.js.Skript1: Data: ''(5
18:08:40.985 [info] javascript.0 script.js.Skript1: Data: �L�EDIT: sehe die HEX Daten jetzt im log, allerdings nicht in einem String oder?
javascript.0 2018-02-28 19:24:20.743 info Stop script script.js.Skript1
javascript.0 2018-02-28 19:22:15.871 info script.js.Skript1: Data: 0311a1ff
javascript.0 2018-02-28 19:22:15.855 info script.js.Skript1: Data: 000127001701270028351210
javascript.0 2018-02-28 19:22:15.840 info script.js.Skript1: Data: 000003010808000000000000
javascript.0 2018-02-28 19:22:15.823 info script.js.Skript1: Data: a3200020000000020000000000
javascript.0 2018-02-28 19:22:15.807 info script.js.Skript1: Data: 000000000000002c9d020002
javascript.0 2018-02-28 19:22:15.792 info script.js.Skript1: Data: 413f3f474202000000a04100
javascript.0 2018-02-28 19:22:15.775 info script.js.Skript1: Data: fe3e096f1442b58b0042cc771b
javascript.0 2018-02-28 19:22:15.760 info script.js.Skript1: Data: c082e9434092e61740e151
javascript.0 2018-02-28 19:22:15.744 info script.js.Skript1: Data: 2a1212010d01e32000004e5b1d
javascript.0 2018-02-28 19:22:15.727 info script.js.Skript1: Data: 0000000000c7530000020925
javascript.0 2018-02-28 19:22:15.711 info script.js.Skript1: Data: 010101010101010101010101
javascript.0 2018-02-28 19:22:15.696 info script.js.Skript1: Data: ccdb1b461c01834500000000
javascript.0 2018-02-28 19:22:15.680 info script.js.Skript1: Data: 4630422512141c0212e8175d46
javascript.0 2018-02-28 19:22:15.663 info script.js.Skript1: Data: 757de24100009041757de2417a
javascript.0 2018-02-28 19:22:15.647 info script.js.Skript1: Data: cc8c3f83fa05414da0d641
javascript.0 2018-02-28 19:22:15.632 info script.js.Skript1: Data: 7f581442666626c00000000045
javascript.0 2018-02-28 19:22:15.615 info script.js.Skript1: Data: 0044a63de1188cc07ecb0bc1
javascript.0 2018-02-28 19:22:15.599 info script.js.Skript1: Data: 7a4630425238dec200007041
javascript.0 2018-02-28 19:22:15.584 info script.js.Skript1: Data: 757de2417d610a42d3ff3342
javascript.0 2018-02-28 19:22:15.567 info script.js.Skript1: Data: c0c36bd0c0edefb7c04da0d641
javascript.0 2018-02-28 19:22:15.552 info script.js.Skript1: Data: 171fbe120c0603052920a6c6
javascript.0 2018-02-28 19:22:15.537 info script.js.Skript1: Data: ff100200
javascript.0 2018-02-28 19:22:15.508 info script.js.Skript1: Daten gesendetJemand einen Tipp warum ich die nicht in den Datenpunkt geschrieben werden? Der steht auf "0": Danke
-
Habe mal versucht einen Parser zu verwenden. Serialport auf ich auf dem Test System auf 6.1.1 upgedatet.
Wenn ich jetzt im JS Adapter dieses Script starte:
! ````
//createState('Waterkotte.Daten.Rohdaten');
//var SerialPort = require("serialport");
! // To use theByteLength
parser:
const SerialPort = require('serialport');
const ByteLength = SerialPort.parsers.ByteLength;
//const port = new SerialPort('/dev/ttyUSB0');
const parser = port.pipe(new ByteLength({length: 8}));
! var buffer = new Buffer(12);
buffer[0] = 0x10;
buffer[1] = 0x02;
buffer[2] = 0x01;
buffer[3] = 0x15;
buffer[4] = 0x00;
buffer[5] = 0x00;
buffer[6] = 0x00;
buffer[7] = 0xf3;
buffer[8] = 0x10;
buffer[9] = 0x03;
buffer[10] = 0x7c;
buffer[11] = 0x32;
const port = new SerialPort("/dev/ttyUSB0", {
baudRate: 9600,
dataBits : 8,
parity : 'none',
stopBits: 1
//flowControl : false
},
function (err) {
if (err) {
return console.log('Error1: ', err.message);
! }
! port.on('data', function (data) {
//parser.on('data', console.log) // will have 8 bytes per data event
console.log('Data: ' + data.toString('hex'));
var daten=[];
daten=data.toString('hex');
setState('Waterkotte.Daten.Rohdaten', daten,true);
//port.close();
});
! // Flush input
port.flush();
! // send hello
port.write(buffer, function(err) {
if (err) {
return console.log('Error on write: ', err.message);
! }
console.log('Daten gesendet');
// port.close();
});
});
! port.on('open', function() {
console.log('Connected');
});
! port.on('error', function(err) {
console.log('Error2: ', err.message);
//port.close();
});
! // close port if the script stopped (to be able to open it again)
onStop(function (callback) {
if (port && port.isOpen) {
port.close();
console.log('port closed');
}
// callback();
! });Bekomme ich diesen Fehler:
19:52:47.787 [error] javascript.0 script.js.Parser: script.js.Parser:8
19:52:47.788 [error] javascript.0 at script.js.Parser:8:21Das ist aus dem Script diese Zeile:
const parser = port.pipe(new ByteLength({length: 8}));
Und wenn ich das richtig interpretiere ab dem "21" Zeichen –> "pipe" !? Die Parser Funktion habe ich aus der Aktuellen Serial Port Doku zum testen benutzen wollen. Liegt das jetzt am JS Adapter 3.6.4 das er das nicht kennt? Danke für eure Hilfe
-
Jemand einen Tipp warum ich die nicht in den Datenpunkt geschrieben werden? Der steht auf "0": `
Hi,versuch mal das hier:
setState('Waterkotte.Daten.Rohdaten', daten);
Gruß
Franz
-
Hi Franz,
Mache ich morgen.
Danke !
Gute Nacht
Edit: keine Ruhe gehabt. Hat nichts geändert.
Morgen will mein Sohn mal gucken. [emoji9]
Gesendet von iPhone mit Tapatalk Pro
-
Du hast zu diesem Zeitpunkt keine Variable "port", also kannst du auch nicht port.pipe machen.
Ich finde super, dass du dich mit deinen begrenzten Vorkenntnissen an so ein Projekt wagst und du machst ja auch Fortschritte, also bitte folgendes nicht falsch verstehen:
Es ist grundsätzlich nicht auszuschließen, dass der Javascript Adapter Bugs hat, aber es ist sehr unwahrscheinlich, dass bei deinen Skills ein Fehler tatsächlich am Adapter liegt und nicht an deinem Code. Es hilft auch nicht, wenn hier jemand liest und dann einen Bug im Adapter sucht. Vielleicht änderst du mal den Titel in etwas sinnvolleres.
-
Hallo Pman,
Das mit dem Titel mache ich.
Der ist ja auch noch zu Beginn entstanden.
Ja, die lieben Anfänger…
Das mit dem Port.pipe hat mein Sohn mir gestern Nacht im Vorbeigehen auch gesagt.
Da war der Beitrag schon geschrieben und ich zu müde das im Script noch irgendwie richtig zu versuchen.
Gesendet von iPhone mit Tapatalk Pro
-
Hallo Mirko,
was passiert, wenn Du die Variable "daten" auf der Console ausgeben lässt?
Gruß
Franz
-
Hi Franz,
wenn ich das richtig verstehe ist die variable "daten" nichts anderes als die Ausgabe von:
console.log('Data: ' + data.toString('hex'));
Wenn ich also zum testen ein:
console.log('Daten: ' + daten);
einfüge, erhalte ich in der Ausgabe jeweils zwei Zeilen mit demselben Inhalt: Beispiel Auszug –>
08:19:11.522 [info] javascript.0 script.js.Parser: Data: 0000000127008901270028 08:19:11.522 [info] javascript.0 script.js.Parser: Daten: 0000000127008901270028 08:19:11.538 [info] javascript.0 script.js.Parser: Data: 351210038929ff 08:19:11.538 [info] javascript.0 script.js.Parser: Daten: 351210038929ff
Oder meintest du das anders?
Mirko
-
Hi Mirko,
ja, genau so.
Die Daten stehen also in der Variable "daten".
Und damit landet dann wirklich nichts hier?
setState('Waterkotte.Daten.Rohdaten', daten);
Was passiert, wenn Du das manuell machst?
var test = 1234
Waterkotte.Daten.Rohdaten', test);
Gruß
Franz
-
Hallo Franz,
doch, es landet etwas in dem Datenpunkt.
Aber immer nur das letzte der Ausgabe und nicht der komplette String.
z.B.
Ergebnis der Abfrage in der Console:
08:54:57.546 [info] javascript.0 script.js.Parser: Data: ff 08:54:57.562 [info] javascript.0 script.js.Parser: Data: 100200171fbe120c0603052918 08:54:57.577 [info] javascript.0 script.js.Parser: Data: 33cdc01191bfc0ffe9d3c0fb56 08:54:57.592 [info] javascript.0 script.js.Parser: Data: d8413d84de4165fb0742d3 08:54:57.608 [info] javascript.0 script.js.Parser: Data: ff334212c928425238dec20000 08:54:57.625 [info] javascript.0 script.js.Parser: Data: 704156ee5abeefa68dc0d000 08:54:57.640 [info] javascript.0 script.js.Parser: Data: 01c1c5c011429a9999bf0000 08:54:57.656 [info] javascript.0 script.js.Parser: Data: 0000b1e7933f61560341fb56 08:54:57.673 [info] javascript.0 script.js.Parser: Data: d8413d84de41000090413d84de 08:54:57.689 [info] javascript.0 script.js.Parser: Data: 4112c928421333090103126a 08:54:57.704 [info] javascript.0 script.js.Parser: Data: 2f5d46eaf01b46ea05834500 08:54:57.720 [info] javascript.0 script.js.Parser: Data: 00000001010101010101010101 08:54:57.737 [info] javascript.0 script.js.Parser: Data: 01010000000000c753000002 08:54:57.752 [info] javascript.0 script.js.Parser: Data: 09252a1212010d01e3200000 08:54:57.768 [info] javascript.0 script.js.Parser: Data: 4e5b1dc082e9434092e61740 08:54:57.785 [info] javascript.0 script.js.Parser: Data: e151fe3e096f1442b58b0042cc 08:54:57.800 [info] javascript.0 script.js.Parser: Data: 771b413f3f474202000000 08:54:57.816 [info] javascript.0 script.js.Parser: Data: a04100000000000000002cc502 08:54:57.833 [info] javascript.0 script.js.Parser: Data: 0002a320002000000002000000 08:54:57.848 [info] javascript.0 script.js.Parser: Data: 0000000003010808000000 08:54:57.864 [info] javascript.0 script.js.Parser: Data: 00000000012700890127002835 08:54:57.880 [info] javascript.0 script.js.Parser: Data: 1210039197ff
Eintrag im Datenpunkt:
Das versuche ich jetzt zu lösen…