Example #1
0
    client.request(FC.READ_HOLDING_REGISTERS, blocks[blockindex].start, blocks[blockindex].len, function(err, response)
    {
        if (err)
        {
            /* stop on error */
            dbgout(err);
            stop();
        }

        /* write modbus data array to buffer
        * this is easier to handle/convert the data
        * */
        var buf = new buffer(response.length*2);
        for (var i=0; i<response.length; i++)
        {
            buf.writeUInt16LE(response[i],i*2);
        }

        /* convert data depending on current block */
        switch (blockindex)
        {
            case 0:
                dp['serial'] = buf.readUInt32LE(4)+(buf.readUInt32LE(8)<<32);
                dp['name'] = buf.toString('utf-8',12,32);
                dp['version'] = buf.readUInt8(45)+'.'+ buf.readUInt8(44);

                setState(settings.adapters.pluggit.firstId+1, dp['name']);
                setState(settings.adapters.pluggit.firstId+2, dp['serial']);
                setState(settings.adapters.pluggit.firstId+3, dp['version']);

                dbgout("\r\nsn: " + dp['serial']);
                dbgout("\r\nname: " + dp['name']);
                dbgout("\r\nfw: " + dp['version']);
                break;
            case 1:
                dp['t1'] = buf.readFloatLE(0);
                dp['t2'] = buf.readFloatLE(4);
                dp['t3'] = buf.readFloatLE(8);
                dp['t4'] = buf.readFloatLE(12);
                dp['t5'] = buf.readFloatLE(16);

                setState(settings.adapters.pluggit.firstId+10, dp['t1']);
                setState(settings.adapters.pluggit.firstId+11, dp['t2']);
                setState(settings.adapters.pluggit.firstId+12, dp['t3']);
                setState(settings.adapters.pluggit.firstId+13, dp['t4']);
                setState(settings.adapters.pluggit.firstId+14, dp['t5']);

                dbgout("\r\nt1: " + dp['t1'] + "°C");
                dbgout("\r\nt2: " + dp['t2'] + "°C");
                dbgout("\r\nt3: " + dp['t3'] + "°C");
                dbgout("\r\nt4: " + dp['t4'] + "°C");
                dbgout("\r\nt5: " + dp['t5'] + "°C");
                break;
            case 2:
                dp['filter'] = buf.readUInt32LE(0);
                dp['humidity'] = buf.readUInt32LE(4);
                dp['bypass'] = buf.readUInt32LE(8);
                switch (dp['bypass'])
                {
                    case 0x0000:
                        dp['bypassState']='closed';
                        break;
                    case 0x0001:
                        dp['bypassState']='in process';
                        break;
                    case 0x0020:
                        dp['bypassState']='closing';
                        break;
                    case 0x0040:
                        dp['bypassState']='opening';
                        break;
                    case 0x00FF:
                        dp['bypassState']='opened';
                        break;
                    default:
                        dp['bypassState']='unknown';
                        break;
                }

                setState(settings.adapters.pluggit.firstId+20, dp['filter']);
                setState(settings.adapters.pluggit.firstId+22, dp['humidity']);
                setState(settings.adapters.pluggit.firstId+23, dp['bypass']);
                setState(settings.adapters.pluggit.firstId+24, dp['bypassState']);

                dbgout("\r\nfilter: " + dp['filter'] + " month");
                dbgout("\r\nRH: " + dp['humidity'] + "%");
                dbgout("\r\nBypass: "******"\r\nspeed: " + dp['speed']);
                break;
            case 4:
                dp['alarm'] = buf.readUInt16LE(0);
                switch (dp['alarm'])
                {
                    case 0:
                        dp['alarmState']='None';
                        break;
                    case 1:
                        dp['alarmState']='Exhaust FAN Alarm';
                        break;
                    case 2:
                        dp['alarmState']='Supply FAN Alarm';
                        break;
                    case 3:
                        dp['alarmState']='Bypass Alarm';
                        break;
                    case 4:
                        dp['alarmState']='T1 Alarm';
                        break;
                    case 5:
                        dp['alarmState']='T2 Alarm';
                        break;
                    case 6:
                        dp['alarmState']='T3 Alarm';
                        break;
                    case 7:
                        dp['alarmState']='T4 Alarm';
                        break;
                    case 8:
                        dp['alarmState']='T5 Alarm';
                        break;
                    case 9:
                        dp['alarmState']='RH Alarm';
                        break;
                    case 10:
                        dp['alarmState']='Outdoor13 Alarm';
                        break;
                    case 11:
                        dp['alarmState']='Supply5 Alarm';
                        break;
                    case 12:
                        dp['alarmState']='Fire Alarm';
                        break;
                    case 13:
                        dp['alarmState']='Communication Alarm';
                        break;
                    case 14:
                        dp['alarmState']='FireTermostat Alarm';
                        break;
                    case 15:
                        dp['alarmState']='VOC Alarm';
                        break;
                    default:
                        dp['alarmState']='unknown';
                        break;
                }
                setState(settings.adapters.pluggit.firstId+30, dp['alarm']);
                setState(settings.adapters.pluggit.firstId+31, dp['alarmState']);
                dbgout("\r\nalarm: " + dp['alarm'] + ' ('+dp['alarmState']+')');
                break;
            case 5:
                dp['filterReset'] = buf.readUInt16LE(0);
                setState(settings.adapters.pluggit.firstId+22, dp['filterReset']);
                dbgout("\r\nfilter reset: " + dp['filterReset'] + ' days');
                break;
            case 6:
                dp['workTime'] = buf.readUInt32LE(0);
                setState(settings.adapters.pluggit.firstId+40, dp['workTime']);
                dbgout("\r\work time: " + dp['workTime'] + ' hours');
                break;
            default:
                /* should not happen */
                stop();
        }

        if (++blockindex < Object.keys(blocks).length)
        {
            /* request next block
             * be aware that this is a recursive call
             */
            requestBlock(blockindex);
        }
        else
        {
            /* store all data in database */
            storeDatabase(timestamp, dp);
            /* now all is done */
            stop();
        }
    });
Example #2
0
    buf.fill(0xFF);
    written = buf.write('abcd', 0, 2, encoding);
    console.log(buf);
    assert.equal(written, 2);
    assert.equal(buf[0], 0x61);
    assert.equal(buf[1], 0x00);
    assert.equal(buf[2], 0xFF);
    assert.equal(buf[3], 0xFF);
  });
}

{
  // test offset returns are correct
  const b = new Buffer(16);
  assert.equal(4, b.writeUInt32LE(0, 0));
  assert.equal(6, b.writeUInt16LE(0, 4));
  assert.equal(7, b.writeUInt8(0, 6));
  assert.equal(8, b.writeInt8(0, 7));
  assert.equal(16, b.writeDoubleLE(0, 8));
}

{
  // test unmatched surrogates not producing invalid utf8 output
  // ef bf bd = utf-8 representation of unicode replacement character
  // see https://codereview.chromium.org/121173009/
  const buf = new Buffer('ab\ud800cd', 'utf8');
  assert.equal(buf[0], 0x61);
  assert.equal(buf[1], 0x62);
  assert.equal(buf[2], 0xef);
  assert.equal(buf[3], 0xbf);
  assert.equal(buf[4], 0xbd);
Example #3
0
NetWriter.prototype.writeUInt16LE = function (value) {
    var buffer = new Buffer(2);
    buffer.writeUInt16LE(value, 0, true);
    this.content.push(buffer);
    this.size += 2;
};