This repository has been archived by the owner on Nov 21, 2021. It is now read-only.
/
device.go
153 lines (145 loc) · 4.32 KB
/
device.go
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package cmd
import (
"errors"
"reflect"
"time"
"github.com/AJGherardi/HomeHub/model"
)
// AddDevice provisions configures and adds the device at the given uuid
func (n *Network) AddDevice(name string, uuid []byte, groupAddr uint16) (uint16, error) {
// Get group
group, getErr := n.Store.GetGroup(groupAddr)
if getErr != nil {
return 0, getErr
}
// Provision device
if err := n.Controller.Provision(uuid); err != nil {
return 0, errors.New("Device Setup Failed")
}
// Wait for node added
var nodeAddr uint16
select {
case addr := <-n.NodeAdded:
nodeAddr = addr
case <-time.After(10 * time.Second):
// Timeout after 10 seconds
return 0, errors.New("Timeout adding device")
}
// Make device object
device := model.Device{}
// If device is a 2 plug outlet
if reflect.DeepEqual(uuid[6:8], []byte{0x00, 0x02}) {
device = model.MakeDevice(
"2Outlet",
nodeAddr,
)
}
if reflect.DeepEqual(uuid[6:8], []byte{0x00, 0x01}) {
device = model.MakeDevice(
"4Button",
nodeAddr,
)
}
// Configure Device
sendErr := n.Controller.ConfigureNode(nodeAddr, group.KeyIndex)
time.Sleep(100 * time.Millisecond)
// If device is a 2 plug outlet
if reflect.DeepEqual(uuid[6:8], []byte{0x00, 0x02}) {
// Set type and add elements
elemAddr0 := device.AddElem(name+"-0", "onoff", nodeAddr)
sendErr = n.Controller.ConfigureElem(groupAddr, nodeAddr, elemAddr0, group.KeyIndex)
time.Sleep(100 * time.Millisecond)
elemAddr1 := device.AddElem(name+"-1", "onoff", nodeAddr)
sendErr = n.Controller.ConfigureElem(groupAddr, nodeAddr, elemAddr1, group.KeyIndex)
}
// If device is a button
if reflect.DeepEqual(uuid[6:8], []byte{0x00, 0x01}) {
// Set type and add elements
elemAddr0 := device.AddElem(name+"-0", "event", nodeAddr)
sendErr = n.Controller.ConfigureElem(groupAddr, nodeAddr, elemAddr0, group.KeyIndex)
time.Sleep(1000 * time.Millisecond)
elemAddr1 := device.AddElem(name+"-1", "event", nodeAddr)
sendErr = n.Controller.ConfigureElem(groupAddr, nodeAddr, elemAddr1, group.KeyIndex)
time.Sleep(3000 * time.Millisecond)
elemAddr2 := device.AddElem(name+"-2", "event", nodeAddr)
sendErr = n.Controller.ConfigureElem(groupAddr, nodeAddr, elemAddr2, group.KeyIndex)
time.Sleep(3000 * time.Millisecond)
elemAddr3 := device.AddElem(name+"-3", "event", nodeAddr)
sendErr = n.Controller.ConfigureElem(groupAddr, nodeAddr, elemAddr3, group.KeyIndex)
}
// If device is not setup do not proceed
if sendErr != nil {
return 0, errors.New("Device Setup Failed")
}
// Add device to group
group.AddDevice(nodeAddr, device)
return nodeAddr, nil
}
// RemoveDevice sends are reset message and removes the device from the group
func (n *Network) RemoveDevice(groupAddr, devAddr uint16) error {
// Get group
group, getErr := n.Store.GetGroup(groupAddr)
if getErr != nil {
return getErr
}
// Send reset payload
sendErr := n.Controller.ResetNode(devAddr)
if sendErr != nil {
return errors.New("Failed to remove device")
}
// Remove device from group
group.RemoveDevice(devAddr)
return nil
}
// SetState sends a state message to the element at the given address
func (n *Network) SetState(state []byte, groupAddr, elemAddr uint16) error {
// Get group
group, getErr := n.Store.GetGroup(groupAddr)
if getErr != nil {
return getErr
}
// Send State
if true {
// Send msg
sendErr := n.Controller.SendMessage(
state[0],
elemAddr,
group.KeyIndex,
)
if sendErr != nil {
return errors.New("Failed to send message")
}
}
return nil
}
// ReadState Gets the state from a elem on a device
func (n *Network) ReadState(groupAddr, devAddr, elemAddr uint16) ([]byte, error) {
// Get group
group, getErr := n.Store.GetGroup(groupAddr)
if getErr != nil {
return []byte{}, getErr
}
// Get device
device, getErr := group.GetDevice(devAddr)
if getErr != nil {
return []byte{}, getErr
}
state, getErr := device.GetState(elemAddr)
return state, getErr
}
// UpdateState Sets the state of a elem on the device
func (n *Network) UpdateState(elemAddr uint16, state byte) error {
// Get reference to device with element
for _, group := range n.Store.Groups {
for _, device := range group.Devices {
for addr := range device.Elements {
if addr == elemAddr {
// Update element state
setErr := device.UpdateState(elemAddr, []byte{state})
return setErr
}
}
}
}
return errors.New("Element not found")
}