UNPKG

signalk-empirbusnxt-plugin

Version:

Signal K server plugin to monitor and control an EmpirBus NXT via application specific PGN

194 lines (182 loc) 5.49 kB
const assert = require('assert') const _ = require('lodash') var chai = require('chai') chai.Should() chai.use(require('chai-things')) chai.use(require('chai-json-equal')); var app = {} var result app.handleMessage = (id, delta) => { result = delta } const plugin = require('../index')(app) describe('Read pgn 65280', () => { it('from buffer works', () => { const correct_buffer = new Buffer(new Uint8Array([0x00,0xf4,0x01,0xe8,0x03,0x55])) var state = plugin.readDataBuffer(correct_buffer) var delta = plugin.createDelta(state) validate(delta) }), it('from actisense works', () => { const pgn = {"timestamp":"2018-01-19T15:37:01.781Z","prio":2,"src":0,"dst":255,"pgn":65280,"description":"Manufacturer Proprietary single-frame non-addressed","fields":{ "Manufacturer Code": "Empirbus","Industry Code":"Marine","Data":"93475265704961"}} plugin.listener(pgn) assert.ok(result, 'no result') validate(result) }), it('to actisense', () => { const state = { dimmers: [ 500, 1000 ], lastDimmingLevels: [ 1000, 1000 ], switches: [ 1, 0, 1, 0, 1, 0, 1, 0 ] } var actisense = plugin.generateStatePGN(0, state) actisense.substr(25).should.equal('2,65280,0,255,8,30,99,00,f4,01,e8,03,55') }) }) var expected = { "electrical": { "switches": { "empirBusNxt-instance0-dimmer1": { "state": true, "dimmingLevel": 0.5, "type": "dimmer", "name": "Dimmer 0.1", "meta": { "associatedDevice": {"instance":0,"device":"dimmer 1"}, "source": "empirBusNxt", "dataModel": 2, "manufacturer": { "name": "EmpirBus", "model": "NXT DCM" } } }, "empirBusNxt-instance0-dimmer2": { "state": false, "dimmingLevel": 1, "type": "dimmer", "name": "Dimmer 0.2", "meta": { "associatedDevice": {"instance":0,"device":"dimmer 2"}, "source": "empirBusNxt", "dataModel": 2, "manufacturer": { "name": "EmpirBus", "model": "NXT DCM" } } }, "empirBusNxt-instance0-switch3": { "state": true, "type": "switch", "name": "Switch 0.3", "meta": { "associatedDevice": {"instance":0,"device":"switch 3"}, "source": "empirBusNxt", "dataModel": 2, "manufacturer": { "name": "EmpirBus", "model": "NXT DCM" } } }, "empirBusNxt-instance0-switch4": { "state": false, "type": "switch", "name": "Switch 0.4", "meta": { "associatedDevice": {"instance":0,"device":"switch 4"}, "source": "empirBusNxt", "dataModel": 2, "manufacturer": { "name": "EmpirBus", "model": "NXT DCM" } } }, "empirBusNxt-instance0-switch5": { "state": true, "type": "switch", "name": "Switch 0.5", "meta": { "associatedDevice": {"instance":0,"device":"switch 5"}, "source": "empirBusNxt", "dataModel": 2, "manufacturer": { "name": "EmpirBus", "model": "NXT DCM" } } }, "empirBusNxt-instance0-switch6": { "state": false, "type": "switch", "name": "Switch 0.6", "meta": { "associatedDevice": {"instance":0,"device":"switch 6"}, "source": "empirBusNxt", "dataModel": 2, "manufacturer": { "name": "EmpirBus", "model": "NXT DCM" } } }, "empirBusNxt-instance0-switch7": { "state": true, "type": "switch", "name": "Switch 0.7", "meta": { "associatedDevice": {"instance":0,"device":"switch 7"}, "source": "empirBusNxt", "dataModel": 2, "manufacturer": { "name": "EmpirBus", "model": "NXT DCM" } } }, "empirBusNxt-instance0-switch8": { "state": false, "type": "switch", "name": "Switch 0.8", "meta": { "associatedDevice": {"instance":0,"device":"switch 8"}, "source": "empirBusNxt", "dataModel": 2, "manufacturer": { "name": "EmpirBus", "model": "NXT DCM" } } } } } } function validate(delta) { var flat = toFlat(delta) //console.log(JSON.stringify(flat, null, 2)) flat.should.jsonEqual(expected) //console.log(delta.updates[0].values[0]) /* delta.updates[0].values[0].path.should.equal('electrical.controls.empirBusNxt-instance1-dimmer1.state') delta.updates[0].values[0].value.should.equal('on') delta.updates[0].values[1].path.should.equal('electrical.controls.empirBusNxt-instance1-dimmer1.brightness') delta.updates[0].values[1].value.should.equal(0.5) var expected = 'on' for ( var i = 0; i < 8; i++ ) { delta.updates[0].values[i+2].path.should.equal(`electrical.controls.empirBusNxt-instance1-switch${i+1}.state`) delta.updates[0].values[i+2].value.should.equal(expected) expected = expected === 'on' ? 'off' : 'on' } */ } function toFlat(delta) { var res = {} delta.updates.forEach(update => { update.values.forEach(pathValue => { _.set(res, pathValue.path, pathValue.value) }) }) return res }