-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathplug.go
88 lines (78 loc) · 2 KB
/
plug.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
package migateway
const (
MODEL_PLUG = "plug"
FIELD_PLUG_LOADVOLTAGE = "load_voltage"
FIELD_PLUG_LOADPOWER = "load_power"
FIELD_PLUG_POWERCONSUMED = "power_consumed"
)
type Plug struct {
*Device
State PlugState
}
type PlugState struct {
LoadVoltage uint32
PowerConsumed uint32
LoadPower float32
InUse bool
IsOn bool
}
type PlugStateChange struct {
ID string
From PlugState
To PlugState
}
func (p PlugStateChange) IsChanged() bool {
return p.From.InUse != p.To.InUse || p.From.IsOn != p.To.IsOn || p.From.LoadPower != p.To.LoadPower || p.From.LoadVoltage != p.To.LoadVoltage || p.From.PowerConsumed != p.To.PowerConsumed
}
func NewPlug(dev *Device) *Plug {
p := &Plug{Device: dev}
p.Set(dev)
return p
}
func (p *Plug) Set(dev *Device) {
change := &PlugStateChange{ID: p.Sid, From: p.State, To: p.State}
if dev.hasField(FIELD_INUSE) {
p.State.InUse = dev.GetDataAsBool(FIELD_INUSE)
}
if dev.hasField(FIELD_STATUS) {
p.State.IsOn = dev.GetDataAsBool(FIELD_STATUS)
}
if dev.hasField(FIELD_PLUG_LOADVOLTAGE) {
p.State.LoadVoltage = dev.GetDataAsUint32(FIELD_PLUG_LOADVOLTAGE)
}
if dev.hasField(FIELD_PLUG_LOADPOWER) {
p.State.LoadPower = dev.GetDataAsFloat32(FIELD_PLUG_LOADPOWER)
}
if dev.hasField(FIELD_PLUG_POWERCONSUMED) {
p.State.PowerConsumed = dev.GetDataAsUint32(FIELD_PLUG_POWERCONSUMED)
}
change.To = p.State
if change.IsChanged() || p.shouldPushUpdates() {
p.Aqara.StateMessages <- change
}
if dev.Token != "" {
p.Token = dev.Token
}
}
func (p *Plug) Toggle() error {
tostate := "on"
if p.State.IsOn == false {
tostate = "off"
}
data := map[string]interface{}{
FIELD_STATUS: tostate,
}
return p.GatewayConnection.Control(p.Device, data)
}
func (p *Plug) TurnOn() error {
data := map[string]interface{}{
FIELD_STATUS: "on",
}
return p.GatewayConnection.Control(p.Device, data)
}
func (p *Plug) TurnOff() error {
data := map[string]interface{}{
FIELD_STATUS: "off",
}
return p.GatewayConnection.Control(p.Device, data)
}