Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Handle missing serial numbers #44

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,5 @@ before_install:

script:
- npm run lint
# TODO: Tests don't work in CI yet
# - npm run test
22 changes: 16 additions & 6 deletions lib/AccessoryManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,15 +99,10 @@ class AccessoryManager {
this._zwave.onNodeReady(zwaveNodeId, zwaveNode => {
this._accessoryReadyState = READY_STATE_READY

const { value: serialNumber } = this._zwave.findNodeValue(zwaveNodeId, {
class_id: COMMAND_CLASS_MANUFACTURER_SPECIFIC,
index: MANUFACTURER_SPECIFIC_INDEX_SERIAL_NUMBER
})

this._configureAccessoryInformationService(
zwaveNode.manufacturer,
zwaveNode.product,
serialNumber
this._findNodeSerialNumber(zwaveNodeId)
)
})
}
Expand Down Expand Up @@ -631,6 +626,21 @@ class AccessoryManager {
this._log(`${accessoryDisplayName} "${characteristicName}" characteristic value updated to ${value} outside of HomeKit`)
})
}

/**
* Get serial number from node
*
* @param {Number} zwaveNodeId
* @returns {?String} The serial number, or null if the node doesn't have one
*/
_findNodeSerialNumber (zwaveNodeId) {
const { value: serialNumber = null } = this._zwave.findNodeValue(zwaveNodeId, {
class_id: COMMAND_CLASS_MANUFACTURER_SPECIFIC,
index: MANUFACTURER_SPECIFIC_INDEX_SERIAL_NUMBER
}) || {}

return serialNumber
}
}

module.exports = AccessoryManager
30 changes: 30 additions & 0 deletions lib/AccessoryManager.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const AccessoryManager = require('./AccessoryManager')

describe('_findNodeSerialNumber', () => {
const mockZwave = {}
const manager = new AccessoryManager({}, {}, console.log, mockZwave)

function mockFindNodeResult (result) {
mockZwave.findNodeValue = (_nodeId, _options = {}) => result
}

test('returns serialNumber if provided by ZWave', () => {
mockFindNodeResult({ value: '12345' })
expect(manager._findNodeSerialNumber(1)).toBe('12345')
})

test('returns null if ZWave value is undefined', () => {
mockFindNodeResult({ value: undefined })
expect(manager._findNodeSerialNumber(1)).toBe(null)
})

test('returns null if ZWave result is empty', () => {
mockFindNodeResult({})
expect(manager._findNodeSerialNumber(1)).toBe(null)
})

test('returns null if entire ZWave result is undefined', () => {
mockFindNodeResult(undefined)
expect(manager._findNodeSerialNumber(1)).toBe(null)
})
})
Loading