flic 0.0.3 → 0.0.4
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 +4 -4
- data/README.md +100 -7
- data/lib/flic/protocol/connection.rb +1 -1
- data/lib/flic/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae762531f46f32f4d88e0d006bf08c7c804e1a9f
|
4
|
+
data.tar.gz: 470cd52b6b01ee89bb423df22d6847d6bfdfef9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bffa799520a877ab2924f84af76a1ae91acb5c860c1881c383ba7c8755c359d448ec0fdd7b02843dc44616e3cbc73778244da06253859ff8b32cdc7e8134ee2d
|
7
|
+
data.tar.gz: 24481590f130a83cca420f172a0cf43d6832e45f2aa81bee9bea94d1b7d5dcc084915f4e072f991a05a37bd5ed43da2cc9cf5aaa77b7b554e73ff80bca849f1b
|
data/README.md
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
# Flic
|
2
|
-
|
3
|
-
Flic is a Ruby implementation of the [Fliclib](https://github.com/50ButtonsEach/fliclib-linux-hci/blob/master/ProtocolDocumentation.md).
|
2
|
+
Flic is a lightweight but thread-safe Ruby implementation of the [Fliclib](https://github.com/50ButtonsEach/fliclib-linux-hci/blob/master/ProtocolDocumentation.md). It interfaces with [flicd](https://github.com/50ButtonsEach/fliclib-linux-hci), and allows [Flic buttons](https://flic.io/) to be used as an input for Ruby applications.
|
4
3
|
|
5
4
|
## Installation
|
6
|
-
|
7
5
|
Add this line to your application's Gemfile:
|
8
6
|
|
9
7
|
```ruby
|
@@ -18,13 +16,108 @@ Or install it yourself as:
|
|
18
16
|
|
19
17
|
$ gem install flic
|
20
18
|
|
19
|
+
## Simple Usage
|
20
|
+
The easiest way to get up an running is to use `Flic::SimpleClient`. It is a thin wrapper around `Flic::Client` that provides a simplified, synchronous API for the most intuative uses of a Flic button.
|
21
21
|
|
22
|
-
|
22
|
+
### Establishing a connection to `flicd`
|
23
|
+
By default, `flicd` binds to `localhost` on port `5551`. These are also the defaults for `Filc::SimpleClient`. This means that if you are running `flicd` on your local machine, establishing a connection is as easy as creating a new instance of `Flic::SimpleClient`. For other configurations, you can initialize `Flic::SimpleCient` with host and port. For example, `Flic::SimpleClient.new('192.168.1.200', 5553)` will open a connection to `flicd` on `192.168.1.200` listening on port `5553`.
|
23
24
|
|
24
|
-
|
25
|
+
### Getting a list of buttons
|
26
|
+
To get a list of verified buttons (buttons associated and ready to be used with a given `flicd`), call `Flic::SimpleClient#buttons`. This will return a list of button's bluetooth addresses.
|
25
27
|
|
28
|
+
### Connecting a new button
|
29
|
+
A button must be in public mode before it can be added. To put a button in public mode, press and hold it for at least 7 seconds. `Flic::SimpleClient#connect_button` will return the bluetooh address of the button that was added or `nil` if no button was added.
|
26
30
|
|
27
|
-
|
31
|
+
### Disconnecting a button
|
32
|
+
Similarly, a button may be disconnected by passing `Flic::SimpleClient#disconnect_button` a button's bluetooth address.
|
28
33
|
|
29
|
-
|
34
|
+
### Listening for button events
|
35
|
+
`Flic::SimpleClient#listen` accepts a latency mode (`:low`, `:normal`, or `:high`) as it's first argument and button bluetooth addresses as its other arguments. For each event that occurs to those buttons, it yields the bluetooth address of the button responsible for a given event, the type of click involved in the event (`:button_down`, `:button_up`, `:button_single_click`, `:button_double_click`, or `:button_hold`), the time in milliseconds since the event occured, and whether the event was queued. **It will block until the connection is closed or the block raises some other exception.**
|
36
|
+
|
37
|
+
### Closing the connection to `flicd`
|
38
|
+
To gracefully cleanup all connection channels and close the socket connection, call `Flic::SimpleClient#shutdown`. Once a `Flic::SimpleClient` has been shutdown it will close the underlying socket and cannot be used anymore.
|
39
|
+
|
40
|
+
### Example
|
41
|
+
This is the script that I wrote to allow some of my Flic buttons to control Wink-enabled smart devices in home.
|
42
|
+
```ruby
|
43
|
+
#!/usr/bin/env ruby
|
44
|
+
|
45
|
+
require 'bundler/setup'
|
46
|
+
require 'flic'
|
47
|
+
require 'httparty'
|
48
|
+
|
49
|
+
# Obtained from https://winkbearertoken.appspot.com/
|
50
|
+
WINK_ACCESS_TOKEN = 'YOUR ACCESS TOKEN HERE'
|
51
|
+
|
52
|
+
# These bluetooth addresses were obtained from SimpleClient#connect_button
|
53
|
+
LIVING_ROOM_BUTTON = 'XX:XX:XX:XX:XX:XX'
|
54
|
+
BEDROOM_BUTTON = 'XX:XX:XX:XX:XX:XX'
|
55
|
+
NIGHTSTAND_BUTTON = 'XX:XX:XX:XX:XX:XX'
|
56
|
+
|
57
|
+
begin
|
58
|
+
puts "[*] Opening a connection to flicd..."
|
59
|
+
client = Flic::SimpleClient.new
|
60
|
+
|
61
|
+
puts "[*] Entering main loop"
|
62
|
+
client.listen(:low, LIVING_ROOM_BUTTON, BEDROOM_BUTTON, NIGHTSTAND_BUTTON) do |button, event, latency_ms|
|
63
|
+
if latency_ms > 2000
|
64
|
+
puts "[*] [#{button}] Ignoring #{event} because the latency is #{latency_ms} ms"
|
65
|
+
else
|
66
|
+
puts "[*] [#{button}] Handling #{event}"
|
30
67
|
|
68
|
+
case button
|
69
|
+
when LIVING_ROOM_BUTTON
|
70
|
+
case event
|
71
|
+
when :button_single_click
|
72
|
+
puts HTTParty.post('https://api.wink.com/scenes/SCENE_ID/activate', headers: { Authorization: "Bearer #{WINK_ACCESS_TOKEN}" }).inspect
|
73
|
+
when :button_double_click
|
74
|
+
puts HTTParty.post('https://api.wink.com/scenes/SCENE_ID/activate', headers: { Authorization: "Bearer #{WINK_ACCESS_TOKEN}" }).inspect
|
75
|
+
when :button_hold
|
76
|
+
puts HTTParty.post('https://api.wink.com/scenes/SCENE_ID/activate', headers: { Authorization: "Bearer #{WINK_ACCESS_TOKEN}" }).inspect
|
77
|
+
end
|
78
|
+
|
79
|
+
when BEDROOM_BUTTON
|
80
|
+
case event
|
81
|
+
when :button_single_click
|
82
|
+
puts HTTParty.post('https://api.wink.com/scenes/SCENE_ID/activate', headers: { Authorization: "Bearer #{WINK_ACCESS_TOKEN}" }).inspect
|
83
|
+
when :button_double_click
|
84
|
+
puts HTTParty.post('https://api.wink.com/scenes/SCENE_ID/activate', headers: { Authorization: "Bearer #{WINK_ACCESS_TOKEN}" }).inspect
|
85
|
+
when :button_hold
|
86
|
+
puts HTTParty.post('https://api.wink.com/scenes/SCENE_ID/activate', headers: { Authorization: "Bearer #{WINK_ACCESS_TOKEN}" }).inspect
|
87
|
+
end
|
88
|
+
|
89
|
+
when NIGHTSTAND_BUTTON
|
90
|
+
case event
|
91
|
+
when :button_single_click
|
92
|
+
puts HTTParty.post('https://api.wink.com/scenes/SCENE_ID/activate', headers: { Authorization: "Bearer #{WINK_ACCESS_TOKEN}" }).inspect
|
93
|
+
when :button_double_click
|
94
|
+
puts HTTParty.post('https://api.wink.com/scenes/SCENE_ID/activate', headers: { Authorization: "Bearer #{WINK_ACCESS_TOKEN}" }).inspect
|
95
|
+
when :button_hold
|
96
|
+
puts HTTParty.post('https://api.wink.com/scenes/SCENE_ID/activate', headers: { Authorization: "Bearer #{WINK_ACCESS_TOKEN}" }).inspect
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
rescue StandardError => error
|
102
|
+
puts "[!] Whoops! #{error.inspect} occured. Wait for a second and restart everything."
|
103
|
+
sleep 1
|
104
|
+
|
105
|
+
retry
|
106
|
+
rescue Interrupt
|
107
|
+
puts "[*] Shutting down gracefully because of an interrupt"
|
108
|
+
|
109
|
+
client.shutdown
|
110
|
+
end
|
111
|
+
|
112
|
+
puts "[*] Goodbye cruel world!"
|
113
|
+
```
|
114
|
+
|
115
|
+
## Advanced Usage
|
116
|
+
The interface of `Flic::Client` closely mirrors [the official Java implimentation](https://github.com/50ButtonsEach/fliclib-linux-hci/tree/master/clientlib/java). Unlike `Flic::SimpleClient`, none of it's methods are blocking except `Flic::Client#handle_next_event` which blocks until the next event is recevied and dispatches it to the approprate handlers and `Flic::Client#enter_main_loop` which blocks until the client is shutdown and dispatches events as they are received. Ideally, `Flic::Client#enter_main_loop` should be run in a dedicated networking / event dispatch thread.
|
117
|
+
|
118
|
+
|
119
|
+
## Contributing
|
120
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/anarchocurious/flic.
|
121
|
+
|
122
|
+
## License
|
123
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/lib/flic/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alec Larsen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bindata
|