renstar 0.1.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3651f4b220453c1382ee4accc5503a1122364672acee6590366adcfe0bc911c9
4
- data.tar.gz: 7355ee293bca9e280004a799198c107c060c555dfff9913215c757d678ef67cc
3
+ metadata.gz: 6e0023780425b4b2d649ffaaf881630adb1485a8c54e58934f69c31ba4953bd5
4
+ data.tar.gz: ebbef10e2b31c0c51aa5de4c8b02b82ec6f5d29be6d4526f4ec15c5cbdffde62
5
5
  SHA512:
6
- metadata.gz: d216511fa715d06164f923d0d923312d7c515f7c97f9395bb91fa90dec0cbc416fbcc935e338d4b08b20f518236a4a3bc55a8766d470c1b2a501fedb1ee67884
7
- data.tar.gz: 56077d08ddc62d53d365999ac75fe552aeb8cf52222f97b3ba8fe4ce5de9a9ebc0f04546803fbb9df422ae51187bff0cc20ae30e682dbdfb3f2bce6cc647df14
6
+ metadata.gz: d36ebe45f2767dc4ed9f45f1299828004985fffe6c790913e5a1fad386ba23a59fd25347bb746ce0a2f9d8a88a448c952bfa707d77cfed9522e131477fc6f968
7
+ data.tar.gz: 4ae3c1982c6df2f82e05f45410002259df1a8c21113039dc4d9d4b2484819d432e2584109eb72683a3684e46d55519fe79b3342047904a32c68c7dae5c97db9f
data/Gemfile CHANGED
@@ -6,3 +6,4 @@ source 'https://rubygems.org'
6
6
  gemspec
7
7
 
8
8
  gem 'rake', '~> 13.0'
9
+ gem 'ssdp', git: 'https://github.com/mikerodrigues/ssdp'
data/README.md CHANGED
@@ -20,13 +20,69 @@ Or install it yourself as:
20
20
 
21
21
  $ gem install renstar
22
22
 
23
- ## Usage
23
+ ## Using the included binary
24
+
25
+ When installing the gem, we install `renstar.rb` for you automatically. You can
26
+ pass the `-h` flag for more info.
27
+
28
+ The help page does not list all the accepted commands or their values but all of
29
+ the methods below are supported. The binary just passes your arguments to the
30
+ methods below.
31
+
32
+ So, if you want to cool your house to 72 using the binary, you can do this:
33
+ ```ruby
34
+ renstar.rb cool 72
35
+ ```
36
+
37
+ You can apply the logic above to any of the methods below for the same effect.
38
+
39
+ The binary chooses the first thermostat it finds on the network, so you may get
40
+ unexpected results if you have more than one on your network. I do plan on
41
+ improving this.
42
+
43
+ You may have trouble with discovery on multi-homed hosts, but I'm working with
44
+ the author of the `ssdp` library to fix this, so I expect it to improve. You can
45
+ install my fork of `ssdp` from github if you need multi-homed support now.
46
+
47
+ ## Using the library
48
+
49
+ First we need to create a `Thermostat` object.
24
50
 
25
51
  * Search for thermostats on the LAN, return the first one found:
26
52
  ```ruby
27
53
  thermo = Renstar::Thermostat.search.first
28
54
  ```
29
55
 
56
+ ### Query
57
+
58
+ These methods let you see the thermostat info (controls and settings status), sensor info, runtimes, and
59
+ alerts.
60
+
61
+ * Get information about the thermostat:
62
+ ```ruby
63
+ thermo.info
64
+ ```
65
+
66
+ * Get the current sensors and their readings:
67
+ ```ruby
68
+ thermo.sensors
69
+ ```
70
+
71
+ * Get runtimes:
72
+ ```ruby
73
+ thermo.runtimes
74
+ ```
75
+
76
+ * See alerts and their status:
77
+ ```ruby
78
+ thermo.alerts
79
+
80
+
81
+ ### Control
82
+
83
+ These methods let you control the thermostat temperature controls, and fan. You
84
+ can use the `info` method to check the current state of these controls.
85
+
30
86
  * Heat to 80 degrees:
31
87
  ```ruby
32
88
  thermo.heat(80)
@@ -42,7 +98,7 @@ thermo.cool(60)
42
98
  thermo.auto(70, 74)
43
99
  ```
44
100
 
45
- * Turn off heeating and/or cooling
101
+ * Turn off heating and/or cooling
46
102
  ```ruby
47
103
  thermo.off
48
104
  ```
@@ -56,11 +112,17 @@ thermo.fan_off
56
112
  thermo.fan_toggle
57
113
  ```
58
114
 
