lifx-lan 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +8 -0
- data/.yardopts +3 -0
- data/CHANGES.md +45 -0
- data/Gemfile +19 -0
- data/LICENSE.txt +23 -0
- data/README.md +15 -0
- data/Rakefile +20 -0
- data/bin/lifx-snoop +50 -0
- data/examples/auto-off/auto-off.rb +34 -0
- data/examples/blink/blink.rb +19 -0
- data/examples/identify/identify.rb +69 -0
- data/examples/travis-build-light/build-light.rb +57 -0
- data/lib/bindata_ext/bool.rb +30 -0
- data/lib/bindata_ext/record.rb +11 -0
- data/lib/lifx-lan.rb +27 -0
- data/lib/lifx/lan/client.rb +149 -0
- data/lib/lifx/lan/color.rb +199 -0
- data/lib/lifx/lan/config.rb +17 -0
- data/lib/lifx/lan/firmware.rb +60 -0
- data/lib/lifx/lan/gateway_connection.rb +185 -0
- data/lib/lifx/lan/light.rb +440 -0
- data/lib/lifx/lan/light_collection.rb +111 -0
- data/lib/lifx/lan/light_target.rb +185 -0
- data/lib/lifx/lan/logging.rb +14 -0
- data/lib/lifx/lan/message.rb +168 -0
- data/lib/lifx/lan/network_context.rb +188 -0
- data/lib/lifx/lan/observable.rb +66 -0
- data/lib/lifx/lan/protocol/address.rb +25 -0
- data/lib/lifx/lan/protocol/device.rb +387 -0
- data/lib/lifx/lan/protocol/header.rb +24 -0
- data/lib/lifx/lan/protocol/light.rb +142 -0
- data/lib/lifx/lan/protocol/message.rb +19 -0
- data/lib/lifx/lan/protocol/metadata.rb +23 -0
- data/lib/lifx/lan/protocol/payload.rb +12 -0
- data/lib/lifx/lan/protocol/sensor.rb +31 -0
- data/lib/lifx/lan/protocol/type.rb +204 -0
- data/lib/lifx/lan/protocol/wan.rb +51 -0
- data/lib/lifx/lan/protocol/wifi.rb +102 -0
- data/lib/lifx/lan/protocol_path.rb +85 -0
- data/lib/lifx/lan/required_keyword_arguments.rb +12 -0
- data/lib/lifx/lan/routing_manager.rb +114 -0
- data/lib/lifx/lan/routing_table.rb +48 -0
- data/lib/lifx/lan/seen.rb +25 -0
- data/lib/lifx/lan/site.rb +97 -0
- data/lib/lifx/lan/tag_manager.rb +111 -0
- data/lib/lifx/lan/tag_table.rb +49 -0
- data/lib/lifx/lan/target.rb +24 -0
- data/lib/lifx/lan/thread.rb +13 -0
- data/lib/lifx/lan/timers.rb +29 -0
- data/lib/lifx/lan/transport.rb +46 -0
- data/lib/lifx/lan/transport/tcp.rb +91 -0
- data/lib/lifx/lan/transport/udp.rb +87 -0
- data/lib/lifx/lan/transport_manager.rb +43 -0
- data/lib/lifx/lan/transport_manager/lan.rb +169 -0
- data/lib/lifx/lan/utilities.rb +36 -0
- data/lib/lifx/lan/version.rb +5 -0
- data/lifx-lan.gemspec +26 -0
- data/spec/color_spec.rb +43 -0
- data/spec/gateway_connection_spec.rb +30 -0
- data/spec/integration/client_spec.rb +42 -0
- data/spec/integration/light_spec.rb +56 -0
- data/spec/integration/tags_spec.rb +42 -0
- data/spec/light_collection_spec.rb +37 -0
- data/spec/message_spec.rb +183 -0
- data/spec/protocol_path_spec.rb +109 -0
- data/spec/routing_manager_spec.rb +25 -0
- data/spec/routing_table_spec.rb +23 -0
- data/spec/spec_helper.rb +56 -0
- data/spec/transport/udp_spec.rb +44 -0
- data/spec/transport_spec.rb +14 -0
- metadata +187 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
module LIFX
|
2
|
+
module LAN
|
3
|
+
module Protocol
|
4
|
+
module HeaderFields
|
5
|
+
def HeaderFields.included(mod)
|
6
|
+
mod.instance_eval do
|
7
|
+
uint16 :msg_size # Size of entire message in bytes including this field.
|
8
|
+
bit12le :protocol, value: 1024 # Protocol number, always 1024 for LIFX Protocol messages
|
9
|
+
bool_bit1 :addressable, value: true # Message includes an address, always true for LIFX Protocol messages
|
10
|
+
bool_bit1 :tagged # Indicates that the message addresses device tagged with specified tags
|
11
|
+
bit2le :origin, value: 0 # Message origin indicator, should be zero
|
12
|
+
uint32 :source # Source identifier. Unique 32 bit value sent by the client, used for NAT and responses
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Header < BinData::Record
|
18
|
+
endian :little
|
19
|
+
|
20
|
+
include HeaderFields
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
module LIFX
|
2
|
+
module LAN
|
3
|
+
module Protocol
|
4
|
+
# @api private
|
5
|
+
module Light
|
6
|
+
module Waveform
|
7
|
+
SAW = 0
|
8
|
+
SINE = 1
|
9
|
+
HALF_SINE = 2
|
10
|
+
TRIANGLE = 3
|
11
|
+
PULSE = 4
|
12
|
+
end
|
13
|
+
|
14
|
+
class Hsbk < Payload
|
15
|
+
endian :little
|
16
|
+
|
17
|
+
uint16 :hue # 0..65_535 scaled to 0° - 360°
|
18
|
+
uint16 :saturation # 0..65_535 scaled to 0% - 100%
|
19
|
+
uint16 :brightness # 0..65_535 scaled to 0% - 100%
|
20
|
+
uint16 :kelvin # Explicit 2_400..9_000
|
21
|
+
end
|
22
|
+
|
23
|
+
# Introspect the light state
|
24
|
+
class Get < Payload
|
25
|
+
endian :little
|
26
|
+
end
|
27
|
+
|
28
|
+
# class Set < Payload
|
29
|
+
# endian :little
|
30
|
+
|
31
|
+
# uint8 :stream # 0 is no stream.
|
32
|
+
# hsbk :color
|
33
|
+
# uint32 :duration # Milliseconds.
|
34
|
+
# end
|
35
|
+
|
36
|
+
# Light state including identifying meta data
|
37
|
+
class State < Payload
|
38
|
+
endian :little
|
39
|
+
|
40
|
+
hsbk :color
|
41
|
+
int16 :dim
|
42
|
+
uint16 :power
|
43
|
+
string :label, length: 32, trim_padding: true
|
44
|
+
uint64 :tags
|
45
|
+
end
|
46
|
+
|
47
|
+
# Simple light color control
|
48
|
+
class SetColor < Payload
|
49
|
+
endian :little
|
50
|
+
|
51
|
+
uint8 :stream, value: 0 # Reserved for LIFX use, must be 0 (0 is no stream)
|
52
|
+
hsbk :color # Color value
|
53
|
+
uint32 :duration # Transition duration in milliseconds
|
54
|
+
end
|
55
|
+
|
56
|
+
# Instrospect light power level on device
|
57
|
+
class GetPower < Payload
|
58
|
+
endian :little
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
# Set the power level of a light
|
63
|
+
class SetPower < Payload
|
64
|
+
endian :little
|
65
|
+
|
66
|
+
uint16 :level # Power level between 0..65535. Zero implies standby and non-zero sets a corresponding power draw level on device
|
67
|
+
uint32 :duration # Duration in milliseconds for the power transition between 0..65535
|
68
|
+
end
|
69
|
+
|
70
|
+
# Current power level of device
|
71
|
+
class StatePower < Payload
|
72
|
+
endian :little
|
73
|
+
|
74
|
+
uint16 :level
|
75
|
+
end
|
76
|
+
|
77
|
+
# Does below code work with LIFX20 ?
|
78
|
+
# ----------------------------------------------------------------
|
79
|
+
class SetWaveform < Payload
|
80
|
+
endian :little
|
81
|
+
|
82
|
+
uint8 :stream # 0 is no stream.
|
83
|
+
bool :transient
|
84
|
+
hsbk :color
|
85
|
+
uint32 :period # Milliseconds per cycle.
|
86
|
+
float :cycles
|
87
|
+
int16 :skew_ratio
|
88
|
+
uint8 :waveform
|
89
|
+
end
|
90
|
+
|
91
|
+
class SetDimAbsolute < Payload
|
92
|
+
endian :little
|
93
|
+
|
94
|
+
int16 :brightness # 0 is no change.
|
95
|
+
uint32 :duration # Milliseconds.
|
96
|
+
end
|
97
|
+
|
98
|
+
class SetDimRelative < Payload
|
99
|
+
endian :little
|
100
|
+
|
101
|
+
int32 :brightness # 0 is no change.
|
102
|
+
uint32 :duration # Milliseconds.
|
103
|
+
end
|
104
|
+
|
105
|
+
class Rgbw < Payload
|
106
|
+
endian :little
|
107
|
+
|
108
|
+
uint16 :red
|
109
|
+
uint16 :green
|
110
|
+
uint16 :blue
|
111
|
+
uint16 :white
|
112
|
+
end
|
113
|
+
|
114
|
+
class SetRgbw < Payload
|
115
|
+
endian :little
|
116
|
+
|
117
|
+
rgbw :color
|
118
|
+
end
|
119
|
+
|
120
|
+
class GetRailVoltage < Payload
|
121
|
+
endian :little
|
122
|
+
end
|
123
|
+
|
124
|
+
class StateRailVoltage < Payload
|
125
|
+
endian :little
|
126
|
+
|
127
|
+
uint32 :voltage
|
128
|
+
end
|
129
|
+
|
130
|
+
class GetTemperature < Payload
|
131
|
+
endian :little
|
132
|
+
end
|
133
|
+
|
134
|
+
class StateTemperature < Payload
|
135
|
+
endian :little
|
136
|
+
|
137
|
+
int16 :temperature # Deci-celsius. 25.45 celsius is 2545
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'lifx/lan/protocol/header'
|
2
|
+
require 'lifx/lan/protocol/address'
|
3
|
+
require 'lifx/lan/protocol/metadata'
|
4
|
+
|
5
|
+
module LIFX
|
6
|
+
module LAN
|
7
|
+
module Protocol
|
8
|
+
class Message < BinData::Record
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
include HeaderFields
|
12
|
+
include AddressFields
|
13
|
+
include MetadataFields
|
14
|
+
|
15
|
+
rest :payload
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module LIFX
|
2
|
+
module LAN
|
3
|
+
module Protocol
|
4
|
+
module MetadataFields
|
5
|
+
def MetadataFields.included(mod)
|
6
|
+
mod.instance_eval do
|
7
|
+
hide :_reserved3
|
8
|
+
|
9
|
+
uint64 :at_time
|
10
|
+
uint16 :type_
|
11
|
+
uint16 :_reserved3
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class Metadata < BinData::Record
|
17
|
+
endian :little
|
18
|
+
|
19
|
+
include MetadataFields
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module LIFX
|
2
|
+
module LAN
|
3
|
+
module Protocol
|
4
|
+
# @api private
|
5
|
+
module Sensor
|
6
|
+
class GetAmbientLight < Payload
|
7
|
+
endian :little
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
class StateAmbientLight < Payload
|
12
|
+
endian :little
|
13
|
+
|
14
|
+
float :lux
|
15
|
+
end
|
16
|
+
|
17
|
+
class GetDimmerVoltage < Payload
|
18
|
+
endian :little
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
class StateDimmerVoltage < Payload
|
23
|
+
endian :little
|
24
|
+
|
25
|
+
uint32 :voltage
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
# Generated code ahoy!
|
2
|
+
module LIFX
|
3
|
+
module LAN
|
4
|
+
module Protocol
|
5
|
+
TYPE_ID_TO_CLASS = {
|
6
|
+
# 1 => Device::SetSite,
|
7
|
+
# 2 => Device::GetPanGateway,
|
8
|
+
# 3 => Device::StatePanGateway,
|
9
|
+
2 => Device::GetService,
|
10
|
+
3 => Device::StateService,
|
11
|
+
4 => Device::GetTime,
|
12
|
+
5 => Device::SetTime,
|
13
|
+
6 => Device::StateTime,
|
14
|
+
# 7 => Device::GetResetSwitch,
|
15
|
+
# 8 => Device::StateResetSwitch,
|
16
|
+
# 12 => Device::GetMeshInfo,
|
17
|
+
# 13 => Device::StateMeshInfo,
|
18
|
+
# 14 => Device::GetMeshFirmware,
|
19
|
+
# 15 => Device::StateMeshFirmware,
|
20
|
+
12 => Device::GetHostInfo,
|
21
|
+
13 => Device::StateHostInfo,
|
22
|
+
14 => Device::GetHostFirmware,
|
23
|
+
15 => Device::StateHostFirmware,
|
24
|
+
16 => Device::GetWifiInfo,
|
25
|
+
17 => Device::StateWifiInfo,
|
26
|
+
18 => Device::GetWifiFirmware,
|
27
|
+
19 => Device::StateWifiFirmware,
|
28
|
+
20 => Device::GetPower,
|
29
|
+
21 => Device::SetPower,
|
30
|
+
22 => Device::StatePower,
|
31
|
+
23 => Device::GetLabel,
|
32
|
+
24 => Device::SetLabel,
|
33
|
+
25 => Device::StateLabel,
|
34
|
+
26 => Device::GetTags,
|
35
|
+
27 => Device::SetTags,
|
36
|
+
28 => Device::StateTags,
|
37
|
+
29 => Device::GetTagLabels,
|
38
|
+
30 => Device::SetTagLabels,
|
39
|
+
31 => Device::StateTagLabels,
|
40
|
+
32 => Device::GetVersion,
|
41
|
+
33 => Device::StateVersion,
|
42
|
+
34 => Device::GetInfo,
|
43
|
+
35 => Device::StateInfo,
|
44
|
+
# 36 => Device::GetMcuRailVoltage,
|
45
|
+
# 37 => Device::StateMcuRailVoltage,
|
46
|
+
# 38 => Device::Reboot,
|
47
|
+
38 => Device::SetReboot,
|
48
|
+
43 => Device::StateReboot,
|
49
|
+
45 => Device::Acknowledgement,
|
50
|
+
46 => Device::SetFactoryReset,
|
51
|
+
47 => Device::StateFactoryReset,
|
52
|
+
48 => Device::GetLocation,
|
53
|
+
49 => Device::SetLocation,
|
54
|
+
50 => Device::StateLocation,
|
55
|
+
51 => Device::GetGroup,
|
56
|
+
52 => Device::SetGroup,
|
57
|
+
53 => Device::StateGroup,
|
58
|
+
54 => Device::GetOwner,
|
59
|
+
55 => Device::SetOwner,
|
60
|
+
56 => Device::StateOwner,
|
61
|
+
58 => Device::EchoRequest,
|
62
|
+
59 => Device::EchoResponse,
|
63
|
+
|
64
|
+
101 => Light::Get,
|
65
|
+
# 102 => Light::Set,
|
66
|
+
102 => Light::SetColor,
|
67
|
+
103 => Light::SetWaveform,
|
68
|
+
# 104 => Light::SetDimAbsolute,
|
69
|
+
# 105 => Light::SetDimRelative,
|
70
|
+
# 106 => Light::SetRgbw,
|
71
|
+
107 => Light::State,
|
72
|
+
# 108 => Light::GetRailVoltage,
|
73
|
+
# 109 => Light::StateRailVoltage,
|
74
|
+
110 => Light::GetTemperature,
|
75
|
+
111 => Light::StateTemperature,
|
76
|
+
116 => Light::GetPower,
|
77
|
+
117 => Light::SetPower,
|
78
|
+
118 => Light::StatePower,
|
79
|
+
|
80
|
+
201 => Wan::ConnectPlain,
|
81
|
+
202 => Wan::ConnectKey,
|
82
|
+
203 => Wan::StateConnect,
|
83
|
+
204 => Wan::Sub,
|
84
|
+
205 => Wan::Unsub,
|
85
|
+
206 => Wan::StateSub,
|
86
|
+
|
87
|
+
301 => Wifi::Get,
|
88
|
+
302 => Wifi::Set,
|
89
|
+
303 => Wifi::State,
|
90
|
+
# 304 => Wifi::GetAccessPoint,
|
91
|
+
304 => Wifi::GetAccessPoints,
|
92
|
+
305 => Wifi::SetAccessPoint,
|
93
|
+
# 306 => Wifi::StateAccessPoint,
|
94
|
+
306 => Wifi::StateAccessPoints,
|
95
|
+
307 => Wifi::GetAccessPoint,
|
96
|
+
308 => Wifi::StateAccessPoint,
|
97
|
+
|
98
|
+
401 => Sensor::GetAmbientLight,
|
99
|
+
402 => Sensor::StateAmbientLight,
|
100
|
+
403 => Sensor::GetDimmerVoltage,
|
101
|
+
404 => Sensor::StateDimmerVoltage,
|
102
|
+
}
|
103
|
+
|
104
|
+
CLASS_TO_TYPE_ID = {
|
105
|
+
# Device::SetSite => 1,
|
106
|
+
# Device::GetPanGateway => 2,
|
107
|
+
# Device::StatePanGateway => 3,
|
108
|
+
Device::GetService => 2,
|
109
|
+
Device::StateService => 3,
|
110
|
+
Device::GetTime => 4,
|
111
|
+
Device::SetTime => 5,
|
112
|
+
Device::StateTime => 6,
|
113
|
+
# Device::GetResetSwitch => 7,
|
114
|
+
# Device::StateResetSwitch => 8,
|
115
|
+
# Device::GetMeshInfo => 12,
|
116
|
+
# Device::StateMeshInfo => 13,
|
117
|
+
# Device::GetMeshFirmware => 14,
|
118
|
+
# Device::StateMeshFirmware => 15,
|
119
|
+
Device::GetHostInfo => 12,
|
120
|
+
Device::StateHostInfo => 13,
|
121
|
+
Device::GetHostFirmware => 14,
|
122
|
+
Device::StateHostFirmware => 15,
|
123
|
+
Device::GetWifiInfo => 16,
|
124
|
+
Device::StateWifiInfo => 17,
|
125
|
+
Device::GetWifiFirmware => 18,
|
126
|
+
Device::StateWifiFirmware => 19,
|
127
|
+
Device::GetPower => 20,
|
128
|
+
Device::SetPower => 21,
|
129
|
+
Device::StatePower => 22,
|
130
|
+
Device::GetLabel => 23,
|
131
|
+
Device::SetLabel => 24,
|
132
|
+
Device::StateLabel => 25,
|
133
|
+
Device::GetTags => 26,
|
134
|
+
Device::SetTags => 27,
|
135
|
+
Device::StateTags => 28,
|
136
|
+
Device::GetTagLabels => 29,
|
137
|
+
Device::SetTagLabels => 30,
|
138
|
+
Device::StateTagLabels => 31,
|
139
|
+
Device::GetVersion => 32,
|
140
|
+
Device::StateVersion => 33,
|
141
|
+
Device::GetInfo => 34,
|
142
|
+
Device::StateInfo => 35,
|
143
|
+
# Device::GetMcuRailVoltage => 36,
|
144
|
+
# Device::StateMcuRailVoltage => 37,
|
145
|
+
# Device::Reboot => 38,
|
146
|
+
Device::SetReboot => 38,
|
147
|
+
Device::StateReboot => 43,
|
148
|
+
Device::Acknowledgement => 45,
|
149
|
+
Device::SetFactoryReset => 46,
|
150
|
+
Device::StateFactoryReset => 47,
|
151
|
+
Device::GetLocation => 48,
|
152
|
+
Device::SetLocation => 49,
|
153
|
+
Device::StateLocation => 50,
|
154
|
+
Device::GetGroup => 51,
|
155
|
+
Device::SetGroup => 52,
|
156
|
+
Device::StateGroup => 53,
|
157
|
+
Device::GetOwner => 54,
|
158
|
+
Device::SetOwner => 55,
|
159
|
+
Device::StateOwner => 56,
|
160
|
+
Device::EchoRequest => 58,
|
161
|
+
Device::EchoResponse => 59,
|
162
|
+
|
163
|
+
Light::Get => 101,
|
164
|
+
# Light::Set => 102,
|
165
|
+
Light::SetColor => 102,
|
166
|
+
# Light::SetWaveform => 103,
|
167
|
+
# Light::SetDimAbsolute => 104,
|
168
|
+
# Light::SetDimRelative => 105,
|
169
|
+
# Light::SetRgbw => 106,
|
170
|
+
Light::State => 107,
|
171
|
+
# Light::GetRailVoltage => 108,
|
172
|
+
# Light::StateRailVoltage => 109,
|
173
|
+
Light::GetTemperature => 110,
|
174
|
+
Light::StateTemperature => 111,
|
175
|
+
Light::GetPower => 116,
|
176
|
+
Light::SetPower => 117,
|
177
|
+
Light::StatePower => 118,
|
178
|
+
|
179
|
+
Wan::ConnectPlain => 201,
|
180
|
+
Wan::ConnectKey => 202,
|
181
|
+
Wan::StateConnect => 203,
|
182
|
+
Wan::Sub => 204,
|
183
|
+
Wan::Unsub => 205,
|
184
|
+
Wan::StateSub => 206,
|
185
|
+
|
186
|
+
Wifi::Get => 301,
|
187
|
+
Wifi::Set => 302,
|
188
|
+
Wifi::State => 303,
|
189
|
+
# Wifi::GetAccessPoint => 304,
|
190
|
+
Wifi::GetAccessPoints => 304,
|
191
|
+
Wifi::SetAccessPoint => 305,
|
192
|
+
# Wifi::StateAccessPoint => 306,
|
193
|
+
Wifi::StateAccessPoints => 306,
|
194
|
+
Wifi::GetAccessPoint => 307,
|
195
|
+
Wifi::StateAccessPoint => 308,
|
196
|
+
|
197
|
+
Sensor::GetAmbientLight => 401,
|
198
|
+
Sensor::StateAmbientLight => 402,
|
199
|
+
Sensor::GetDimmerVoltage => 403,
|
200
|
+
Sensor::StateDimmerVoltage => 404,
|
201
|
+
}
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|