NEWS
Wolf-Adapter Sollwertkorrektur in 0.5er Schritten
-
Moin zusammen,
ich bin noch sehr frisch hier im Forum, also hauptsächlich lesender Teilhaber.. Nehmt es mir also bitte nicht krumm, wenn meine Beiträge nicht das richtige "wording" oder die richtige Formatierung haben..
Ich habe mir gestern den Wolf-Adapter für meine Heizung installiert und das ISM8i erfolgreich angebunden. Leider ist mir aufgefallen, dass die Sollwertkorrektur (also quasi die Heizleistung) nicht in 0.5er Schritten einstellbar ist. Wenn ich die entsprechende Variable (wolf0.bm1.65) auf 0.5 oder 1.5 eingestellt habe, wird bei der Heizung auf -4 angepasst, oder gar nichts ändert sich..
Bevor ich hier grundlegende Fragen stelle, wollte ich kurz selber suchen und bin auf die Funktion "encodeDPT9" im Modul Encode (/opt/iobroker/node-modules/iobroker.wolf/js/encoder.js) aufmerksam geworden. Dort wird der übergebene Wert in das für die Schnittstelle notwendige Format (Anleitung Seite 33) übersetzt.
Encoder.prototype.encodeDPT9 = function(value, exp) { const data = [0,0]; if(exp === undefined) { exp = 2; } let mant = value * 100 / (1 << exp); //Fill in sign bit if (value < 0) { data[0] |= 0x80; mant = (~(mant * -1) + 1) & 0x07ff; } //Fill in exp (4bit) data[0] |= (exp & 0x0F) << 3; //Fill in mant data[0] |= (mant >> 8) & 0x7; data[1] |= mant & 0xFF; const buffer = new Buffer(2); buffer.writeUInt8(data[0], 0); buffer.writeUInt8(data[1], 1); return buffer; };
Das Problem (laut meiner knappen, stümperhaften Analyse) an der Stelle ist, dass der Funktion in keinem Aufruf ein Exponent mitgegeben wird. Wenn der Exponent-Parameter aber 'undefined' ist, wird immer 2 angenommen. Was meiner Meinung nach zu Fehlern führt.
Ich habe daher ein paar Zeilen Code hinzugefügt und konnte den Wert 0.5 erfolgreich als Sollwertkorrektur übergeben.
Encoder.prototype.encodeDPT9 = function(value, exp) { const data = [0,0]; // Mantisse hat 11 Bit, also -2048 bis 2047 // exp berechnen wenn darüber oder darunter // NEU =========================================== if(exp === undefined) { exp = 0; let mant = (value*100)/2; while (mant.toString(2).length > 11) { mant = mant/2; exp = exp+1; } } // ALT =========================================== /* if(exp === undefined) { exp = 2; } */ // =============================================== let mant = value * 100 / (1 << exp); //Fill in sign bit if (value < 0) { data[0] |= 0x80; mant = (~(mant * -1) + 1) & 0x07ff; } //Fill in exp (4bit) data[0] |= (exp & 0x0F) << 3; //Fill in mant data[0] |= (mant >> 8) & 0x7; data[1] |= mant & 0xFF; const buffer = new Buffer(2); buffer.writeUInt8(data[0], 0); buffer.writeUInt8(data[1], 1); return buffer; };
Vielleicht steckt ja einer von euch so tief im Code, dass er mir kurz erklären kann warum der Exponent an der Stelle nicht berechnet werden muss, oder was ich anderes übersehen habe.
Viele Grüße
Max