hue-cli 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.
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ Gemfile.lock
2
+ *.gem
3
+ *.gem
4
+ *.rbc
5
+ .bundle
6
+ .config
7
+ coverage
8
+ InstalledFiles
9
+ lib/bundler/man
10
+ pkg
11
+ rdoc
12
+ spec/reports
13
+ test/tmp
14
+ test/version_tmp
15
+ tmp
16
+
17
+ # YARD artifacts
18
+ .yardoc
19
+ _yardoc
20
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,117 @@
1
+ hue-cli
2
+ =======
3
+
4
+ Command Line Interface to the Philips Hue lighting system.
5
+
6
+ # Installation
7
+ To begin using, install the ruby gem (this requires ruby 1.9 and rubygems)
8
+
9
+ ```
10
+ $ gem install hue-cli
11
+ ```
12
+
13
+ # Usage
14
+
15
+ This install the hue command. Simply type
16
+
17
+ ```
18
+ $ hue
19
+ ```
20
+
21
+ and the bridge state will be verified. Follow the instructions to register the application with your bridge.
22
+
23
+ ## Register
24
+
25
+ You can explicity register the application with
26
+
27
+ ```
28
+ $ hue register
29
+ ```
30
+
31
+ ## Bridge state
32
+
33
+ Examine the current state of the bridge
34
+
35
+ ```
36
+ $ hue
37
+ Philips Hue
38
+ IP: 196.168.0.1
39
+ Button pressed: false
40
+ Applications:
41
+ 073f2ed95fcbbef2532c751dd404cc9d : hue-cli
42
+ Lights:
43
+ 1. Living Overhead - OFF
44
+ 2. Living Cabinet - OFF
45
+ 3. Living Corner Lamp - OFF
46
+ ```
47
+
48
+ ## Light state
49
+
50
+ Examine the state of one of the lights
51
+
52
+ ```
53
+ $ hue lights 1
54
+ ```
55
+
56
+ or just
57
+
58
+ ```
59
+ $ hue 1
60
+ Living Overhead: ON
61
+ Brightness: 254 (100%)
62
+ Color: Temperature=2012°K (497 mired), RGB≈[255, 136, 13]
63
+ ```
64
+
65
+ ## Change Light state
66
+
67
+ Change a single lights state with the follow (rather self-explanatory) commands
68
+
69
+ ```
70
+ $ hue 1 on
71
+ $ hue 1 off
72
+ $ hue 1 flash
73
+ $ hue 1 blink
74
+ $ hue 1 solid
75
+ ```
76
+
77
+ ### Light brightness
78
+
79
+ The lights brightness command takes a value (0-255) or percentage (0%-100%)
80
+ ```
81
+ $ hue 1 brightness 200
82
+ $ hue 1 brightness 50%
83
+ $ hue 1
84
+ Living Overhead: ON
85
+ Brightness: 128 (50%)
86
+ Color: Temperature=2012°K (497 mired), RGB≈[255, 136, 13]
87
+ ```
88
+
89
+ ### Light color
90
+
91
+ The lights color command takes 1-3 arguments, each interpreted depending on range and value.
92
+
93
+ ```
94
+ $ hue 1 color 6500
95
+ $ hue 1
96
+ Living Overhead: ON
97
+ Brightness: 128 (50%)
98
+ Color: Temperature=6500°K (153 mired), RGB≈[255, 254, 250]
99
+ ```
100
+
101
+ ```
102
+ $ hue 1 color 240
103
+ $ hue 1
104
+ Living Overhead: ON
105
+ Brightness: 128 (50%)
106
+ Color: Temperature=4167°K (240 mired), RGB≈[255, 208, 170]
107
+ ```
108
+
109
+ ```
110
+ $ hue 1 color 30000 255
111
+ $ hue 1
112
+ Living Overhead: ON
113
+ Brightness: 128 (50%)
114
+ Color: Hue=30000, Saturation=255, RGB≈[0, 255, 190]
115
+ ```
116
+
117
+ ## More coming...
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ require 'rake'
2
+
3
+ begin
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new('spec') do |t|
7
+ t.rspec_opts = ["-fd", "-c"]
8
+ t.ruby_opts = ["-Ispec,lib"]
9
+ t.pattern = 'spec/**/*_spec.rb'
10
+ end
11
+
12
+ rescue LoadError
13
+ desc 'Spec rake task not available'
14
+ task :spec do
15
+ abort 'Spec rake task is not available. Be sure to install rspec as a gem or plugin'
16
+ end
17
+ end
18
+
19
+ task :default => [:spec]
data/bin/hue ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "#{File.dirname(__FILE__)}/../lib/hue/cli"
4
+
5
+ Hue::CLI.run(ARGV)
data/hue-cli.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "hue-cli"
6
+ s.version = '0.1.0'
7
+ s.authors = ["Birkir A. Barkarson", ""]
8
+ s.email = ["birkirb@stoicviking.net"]
9
+ s.homepage = "https://github.com/birkirb/hue-lib"
10
+ s.summary = %q{Command line interface for controlling Philips Hue system's lights and bridge.}
11
+ s.description = %q{CLI that allows simple printing of bridge and light state, with easy-to-use syntax to manipulate state}
12
+
13
+ s.rubyforge_project = "hue-cli"
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_runtime_dependency("json")
21
+ s.add_runtime_dependency("hue-lib", '>= 0.7.0')
22
+ s.add_development_dependency("rspec", '>= 2.6.0')
23
+ s.add_development_dependency("mocha", '>= 0.9.0')
24
+ s.add_development_dependency("webmock", '>= 1.8.0')
25
+ end
@@ -0,0 +1,58 @@
1
+ module Hue
2
+ module CLI
3
+ class Command
4
+
5
+ public
6
+
7
+ def initialize
8
+ set_bridge
9
+ parse_methods
10
+ end
11
+
12
+ def execute(*args)
13
+ if args.size > 0
14
+ send_method(*args)
15
+ else
16
+ @bridge.print_state
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :bridge
23
+
24
+ def is_available?(method_name)
25
+ @methods[method_name.to_sym]
26
+ end
27
+
28
+ def is_available!(method_name)
29
+ is_available?(method_name) or
30
+ raise Error.new("Action '#{method_name.to_s}' is not available for operation '#{name}'")
31
+ end
32
+
33
+ def name
34
+ self.class.name.gsub(/.*\:\:/, '').downcase
35
+ end
36
+
37
+ def set_bridge
38
+ @bridge = Hue::CLI.bridge
39
+ end
40
+
41
+ def parse_methods
42
+ @methods = self.class.instance_methods(false).inject(Hash.new(false)) do |hash, method_name|
43
+ hash[method_name] = true
44
+ hash
45
+ end
46
+ @methods[:execute] = false
47
+ end
48
+
49
+ def send_method(*args)
50
+ method = args.shift.to_sym
51
+ if is_available!(method)
52
+ send(method, *args)
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,60 @@
1
+ module Hue
2
+ module CLI
3
+ module Commands
4
+ class Light < Hue::CLI::Command
5
+
6
+ attr_reader :bulb
7
+
8
+ def execute(*args)
9
+ arg = args.shift
10
+ light_number = arg.to_i
11
+
12
+ if light_number > 0
13
+ @bulb = Hue::Bulb.new(bridge, light_number)
14
+ else
15
+ raise Hue::CLI::Error.new("Not a valid light number: #{arg}")
16
+ end
17
+
18
+ # bulb exists (is valid?)
19
+
20
+ if args.size > 0
21
+ super(*args)
22
+ else
23
+ bulb.print_state
24
+ end
25
+ end
26
+
27
+ protected
28
+
29
+ def on(*args)
30
+ bulb.on
31
+ end
32
+
33
+ def off(*args)
34
+ bulb.off
35
+ end
36
+
37
+ def brightness(*args)
38
+ bulb.brightness = args.first
39
+ end
40
+
41
+ def flash(*args)
42
+ bulb.flash
43
+ end
44
+
45
+ def blink(*args)
46
+ bulb.blink
47
+ end
48
+
49
+ def solid(*args)
50
+ bulb.solid
51
+ end
52
+
53
+ def color(*args)
54
+ bulb.color = Colors.parse(*args)
55
+ end
56
+
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,37 @@
1
+ module Hue
2
+ module CLI
3
+ module Commands
4
+ class Register < Hue::CLI::Command
5
+
6
+ def initialize
7
+ parse_methods
8
+ end
9
+
10
+ def execute(*args)
11
+ if args.size > 0
12
+ super(*args)
13
+ else
14
+ default
15
+ end
16
+ end
17
+
18
+ protected
19
+
20
+ def default(*args)
21
+ print_button_instructions
22
+ Hue.register_default
23
+ end
24
+
25
+ private
26
+
27
+ def print_button_instructions
28
+ puts "Please press the button on your bridge."
29
+ sleep 1
30
+ puts "Once done, press Enter to continue with the registration."
31
+ gets
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+ end
data/lib/hue/cli.rb ADDED
@@ -0,0 +1,73 @@
1
+ require 'hue'
2
+ require 'find'
3
+ require_relative 'cli/command'
4
+ require_relative 'extensions/bulb'
5
+ require_relative 'extensions/bridge'
6
+ require_relative 'extensions/hue'
7
+
8
+ module Hue
9
+ module CLI
10
+ class Error < StandardError; end;
11
+
12
+ def self.bridge
13
+ Hue.application
14
+ end
15
+
16
+ def self.run(args = [])
17
+ commands = commands_in_object_space
18
+
19
+ if args.size > 0
20
+ first_arg = args.shift
21
+ if command = commands[first_arg.to_sym]
22
+ command.new.execute(*args)
23
+ else
24
+ Commands::Light.new.execute(first_arg, *args)
25
+ end
26
+ else
27
+ print_default
28
+ end
29
+ rescue Hue::Error => err
30
+ puts err.message
31
+ rescue Hue::CLI::Error => err
32
+ puts err.message
33
+ end
34
+
35
+ private
36
+
37
+ def self.print_default
38
+ Command.new.execute
39
+ rescue Hue::Error => err
40
+ puts "Failed to initialize bridge."
41
+ if bridges = Hue.register_bridges
42
+ puts "Found bridges:"
43
+ bridges.each do |key, config|
44
+ puts " #{config.uri} (uuid: #{key})"
45
+ end
46
+ puts
47
+ puts "Please type 'hue register' to register your application with the bridge."
48
+ else
49
+ puts "No bridges found on the local network."
50
+ end
51
+ end
52
+
53
+ def self.commands_in_object_space
54
+ require_commands
55
+ commands = Hash.new
56
+ ::ObjectSpace.each_object(Class) do |klass|
57
+ if(Hue::CLI::Command > klass)
58
+ commands[klass.name.gsub(/.*\:\:/, '').downcase.to_sym] = klass
59
+ end
60
+ end
61
+ commands
62
+ end
63
+
64
+ def self.require_commands
65
+ Find.find(File.join(File.dirname(__FILE__), 'cli', 'commands')) do |path|
66
+ if File.file?(path) && path.match(/\.rb$/)
67
+ require path
68
+ end
69
+ end
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,21 @@
1
+ module Hue
2
+ class Bridge
3
+
4
+ def print_state
5
+ state = self.status
6
+ config = state['config']
7
+ puts "#{config['name']}"
8
+ puts "IP: #{config['ipaddress']}"
9
+ puts "Button pressed: #{config['linkbutton']}"
10
+ puts "Applications:"
11
+ config['whitelist'].each do |key, values|
12
+ puts " #{key} : #{values['name']}"
13
+ end
14
+ puts "Lights:"
15
+ state['lights'].each do |key, values|
16
+ puts " #{key}. #{values['name']} - #{values['state']['on'] ? 'ON' : 'OFF'}"
17
+ end
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module Hue
2
+ class Bulb
3
+
4
+ def print_state
5
+ puts "#{self.name}: #{self.on? ? 'ON' : 'OFF'}"
6
+ puts "Brightness: #{self.brightness} (#{(self.brightness_percent).to_i}%)"
7
+ print "Color: "
8
+ print self.color.to_s
9
+ puts ", #{self.color.to_rgb.to_s}"
10
+ if blinking?
11
+ puts "Alert: Blinking!"
12
+ end
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ module Hue
2
+ def self.device_type
3
+ 'hue-cli'
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hue-cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Birkir A. Barkarson
9
+ - ''
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-02-04 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: hue-lib
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: 0.7.0
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: 0.7.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 2.6.0
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: 2.6.0
63
+ - !ruby/object:Gem::Dependency
64
+ name: mocha
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: 0.9.0
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: 0.9.0
79
+ - !ruby/object:Gem::Dependency
80
+ name: webmock
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: 1.8.0
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: 1.8.0
95
+ description: CLI that allows simple printing of bridge and light state, with easy-to-use
96
+ syntax to manipulate state
97
+ email:
98
+ - birkirb@stoicviking.net
99
+ executables:
100
+ - hue
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - .gitignore
105
+ - Gemfile
106
+ - README.md
107
+ - Rakefile
108
+ - bin/hue
109
+ - hue-cli.gemspec
110
+ - lib/hue/cli.rb
111
+ - lib/hue/cli/command.rb
112
+ - lib/hue/cli/commands/light.rb
113
+ - lib/hue/cli/commands/register.rb
114
+ - lib/hue/extensions/bridge.rb
115
+ - lib/hue/extensions/bulb.rb
116
+ - lib/hue/extensions/hue.rb
117
+ homepage: https://github.com/birkirb/hue-lib
118
+ licenses: []
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ! '>='
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ! '>='
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ requirements: []
136
+ rubyforge_project: hue-cli
137
+ rubygems_version: 1.8.23
138
+ signing_key:
139
+ specification_version: 3
140
+ summary: Command line interface for controlling Philips Hue system's lights and bridge.
141
+ test_files: []
142
+ has_rdoc: