This repository has been archived by the owner on Oct 31, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathswitch.go
144 lines (139 loc) · 3.12 KB
/
switch.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
package sdk
import (
"encoding/json"
"fmt"
"io"
"net/http"
)
// Switch Response from Smarthome
// Id is a unique identifier used for many actions regarding switches
type Switch struct {
Id string `json:"id"`
Name string `json:"name"`
RoomId string `json:"roomId"`
PowerOn bool `json:"powerOn"`
Watts uint16 `json:"watts"`
}
// Returns a list of switches to which the user has access to
/** Errors
- nil
- ErrInvalidCredentials
- ErrServiceUnavailable
- ErrReadResponseBody
- ErrConnFailed
- ErrNotInitialized
- PrepareRequest errors
*/
func (c *Connection) GetPersonalSwitches() (switches []Switch, err error) {
if !c.ready {
return nil, ErrNotInitialized
}
req, err := c.prepareRequest("/api/switch/list/personal", Get, nil)
if err != nil {
return nil, err
}
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return nil, ErrConnFailed
}
switch res.StatusCode {
case 200:
resBody, err := io.ReadAll(res.Body)
if err != nil {
return nil, ErrReadResponseBody
}
var parsedBody []Switch
if err := json.Unmarshal(resBody, &parsedBody); err != nil {
return nil, ErrReadResponseBody
}
return parsedBody, nil
case 401:
return nil, ErrInvalidCredentials
case 503:
return nil, ErrServiceUnavailable
}
return nil, fmt.Errorf("unknown response code: %s", res.Status)
}
// Returns a list containing all switches of the target instance
/** Errors
- nil
- ErrServiceUnavailable
- ErrReadResponseBody
- ErrConnFailed
- ErrNotInitialized
- PrepareRequest errors
*/
func (c *Connection) GetAllSwitches() (switches []Switch, err error) {
if !c.ready {
return nil, ErrNotInitialized
}
req, err := c.prepareRequest("/api/switch/list/all", Get, nil)
if err != nil {
return nil, err
}
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return nil, ErrConnFailed
}
switch res.StatusCode {
case 200:
resBody, err := io.ReadAll(res.Body)
if err != nil {
return nil, ErrReadResponseBody
}
var parsedBody []Switch
if err := json.Unmarshal(resBody, &parsedBody); err != nil {
return nil, ErrReadResponseBody
}
return parsedBody, nil
case 503:
return nil, ErrServiceUnavailable
}
return nil, fmt.Errorf("unknown response code: %s", res.Status)
}
// Sends a power request to Smarthome
// Only switch to which the user has permission to will work
/** Errors
- nil
- ErrNotInitialized
- ErrConnFailed
- ErrServiceUnavailable
- ErrInvalidSwitch
- ErrPermissionDenied
- PrepareRequest errors
- Unknown
*/
func (c *Connection) SetPower(switchId string, powerOn bool) error {
if !c.ready {
return ErrNotInitialized
}
req, err := c.prepareRequest("/api/power/set", Post, struct {
Switch string `json:"switch"`
PowerOn bool `json:"powerOn"`
}{
Switch: switchId,
PowerOn: powerOn,
})
if err != nil {
return err
}
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return ErrConnFailed
}
defer res.Body.Close()
switch res.StatusCode {
case 200:
return nil
case 503:
return ErrServiceUnavailable
case 422:
return ErrInvalidSwitch
case 403:
return ErrPermissionDenied
}
return fmt.Errorf("unknown response code: %s", res.Status)
}