59
- * Control the schedule:
115
+ ### Settings
116
+
117
+ These methods let you change the schedule and vacation settings on your
118
+ thermostat. You can use the `info` method to check the current state of the
119
+ settings.
120
+
121
+ * Set the schedule:
60
122
  ```ruby
61
123
  thermo.schedule_on
62
124
 
63
- thermo.scheduel_off
125
+ thermo.schedule_off
64
126
 
65
127
  thermo.schedule_toggle
66
128
  ```
@@ -72,8 +134,6 @@ thermo.home
72
134
  thermo.away
73
135
  ```
74
136
 
75
-
76
-
77
137
  ## Development
78
138
 
79
139
  After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/bin/renstar.rb CHANGED
@@ -1,50 +1,51 @@
1
1
  require 'renstar'
2
2
  require 'optparse'
3
3
  require 'ostruct'
4
+ require 'pry'
4
5
 
5
- class RenstarOptions
6
- DEFAULT_OPTIONS = { all: false }.freeze
7
- USAGE = " Usage: renstar.rb command [value]"
6
+ options = {}
8
7
 
9
- def self.parse(args)
8
+ #DEFAULT_OPTIONS = { all: false }.freeze
10
9
 
11
- @options = OpenStruct.new(DEFAULT_OPTIONS)
12
10
 
13
- options = OptionParser.new do |opts|
14
- opts.banner = USAGE
11
+ USAGE = " Usage: renstar.rb command [value]"
15
12
 
16
- opts.on '-d', '--discover', 'Discover all Renstar devices' do |d|
17
- @options.discover = true
18
- end
13
+ OptionParser.new do |opts|
19
14
 
20
- opts.on '-h', '--help', 'Display this screen' do |h|
21
- @options.help = true
22
- end
23
- end
15
+ opts.banner = USAGE
24
16
 
25
- options.parse!(args)
26
-
27
- puts options if @options && ARGV == []
28
-
29
- if @options.discover
30
- Renstar.discover.each do |device|
31
- puts "#{device.name} #{device.ip}"
32
- end
33
- exit 0
34
- end
35
-
36
- if @options.help
37
- puts opts
38
- exit 0
39
- end
17
+ opts.on '-d', '--discover', 'Discover all Renstar devices' do |d|
18
+ options[:discover] = true
19
+ end
40
20
 
21
+ opts.on '-h', '--help', 'Display this screen' do |h|
22
+ puts opts
23
+ exit 0
24
+ end
25
+ end.parse!
41
26
 
27
+ if options[:discover]
28
+ thermos = Renstar::Thermostat.search
29
+ thermos.each do |thermo|
30
+ puts "Found: #{thermo.location} #{thermo.usn}"
42
31
  end
32
+ exit 0
43
33
  end
44
34
 
45
- @options = RenstarOptions.parse(ARGV)
46
35
 
47
- thermo = Renstar::Thermostat.search.first
48
-
49
-
50
- thermo.send(*ARGV)
36
+ thermos = Renstar::Thermostat.search
37
+ thermos.each do |thermo|
38
+ puts "Found: #{thermo.location} #{thermo.usn}"
39
+ end
40
+ puts "Using: " + thermos.first.location + " - " + thermos.first.usn
41
+ unless (ARGV.nil? || ARGV.empty?)
42
+ response = thermos.first.send(*ARGV)
43
+ case response
44
+ when String
45
+ puts response
46
+ when Renstar::APIClient::APIObject
47
+ response.pp
48
+ when Array
49
+ response.each {|x| x.pp }
50
+ end
51
+ end
@@ -23,18 +23,15 @@ module Renstar
23
23
  @raw_hash
24
24
  end
25
25
 
26
- def human_readable
26
+ def human_readable(type)
27
27
  @raw_hash.map do |key, value|
28
- description = APIClient.key_to_description('runtimes', key)
29
- formatted_value = APIClient.value_to_formatted('runtimes', key, value)
28
+ description = APIClient.key_to_description(type, key)
29
+ formatted_value = APIClient.value_to_formatted(type, key, value)
30
30
  format("%-35<description>s %<formatted_value>s\n",
31
31
  { description: description, formatted_value: formatted_value })
32
32
  end.join
33
33
  end
34
34
 
35
- def pp
36
- puts human_readable
37
- end
38
35
  end
39
36
  end
40
37
  end
@@ -8,6 +8,9 @@ module Renstar
8
8
  # These alerts are for Air filter, Service, and UV Lamp
9
9
  #
10
10
  class Alert < APIObject
11
+ def pp
12
+ puts human_readable('alerts')
13
+ end
11
14
  end
12
15
  end
13
16
  end
@@ -9,6 +9,9 @@ module Renstar
9
9
  # info response from the API for clean access.
10
10
  #
11
11
  class Info < APIObject
12
+ def pp
13
+ puts human_readable('info')
14
+ end
12
15
  end
13
16
  end
14
17
  end
@@ -8,6 +8,9 @@ module Renstar
8
8
  # Breaks down how much time the system spent in various states
9
9
  # like heating or cooling.
10
10
  class Runtime < APIObject
11
+ def pp
12
+ puts human_readable('runtimes')
13
+ end
11
14
  end
12
15
  end
13
16
  end
@@ -7,6 +7,9 @@ module Renstar
7
7
  # Represents an installed sensor in the system
8
8
  # Returns the value of the sensor
9
9
  class Sensor < APIObject
10
+ def pp
11
+ puts human_readable('sensors')
12
+ end
10
13
  end
11
14
  end
12
15
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'ssdp'
4
+ require 'socket'
4
5
  require_relative 'api_client'
5
6
 
6
7
  module Renstar
@@ -11,27 +12,42 @@ module Renstar
11
12
  #
12
13
  class Thermostat
13
14
  SERVICE = 'venstar:thermostat:ecp'
14
- DEFAULT_TIMEOUT = 5
15
+ DEFAULT_TIMEOUT = 3
15
16
 
16
17
  attr_reader :location, :usn, :cached_info
17
18
 
18
19
  include APIClient
19
20
 
20
- def initialize(location, usn)
21
- @location = location
22
- @usn = usn
21
+ def initialize(location, usn = nil)
22
+ if location && usn then
23
+ @location = location
24
+ @usn = usn
25
+ else
26
+ @location = "http://" + location + '/'
27
+ @usn = ""
28
+ end
29
+
23
30
  @cache_timestamp = Time.now
24
31
  @cached_info = info
25
32
  end
26
33
 
27
34
  def self.search(timeout = DEFAULT_TIMEOUT)
28
- ssdp = SSDP::Consumer.new
29
- thermos = ssdp.search(service: SERVICE, timeout: timeout)
30
- thermos.map do |thermo|
31
- location = thermo[:params]['Location']
32
- usn = thermo[:params]['USN']
33
- Renstar::Thermostat.new(location, usn)
35
+ all_thermos = []
36
+ ips = Socket.ip_address_list.select do |ip|
37
+ ip.ipv4? &&
38
+ !ip.ipv4_loopback?
39
+ end
40
+ ips.each do |ip|
41
+ puts "Searching subnet associated with #{ip.ip_address}"
42
+ ssdp = SSDP::Consumer.new({bind: ip.ip_address})
43
+ thermos = ssdp.search(service: SERVICE, timeout: timeout)
44
+ thermos.each do |thermo|
45
+ location = thermo[:params]['Location']
46
+ usn = thermo[:params]['USN']
47
+ all_thermos << Renstar::Thermostat.new(location, usn)
48
+ end
34
49
  end
50
+ all_thermos
35
51
  end
36
52
 
37
53
  def update
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Renstar
4
- VERSION = '0.1.3'
4
+ VERSION = '0.3.0'
5
5
  end
data/renstar.gemspec CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.require_paths = ['lib']
30
30
 
31
31
  spec.add_runtime_dependency 'json'
32
- spec.add_runtime_dependency 'ssdp'
32
+ spec.add_runtime_dependency 'ssdp', '~> 1.1.7'
33
33
 
34
34
  # Uncomment to register a new dependency of your gem
35
35
  # spec.add_dependency "example-gem", "~> 1.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: renstar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Rodrigues
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-21 00:00:00.000000000 Z
11
+ date: 2022-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: ssdp
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 1.1.7
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 1.1.7
41
41
  description: Control Venstar thermostats with Ruby via their local API.
42
42
  email:
43
43
  - mikebrodrigues@gmail.com
@@ -50,7 +50,6 @@ extra_rdoc_files: []
50
50
  files:
51
51
  - ".gitignore"
52
52
  - Gemfile
53
- - Gemfile.lock
54
53
  - LICENSE
55
54
  - README.md
56
55
  - Rakefile
@@ -92,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
91
  - !ruby/object:Gem::Version
93
92
  version: '0'
94
93
  requirements: []
95
- rubygems_version: 3.2.22
94
+ rubygems_version: 3.2.33
96
95
  signing_key:
97
96
  specification_version: 4
98
97
  summary: Control Venstar thermostats.
data/Gemfile.lock DELETED
@@ -1,23 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- renstar (0.1.1)
5
- json
6
- ssdp
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- json (2.6.1)
12
- rake (13.0.6)
13
- ssdp (1.1.7)
14
-
15
- PLATFORMS
16
- x86_64-linux
17
-
18
- DEPENDENCIES
19
- rake (~> 13.0)
20
- renstar!
21
-
22
- BUNDLED WITH
23
- 2.2.22