NEWS
Bits to Word / Word to Bits
-
Hi,
ich schreibe gerade meine ersten Skripte mit JavaScript (habe bis jetzt Erfahrungen mit C++ und SCL) und wollte Mal eure Meinung zu folgenden einfachen Skripten hören. Anregungen und Verbesserungen gerne gewünscht.
WordsToBits
const BIT0 = 1; const BIT1 = 2; const BIT2 = 4; const BIT3 = 8; const BIT4 = 16; const BIT5 = 32; const BIT6 = 64; const BIT7 = 128; const BIT8 = 256; const BIT9 = 512; const BIT10 = 1024; const BIT11 = 2048; const BIT12 = 4096; const BIT13 = 8192; const BIT14 = 16384; const BIT15 = 32768; let arrWordsToBits = [ [ "0_userdata.0.Test.MyInt", [ ["0_userdata.0.Test.MyBool", BIT0], ["0_userdata.0.Test.MyBool2", BIT2] ] ] ] function ConvertWordToBit(word, position) { return Boolean(word & position); } for (const outer_element of arrWordsToBits) { on({id: outer_element[0].toString(), change: 'ne'}, function(obj) { var word_value = getState(outer_element[0].toString()).val; for (const inner_element of outer_element[1]) { setState(inner_element[0].toString(), ConvertWordToBit(word_value, inner_element[1])); } }); }
BitsToWords
const BIT0 = 1; const BIT1 = 2; const BIT2 = 4; const BIT3 = 8; const BIT4 = 16; const BIT5 = 32; const BIT6 = 64; const BIT7 = 128; const BIT8 = 256; const BIT9 = 512; const BIT10 = 1024; const BIT11 = 2048; const BIT12 = 4096; const BIT13 = 8192; const BIT14 = 16384; const BIT15 = 32768; let arrBitsToWords = [ [ "0_userdata.0.Test.MyBool", "0_userdata.0.Test.MyInt2", BIT0 ], [ "0_userdata.0.Test.MyBool2", "0_userdata.0.Test.MyInt2", BIT2 ] ] function ModifyWord(word, bit, position) { if (bit) // value true --> set position { return word | position; } else // value false --> reset position { return word & ~position; } } for (const element of arrBitsToWords) { on({id: element[0].toString(), change: 'ne'}, function(obj) { var bit_value = getState(element[0].toString()).val; var word_value = getState(element[1].toString()).val; setState(element[1].toString(), ModifyWord(word_value, bit_value, element[2])); }); }
Mit freundlichen Grüßen
Kevin -
@kev-0
Siehe hier oder hier -
@kev-0
Ich persönlich würde dazu raten Datenstrukturen in Json zu verwenden, außer das wäre eine große geistige Umstellung. Zum Beispiel so:const arrWordsToBits={ "0_userdata.0.Test.MyInt": [ { dp: "0_userdata.0.Test.MyBool", val: BIT0 }, { dp: "0_userdata.0.Test.MyBool2", val: BIT2 } ] } function ConvertWordToBit(word,position) { return Boolean(word&position); } for (const outer_element of arrWordsToBits) { on({ id: outer_element,change: 'ne' },function (obj) { //var word_value=getState(obj._id).val; const word_value = obj.state.val; for (const inner_element of arrWordsToBits[obj.id]) { setState(inner_element.id.toString(), ConvertWordToBit(word_value,inner_element.val)); } }); }
Hoffe ich hab keinen Fehler gemacht, fällt mir mittlerweile schwer arrays in arrays in arrays zu lesen
nicht Wunder über die const... typescript eslint hat mich umerzogen.
-
@ticaki Vielen Dank für deine Antwort aber leider habe ich so meine Probleme damit bzw. auch Javascript
Ich bekomme die Fehlermeldung dass arrWordsToBits nicht iterierbar ist.
Viell. war es an meinem ersten Beispiel nicht gut ersichtlich aber es kann noch mehr MyInts geben die wiederum andere Bool schreiben z.B.let arrWordsToBits = [ [ "modbus.1.holdingRegisters.0_Fensterkontakte", [ ["0_userdata.0.Fensterkontakte.BalkonKindNordGeschlossen", BIT0], ["0_userdata.0.Fensterkontakte.BalkonKindSuedGeschlossen", BIT1], ["0_userdata.0.Fensterkontakte.BalkonSchlafGeschlossen", BIT2], ["0_userdata.0.Fensterkontakte.FensterAnkleideGeschlossen", BIT3], ] ], [ "modbus.1.holdingRegisters.1_Lichtzustaende_1", [ ["0_userdata.0.Leuchten.Zustaende.Dielentreppe", BIT0], ["0_userdata.0.Leuchten.Zustaende.Technik", BIT1], ["0_userdata.0.Leuchten.Zustaende.Werkstatt", BIT2], ] ]
Dann ist mir aufgefallen, dass du unten inner_element.id verwendest aber müsste das nicht inner_element.dp sein?
-
@kev-0
sry, of und in werfe ich gelegentlich durcheinander. Habs jetzt mal so umgeschrieben dass ich es auch verstehehoffe du verstehst auch noch. Json hat doch einige Vorteile vorallem das sowohl der "index" als auch der "Value" einen aussagekräfigen wert hat.
for (const dp in arrWordsToBits) { on({ id: dp,change: 'ne' },function (obj) { //var word_value=getState(obj._id).val; const word_value=obj.state.val; for (const index in arrWordsToBits[obj.id]) { const inner_element = arrWordsToBits[obj.id][index] const dp = inner_element.id.toString() setState(dp,ConvertWordToBit(word_value,inner_element.val)); } }); }
Darauf war mein Beispiel ausgelegt.
Du kannst es auch so machen:
const arrWordsToBits = { '0_userdata.0.Test.MyInt': { '0_userdata.0.Test.MyBool': BIT0, '0_userdata.0.Test.MyBool2': BIT2, }, };
for (const dp in arrWordsToBits) { on({ id: dp,change: 'ne' },function (obj) { //var word_value=getState(obj._id).val; const word_value=obj.state.val; for (const dp in arrWordsToBits[obj.id]) { const value = arrWordsToBits[obj.id][dp] setState(dp,ConvertWordToBit(word_value,value)); } }); }
-
@kev-0 sagte: Anregungen und Verbesserungen gerne gewünscht.
Die vielen Konstanten benötigt man nicht. Ich verwende 3 globale Funktionen für Bitoperationen:
function checkBit(val, bit) { return !!(val >> bit & 1); } function setBit(val, bit) { return val | (1 << bit); } function resetBit(val, bit) { return val & ~(1 << bit); }
Das Objekt für die Zuordnung von Bit-Position zu Datenpunkt-IDs könnte so aussehen:
const bits = { '0_userdata.0.Test.MyBool': 0, '0_userdata.0.Test.MyBool2': 2 };