lita-hue-lightswitch 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7b3ca14ae52d62142c1a9454e6a2b9b608d238f316ef3502f5c2dba0d79bd571
4
+ data.tar.gz: b078b50df0c4094da457eb022a60a0eea78d3fd51c4bc2cc6fd0103092d138a1
5
+ SHA512:
6
+ metadata.gz: e1fdf9d26770667c6f031eb492ddeb1ffb81ee12dc0290036e4e8aafdf376c1a9da001d60587a2b1ab9e20655513d88e75a61ba60bae5af743784dc4ae9694aa
7
+ data.tar.gz: b65978eed2c4153e5dc4c9d003d5bb15a55a1c96763669baf192fb9768aeef1500c9ab94bcd63f3360825412318c6535117d36ec5a961cb97338997b71e68ced
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+
19
+ # vim
20
+ *.swp
21
+ *.swo
22
+ *~
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,19 @@
1
+ # lita-hue-lightswitch
2
+
3
+ TODO: Add a description of the plugin.
4
+
5
+ ## Installation
6
+
7
+ Add lita-hue-lightswitch to your Lita instance's Gemfile:
8
+
9
+ ``` ruby
10
+ gem "lita-hue-lightswitch"
11
+ ```
12
+
13
+ ## Configuration
14
+
15
+ TODO: Describe any configuration attributes the plugin exposes.
16
+
17
+ ## Usage
18
+
19
+ TODO: Describe the plugin's features and how to use them.
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,62 @@
1
+ # START:setup
2
+ [1] pry(main)> require 'hue'
3
+ => true
4
+
5
+ [2] pry(main)> client = Hue::Client.new
6
+ => #<Hue::Client:0x0000555b194f0b40
7
+ @bridges=
8
+ [#<Hue::Bridge:0x0000555b194f0140
9
+ @client=#<Hue::Client:0x0000555b194f0b40 ...>,
10
+ @id="001788fffe2c1ba4",
11
+ @ip="10.0.0.106">],
12
+ @username="redacted">
13
+ # END:setup
14
+
15
+ # START:lights
16
+ [3] pry(main)> client.lights.map(&:name)
17
+ => ["Bottom lamp", "Middle lamp", "Top lamp", "Bloom"]
18
+
19
+ [4] pry(main)> bloom = client.lights.last
20
+ => #<Hue::Light:0x0000555b1970a750
21
+ @alert="none",
22
+ @bridge=
23
+ #<Hue::Bridge:0x0000555b194f0140
24
+ @client=
25
+ #<Hue::Client:0x0000555b194f0b40
26
+ @bridges=[#<Hue::Bridge:0x0000555b194f0140 ...>],
27
+ @username="CSvQNKCBeyLj-FRitKTPUNRD4tEmphZIjUG1VGp1">,
28
+ @id="001788fffe2c1ba4",
29
+ @ip="10.0.0.106",
30
+ @lights=
31
+ # END:lights
32
+ # ... snipped for brevity ...
33
+
34
+ # START:commands
35
+ [6] pry(main)> ls bloom
36
+ Hue::TranslateKeys#methods: translate_keys unpack_hash
37
+ Hue::EditableState#methods:
38
+ alert= color_temperature= hue= on! on? set_xy
39
+ brightness= effect= off! on= saturation=
40
+ Hue::Light#methods:
41
+ alert color_mode hue name reachable?
42
+ bridge color_temperature id name= refresh
43
+ brightness effect model point_symbol saturation
44
+ instance variables:
45
+ @alert @client @hue @name @saturation
46
+ @bridge @color_mode @id @on @software_ver
47
+ @brightness @effect @model @reachable @state
48
+ # END:commands
49
+
50
+ # START:action
51
+ # Change my bulb to a blue color
52
+ [7] pry(main)> bloom.hue = 44444
53
+ => 44444
54
+
55
+ # Turn off my bulb
56
+ [8] pry(main)> bloom.off!
57
+ => false
58
+
59
+ # Turn on my bulb
60
+ [9] pry(main)> bloom.on!
61
+ => true
62
+ # END:action
@@ -0,0 +1,16 @@
1
+ $ lita
2
+ Type "exit" or "quit" to end the session.
3
+ Lita > lita hue off
4
+ Turning off light!
5
+
6
+ Lita > lita hue on
7
+ Turning on light!
8
+
9
+ Lita > lita hue color red
10
+ Setting color to red
11
+
12
+ Lita > lita hue color green
13
+ Setting color to green
14
+
15
+ Lita > lita hue demo
16
+ Enjoy the light demo!
@@ -0,0 +1,13 @@
1
+ require "lita"
2
+
3
+ Lita.load_locales Dir[File.expand_path(
4
+ File.join("..", "..", "locales", "*.yml"), __FILE__
5
+ )]
6
+
7
+ require "lita/hue_colored_bulb"
8
+ require "lita/handlers/hue_lightswitch"
9
+
10
+ Lita::Handlers::HueLightswitch.template_root File.expand_path(
11
+ File.join("..", "..", "templates"),
12
+ __FILE__
13
+ )
@@ -0,0 +1,96 @@
1
+ # START:header
2
+ module Lita
3
+ module Handlers
4
+ class HueLightswitch < Handler
5
+
6
+ # Set these in your bot's lita_config.rb
7
+ config :hue_bulb_name, default: 'Bloom'
8
+
9
+ # Create a reusable instance variable handle to a bulb
10
+ # named 'Bloom' (or whatever your config value for
11
+ # :hue_bulb_name is set to.
12
+ def light
13
+ @_light ||= HueColoredBulb.new(config.hue_bulb_name)
14
+ end
15
+ # END:header
16
+
17
+ # START:handle
18
+ # Any command of the form 'lita hue ____' should be caught
19
+ # and passed to the :handle_hue method
20
+ route /^hue\s+(.+)/i, :handle_hue, command: true
21
+
22
+ # Split the captured hue command into a one-word command name
23
+ # and everything after that (if anything) and pass the results
24
+ # on to the :hue_execute mapping below.
25
+ def handle_hue(message)
26
+ command, *rest = message.matches.last.last.split
27
+ response = hue_execute(command, rest)
28
+ message.reply response
29
+ end
30
+ # END:handle
31
+
32
+ # START:mapping
33
+ # Given a one-word hue :command and a possibly-empty array of
34
+ # additional parameters :rest, step through this case
35
+ # statement and perform the first matching action.
36
+ def hue_execute(command, rest=[])
37
+ case command
38
+ when 'demo'
39
+ demo
40
+ 'Enjoy the light demo!'
41
+ when 'list_colors'
42
+ list_colors
43
+ when 'color'
44
+ recolor rest
45
+ "Setting color to #{rest.join ' '}"
46
+ when 'off'
47
+ off!
48
+ "Turning off light!"
49
+ when 'on'
50
+ on!
51
+ "Turning on light!"
52
+ else
53
+ debug_message = [command, rest].flatten.join ' '
54
+ "I don't know how to [#{debug_message}] a hue bulb."
55
+ end
56
+ end
57
+ # END: mapping
58
+
59
+ # START:colors
60
+ # Simple help text in case someone forgets Lita's `hue` commands
61
+ def list_colors
62
+ light.colors.join ' '
63
+ end
64
+
65
+ # Set the bulb's color to one of the named colors it recognizes
66
+ # e.g. red, green, blue, etc.
67
+ def recolor(rest)
68
+ new_color = rest.first
69
+ light.set_color new_color
70
+ end
71
+ # END:colors
72
+
73
+ # START:basics
74
+ ##################
75
+ #
76
+ # These three commands are pass-throughs to the HueColoredBulb wrapper.
77
+ #
78
+ ##################
79
+
80
+ def off!
81
+ light.off!
82
+ end
83
+
84
+ def on!
85
+ light.on!
86
+ end
87
+
88
+ def demo
89
+ light.demo
90
+ end
91
+ # END:basics
92
+
93
+ Lita.register_handler(self)
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,123 @@
1
+ # START:header
2
+ # The hue gem is doing all the heavy lifting here, you're simply
3
+ # wrapping it in some more beginner-friendly language.
4
+ require 'hue'
5
+
6
+ # Exposes basic on, off, and recolor commands for a single named Hue bulb
7
+ # on the local network.
8
+ class HueColoredBulb
9
+ # Note that the initializer only cares about a single named bulb
10
+ # and does not look around for other bulbs to care about.
11
+ def initialize(name='Bloom')
12
+ @client = Hue::Client.new
13
+
14
+ # Your client likely has multiple bulbs attached, but here you're only
15
+ # going to want to find a single bulb that matches the supplied name.
16
+ @light = @client.lights.select do |light|
17
+ light.name == name
18
+ end.first
19
+
20
+ # No point continuing if the bulb can't be found by name.
21
+ raise ArgumentError if @light.nil?
22
+ end
23
+
24
+ # The named light itself and the Hue client object are both worth reusing
25
+ # as instance variables
26
+ attr_reader :light, :client
27
+ # END:header
28
+
29
+ # START:basics
30
+ # on! and off! methods are passed right through this API. They're plenty
31
+ # simple for your purposes as is.
32
+ def on!
33
+ light.on!
34
+ end
35
+
36
+ def off!
37
+ light.off!
38
+ end
39
+
40
+ # Fun demo to spin through all named colors, one color every quarter second.
41
+ def demo(sleep_seconds=0.25)
42
+ colors.each do |color_name|
43
+ self.set_color color_name
44
+ sleep sleep_seconds
45
+ end
46
+ end
47
+ # END:basics
48
+
49
+ # START:color_names
50
+ # Hue's color coordinate system has about 64,000 distinct hues. For Lita
51
+ # purposes you're fine starting with these twelve familiar options.
52
+ #
53
+ # The colors are listed in ascending order of hue along the color wheel
54
+ # starting at red, moving clockwise up through green and blue,
55
+ # and looping back around to the starting point to end at the same
56
+ # red where they began.
57
+
58
+ # Each color's corresponding hue number is one-twelfth of the circle's
59
+ # circumference higher than the previous color. If red is 0 then orange is
60
+ # 65535 / 12 * 1, or 5461. Yellow is twice that at 10,922. Rose is 60,073.
61
+
62
+ # [R]ed
63
+
64
+ # rose orange
65
+
66
+ # magenta yellow
67
+
68
+ # violet chartreuse
69
+
70
+ # [B]lue [G]reen
71
+
72
+ # azure aquamarine
73
+
74
+ # cyan
75
+
76
+ #
77
+ def colors
78
+ [
79
+ 'red', 'orange', 'yellow', # red is 0
80
+ 'chartreuse', 'green', 'aquamarine', # green is 21,000
81
+ 'cyan', 'azure', 'blue', # blue is 44,000
82
+ 'violet', 'magenta', 'rose' # rose is about 60,000
83
+ ]
84
+ end
85
+
86
+ # Take a color name like cyan, look up its hue on the 65000 point scale,
87
+ # and pass that number to the light's hue= method to recolor the light.
88
+ def set_color(name)
89
+ unless colors.include? name.downcase
90
+ raise ArgumentError.new("I don't know that color!")
91
+ end
92
+
93
+ light.hue = hue_for_color(name)
94
+ end
95
+ # END:color_names
96
+
97
+ # START:color_backend
98
+ # RGB color wheel from 0 to 65535:
99
+ # red is 0 (and 65535 because the wheel starts over at the end)
100
+ # green is ~21000
101
+ # blue is ~44000
102
+ def hue_for_color(name)
103
+ # green has an index of 4 in the colors array above
104
+ color_index = colors.find_index(name)
105
+
106
+ # each color is 65535 / 12 points "wide",
107
+ # which is 5461 points on this RGB color wheel.
108
+ color_width = (max_color / colors.count).to_i
109
+
110
+ # green's hue is thus 4 * 5461 = 21845.
111
+ color_index * color_width
112
+ end
113
+
114
+ private
115
+ # The hue gem has a built-in constant range to track the number of distinct
116
+ # color hues the system exposes for a given colored bulb, i.e. 2^16 or
117
+ # "16-bit" color.
118
+ def max_color
119
+ # 0..65535
120
+ Hue::Light::HUE_RANGE.last
121
+ end
122
+ # END:color_backend
123
+ end
@@ -0,0 +1,27 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = "lita-hue-lightswitch"
3
+ spec.version = "1.0.0"
4
+ spec.authors = ["Daniel J. Pritchett"]
5
+ spec.email = ["daniel@gremlin.com"]
6
+ spec.description = "Control Hue lights with a Lita chatbot"
7
+ spec.summary = "Control Hue lights with a Lita chatbot"
8
+ spec.homepage = "https://github.com/dpritchett/lita-hue-lightswitch"
9
+ spec.license = "MIT"
10
+ spec.metadata = { "lita_plugin_type" => "handler" }
11
+
12
+ spec.files = `git ls-files`.split($/)
13
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.require_paths = ["lib"]
16
+
17
+ # START:runtime
18
+ spec.add_runtime_dependency "lita", ">= 4.7"
19
+ spec.add_runtime_dependency "hue", "~> 0.2.0"
20
+ # END:runtime
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "pry-byebug"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rack-test"
26
+ spec.add_development_dependency "rspec", ">= 3.0.0"
27
+ end
@@ -0,0 +1,4 @@
1
+ en:
2
+ lita:
3
+ handlers:
4
+ hue_lightswitch:
@@ -0,0 +1,64 @@
1
+ # START:header
2
+ require "spec_helper"
3
+
4
+ describe HueColoredBulb do
5
+ let(:bulb_name) { 'Bloom' }
6
+ subject { described_class.new(bulb_name) }
7
+ # END:header
8
+
9
+ # START:basics
10
+ it 'can turn on and off' do
11
+ subject.on!
12
+ subject.off!
13
+ end
14
+
15
+ it 'has a list of colors' do
16
+ actual = subject.colors
17
+ expect(actual.first).to eq('red')
18
+ expect(actual).to include('azure')
19
+ end
20
+
21
+ context 'setting a color' do
22
+ it 'can be colored cyan' do
23
+ expect{subject.set_color 'cyan'}.to_not raise_error
24
+ end
25
+
26
+ it 'cannot be colored burnt sienna' do
27
+ expect{subject.set_color 'burnt_sienna'}.to raise_error(ArgumentError)
28
+ end
29
+ end
30
+ # END:basics
31
+
32
+ # START:math
33
+ context 'color hue estimations' do
34
+ it 'has red at 0 hue' do
35
+ actual = subject.hue_for_color 'red'
36
+ expect(actual).to eq(0)
37
+ end
38
+
39
+ it 'has green at approximately 21k hue' do
40
+ actual = subject.hue_for_color 'green'
41
+ # absolute value of hue_for_color('green') should be within 1000
42
+ # of the 21,000 approximation specified here.
43
+ delta = (actual - 21000).abs
44
+ expect(delta < 1000).to be_truthy
45
+ end
46
+
47
+ it 'has blue at approximately 44k hue' do
48
+ actual = subject.hue_for_color 'blue'
49
+ delta = (actual - 44000).abs
50
+ expect(delta < 1000).to be_truthy
51
+ end
52
+ end
53
+ # END:math
54
+
55
+ # START:demo
56
+ context 'color wheel demo' do
57
+ it 'displays each color exactly once' do
58
+ n = subject.colors.count
59
+ expect(subject.light).to receive(:hue=).exactly(n).times
60
+ subject.demo(0.0001)
61
+ end
62
+ end
63
+ # END:demo
64
+ end
@@ -0,0 +1,59 @@
1
+ # START:header
2
+ require "spec_helper"
3
+
4
+ describe Lita::Handlers::HueLightswitch, lita_handler: true do
5
+ subject { described_class.new(robot) }
6
+ # END:header
7
+
8
+ # START:routes
9
+ it { is_expected.to route("Lita hue color green") }
10
+ it { is_expected.to route("Lita hue list_colors") }
11
+ it { is_expected.to route("Lita hue off") }
12
+ it { is_expected.to route("Lita hue on") }
13
+ # END:routes
14
+
15
+ # START:client
16
+ context 'using a dummy HueColoredBulb client' do
17
+ let(:bulb) { double(:bulb) }
18
+ before { subject.stub(:light).and_return bulb }
19
+ # Intentionally deviating from the color list of the actual
20
+ # HueColoredBulb class for two reasons:
21
+ # - three colors make for simpler testing than 12
22
+ # - violating some of the numeric assumptions of the linked
23
+ # class might give us a more robust integration by assuming
24
+ # as little as necessary from this calling class.
25
+ before { bulb.stub(:colors).and_return %w[red orange green] }
26
+ # END:client
27
+
28
+ # START:power
29
+ it 'can turn off the bulb' do
30
+ expect(bulb).to receive(:off!)
31
+ actual = subject.hue_execute 'off'
32
+ expect(actual).to match /Turning off/
33
+ end
34
+
35
+ it 'can turn off the bulb' do
36
+ expect(bulb).to receive(:on!)
37
+ actual = subject.hue_execute 'on'
38
+ expect(actual).to match /Turning on/
39
+ end
40
+ # END:power
41
+
42
+ # START:colors
43
+ it 'can list colors' do
44
+ actual = subject.list_colors
45
+ expect(actual).to include 'green'
46
+ expect(actual).to include 'red'
47
+ expect(actual).to include 'orange'
48
+ end
49
+
50
+ it 'can recolor the bulb' do
51
+ new_color = bulb.colors.sample
52
+
53
+ expect(bulb).to receive(:set_color)
54
+ actual = subject.hue_execute "color", [new_color]
55
+ expect(actual).to match /Setting color to #{new_color}/
56
+ end
57
+ # END:colors
58
+ end
59
+ end
@@ -0,0 +1,6 @@
1
+ require "lita-hue-lightswitch"
2
+ require "lita/rspec"
3
+
4
+ # A compatibility mode is provided for older plugins upgrading from Lita 3. Since this plugin
5
+ # was generated with Lita 4, the compatibility mode should be left disabled.
6
+ Lita.version_3_compatibility_mode = false
File without changes
metadata ADDED
@@ -0,0 +1,161 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lita-hue-lightswitch
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Daniel J. Pritchett
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-01-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lita
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '4.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: hue
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack-test
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 3.0.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 3.0.0
111
+ description: Control Hue lights with a Lita chatbot
112
+ email:
113
+ - daniel@gremlin.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - Gemfile
120
+ - README.md
121
+ - Rakefile
122
+ - examples/001-hue-demo.rb
123
+ - examples/002-lita-demo.session
124
+ - lib/lita-hue-lightswitch.rb
125
+ - lib/lita/handlers/hue_lightswitch.rb
126
+ - lib/lita/hue_colored_bulb.rb
127
+ - lita-hue-lightswitch.gemspec
128
+ - locales/en.yml
129
+ - spec/lita/handlers/hue_colored_bulb_spec.rb
130
+ - spec/lita/handlers/hue_lightswitch_spec.rb
131
+ - spec/spec_helper.rb
132
+ - templates/.gitkeep
133
+ homepage: https://github.com/dpritchett/lita-hue-lightswitch
134
+ licenses:
135
+ - MIT
136
+ metadata:
137
+ lita_plugin_type: handler
138
+ post_install_message:
139
+ rdoc_options: []
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubyforge_project:
154
+ rubygems_version: 2.7.6
155
+ signing_key:
156
+ specification_version: 4
157
+ summary: Control Hue lights with a Lita chatbot
158
+ test_files:
159
+ - spec/lita/handlers/hue_colored_bulb_spec.rb
160
+ - spec/lita/handlers/hue_lightswitch_spec.rb
161
+ - spec/spec_helper.rb