thermostat 1.0.0 → 1.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/History.txt +5 -0
- data/Manifest.txt +1 -1
- data/README.rdoc +11 -2
- data/lib/pdp/network.rb +33 -15
- data/lib/thermostat.rb +18 -1
- data/test/test_helper.rb +10 -10
- data/test/test_network.rb +78 -0
- data/test/test_oid.rb +19 -12
- data/test/test_thermostat.rb +37 -10
- data/website/index.html +2 -2
- data/website/index.txt +18 -3
- metadata +4 -3
- data/config/website.yml.sample +0 -2
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -5,7 +5,6 @@ README.rdoc
|
|
5
5
|
Rakefile
|
6
6
|
account.yaml.example
|
7
7
|
config/website.yml
|
8
|
-
config/website.yml.sample
|
9
8
|
docs/PDP_API_R1_11.pdf
|
10
9
|
examples/test-fan-off.rb
|
11
10
|
examples/test-fan-on.rb
|
@@ -20,6 +19,7 @@ script/destroy
|
|
20
19
|
script/generate
|
21
20
|
script/txt2html
|
22
21
|
test/test_helper.rb
|
22
|
+
test/test_network.rb
|
23
23
|
test/test_oid.rb
|
24
24
|
test/test_thermostat.rb
|
25
25
|
website/index.html
|
data/README.rdoc
CHANGED
@@ -32,7 +32,16 @@ request and subsequent get request.
|
|
32
32
|
|
33
33
|
== SYNOPSIS:
|
34
34
|
|
35
|
-
|
35
|
+
thermostat = Thermostate.new("hostname", "admin", "password")
|
36
|
+
|
37
|
+
# get the current temperature
|
38
|
+
current_temp = thermostat.temp
|
39
|
+
|
40
|
+
# get the current setback heat value
|
41
|
+
current_target_temp = thermostat.heat_to
|
42
|
+
|
43
|
+
# set the thermostat to 69F (units are set in the thermost)
|
44
|
+
thermostat.heat_to = 69
|
36
45
|
|
37
46
|
== REQUIREMENTS:
|
38
47
|
|
@@ -44,7 +53,7 @@ sudo gem install thermostat
|
|
44
53
|
|
45
54
|
(The MIT License)
|
46
55
|
|
47
|
-
Copyright (c) 2010 Sean Dague
|
56
|
+
Copyright (c) 2008-2010 Sean Dague
|
48
57
|
|
49
58
|
Permission is hereby granted, free of charge, to any person obtaining
|
50
59
|
a copy of this software and associated documentation files (the
|
data/lib/pdp/network.rb
CHANGED
@@ -6,11 +6,16 @@ module Proliphix
|
|
6
6
|
require "open-uri"
|
7
7
|
|
8
8
|
class Network
|
9
|
+
attr_accessor :debug, :simulate, :query, :squery, :buffer
|
10
|
+
|
9
11
|
def initialize(ip, user, passwd)
|
12
|
+
@buffer = ""
|
13
|
+
@debug = false
|
14
|
+
@simulate = false
|
10
15
|
@ip = ip
|
11
16
|
@user = user
|
12
17
|
@passwd = passwd
|
13
|
-
@last = Time.now.to_i
|
18
|
+
@last = Time.now.to_i - 120
|
14
19
|
@fetched = {}
|
15
20
|
@sensors = [
|
16
21
|
ThermHvacMode,
|
@@ -43,7 +48,9 @@ module Proliphix
|
|
43
48
|
|
44
49
|
def set(name, value)
|
45
50
|
set_data(name, value)
|
46
|
-
|
51
|
+
if not @simulate
|
52
|
+
sleep 1
|
53
|
+
end
|
47
54
|
fetch_data
|
48
55
|
end
|
49
56
|
|
@@ -60,34 +67,41 @@ module Proliphix
|
|
60
67
|
end
|
61
68
|
|
62
69
|
def get_query_url
|
63
|
-
query = ""
|
64
|
-
|
65
|
-
|
66
|
-
query += "&"
|
67
|
-
end
|
68
|
-
query += "OID#{item.oid}="
|
70
|
+
@query = url + "/get?" + @sensors.map {|item| "OID#{item.oid}="}.join("&")
|
71
|
+
if @debug
|
72
|
+
puts @query
|
69
73
|
end
|
70
|
-
|
74
|
+
return @query
|
71
75
|
end
|
72
76
|
|
73
77
|
def set_query_url(mod, value)
|
74
|
-
|
75
|
-
|
78
|
+
@squery = url + "/pdp?OID#{mod.oid}=#{value}&sumbit=Submit"
|
79
|
+
if @debug
|
80
|
+
puts @squery
|
81
|
+
end
|
82
|
+
return @squery
|
76
83
|
end
|
77
84
|
|
78
85
|
# Because of the timing issues with the thermostat we want to
|
79
86
|
# get all the data we can in one packet.
|
80
87
|
def fetch_data()
|
81
|
-
|
82
|
-
|
88
|
+
url = get_query_url
|
89
|
+
if not simulate
|
90
|
+
open(url, :http_basic_authentication => [@user, @passwd]) do |line|
|
91
|
+
@buffer = line.read
|
92
|
+
end
|
83
93
|
end
|
94
|
+
parse_data(@buffer)
|
84
95
|
return self
|
85
96
|
end
|
86
97
|
|
87
98
|
def set_data(mod, value)
|
88
99
|
unless mod.ro?
|
89
|
-
|
90
|
-
|
100
|
+
url = set_query_url(mod, value)
|
101
|
+
if not simulate
|
102
|
+
open(url, :http_basic_authentication => [@user, @passwd]) do |line|
|
103
|
+
@buffer = line.read
|
104
|
+
end
|
91
105
|
end
|
92
106
|
end
|
93
107
|
return self
|
@@ -97,6 +111,10 @@ module Proliphix
|
|
97
111
|
# includes oids = values in what looks like a uri string. So
|
98
112
|
# split twice to get values.
|
99
113
|
def parse_data(raw_data)
|
114
|
+
if @debug
|
115
|
+
puts raw_data
|
116
|
+
end
|
117
|
+
|
100
118
|
results = raw_data.split('&')
|
101
119
|
results.each do |r|
|
102
120
|
(oid, value) = r.split('=')
|
data/lib/thermostat.rb
CHANGED
@@ -4,12 +4,14 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
4
4
|
# This is the main class for controlling the Proliphix Thermostat.
|
5
5
|
# You must first initialize it with the control point credentials
|
6
6
|
class Thermostat
|
7
|
-
VERSION = '1.
|
7
|
+
VERSION = '1.1.0'
|
8
8
|
|
9
9
|
require 'pdp/oid'
|
10
10
|
require 'pdp/constants'
|
11
11
|
require 'pdp/network'
|
12
12
|
|
13
|
+
attr :network
|
14
|
+
|
13
15
|
include Proliphix
|
14
16
|
|
15
17
|
# create a new thermostat object. It needs
|
@@ -89,6 +91,21 @@ class Thermostat
|
|
89
91
|
self[ThermHvacState] == "Cool"
|
90
92
|
end
|
91
93
|
|
94
|
+
# The number of minutes of active heating since last reset of the counters.
|
95
|
+
def heat_usage
|
96
|
+
self[ThermHeat1Usage]
|
97
|
+
end
|
98
|
+
|
99
|
+
# The number of minutes of active cooling since last reset of the counters.
|
100
|
+
def cool_usage
|
101
|
+
self[ThermCool1Usage]
|
102
|
+
end
|
103
|
+
|
104
|
+
# The number of minutes the fan was running since last reset of the counters.
|
105
|
+
def fan_usage
|
106
|
+
self[ThermFanUsage]
|
107
|
+
end
|
108
|
+
|
92
109
|
# Is the fan currently on. It doesn't matter why it's on, just
|
93
110
|
# that it's on.
|
94
111
|
def fan_on?
|
data/test/test_helper.rb
CHANGED
@@ -3,14 +3,14 @@ require 'test/unit'
|
|
3
3
|
require File.dirname(__FILE__) + '/../lib/thermostat'
|
4
4
|
|
5
5
|
@@values = {}
|
6
|
-
module Proliphix
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
# module Proliphix
|
7
|
+
# class Network
|
8
|
+
# def get(name)
|
9
|
+
# @@values[name]
|
10
|
+
# end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
12
|
+
# def set(name, value)
|
13
|
+
# @@values[name] = value
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
# end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestThermostatNetwork < Test::Unit::TestCase
|
4
|
+
include Proliphix
|
5
|
+
|
6
|
+
def squery
|
7
|
+
@@t.network.squery
|
8
|
+
end
|
9
|
+
def query
|
10
|
+
@@t.network.query
|
11
|
+
end
|
12
|
+
|
13
|
+
def setup
|
14
|
+
@@t = Thermostat.new("foo", "me", "go")
|
15
|
+
@@t.network.simulate = 1
|
16
|
+
# this is some real data
|
17
|
+
@@t.network.buffer = "OID4.1.1=2&OID4.1.2=3&OID4.1.3=1&OID4.1.4=2&OID4.1.5=690&OID4.1.6=760&OID4.5.1=87337&OID4.5.3=47835&OID4.5.5=36826&OID4.1.13=686&"
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_get_query_generate
|
21
|
+
base_query = "http://foo/get?OID4.1.1=&OID4.1.2=&OID4.1.3=&OID4.1.4=&OID4.1.5=&OID4.1.6=&OID4.5.1=&OID4.5.3=&OID4.5.5=&OID4.1.13="
|
22
|
+
|
23
|
+
@@t.heat_to
|
24
|
+
assert_equal(base_query, query)
|
25
|
+
|
26
|
+
@@t.cool_to
|
27
|
+
assert_equal(base_query, query)
|
28
|
+
|
29
|
+
@@t.temp
|
30
|
+
assert_equal(base_query, query)
|
31
|
+
|
32
|
+
@@t.fan_on?
|
33
|
+
assert_equal(base_query, query)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_set_query_generate
|
37
|
+
@@t.heat_to = 68
|
38
|
+
assert_equal("http://foo/pdp?OID4.1.5=680&sumbit=Submit", squery)
|
39
|
+
|
40
|
+
@@t.heat_to = 68.0
|
41
|
+
assert_equal("http://foo/pdp?OID4.1.5=680&sumbit=Submit", squery)
|
42
|
+
|
43
|
+
@@t.heat_to = 68.01
|
44
|
+
assert_equal("http://foo/pdp?OID4.1.5=680&sumbit=Submit", squery)
|
45
|
+
|
46
|
+
@@t.heat_to = 68.095
|
47
|
+
assert_equal("http://foo/pdp?OID4.1.5=680&sumbit=Submit", squery)
|
48
|
+
|
49
|
+
|
50
|
+
@@t.cool_to = 76.5
|
51
|
+
assert_equal("http://foo/pdp?OID4.1.6=765&sumbit=Submit", squery)
|
52
|
+
|
53
|
+
@@t.cool_to = 76.51
|
54
|
+
assert_equal("http://foo/pdp?OID4.1.6=765&sumbit=Submit", squery)
|
55
|
+
|
56
|
+
@@t.cool_to = 76.519
|
57
|
+
assert_equal("http://foo/pdp?OID4.1.6=765&sumbit=Submit", squery)
|
58
|
+
|
59
|
+
@@t.fan_off!
|
60
|
+
assert_equal("http://foo/pdp?OID4.1.3=1&sumbit=Submit", squery)
|
61
|
+
|
62
|
+
@@t.fan_on!
|
63
|
+
assert_equal("http://foo/pdp?OID4.1.3=2&sumbit=Submit", squery)
|
64
|
+
|
65
|
+
@@t.network.squery = ""
|
66
|
+
|
67
|
+
# we have some safety measures in here
|
68
|
+
@@t.cool_to = 45
|
69
|
+
assert_equal("", squery)
|
70
|
+
|
71
|
+
@@t.cool_to = -100
|
72
|
+
assert_equal("", squery)
|
73
|
+
|
74
|
+
@@t.heat_to = 90
|
75
|
+
assert_equal("", squery)
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
data/test/test_oid.rb
CHANGED
@@ -1,12 +1,19 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
-
|
3
|
-
require "pp"
|
4
|
-
|
5
|
-
class TestThermostat < Test::Unit::TestCase
|
6
|
-
include Proliphix
|
7
|
-
|
8
|
-
def
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
require "pp"
|
4
|
+
|
5
|
+
class TestThermostat < Test::Unit::TestCase
|
6
|
+
include Proliphix
|
7
|
+
|
8
|
+
def test_oid_values
|
9
|
+
assert_equal(68, ThermSetbackHeat[680])
|
10
|
+
assert_equal(68.0, ThermSetbackHeat[680])
|
11
|
+
|
12
|
+
assert_equal(68, ThermSetbackCool[680])
|
13
|
+
assert_equal(68.0, ThermSetbackCool[680])
|
14
|
+
|
15
|
+
assert_equal(68, ThermAverageTemp[680])
|
16
|
+
assert_equal(68.0, ThermAverageTemp[680])
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/test/test_thermostat.rb
CHANGED
@@ -4,23 +4,50 @@ class TestThermostat < Test::Unit::TestCase
|
|
4
4
|
include Proliphix
|
5
5
|
|
6
6
|
def setup
|
7
|
-
@@
|
7
|
+
@@t = Thermostat.new("foo", "me", "go")
|
8
|
+
@@t.network.simulate = true
|
8
9
|
end
|
9
10
|
|
10
11
|
def test_scenario_one
|
11
|
-
@@
|
12
|
-
@@values[ThermSetbackHeat] = 69.0
|
13
|
-
@@values[ThermSetbackCool] = 79.0
|
14
|
-
@@values[ThermAverageTemp] = 68.5
|
12
|
+
@@t.network.buffer = "OID4.1.1=2&OID4.1.2=3&OID4.1.3=1&OID4.1.4=2&OID4.1.5=690&OID4.1.6=760&OID4.5.1=87337&OID4.5.3=47835&OID4.5.5=36826&OID4.1.13=686&"
|
15
13
|
|
16
|
-
assert_equal @@
|
17
|
-
assert_equal
|
18
|
-
assert_equal
|
19
|
-
assert_equal @@
|
14
|
+
assert_equal "Heat", @@t.mode
|
15
|
+
assert_equal 68.6, @@t.temp
|
16
|
+
assert_equal 69.0, @@t.heat_to
|
17
|
+
assert_equal true, @@t.heating?
|
18
|
+
assert_equal true, @@t.fan_on?
|
19
|
+
assert_equal false, @@t.cooling?
|
20
|
+
assert_equal nil, @@t.cool_to
|
21
|
+
assert_equal 87337, @@t.heat_usage
|
22
|
+
assert_equal 47835, @@t.cool_usage
|
23
|
+
assert_equal 36826, @@t.fan_usage
|
20
24
|
end
|
21
25
|
|
22
26
|
def test_scenario_two
|
27
|
+
@@t.network.buffer = "OID4.1.1=1&OID4.1.2=2&OID4.1.3=1&OID4.1.4=1&OID4.1.5=690&OID4.1.6=760&OID4.5.1=87337&OID4.5.3=47835&OID4.5.5=36826&OID4.1.13=686&"
|
28
|
+
|
29
|
+
assert_equal "Off", @@t.mode
|
30
|
+
assert_equal 68.6, @@t.temp
|
31
|
+
assert_equal nil, @@t.heat_to
|
32
|
+
assert_equal false, @@t.heating?
|
33
|
+
assert_equal false, @@t.fan_on?
|
34
|
+
assert_equal false, @@t.cooling?
|
35
|
+
assert_equal nil, @@t.cool_to
|
23
36
|
|
24
37
|
end
|
25
|
-
|
38
|
+
|
39
|
+
def test_scenario_three
|
40
|
+
@@t.network.buffer = "OID4.1.1=3&OID4.1.2=2&OID4.1.3=1&OID4.1.4=1&OID4.1.5=690&OID4.1.6=760&OID4.5.1=87337&OID4.5.3=47835&OID4.5.5=36826&OID4.1.13=686&"
|
41
|
+
|
42
|
+
assert_equal "Cool", @@t.mode
|
43
|
+
assert_equal 68.6, @@t.temp
|
44
|
+
assert_equal nil, @@t.heat_to
|
45
|
+
assert_equal false, @@t.heating?
|
46
|
+
assert_equal false, @@t.fan_on?
|
47
|
+
assert_equal false, @@t.cooling?
|
48
|
+
assert_equal 76, @@t.cool_to
|
49
|
+
assert_equal 76.0, @@t.cool_to
|
50
|
+
|
51
|
+
end
|
52
|
+
|
26
53
|
end
|
data/website/index.html
CHANGED
@@ -34,7 +34,7 @@
|
|
34
34
|
<div class="sidebar">
|
35
35
|
<div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/sdaguegems"; return false'>
|
36
36
|
<p>Get Version</p>
|
37
|
-
<a href="http://rubyforge.org/projects/sdaguegems" class="numbers">1.0</a>
|
37
|
+
<a href="http://rubyforge.org/projects/sdaguegems" class="numbers">1.0.0</a>
|
38
38
|
</div>
|
39
39
|
</div>
|
40
40
|
<h2>What</h2>
|
@@ -63,7 +63,7 @@ rake install_gem</pre>
|
|
63
63
|
<h2>Contact</h2>
|
64
64
|
<p>Comments are welcome. Send an email to <a href="mailto:sean@dague.net">Sean Dague</a></p>
|
65
65
|
<p class="coda">
|
66
|
-
<a href="FIXME email">FIXME full name</a>,
|
66
|
+
<a href="FIXME email">FIXME full name</a>, 7th March 2010<br>
|
67
67
|
Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
|
68
68
|
</p>
|
69
69
|
</div>
|
data/website/index.txt
CHANGED
@@ -12,9 +12,21 @@ h2. Installing
|
|
12
12
|
|
13
13
|
h2. The basics
|
14
14
|
|
15
|
-
|
16
15
|
h2. Demonstration of usage
|
17
16
|
|
17
|
+
<pre syntax="ruby">
|
18
|
+
thermostat = Thermostate.new("hostname", "admin", "password")
|
19
|
+
|
20
|
+
# get the current temperature
|
21
|
+
current_temp = thermostat.temp
|
22
|
+
|
23
|
+
# get the current setback heat value
|
24
|
+
current_target_temp = thermostat.heat_to
|
25
|
+
|
26
|
+
# set the thermostat to 69F (units are set in the thermost)
|
27
|
+
thermostat.heat_to = 69
|
28
|
+
</pre>
|
29
|
+
|
18
30
|
h2. Documentation
|
19
31
|
|
20
32
|
Full module level documentat can be found here:http://sdaguegems.rubyforge.org/thermostat/rdoc
|
@@ -22,7 +34,7 @@ Full module level documentat can be found here:http://sdaguegems.rubyforge.org/t
|
|
22
34
|
|
23
35
|
h2. How to submit patches
|
24
36
|
|
25
|
-
Read the "8 steps for fixing other people's code":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/
|
37
|
+
Read the "8 steps for fixing other people's code":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/
|
26
38
|
|
27
39
|
You can fetch the source from
|
28
40
|
|
@@ -30,13 +42,16 @@ You can fetch the source from
|
|
30
42
|
|
31
43
|
<pre>git clone git://github.com/sdague/thermostat.rb.git</pre>
|
32
44
|
|
45
|
+
To send me code updates, fork the tree on github, make your changes,
|
46
|
+
then send me a pull request. That will make it easy for me to
|
47
|
+
integrate your patches.
|
48
|
+
|
33
49
|
h3. Build and test instructions
|
34
50
|
|
35
51
|
<pre>cd thermostat
|
36
52
|
rake test
|
37
53
|
rake install_gem</pre>
|
38
54
|
|
39
|
-
|
40
55
|
h2. License
|
41
56
|
|
42
57
|
This code is free to use under the terms of the MIT license.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thermostat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Dague
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-03-
|
12
|
+
date: 2010-03-10 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -79,7 +79,6 @@ files:
|
|
79
79
|
- Rakefile
|
80
80
|
- account.yaml.example
|
81
81
|
- config/website.yml
|
82
|
-
- config/website.yml.sample
|
83
82
|
- docs/PDP_API_R1_11.pdf
|
84
83
|
- examples/test-fan-off.rb
|
85
84
|
- examples/test-fan-on.rb
|
@@ -94,6 +93,7 @@ files:
|
|
94
93
|
- script/generate
|
95
94
|
- script/txt2html
|
96
95
|
- test/test_helper.rb
|
96
|
+
- test/test_network.rb
|
97
97
|
- test/test_oid.rb
|
98
98
|
- test/test_thermostat.rb
|
99
99
|
- website/index.html
|
@@ -131,6 +131,7 @@ signing_key:
|
|
131
131
|
specification_version: 3
|
132
132
|
summary: Thermostat.rb is an attempt to build an easy to use ruby api around the web services provided by the Proliphix line of network thermostats
|
133
133
|
test_files:
|
134
|
+
- test/test_network.rb
|
134
135
|
- test/test_thermostat.rb
|
135
136
|
- test/test_oid.rb
|
136
137
|
- test/test_helper.rb
|
data/config/website.yml.sample
DELETED