-
Notifications
You must be signed in to change notification settings - Fork 2
/
nuki.coffee
86 lines (70 loc) · 2.55 KB
/
nuki.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# The amazing dash-button plugin
module.exports = (env) ->
Promise = env.require 'bluebird'
nukiApi = require 'nuki-bridge-api'
NukiObject = require 'nuki-bridge-api/lib/nuki'
commons = require('pimatic-plugin-commons')(env)
# ###NukiPlugin class
class NukiPlugin extends env.plugins.Plugin
init: (app, @framework, @config) =>
@debug = @config.debug || false
@bridge = new nukiApi.Bridge @config.host, @config.port, @config.token
@base = commons.base @, 'Plugin'
# register devices
deviceConfigDef = require("./device-config-schema")
@framework.deviceManager.registerDeviceClass("Nuki",
configDef: deviceConfigDef.Nuki,
createCallback: (@config, lastState) =>
new Nuki(@config, @, lastState)
)
# auto-discovery
@framework.deviceManager.on('discover', (eventData) =>
@framework.deviceManager.discoverMessage 'pimatic-nuki', 'Searching for Nuki Smart Locks.'
@lastId = null
@bridge.list().then (nukiDevices) =>
for device in nukiDevices
do (device) =>
@lastId = @base.generateDeviceId @framework, "nuki", @lastId
deviceConfig =
id: @lastId
name: device.name
class: 'Nuki'
nukiId: device.nukiId
@framework.deviceManager.discoveredDevice(
'pimatic-nuki',
"#{deviceConfig.name} (#{deviceConfig.nukiId})",
deviceConfig
)
)
class Nuki extends env.devices.ContactSensor
constructor: (@config, @plugin, lastState) ->
@id = @config.id
@name = @config.name
@_contact = false
@nuki = new NukiObject @plugin.bridge, @config.nukiId
@debug = @plugin.debug || false
@base = commons.base @, @config.class
super()
process.nextTick () =>
@_requestUpdate()
destroy: () ->
@base.cancelUpdate()
super()
_requestUpdate: () =>
@base.cancelUpdate()
@base.debug "Requesting update"
@nuki.lockState()
.then (state) =>
@base.debug "Lock state is #{state}"
if typeof state is "string"
state = parseInt state
@_setContact (state is nukiApi.lockState.LOCKED)
.catch (error) =>
@base.error "Error:", error
.finally () =>
@base.scheduleUpdate @_requestUpdate, @config.interval * 1000
getContact: () -> Promise.resolve @_contact
# ###Finally
# Create a instance of my plugin
# and return it to the framework.
return new NukiPlugin